the fitness log

Roadmap · built in deliberate phases

The Fitness Log is built in deliberate phases. Phases 1 through 5 are live; five ideas for a more agentic dashboard are next, followed by an editing pass informed by outside design review, planned and intentionally not started yet. Each one is added only once the phase before it is solid.

01 the dashboard

Live

Pull six months of recovery, sleep, strain, and workouts from WHOOP and lay them out on one page: hero scores, recovery and strain charted together, HRV and sleep trends, all-time personal records, sport mix, and computed patterns.

See the whole picture of training and recovery at a glance, on any device, with no app to open.

Already in place
  • Jun 2026Faster, steadier sync. A full refresh now takes ~8 requests instead of ~180, ending the intermittent reconnect prompts; a post-deploy smoke test catches a stale or broken snapshot.
  • Jun 2026Offline dev loop. The dashboard runs locally on generated sample data, with a quality-check harness and a guide for the agents that help maintain it.
  • May 2026GitHub + auto-deploy. Every push deploys itself; core logic moved into modules covered by 58 automated tests.
  • May 2026Records & polish. Eight all-time records, trend arrows, animated number tickers, and a locked, consistent color palette.

02 always current

Live

A scheduled job refreshes the snapshot from WHOOP once a day on its own, instead of only when Susan opens the dashboard.

The page stays current even on days she doesn't visit, no manual refresh required.

Already in place
  • Jul 2026Daily scheduled refresh. A Netlify scheduled function pulls WHOOP data and republishes the snapshot once a day on its own.
  • Jul 2026Persisted owner token. The refresh token now lives in a private, encrypted store the scheduled job can read and rotate, kept in sync whenever the browser session also refreshes.

03 a smarter read

Live

The fixed-template "Today's Call" now reads more than this morning's number: a 3-day recovery trend, a 6-day no-rest-day guard, and sleep debt building up across nights. No LLM yet — no ANTHROPIC_API_KEY is in place, so this shipped as a smarter version of the same deterministic rule set rather than a generated summary. That stays a real option later.

A call that reads the week, not just this morning, with nothing new to keep running.

Already in place
  • Jul 20263-day recovery trend. A steady slide gets flagged on day 3, even when today's own number still clears the bar for training.
  • Jul 2026No-rest-day guard. Six straight days with a workout gets flagged, even on a day that otherwise looks fine in isolation.
  • Jul 2026Cumulative sleep debt. A few slightly-short nights now add up, instead of only catching one clearly bad night.
  • Jul 2026Recommendation logic extracted and tested. The rule set now lives in its own tested module, the same pattern as every other piece of dashboard logic, and the fallback path if an LLM version ever ships.

04 polish

Live

Gentle loading placeholders while data fetches, tabular numerals so columns of figures line up, and a copy pass over the onboarding page and connection-bar wording.

Smaller rough edges smoothed once the bigger pieces are solid.

Already in place
  • Jul 2026A real loading state. Static placeholder blocks (no shimmer, no pulse, per the locked motion rule) now fill the brief gap between first paint and the data and sign-in checks resolving, instead of a blank page.
  • Jul 2026Tabular numerals, site-wide. Applied at the base font level so any figure anywhere lines up, not just the handful of elements that had it individually before.
  • Jul 2026Connection-bar and onboarding copy reviewed. Checked line by line against the setup page and the sign-in states; already held up, no changes needed.
  • Jul 2026Self-hosted fonts. Fraunces and IBM Plex moved off Google Fonts onto self-hosted files with a year-long cache, removing the Google Fonts request chain from every page load.

pro athlete snapshot

Live

A season-level comparison against real, published WHOOP data for a pro athlete. Not one of the numbered phases above — it shipped out of sequence because WHOOP itself published sourced, WHOOP-to-WHOOP season data for the first time, which was the one thing blocking it.

A sense of scale: how your own numbers sit next to a professional's, using only real data from the same kind of device.

Already in place
  • Jul 2026Resting HR and weekly session count, compared directly. Your own averages, computed from your existing data over the same window as the published report.
  • Jul 2026Season context, not fabricated comparisons. Training hours, Sleep Consistency Score, and recovery-session counts are shown as sourced facts about the athlete's season rather than forced into a side-by-side against numbers this dashboard doesn't track.

design review cadence

Live

A recurring outside critique, not a one-time audit: an independent-designer review run periodically against the live site, checked against this project's own locked design rules (palette, motion, tap targets) and against whether prior recommendations actually got addressed. Not one of the numbered phases — it's a standing practice, not a build with an end state.

Catch design drift as the site grows, instead of only noticing it once it's substantial.

Already in place
  • Jul 2026First review completed. The reusable prompt lives in maintenance.md, "Design review cadence."
  • Jul 2026Automated on a quarterly schedule. Runs itself every January, April, July, and October; the reusable prompt still works standalone in any other tool, on demand.

05 iOS app

Live

An installable version that adds itself to the Home Screen: its own icon, no browser chrome, and offline reading of the last published snapshot. Same dashboard, no separate codebase, no App Store submission — a web app manifest and a small service worker, nothing more.

One tap from the Home Screen for the check Susan already does every morning, instead of finding a browser tab.

