Back to home page

build

Meadow

Everything Flo puts behind a subscription, without the ads or the data sharing. Private cycle tracking for one person, or for two.

what it is

A private cycle tracker built around two roles rather than one user. One person logs (the tracker), and can optionally link a partner, who follows along with supportive context instead of a data dashboard. No ads, no upsells, no premium tier, no third-party analytics or tracking SDKs of any kind. The only external service the app talks to is the database, and that database is locked down with row-level security, so a person's data is only ever readable by that person and the partner they have explicitly linked to.

what is unique

A separate language layer for the partner view is the detail I am proudest of. The tracker's data is not shown to the partner raw, it gets translated: a dedicated copy module maps each cycle phase to plain-language, hedged guidance ("she is on her period, this can bring cramps, fatigue, or just wanting to slow down") paired with concrete, low-effort support prompts, rather than "period day 3 of 5, 60% confidence." Every line is deliberately hedged, because a probabilistic prediction stated with false certainty is worse than no prediction at all. The same forecast has to become two different products depending on who is reading it and what they will do with it. The prediction engine underneath is real, not a lookup table: rolling average cycle length, predicted next period, ovulation calculated backward from the next period rather than forward from the last one (the luteal phase is the clinically consistent part of the cycle, so the next period is the sounder anchor), fertile window, and current phase.

how it was built

React 19TypeScriptViteTailwind CSS v4Supabase (Postgres, auth, row-level security, realtime)vite-plugin-pwa

The prediction module is pure, dependency-free, isolated from the database layer, and independently unit tested, so the logic can be reasoned about separately from how the data gets fetched. Linking is a share-code handshake, no email lookups and no contact syncing. A library of roughly 20 articles across menstruation, contraception, diet, fitness, mood, relationships and general health each cites a real organisation (Mayo Clinic, ACOG, NHS, Cleveland Clinic, Planned Parenthood) and closes with a plain "general information, not medical advice" line.

my learnings

Row-level security that fought back

Privacy is enforced at the database rather than the UI: every table sits behind row-level security, and getting that right meant fixing real bugs. An RLS policy that recursed by querying the table it was protecting. A schema exposed at the API gateway but missing the schema-level grant Postgres also requires. A helper function that was public when it should have been internal-only.

An offline cache that would have lied

Built as an installable PWA with an offline app shell, with API calls deliberately excluded from offline caching so the app never shows stale cycle data just to look fast.

A personalisation product before it is an AI product

In 2019 Flo was reported to be sending cycle and pregnancy data to Facebook and Google analytics tools despite promising not to, and it settled with the FTC in 2021. People kept using it. Every alternative I tried carried the same ad load, the same upsell funnel, the same paywall on things that should not be gated. I did not write a memo about that gap, I built the replacement. The hard part was never the prediction: it was how to say something probabilistic to a second person, the partner, without overstating what is actually known. Every line in the partner view is hedged on purpose, because a guess delivered with false confidence is worse than no guess at all.

live site

Visit the live site
Back to home page