writing / post

Personal software, again

I asked Claude one question about my Hevy data, and three days later I had paid Apple again and owned an iPhone PT coach called Durandal.

published
2026-11-03
reading
07 min

One innocent question

It started, as these things do, with a small and reasonable question. I log every workout in Hevy. I have done that for about two years, so there are 307 workouts in there. I wanted to know if Claude could read them and tell me what to change.

So I asked Claude to build a local MCP server for the Hevy API. It did: hevy-local-mcp runs on my laptop over stdio, the key stays in my local config, and it only talks to api.hevyapp.com. Ten minutes later Claude was reading my log and making polite remarks about my leg days. Fair. Painful, but fair.

That should have been the end. It was a Sunday morning project, done before breakfast.

Meanwhile, the camera

The same weekend, I got annoyed at my Fujifilm X-T30 II. Not the camera: the camera is great. Its phone app is the problem. Recipes, geotags, the whole companion experience felt like it was designed by a committee that never met a photographer.

So I had Claude build resync: recipes over USB-C, location and time sync over Bluetooth LE, in my own design system. Is it a great app? I do not care, choom. It is mine. It does exactly the four things I want, and it does them in monospace. I was satisfied the moment it ran, which is a feeling no App Store app has ever given me.

The sickness returns

And that is where the old disease came back. You know the one. "Personal software": the idea that software can be made for an audience of one, like a sweater your grandmother knitted. I have had this idea before, and I always let it go, because a whole app for one person cost months of evenings.

That math is different now. I do not type the code. I describe what I want and decide what is good enough.

So I bought the Apple Developer license. Again. Yes, again. Apple and I have a pattern: I pay $99, I promise I will ship something this time, and then life happens. This time I had a plan, and the plan was "let Claude build personal software for me, and start with the data I already have": Hevy and Apple Health.

Durandal

the blade, rampant
Durandal's app icon: a pixel sword pointing up, bone on black.

Durandal is an iPhone PT coach. It is named after Roland's sword, because when you name your own app you get to be dramatic.

It plans my training in 7-week cycles: six build weeks and a light week 7, push, pull, legs, upper, lower, and an optional active recovery Saturday. It writes the routines into Hevy, but only after I confirm a diff, and it never writes or deletes workouts. It reads Apple Health (read only) for sleep, HRV, resting heart rate and steps. When I ask, it gives me today's briefing, a review of my last workout, or a plan to improve the cycle, through the Claude API with my own key.

Who talks to whomdiagram

The coach coaches from one skill file, my training plan and my check-in log. Nothing else. It cannot invent a philosophy. It cannot sell me protein powder.

~/today
Durandal's today tab: the logged pull session with 16 of 16 working sets, then today so far with a timeline and steps.
~/train/cycle
The cycle page: week 1 of 7, the check-in button and the cycle grid of push, pull, legs, upper, lower and recovery days.
~/train/lifts
The lifts page: 16 lifts with their estimated one-rep max in kilograms and the change this cycle.
~/coach
The coach tab: the red brief me button, review and improve rows, and a field to ask the coach.
~/sources
The sources page: the Hevy and Claude API key fields, both missing in this offline simulator run, and 307 workouts since 2024-08-04.
~/sources/motion
The motion lab: test panels for screen, switcher and presence timings in milliseconds.

The one red button is brief me. The site has a rule: red is for the primary action and for faults, and nothing else. The app follows the same rule, because it uses the same design system. More on that below.

Seventy-two hours

Here is the part that still makes me laugh. This is not a year of side-project evenings. This is a Sunday, a Monday and most of a Tuesday.

timeline · November 2026text
sun 1   the Hevy MCP server; a weekend active recovery routine;
        resync for the camera; a training log on the homepage;
        a review of my PT routine
mon 2   Durandal, the first build; Apple Health;
        the dashboard design starts
tue 3   the app icon; the dashboard redesign in 3 phases;
        the screens move to a design canvas; on-device AI research;
        the daily activity summary with route maps;
        the focus pass; the motion and haptics pass

Some highlights, in order of how much they surprised me:

  • The dashboard redesign shipped in three phases: health, fitness, vitals. Each phase was its own PR with its own review. I reviewed design decisions, not code.
  • The daily activity summary shows every day from Hevy and Apple Health together, with routes drawn on a Mapbox map in the site's own map style. The route is drawn on the phone over the tiles, so Mapbox only knows which tiles I asked for.
  • The focus pass cut the app down to four tabs: today, train, body, coach. Vitals moved under body. Today now follows the day: before the session, during it, after it. Sunday is the week in review.
  • The app icon is a sword, rampant. I asked for "the blade", and I got the blade.

Design on a canvas, parts on the site

The screens did not start in Xcode. They started as frames on a doop canvas, where I could look at them, comment on them, and say "no, smaller" in a place that was not a pull request.

The parts then went back into this site. The design system on /system now has a native section: the parts of resync, Durandal and terminal home, drawn at device size. The metric tiles, the daily bars, the sleep hypnogram and the cycle grid each say which app file they mirror. The tokens flow the other way: pnpm tokens writes Tokens.swift from this site's CSS, so the app and the site cannot drift apart without a failing check.

Making the robot watch itself

The last pass was motion and haptics. This is where it got properly nerdy.

Tuning motion by hand on a phone is slow. You tap, you squint, you say "hmm, a bit faster", you rebuild. So Claude wrote a script for itself. motion-capture.sh builds the app for the simulator, seeds it with my real data from the phone, launches it offline (no keys, no network, no Hevy, no Health, no Claude), and walks a fixed tour of every tab and page. It records the screen at 60 fps and then measures every burst of motion: where it starts, where the cut lands, when it settles, how many frames dropped.

Then it changes a timing, runs the tour again, and compares. The robot watches its own animations and grades them. The last run settled at a median of 546 ms. I am told the hitches are being dealt with.

These two clips are from that recording, from my own data. The keys are missing on purpose: offline mode.

train · cycle, lifts, log
coach, today, sources

The motion is stepped, like the rest of the site: no springs, no bounce. Panels leave, and then the next ones enter, in order. It feels like a terminal that is trying its best.

Can the coach live on the phone?

The next question was obvious: does the coach need the cloud at all? iOS 27 has Apple's on-device model, and my iPhone 18 Pro gets the bigger one.

The short answer is "not all of it". A full check-in reads the skill, the plan and 30-plus workouts. That is about 8K to 15K tokens, and the on-device context window is smaller than that. It also needs judgment, and judgment is where small models get creative in the bad way.

So the plan is a hybrid. Claude keeps the briefings and anything that writes routines to Hevy. The phone takes the small jobs: short notes, offline fallbacks, pulling numbers out of the log. One Foundation Models session can run on either, so the app does not need to care which brain answers.

Oh yeah?! Now what

Health and Hevy were the first steps. The idea was never "a fitness app". The idea is a copilot for my own life, built from my own data, that answers to me and nobody else. Something like those assistant bots everyone is building, but it lives in my pocket and it knows my squat.

Next, probably, home appliance controls. Then the TV, somehow, which lines up suspiciously well with terminal home, my Android TV launcher that already speaks the same design system.

I do not know where this ends. I paid Apple again, so it has to go somewhere. Ask me in a week. Durandal will have an opinion about my sleep by then, and it will be right.