Why I built it
I wanted fitness software I own and can keep changing as I use it. Be Better is personal software: it runs on my Mac, my phone reaches it over Tailscale, and when something doesn't fit how I train, I change the code. It's public so others can see how it's put together or fork their own.
Snap a photo and it's logged
Not every workout syncs — the treadmill at the gym, a spin bike, a rower. Instead of typing numbers, I photograph the summary screen and a model reads it into a strict workout schema: sport, time, duration, distance, pace, heart rate, power, elevation, and cadence. Several photos of one session become one draft, files from any device go through the same review card, and a photo taken with no signal waits in an outbox until the app reconnects.
If the same workout also arrives as a FIT file or from Intervals.icu, it attaches to the existing entry instead of counting twice.
A coach that can't go rogue
The coach runs through OpenAI's Codex app-server on my existing ChatGPT plan, with sign-in by device code and no token ever reaching the browser or the database. It gets an empty working directory, read-only files, no network, no shell, and only the app's own typed tools. The same tools work with an OpenAI or Anthropic API key.
There's no vector database or hidden memory. Each conversation gets a fresh, bounded summary built from the SQLite training log, so what the coach knows is exactly what I can see and edit.
How it runs
One Hono process serves the API and the built PWA, and the whole log is a single SQLite file next to its original uploads, so a backup is a copy of both. Accepted sessions export to calendars, FIT workouts, and Zwift files.