How it's built

Six scheduled Claude agents, each owning one job, coordinating through Notion. Nothing reaches the athlete's phone except through a worker that enforces the rules in code.

Data
NotionAthlete File · training log · dashboard
Google Calendarevery session and rest day
agents read ↓ · two write back ↑
Agents
Daily plannereveningprograms tomorrow from the file + 14 days of logs
Retry+5 hrsre-runs if the primary failed
Calendar syncnightly ↑writes sessions to the calendar
File updateSun ↑rescans the week, updates PRs and the block clock
Block debrief5 wkscloses out each training block
every plan POSTs to the worker. agents can't message the athlete directly ↓
Worker
Gates, in codePR-window date check · duplicate and late-delivery rejection · spend limits
only what passes gets sent ↓
Athlete
Telegramthe evening briefing
Notion worksheetedited at the gym. It becomes tomorrow's history. ↺

Grounding over prompting. The planner works from an Athlete File: profile, working weights, injury state, current training block. A second agent keeps that file current by rescanning the logs weekly. The daily calendar sync exists so the planner always knows what day it is and what was actually trained.

The model proposes, code disposes. Safety-relevant rules are not trusted to the model. A deterministic worker re-checks PR timing against dated windows, rejects duplicate or late deliveries, and caps spend. If a plan violates a rule, the flag is stripped before anything is sent.

The demo on the front page runs the same programming rules against a generic profile. Its 80 input combinations are pregenerated, so the demo has zero moving parts.

stack: Claude scheduled agents · Notion · Cloudflare Workers · Telegram · Vercel