Fitness · Phone app · Side project
Aether: a strength-training app with no App Store and no subscription
Workout logging and well-known training programs in one free app. It installs from Safari, works offline and keeps its data on the phone.




What it is
Aether combines the logging of an app like Hevy with the structured programs of an app like Boostcamp. During a workout it shows what you did last time and pre-fills today’s target, so most sets are one tap. It times rest, does the plate math, and spots personal records as they happen.
It carries twelve well-known programs, including GZCLP, 5/3/1 and the Reddit PPL, and moves the weights up automatically by each program’s own rules. It imports Hevy history and backs everything up to a single file.
Why I built it
I was logging in one app and following a program in another, and paying for both. I wanted one app that did exactly what I use, nothing more, and that kept my data on my phone.
How it was built
Claude Code built the first version as a native iPhone app. The Claude session ran in the cloud and couldn’t open an iPhone, so the automated build was set up to compile the app on a Mac, launch it in Apple’s iPhone simulator, take screenshots and post them back where Claude could read them. That let it see its own work and fix what looked wrong.
Then I switched it to a web app you add to the home screen. It looks and works like an app, runs offline, and needs no Apple developer account, which costs $99 a year.
The stack
App
- React
- TypeScript
- Vite
- Progressive web appInstalls from Safari to the home screen and works offline, through a service worker
- ZustandApp state
- ImmerImmutable updates to that state
- IndexedDBOn-device storage, with room for years of workouts
The first, native version
- Swift and SwiftUIThe original iPhone app
- Xcode and the iOS SimulatorCompiled on a Mac in CI, then run in the simulator for screenshots
Quality and delivery
- VitestUnit tests for the coaching logic
- PlaywrightEnd-to-end flows in a phone-sized browser
- GitHub ActionsType checks, tests, a build and the browser flows on every push
- Claude CodeWrote the code, in cloud sessions
Technical decisions
- 1A home-screen web app instead of a native one. The SwiftUI version felt right, but putting it on my phone meant Apple code signing or a $99-a-year developer account. A progressive web app installs from Safari, works offline and costs nothing. It gives up lock-screen notifications and haptics.
- 2Data stays on the phone, in IndexedDB rather than localStorage, which only holds a few megabytes. The app asks the browser not to clear it. The cost is that backups are my job, so a backup is one JSON file, and the app reminds me when the last one is more than a week old.
- 3Coaching logic apart from the screens. Progression rules, one-rep-max estimates, plate math, the Hevy importer and backups are plain TypeScript with unit tests, so the coaching can be tested without a browser and the screens can change freely.
- 4Programs as data. The twelve programs and 258 exercises are JSON, run by one tested engine instead of twelve copies of similar logic.
What I learned
If the AI can’t see the result, give it a way to. The screenshot loop turned “it compiles” into “it looks right”.
Platform costs are product decisions too. Moving to a home-screen web app gave up lock-screen notifications and haptics, and removed the yearly fee and the signing hassle. For an app only I use, that was the right trade.
Results
- Built
- October 2026, over three days
- Training programs
- 12
- Exercises in the catalog
- 258
- Cost to run
- $0
How it gets built
The pipeline I build with, and the rules behind it, are on How I build with AI.