Calm by design: how we keep Fern quiet

Plants are slow, and most days the honest answer to "what should I do?" is nothing. How we design an app around that, from the notification budget to the rules for celebrating, and what it costs us.

A pothos on a shelf needs water roughly once a week, sometimes less in winter. A snake plant might go a month. A cutting in a jar of water needs nothing at all for days except a glance to see whether roots have appeared.

So on most days, for most plants, the honest answer to "what should I do?" is "nothing yet". That turns out to be the hardest thing to design for. Apps are built to give you something to do every time you open them, and a plant app that does that is either inventing work or nagging.

This post is about how we design Fern around quiet days. Some of it is philosophy, but most of it is a set of rules we've written down and, where we could, built into the code so they can't drift.

Where this comes from

We wrote six product principles for Fern. They're short enough to remember:

  1. Helpful, not bossy.
  2. Personal, not generic.
  3. Clear, not magical.
  4. Shared, not complicated.
  5. Gentle, not noisy.
  6. Progress over perfection.

Two of them do most of the work in this post. "Gentle, not noisy" comes with a sentence underneath it: every reminder should earn its place. "Progress over perfection" has one too: a missed day is information, not failure.

The reasoning behind both is about trust. A reminder is only useful if people act on it, and people stop acting on reminders that turn out not to matter. If Fern tells you to check on Monty three times and Monty was fine each time, the fourth reminder gets swiped away, and the fourth might have been the one that mattered. So every unnecessary message has a cost, even if nobody complains about it.

Quiet days are part of the product

The first place this shows up is Today, the screen people see most.

On a day with nothing due, Today doesn't fill the space with tips or prompts to add more plants. It says what's true. For a plant that was just added, it says something like "Monty is settling in", explains that there's no care today, and that before its first watering Fern will ask you to feel its soil. When everything for the day is done, a card says "All done for today", with a green check that draws itself in.

That check draws itself once a day. The first time you finish, it animates, a few leaves puff out and the phone gives a single soft tap. If you open the app again an hour later, the check is just there, still. Celebrating the same thing twice makes it mean less.

A screen that says "you're done, nothing to do" can feel like a dead end or like a small reward. The difference is in tiny details: the wording, whether there's motion, whether it repeats.

The notification budget

The rule we're strictest about is how often Fern can reach into your day.

Care notifications have a daily budget. There's one morning summary, sent from 8 AM in your own time zone, with everything that needs you that day. There may be one evening nudge, sent from 6 PM, and only if nothing on today's list has been touched. Across a day, care notifications are capped at three, and the morning summary always gets through.

The reasoning is easiest to see from the alternatives. A reminder per plant sounds reasonable until you have twelve plants and get twelve messages on a Sunday morning. An overdue alert for each missed task sounds helpful until you come back from a weekend away to a stack of them. So care from earlier days doesn't get its own alarm any more. It's folded into the next morning summary, where it sits with everything else.

Quiet hours work the same way. A reminder that falls inside your quiet hours isn't dropped, it waits until they end. Dropping it would mean a plant silently misses its turn, and the whole point of the budget is that the messages which do arrive can be trusted.

Shared homes needed their own rule. When someone you live with waters four plants in a row, you don't get four messages. Fern waits about ten minutes and sends one, saying what was done. You know the plants are looked after without your phone buzzing through someone else's routine.

Weather is the one kind of care news with its own message, because a frost or a heatwave affects plants on a balcony on the day it happens. Even then it comes as one message for each kind of alert, covering every plant it affects, never one per plant.

Asking before assuming

A schedule that says "water every seven days" is easy to build and often wrong. The same plant drinks far more in a bright summer window than in a dim room in January, and pots, soil and the heating all change it further.

Fern could pretend to know. Instead, before a new plant's first watering, it asks you to feel the soil: dry, damp or wet. That one answer says more than any species average, and Fern adjusts the plant's rhythm from it, then keeps learning from what you do.

This is "Clear, not magical" in practice. When Fern suggests a rhythm, the plant's page explains where it came from. When the diagnosis isn't sure what's wrong, it says so, and it can offer to ask other growers. We'd rather Fern admit it doesn't know than sound certain and be wrong, because one confident wrong answer costs more trust than ten honest "it might be this".

The common thing is one tap

When you do have something to do, it should take almost no effort.

Marking care done is one tap. Because one tap is also easy to get wrong, it comes with an undo that stays on screen for a few seconds. On a treatment round, "Can wait a day" is one tap too, and it moves the round to tomorrow without any questions. Plants mind a day's delay much less than apps tend to suggest. If tomorrow doesn't work either, you can pick any other day.

For people with lots of plants, a care round walks through them one by one in a single sitting. It's a session you start when you feel like it, not a standing duty.

When things go wrong

How an app behaves when you fall behind says more about it than how it behaves when everything is fine.

Take a pest treatment. Fern spaces the rounds out, because the eggs hatch on their own schedule and one spray never finishes the job. If you miss a round by three days, Fern says so plainly, because pests don't wait and a late spray matters. But the next words are about what to do: "Do it now", and the later rounds move along by the same three days so they stay properly spaced. The plan bends around your week instead of making you feel you've broken it.

