
Problem
Most fitness apps want an account before they will count a rep. That is a bad trade for daily bodyweight work, where the whole habit is doing a small amount often and the only thing that matters is that you showed up.
Local-first is not a feature preference here, it is the thing that makes it usable. This training happens in a yard or a corridor, which is exactly where signal runs out. An app that needs a round trip to record thirty seconds of skipping is an app that loses the record.
Process
Everything lives in local storage under a set of named keys, start date, history, daily progress, weight logs, jog logs, timer alerts. No account, no sync, no data leaving the device, and the installable PWA shell with its service worker means the exercise library is there before a connection is.
Daily structure is missions rather than a blank log. Each day has a target with rest timers and interval support, and jogging sits alongside it as its own mode with distance-based tiers. Progress gets a fourteen-day analytics window for sessions and jog volume, and weight gets a trend chart, which is the only part of fitness logging that reliably changes behaviour over months.
The AI workout generator has a local fallback and only reaches for an API key when one is supplied, so the core loop does not depend on a network call or a paid tier. Plans can be exported, imported and shared as URLs, which makes a routine portable without making an account mandatory.
Vite and JavaScript, no framework. The app is one bundle and a JSON payload, so there was nothing to be gained from a runtime heavier than the problem.
Result
Free, MIT licensed, and public on GitHub. It runs as an installable PWA, builds to a static bundle that deploys to any static host, and keeps a full fourteen-day history with no account and no connection.