Kristopher Baker iOS roots · Product systems · AI-assisted workflows
← Domestique

shipped · 2026.05.25 · 2 min read

Two languages, two unit systems

A tool that lives on my own machine should speak my languages and my units, both of them.

So over a few days I made Domestique bilingual and unit-aware. All the app's strings moved into an xcstrings catalog: the views, the status and error messages, the enum labels, the workout and plan and adherence prose, even the labels inside the SpriteKit game. Then a unit-system preference, so distance, elevation, speed, and weight render in metric or imperial, with a separate toggle for energy in kJ or kcal. The kJ to kcal conversion even does the real division by 4.184 now, instead of the 1:1 stub I had been getting away with.

The same stretch loosened some hard requirements. Garmin sign-in is now optional rather than the front door: you can run the app Strava-only, and the toolbar sync and status pill respect that. The ramp test got smarter too, auto-ending when I fail to hold the step and showing the estimated FTP right there in the cooldown, with per-step coaching cues that no longer overlap.

None of this is glamorous. It is the layer that decides whether the app feels built for me or merely adapted to me, and living between two countries, I notice the difference.