paiseh apps.paiseh.sg
← All apps

Sprout

Houseplant care that adapts

Tells you exactly when to water each plant in your specific home, adapts to how the plant actually responds, and walks you through rescuing the ones that are struggling.

Status
Build-ready
Platforms
Web (PWA)
Role
Spec, design and build
Source
PaisehSG/sprout (private)
What it does
Adaptive schedule A species baseline adjusted for pot size, light and season, then tuned by your own feedback — tell it the soil is still wet and the interval lengthens.
Symptom diagnosis Guided decision trees for the six most common symptoms, taking you from what you see to a likely cause to a concrete fix.
Limits that can't be forged Free-tier caps are enforced in Firestore rules against counters only Cloud Functions may write, so a tampered client can't bypass them.

Most plant apps hand you a fixed watering interval from a species table and leave you to it. Sprout starts there and then learns.

Content trust matters here, so the app is explicit about it: all care and diagnosis content is researched from authoritative sources — university extension guides, the RHS, the ASPCA — and cited. It is not reviewed by an in-house horticulturist, and the app says so rather than implying otherwise.

How it’s built

React 18, Vite and strict TypeScript with Tailwind, over Firebase for Auth, Firestore, Storage and Cloud Messaging. Installable as a PWA with an offline Today list and background sync. Without Firebase environment variables it runs in demo mode, so the landing page, species library and diagnosis symptoms are all browsable immediately.

Schedule accuracy is a week-one credibility trap: if the first interval it gives you is obviously wrong, nothing else gets a chance. So the two engines that decide it are pure and thoroughly tested — 37 tests across the interval calculation (pot, light and season factors, hemisphere, season boundaries, clamping, brand-new-plant defaults) and the adaptive feedback loop (learning-phase versus settled step sizes, bounds).

Limits that can’t be forged

The free tier caps you at eight plants and one diagnosis. Those caps are enforced by Firestore Security Rules using getAfter() count-mirror checks against counters that Cloud Functions maintain and clients are forbidden to write — so a tampered client can’t bypass them. Photos are compressed on the device before upload, and Storage rules restrict every path to its owner while rejecting non-images and anything over 3 MB.

Scheduled functions handle the parts that have to be server-side: batching each day’s due plants into a single reminder digest that respects quiet hours (never per-plant nagging), and a monthly job that re-derives seasonal baselines while preserving whatever adjustment the plant has taught the app so far.