Roadmap · built in deliberate phases
Phases 1 through 7 are live. So are two that jumped the queue: phase 12, after a security review asked about it, and phase 13, which was ready before the phases in front of it. Four are still ahead. Three would make the dashboard more agentic, and the last is an editing pass driven by an outside design review. A phase starts only once the one before it is solid.
The dashboard
LiveThe whole picture, at a glance, no app to open
Pulls six months of recovery, sleep, strain, and workouts from WHOOP onto one page: hero scores, recovery and strain charted together, HRV and sleep trends, all-time records, sport mix, and computed patterns. A full refresh now costs about 30 data requests instead of roughly 200. Between any change and the live site sit 186 automated tests and a practice copy that runs on sample data first.
Always current
LiveStays current without a manual refresh
A scheduled job pulls the latest WHOOP data once a day on its own. The credential that keeps the connection alive lives in encrypted storage and renews itself, in step with normal sign-ins.
A smarter read
LiveReads the week, not just this morning
Today's Call now weighs a 3-day recovery trend, a 6-day no-rest-day guard, and sleep debt building across nights, still a deterministic rule set (no ANTHROPIC_API_KEY yet, so no generated summary). The rules live in their own tested module, the safety net for an AI-written version later.
Polish
LiveSmaller rough edges, once the bigger pieces are solid
Loading placeholders, tabular numerals so figures line up site-wide, self-hosted fonts that skip a round trip to Google, and a line-by-line copy check of onboarding and connection-bar wording.
Pro athlete snapshot
LiveA sense of scale against a real professional
A season-level comparison against real, published WHOOP data for a pro athlete, shipped out of sequence once WHOOP published sourced season data for the first time. Resting HR and weekly session count compare directly; training hours and recovery-session counts are shown as sourced facts, never forced into a comparison this dashboard can't back up.
Design review cadence
LiveCatch design drift before it's substantial
A recurring outside critique, not a one-time audit: an independent designer checks the live site against its own locked rules and whether prior recommendations landed. Automated on a quarterly schedule (January, April, July, October).
iOS app
LiveOne tap from the Home Screen
A web app manifest and icon set make the dashboard installable with no browser chrome, on iOS and Android alike. A service worker caches the last snapshot for offline reading; sign-in and owner-only routes always hit the network.
The public refresh, checked
LiveAlready safe against a shared link
A security review flagged the open Refresh button as a possible gap. It isn't: throttled to once every 5 minutes off the snapshot's own timestamp, so repeated clicks can't burn through WHOOP's rate limit or spam the shared snapshot. Worst case, an early refresh; no data is ever lost.
Why it failed
LiveA failed check that says what's wrong
The post-deploy smoke test used to report healthy or stale, nothing more. It now sorts a failed headless refresh into a dead token, a WHOOP outage, a rate limit, or a store-availability problem, and surfaces the classified reason instead of a generic "stale."
Today's Call, written daily
LiveReasons about the week, not a fixed table
A daily job has a model read the week in context and write the call itself, falling back to the tested deterministic version if the call fails or ANTHROPIC_API_KEY isn't set. The key itself still isn't provisioned in production, so the dashboard is running that fallback today.
Ask your data
FutureAn answer, not a chart
A small function that answers a plain question against the last 180 days, using data already in the snapshot. Owner-only at first, to keep the cost of an open-ended question bounded.
Nudges
FutureHear about it when it matters
Everything today is pull: open the dashboard to learn anything. A scheduled job could watch the same signals Today's Call already flags and reach out only when one trips, once a delivery channel (likely email) exists.
Athlete data, kept current
FutureOne less thing to remember
The pro athlete snapshot is hand-maintained today. A standing job could watch for newly published season data and draft the update itself, once parsing WHOOP's press page proves reliable enough to trust unwatched.
An editing pass
FutureTake things away
An outside design review found the visual system solid and recommended subtraction: let Today's Call dominate, cut secondary-label noise, darken supporting copy, differentiate section rhythm, simplify chart legends, and trim implementation-heavy prose. Vertical density is already tightened 12–15% site-wide; the rest is still to do.
Noticed
LivePatterns the fixed rules would miss
A model reads the last 60 days and writes up to three patterns, each tied to specific dates and numbers from the data. They show on the dashboard under Noticed. The prompt hands the model the list of things the fixed Patterns rules already check, so it looks elsewhere instead of restating one of them in different words. Nothing substitutes for it when it comes up empty, since a fixed-rule answer is what this phase exists to get past. The section just stays hidden. A failed call or a missing key hides it the same way. 14 tests cover the prompt and the parsing, and ANTHROPIC_API_KEY still isn't provisioned in production, so nothing shows there today.
Phases are sequential. Nothing gets added to an earlier phase just because it would be easy to slot in. Phases 08 to 10 are ordered by how easy they are to build, not by how much they matter, so which one actually goes next is a separate conversation, held when one of them is ready to move from planned to active. Four items sit outside that order on purpose. The pro athlete snapshot was gated on real data existing at all, and shipped the week it did. The design review cadence has no end state; it is a standing practice on its own quarterly clock. Phase 12 was pulled forward because a security review asked a question that deserved a documented answer. Phase 13 went in when it did because the pattern-finding work was finished and there was no reason to hold it.