He watches the clock. The camera stays here.
The camera is on only during a set.
Frames are scored in the overlay and thrown away. Nothing is stored, nothing is sent, there is no clip. Refuse it and nothing counts. No screen capture. No file contents.
The hook sends a tool name and a timestamp.
That is the entire payload: which tool ran, in which session, when. Not the prompt, not the arguments, not the file paths, not the diff.
Your reps live on your machine.
The desktop app keeps everything in a local SQLite file and works offline forever. If you never sign in, nothing leaves the machine at all.
If you do sign in, only daily totals sync.
Reps, sets and minutes converted — per day, in aggregate. Never a tool name, never a project path, never a timestamp precise enough to reconstruct your working day. The handle you pick at /pair is the name on the weekly league. Settings does not store an X account.
Email is the only personal data on this site.
One launch email and one reminder if your pre-season streak dies. No list rental, no drip sequence. Every send carries a link that deletes your row outright — not just unsubscribes it.
There is no cookie banner because there are no tracking cookies.
Two first-party cookies exist and both are functional: one remembers who referred you so the credit lands, one remembers your handle so your round moves your own position. No third-party analytics is in the path.
The data lives on a machine we rent, in a country we chose.
Self-hosted Postgres on a single VPS behind Cloudflare. Payments are handled by Stripe's hosted checkout, so no card details ever touch our box.
Deleting means deleting.
One request removes the waitlist row, every round attached to it, and the referral code. There is no soft-delete column and no thirty-day grace period.