Connecting a watch
Iron U needs two things from your training: how long you went, and how hard. The second one is heart rate, and where it comes from depends on your watch.
Apple Watch, or any watch that writes to Apple Health
The simplest path. Settings → Data sources → Apple Health → Allow. Iron U asks to read workouts with their heart-rate and distance samples, heart rate, heart-rate variability, resting heart rate, VO2 max, steps, body mass and sleep. It asks for no permission to write, so it cannot change anything in Health.
If a screen says there is no data, that is what it means. iOS does not tell an app whether a read was refused, so Iron U never claims to be connected — it shows you what actually arrived.
Garmin, Wahoo, Coros, Polar
These watches do sync to Apple Health, but Health carries only the highest and lowest heart rate of a workout, not the beat-by-beat record. That is a limit of Garmin Connect and Health, not of Iron U, and without the full record nothing can tell an easy session from a hard one.
The fix is a Strava connection, and it is not in this build: the Strava row in Data sources says "coming" and does nothing yet. Until it lands, these watches reach Iron U through Health with the limit above, or through the Garmin path below.
Garmin, direct, on your own Mac
Everything Garmin records — including Body Battery, sleep detail and daily metrics — through a small program that runs on your own computer. It is a power-user path and it needs a Mac that is awake.
- Ask us for the agent — dev@fafutur.com; it is not published yet — then install Python 3.13 or newer and put the agent in a virtual environment at
~/.ironu/venv. - Log in to Garmin once, by hand, with
garth.login(). You type your Garmin email and password into your own computer, never into Iron U. The session is saved in~/.garmin_tokenson that machine and never leaves it. When it expires the agent stops and tells you to run that line again; it will not log in for you. - Run
ironu-agent authand sign in to Iron U. That stores an ordinary user session — the same kind the app uses — in a file only you can read. It can write your own rows and nothing else. - Run
./install-launchd.shwith your~/.ironu/envloaded. It installs two background jobs: a sync every half hour, and a short poll for new activities. - Check Settings → Data sources. It shows the time of the last successful sync.
The agent uses your own account and can only write your own rows. It cannot read anyone else's. When the Mac is asleep, nothing syncs, and the app says the data is old rather than pretending it is current.
Questions people ask
Why 152?
152 is one athlete's number, not a universal one. Your easy ceiling is worked out from the maximum and resting heart rate you entered, using the Karvonen method: the top of zone 2 in your own heart-rate reserve. If you did not enter a maximum, it is estimated from your age, which can be ten beats out in either direction.
Two things about that number matter more than its value:
- It is a ceiling, not a band. There is no lower limit on an easy run. Walking is not too easy.
- An easy ride has no heart-rate target at all. A flat road cannot lift heart rate, and a floor would just make you sprint away from every traffic light.
What is a gate?
A distance you have to be able to cover in one session by a certain date, working back from your race. Yours might be 400 m in one swim, then 750 m, then 1500 m; 40 km in one ride, then 70 km, then 90 km.
Gates exist instead of a streak counter. A streak breaks once and then the app gets deleted. A gate does not care that you missed Tuesday — it asks whether you can cover the distance, and it is still there next week.
The label says what is actually measured. "400 m in one swim" means the longest single swim recorded, because whether you stopped at the wall is not something your watch tells us.
Why does the app hold back sea swims until I own a tow float?
Because a bright orange float makes you visible to boats and gives you something to hold on to if you need it, and because the alternative is an app that sends a beginner into open water without one.
It is a checklist item on your timeline, not a purchase we can verify. Tick it once you have one and the sea appears in your options. Until then Iron U offers pool swims and a dry-land shoulder routine instead.
The app also holds a sea swim back when the forecast has no swimmable day in the coming week. It never means the water is safe — see the terms. Never swim alone.
Why does the morning notification arrive when it does?
It follows your wake time. If your watch has recorded your sleep, Iron U takes the average time you woke over the last seven nights and adds fifteen minutes, so the notification is waiting when you are actually out of bed. With no sleep data it falls back to 08:00. You can set a fixed time instead in Settings → Notifications.
The evening summary is at 21:00 by default.
Every notification is built and scheduled on your phone by iOS. Nothing is pushed from a server, which is also why they keep working with no signal.
What is the US$5 allowance?
Photographing a meal, the sentence written under a session, and the coach all cost money to run, because each one calls an OpenAI model. Every account gets US$5 of that on our key. The app shows how much of it you have used.
When it runs out, those features stop and everything else keeps working — your plan, your sessions, the debrief numbers, the gates, the course. To carry on, add your own OpenAI key in Settings → AI. It is stored encrypted on the server, never sent back to any app, and you can remove it whenever you like. After that you are billed by OpenAI, not by us, and our key is never used for you.
Can I delete everything?
Yes. Settings → Delete account, one confirmation, and every row and every photo goes with the account. Deleting a single meal or drink deletes its photograph too.
Is this medical advice?
No. See the medical disclaimer. See a doctor before you start, and stop training if you have chest pain, feel faint, or become breathless in a new way.
Contact
dev@fafutur.com, or the feedback button in the TestFlight app.