Already in place
  • Jul 2026Add to Home Screen. A web app manifest plus icon set (192px, 512px, and an Apple touch icon) makes the dashboard installable with its own icon and no address bar, on iOS and Android alike.
  • Jul 2026Offline reading of the last snapshot. A service worker caches the shell and the last successful data pull, so opening the app with no signal still shows the last good reading instead of a blank screen. Sign-in and owner-only routes are never cached — those always hit the network.

06 diagnose, not just detect

Planned

The post-deploy smoke test currently reports healthy or stale, nothing more. Teaching it to tell a dead owner token apart from a WHOOP outage or a rate limit means whoever's debugging starts from the actual cause instead of the same first guess every time. No new service, no new API key, just sharper logic in a script that already runs — the smallest lift of this batch.

A failed check that says what's wrong, not just that something is.

07 Today's Call, written daily

Planned

Phase 03 made the same rule-based Today's Call read more of the week. This goes further: with ANTHROPIC_API_KEY finally in place, a daily job could have a model read the week in context and write the call itself, falling back to the tested deterministic version if that call fails. The same direction Phase 03 considered and set aside for lack of a key — the fallback it built is exactly what makes this safe to try now.

A call that reasons about the week, not one that reads it off a fixed table.

08 ask your data

Planned

A small function that answers a plain question against the last 180 days, instead of only offering fixed charts to interpret. Same data already in the snapshot; a new endpoint and a bit of interface on top, kept owner-only at first to keep the cost of an open-ended question bounded.

Ask "how does this month compare to last spring" and get an answer, not a chart.

09 nudges, not just numbers

Planned

Everything today is pull: open the dashboard to learn anything. A scheduled job could watch the same signals Today's Call already flags — a sliding recovery trend, a missing rest day — and only reach out when one actually trips. Needs a delivery channel this project doesn't have yet, most likely email, which is the main reason it sits here rather than earlier.

Hear about it when it matters, instead of finding out on the next visit.

10 athlete data, kept current

Planned

The pro athlete snapshot is hand-maintained: updated whenever WHOOP publishes something new, if someone remembers to check. A standing job could watch for newly published season data and draft the update itself. The least certain item in this batch — WHOOP's press page isn't a formal feed, so this depends on parsing something that could change shape without notice.

One less thing to remember, once it's proven reliable enough to trust unwatched.

11 an editing pass

Planned

The design review cadence's second pass (weighted toward an outside read this time, see maintenance.md) found the visual system itself solid: no locked-rule violations, no pulsing metrics, a page that finally reads as one coherent product rather than several. Its conclusion was that the next move isn't more design, it's restraint — editing down what's already built rather than adding to it.

A product that trusts the person reading it to fill in the gaps, instead of narrating every section and every choice.

Already in place
  • Jul 2026Priority 1, tightened vertical density. Section gaps, card padding, and heading margins cut roughly 12–15% site-wide (desktop and mobile), so more fits above the fold without touching the editorial feel.
Still to do
  • Priority 2Let Today's Call dominate. Bigger type, more whitespace, so it reads as the actual product instead of competing with the strain and sleep pills next to it.
  • Priority 3Cut secondary-label noise. Remove roughly a fifth of small uppercase meta labels ("insights from last 7 days," "seasonal data," and similar) that add texture without adding information.
  • Priority 4Darken supporting copy. Timestamps, captions, chart annotations, and source notes sit right at the edge of comfortable contrast; darken by one step.
  • Priority 5Differentiate section rhythm. Most sections open the same way (headline, thin divider, cards); after five or six repeats the eye stops noticing the pattern. Give narrative, metrics, and chart sections each a distinct opening treatment.
  • Priority 6Simplify chart legends. Lighter, closer to the chart, fewer words — the charts themselves are strong, the legends read a step behind them.
  • Priority 7Trim implementation-heavy prose. About, Roadmap, and Guide have drifted toward explaining every build decision. Cut roughly a fifth of it; let confidence come from omission now that the system has earned trust.
  • Gut-checkReal-device outdoor sunlight test. Confirm captions, axes, and metadata stay legible on a phone at full brightness outdoors — this palette's real risk is perceived contrast in bright light, not accessibility compliance.

12 the public refresh, checked

Live

Audited alongside the edit-key work on the sibling sites: the dashboard's own "Refresh" button is deliberately open to anyone with the link, no sign-in required, so at first glance it looked like the same kind of gap. It isn't — it's already throttled to once every 5 minutes, timed off the snapshot's own lastUpdated rather than per-visitor, so mashing the button can't burn through WHOOP's rate limit or spam the shared snapshot no matter who's clicking it. That's the right shape of protection for a low-stakes, non-destructive write (worst case was ever an early refresh, never lost data), so no edit key was added here — it would only add friction without closing a real gap.

Already can't be abused by a shared link, without needing a passphrase to use the one button on the page that writes something.

Phases are sequential. A later phase is never started early, and nothing is added to an earlier phase just because it would be easy to slot in. Phases 06–10 are ordered by ease of implementation, not by impact or interest — that's a separate conversation whenever one of them is ready to move from planned to active. The pro athlete snapshot and the design review cadence above are the deliberate exceptions to the sequencing rule itself: neither is a phase with an end state, they're a standalone feature gated on real data existing at all, and a standing practice repeated on its own cadence.

The Fitness Log · Built with Claude · Data from WHOOP