Streaks get the same treatment. Fern counts calm days, days when nothing was left late. When a run ends, the count quietly starts again. There's no warning the evening before that you're about to lose it, and no sad screen afterwards.

Some outcomes are genuinely bad. A treatment didn't work, or a plant didn't make it. Those never get a celebration, and they never get a cheerful screen pretending otherwise either. Fern offers a calm next step: another approach to try, or a way to remember the plant.

Even being offline follows the rule. When Fern can't reach its server, it doesn't throw an error dialog. It shows what it already has, under a short banner that says Fern can't be reached and that what you're looking at was saved earlier. Care you mark while offline is kept and sent when the connection comes back.

Celebrating without shouting

We do want Fern to feel good to use. Finishing a pest treatment, a cutting growing its first roots, a plant you've kept for a year: those are real moments, and they deserve more than a small toast at the bottom of the screen. So Fern has a proper celebration system, with full-screen moments and leaf confetti.

It also has the strictest rules in the app, because celebrations are as easy to overdo as notifications.

A big moment only appears on Today, and only once Today has loaded and nothing has moved for a second, with nothing open on top. It never interrupts you halfway through doing something. There's at most one per time you open the app, and two in a day. Anything beyond that isn't thrown away. It becomes a small card on Today for the rest of the day, which you can open whenever you like.

Several badges earned at once become a single moment. Milestones are spaced out: calm-day milestones come at 7, 30, 100 and 365 days, once per run. And if you've turned on Reduce Motion in iOS, the leaves stay still and the moment simply appears.

Smaller wins never take over the screen at all. They happen inside the card where you did the thing. The check pops, a line updates, there's one haptic tap. While a run of calm days is longer than any before it, the "All done" card gains one line saying so. It never shouts, and when the run ends the line simply stops appearing.

These limits live in the code, as constants in the queue that every celebration goes through. That matters. A guideline in a document can be forgotten by the next feature that wants its own moment. A queue with a limit of two a day can't.

What it looks like

Visually, calm mostly means fewer things competing for attention.

The app sits on a warm off-white background rather than pure white, with one green for actions and soft earth tones for everything else. Icons are hand-drawn in the same loose style as the rest of the brand, so they read as part of one picture instead of a set of system symbols. Most cards have one obvious action, and when a card needs two, the second is visibly quieter.

Sprig, the small sprout that is Fern's mascot, is a good example of a rule that came from a feeling. People like Sprig. That's exactly why Sprig appears at most once on any screen. A mascot on every card stops being charming and becomes wallpaper.

Calm also has to hold up for people who use their phones differently. New screens are designed for the largest text sizes and for dark mode too, not only for the default. A layout that breaks into a mess at large text isn't calm for the people who need large text.

Words matter as much as pixels

A lot of what reads as minimal design is really writing.

Fern's writing guidelines say it should sound warm, clear, observant, encouraging and calm, and honest about uncertainty. They also list what it should avoid: scolding, alarmist language, too many notifications, unexplained certainty, competitive plant-owner talk, and technical words when a simple phrase works.

In practice that means the morning summary says "3 plants to look after today" rather than "3 tasks overdue". The evening one says "Still time today". A late treatment round says "Do it now" and tells you what moves with it. The words are small, but they are what people actually read, and they get read many times a week.

Where we break our own rules

We'd be overstating it if we said Fern never interrupts.

Full-screen celebrations are interruptions, even polite ones. We decided a few a week are worth it, because without them the app never marks anything, and the limits above are what keep "a few" from creeping up.

When a free trial ends, Fern shows a full-screen notice once, explaining what stays free and what doesn't. Telling people clearly felt better than letting features quietly lock, but it's still a screen nobody asked for.

And weather alerts arrive as their own message instead of waiting for the morning summary, for the reason above. We keep these exceptions few, and we know what they are.

What it costs

Being quiet isn't free, and we'd rather be honest about that.

Most of the usual ways to get people to open an app more often go against these rules: more notifications, warnings that a streak is about to end, badges that keep counting up, prompts to come back. Some of them would very likely make Fern's numbers look better in the short term.

We've chosen to give those up. The bet is that people keep a calm app on their phone for years and recommend it to friends, because it never made them feel guilty about a plant. Plant care is a long relationship. The person who adds their first pothos today might have thirty plants in three years, and we want Fern to still be welcome on their phone then.

Keeping it this way

The hardest part of minimal design is that it erodes one reasonable decision at a time. Every new feature wants a notification, a badge, a celebration or a prompt, and each request makes sense on its own.

What helps us is turning the rules into things that are hard to bypass. The notification caps are enforced on the server, so a new kind of reminder has to fit inside them. Celebrations all go through one queue with fixed limits. Screens stay up to date without pull-to-refresh, so nobody has to tidy the app by hand. And the writing rules are written down where everyone working on Fern reads them.

The next test is already here. Growers, our community, brings replies, likes and new followers, each of which could easily want its own notification. Fitting all of that inside the same quiet budget is the work in front of us now.