Nunc: why I built my own fitness stack
2026 is, arguably, the year of AI. The first full year when one could really point it at a task, and see results. I’ve built three pieces with Claude Code this year: īmago, an Instagram-like service for friends; Infusor, a coffee recipe platform (give it a photo of a bag of coffee, and it’ll pick the optimum brewer from your library and give you the correct grind settings for your grinder), and Nunc.
Nunc is my interface to my health, showing me the trend for my last 10 days of heart-rate variance, resting heart rate, body temperature, and SpO2 (I'm not convinced by the accuracy of the SpO2 data, but it matches Whoop).

Additionally, I’ve taken my favourite metric from Garmin, Body Battery, and re-invented it as Vigor Vitæ. This is a basic charge/drain mechanism, similar to Resources on a Suunto and other platforms, that charges when at rest, and drains differently depending on HR (and HRV-inferred stress clusters) during the day, shown in the header graphic.
On another tab, we have exercise-focussed data: my running critical power, and a matching running workout for my training readiness. Further down, there’s a swimming workout.

But, why?
Simply, every fitness stack has quirks that annoyed me. Garmin cannot understand swimming, or the effect of a weight session: they’ll dismiss an exhausting swimming workout, or recommend a high intensity interval workout the day after a heavy leg session at the gym, despite recording exactly which exercises I did, and at what load. Garmin has also been inaccurate at tracking swimming distances in the pool, with their support basically telling me ‘you’re too fast’ (I’m really not, cruising up and down at 1:46/100m or so). Suunto, much as I have a special place for them in my psyche, is OK as a data recording device, within limited criteria. Stryd is great, as long as you only run. Form is great, but, same as Stryd, has no visibility outside of your swimming session.
TL;DR I like swimming, running, cycling, lifting, and climbing, and appreciate a structured workout here and there to keep things interesting. No platform that I’ve tried has been able to track this load, and suggest a sensible workout the next day.
How?
At the core of it, I wanted a device that had a long battery life, and could basically be forgotten. Despite it having accuracy issues, cost issues, environmental issues… I picked a second-hand Whoop strap to deliver overall health telemetry. The data from this device drives the metrics on the first two slides, and influences workout selection on the third.
Go on…
Whoop strap, like almost everything else in sports tech, is a bunch of off-the-shelf components transmitting over Bluetooth. All you have to do is learn how it talks, parse the data, and voilà!
At least that’s how it was with the v4 strap: it was really easy to retrieve data from the stream and play it back in a meaningful way, but I was greedy. I wanted a 10-14 day battery life, and the 5 offered that. In order to have my cake and eat it, I had to:
- Understand the data as the strap presents it.
- Develop my own HRV algo.
- Build an app to interact with the strap (Nunc).
- Build a data warehouse to house it (Promus, although really the app runs on its own, I just like having all of my data in a DB).
Now I should be clear: I am not a software developer. I am not SRE. I have 20 years of working in IT, with a lot of bash and networking, but no iOS app dev skills or DB skills.
Oh, Claude…
So I learned to express my will in a very clear way for Claude Code to execute. I wanted my app to be better than Whoop's, specifically:
- Perform all calculations on device, ~instantly (with Whoop, you have to wait 2-10m every morning for the overnight analysis.
- Allow for background sync with the strap via Core Bluetooth (with Whoop, it takes a long time from opening the app for data to appear for human consumption).
- Allow for data ingestion from other sources: the accuracy of the Whoop is fine at rest, but, under motion, as one expects from a wrist-worn optical sensor, it loses: basically Whoop is a very expensive garbage in/out machine. Mine must allow me to replace data from the strap with data from - say - my Garmin, or my bike computer, or my Form goggles, so that the overall day picture is accurate.
- Not care about sleep staging. When ‘good’ = 80% accurate, I’m not into it.
I also didn’t want any of my app to have AI dependencies: at the end of the day, workout suggestions are simple maths, and relying on an LLM is both lazy and expensive. - Revive Marco Altini's morning HRV reading concept, using the ECG sensor on the v5, to see how the trend compares to overnight, and how I feel.
Where are we now?
I have a stable app: it ‘just works’. I open it in the morning, confirm my sleep/wake hours, and it shows me my numbers for the day. I switch from the Validus tab to the Exercitatio tab, I can see what kind of workout the machine thinks I should do (and then promptly ignore it because I am a creature of whimsy). When I go ot the gym, I use my other app, Palæstra, to record the lifting session, complete with between-set HRV recovery indicators to time for the optimum window to start the next set. (Palæstra can also sync a Suunto watch instead of the native app, allowing me to choose my own weather source, but, spoilers, sweetie…)
We are harmonised.
I’ll be posting continuing my Vestigator series going into some of the technical details behind the development of Nunc and Palæstra, and one person’s descent into madness in pursuit of sports stack harmony.
NB
I am confident if I published this app in an app store, Whoop would sue the pants off me. They might still do that, but I want to make it clear this is work I undertook for myself, with second-hand hardware, and that any interaction with their infra was governed by the ToS, under my account. At no point was any infrastructure 'hacked', exploited, &c. I do not plan to distribute this app; this is an intellectual exercise for an audience of 1, and perhaps a nudge for Whoop to make a couple of improvements.
I respect the hardware they've built, and if I thought I understood the complexity of sports tech before, goodness to I have an even greater respect for what it takes to deliver reliable data every day.
Comments ()