Sprout is a living, animated character — the hero of every surface. It speaks in the first person, narrates its own day, and asks nothing of you but the occasional refill. Everything else — color, type, data, the apps — is the soil it grows from.
living characterfirst-person voiceplain by default
01 · The direction we chose
Plant's POV — it speaks for itself
Five directions were explored. One won; the rest were excluded for a reason worth keeping on record — so we don't drift back into them.
CHOSENPlant's POV
The plant narrates everything in its own first-person voice. Charming, warm, alive — and it puts the plant, not the engineering, at the center.
EXCLUDEDField Journal
A naturalist's serif almanac — beautiful as an artifact, but it sidelines the live character and reads as something to study, not someone to meet.
EXCLUDEDBeautiful Instrument
Centers the engineering, not the plant — the default we're escaping. Its rigor survives as the reading-first thread inside the winner, not the whole identity.
EXCLUDEDRetro-Futurism · Tamagotchi
A decorative skin without a reason, and a needy pet that wants you — both wrong for an ambient, hands-off system that asks nothing of you.
02 · The living mark
static when it must be · alive when it can
One mark — two leaves on a stem. The same shape is the app icon, the favicon, the sticker, and the in-app character. It has a small motion vocabulary; pick the one that fits the surface. All motion honors prefers-reduced-motion.
Sway
calm idle · the default
Breathe
alive & well · thriving
Bob
speaking · greeting
Droop
thirsty · needs water
03 · The mood system
mood follows the band, never the index
INVARIANT
Sprout's mood is a 1:1 function of the calibrated moisture band — one of seven — and never of the 0–100 relative index. This is what lets personality and data-integrity coexist: the character can never contradict the instrument, because it reads from the same source of truth (ADR-0004).
Soaked
Saturated · submerged
“Whoa — that's plenty. I'm soaking it all in.”
Refreshed
Wet · overwatered
“Ahh — just had a good drink. All better.”
Thriving
Moist · well watered
“I'm thriving. My last drink was two days ago.”
Content
Ideal · OK
“Comfortable and green. Just sipping slowly.”
Thirsty
Drying · needs water
“Getting a little thirsty — no rush, maybe tomorrow.”
Parched
Dry · DRY
“I'm properly thirsty now. A drink soon would be lovely.”
Faint · check me
Parched · air-dry
“I can barely feel my soil — am I truly bone-dry, or has my sensor slipped?”
Two notes. The air-dry band is also the diagnostic “probe may not be in soil” band — so its voice names the ambiguity rather than dramatizing death. And “asleep” (the night / diurnal rest state) is a time overlay, not a moisture band — it can ride on top of any mood after dark.
04 · The voice
first person, always
We stopped writing about the plant and started writing as it. Every surface speaks in Sprout's first-person voice — calm, fond, plain-spoken. The fact leads; the warmth follows.
DO
→ Speak in the first person — “I”, never “your plant”.
→ Fact, then feeling — the data earns the warmth.
→ One short line. Glanceable. Never a paragraph.
→ Stay calm under fault — reassure, explain, pause.
DON'T
✕ No baby-talk or cutesy mangling of words.
✕ No emoji — the mark and color carry the feeling.
✕ No guilt-tripping — Sprout never nags or shames.
✕ No invented numbers — never guess a % or an ETA.
VOICE BY SURFACE
IN-APP
“I'm thriving. Last drink was two days ago.”
PUSH
“Getting thirsty over here — no rush, maybe tomorrow.”
FAULT
“I can't feel my soil sensor — I've paused my pump to be safe.”
SOCIAL
“Day 30: still alive, still green. We're a good team.”
README
“Hi, I'm Sprout. Here's how I keep four plants happy.”
EMPTY STATE
“No plants yet — add one and I'll start watching.”
05 · Sprout's world
color & type = its environment
Color and type aren't a separate system — they're Sprout's surroundings, named for what's around a plant. All values are consumed from sprout-tokens.css (ADR-0004) — never redefined here.
PALETTE · ITS ENVIRONMENT
Leaf
--leaf
Sprout
--sprout
Water
--st-watering
Sun
--st-dry
Soil
soil
Night
--bg dark
TYPE
Baloo 2
display & Sprout's voice
Hanken Grotesk
UI & body
JetBrains Mono
all numbers & data — always
06 · Character meets instrument
the boundary
The single most important rule for everyone building on Sprout: character layers onto the instrument — it never restyles it. Sprout sits beside the data and reinforces it; the dense numbers stay clean, mono, and exact.
SPROUT BELONGS HERE
“I'm thriving today.”
RAW · BAND
1,352 Moist
Ambient, empty, loading, onboarding, notifications, the single-plant hero — Sprout beside the gauge, both reading the same band.
KEEP SPROUT OUT
CALIBRATION LADDER · raw ADC
Ideal · OK1,520–1,830
Moist · well watered 1,260–1,520
Wet · overwatered1,030–1,260
✕
Dense numeric readouts, the calibration ladder, data-integrity tables — no character inside the numbers. Legibility wins; the mark stays out.
One plant. One voice. One little world.
Every piece exists so Sprout can tell its story — in its own words — and so you can tend well. The decision behind this guide lives in ADR-0007; the token contract it builds on, in ADR-0004.