There are two separate things on your wrist and it is worth keeping them apart. One is the session itself, handed to Apple's own workout scheduler so the watch counts your intervals down for you. The other is a small Trainora app that shows today's plan and two numbers. Neither of them computes anything.
Sending a session, step by stepFrom there the session lives in the watch's own workout experience, scheduled through WorkoutKit: warm-up, intervals with their counts, recoveries, cool-down, counted down for you so that you are not doing arithmetic at threshold. Trainora does not run it and does not record it. Whatever the watch saves goes into Apple Health, and Trainora reads it back from there like any other session — which is the same path a Garmin or a Strava recording takes.
A Trainora prescription is a tree. 6 × (3 min hard / 2 min easy) stays legible as a repeat, and repeats can nest inside repeats. What the watch accepts is flat: one optional warm-up, a list of interval blocks each with a repetition count, one optional cool-down, and one alert per step. Almost everything difficult here comes from that mismatch.
The rule throughout is that whatever does not survive is counted and reported, never dropped in silence. A session whose pace targets quietly did not travel is worse than one that never arrived, because you set off believing the watch will tell you when you are off pace and it will not. These are the real messages, in the app's own words:
3 × (2 × (A/B)) becomes one block of A B A B run three times. Same session, coarser shape.These are de-duplicated by kind rather than listed per step. A session of twelve intervals whose pace was dropped would otherwise produce twelve identical lines, which reads as twelve problems and buries the one that matters.
The watch app itselfOne screen. It shows what the phone last said about today: the session, its planned size, its dominant zone, whether it is the key session — or a rest card, or a plain statement that there is no plan yet and where a plan gets made, since nothing on the watch can create one.
Under that, at most two numbers: fitness and form. They arrive from the phone with the value already removed when the phone was not willing to state it, so nothing on the watch decides what is presentable. There is one confidence ladder and it lives on one side.
The last delivery is kept on the watch, so a session started on a morning run with the phone left at home still shows what was planned rather than a hand-off screen. But a snapshot only describes the day it was built for: past midnight it stops being old and starts being wrong, so it expires and the screen falls back to Open Trainora on your iPhone, with the timestamp of the last thing it heard — As of 18 Aug, 07:12 — rather than implying it is current.
What the watch app cannot doEverything above the scheduling call is verified by tests: the translation, every loss it can report, and the checks against the system's own support predicates — which are not politeness. Attaching an alert the watch refuses does not degrade gracefully; it stops the process dead. That was established by removing the check and watching a test process die rather than fail, which is why the check is there.
The handing-over itself needs a paired watch and cannot be verified on a development machine. It is also the step with no decisions in it. If a session does not arrive, the causes are almost always ordinary: the watch app not installed, the devices out of range, or scheduling permission refused.
Next: limitations — the page I would read first if I were deciding whether to trust this app.
Also in this notebook: the front page, the model, a week worked through, questions, the changelog, support, privacy and terms.
© 2026 Oshi Lab · contact@oshi-messenger.com