There is one engine underneath all of it, and one idea: the watch works out what is possible and hands back a single instruction. Not a dashboard, not a route, not five true numbers the wearer has to combine at threshold — one thing to do next, and a promise about how it ends.
In a city that promise is you will be back where you started, before your dinner. In a race it is you will finish in the time you came for, or the best one still left. The modes differ in what they compute. They do not differ in what they ask of the person wearing them.
Same budget, same trail, same three phases. What changes is what gets drawn on top of them.
One free hour, one unfamiliar city, no route. Missions one at a time, and the way home priced the whole time.
A goal, a plan that is not an even split, and one number: what to run for the next kilometre.
No missions at all. You go where you like; the clock is the only thing holding on to you.
Effort and recovery as missions rather than as a plan. Push, ease, find a hill.
An hour you kept, taken again — and raced, with the goal opening half a minute under your best.
Streets you used last time, carried between hours in the same city. Coarse, capped, thirty days.
Bigger cells, gentler detour, climbs at the centre, and a wider margin — dusk on a hillside is a different kind of late.
The evening you do want the famous things. A separate mode, because a slider between wandering and sightseeing is bad at both.
Half the time is not half the distance: the way home is a straight line and the way out was not. So the budget is computed rather than assumed, once a second, and every mode is downstream of it.
Wandering at 3 m/s a kilometre out, the runner is not told to head home until minute 41 of 60 — eleven minutes past the halfway point a stopwatch would have used.
Same streets, same kilometre, 1.2 m/s. The way home costs twice as much, so exploring ends ten minutes earlier — for the same reason, not by a different rule.
Both figures come out of the app’s own unit test, which drives the real Budget through a simulated hour and reads off the minute each one leaves EXPLORE. Neither number is written anywhere in the source. Stopping counts too: the clock runs while the pace does not, so ten minutes outside a café takes more than ten minutes off the budget. There is no pause button, because time did not pause.
The rule Race Brain is built on, and the one place in FlowMission that does arithmetic a person genuinely could not do while running.
10K, goal 55:00, a minute down at 8 km. Remaining time over remaining distance says thirty seconds a kilometre faster — for the two hardest kilometres of the race. That is how a runner ends up walking at nine.
Against a plan of 5:26. The deficit is spread over what is left and capped at five seconds a kilometre; the rest is let go. Never punish one bad kilometre with another.
Those three figures are the test’s own debug output. The cap is the strategy: 3 sec/km safe, 5 balanced, 8 aggressive — and it drops to zero the moment the effort says the rest of the race cannot afford it, which is a separate test and the one that matters most. The clock is outranked by the body, deliberately and in writing.
A real race settles, controls, works, commits and empties — and halfway through a 5K is the middle of the work while halfway through a marathon is still control. Each phase carries a pace multiplier, and the whole profile is normalised so that running it arrives exactly on the goal. That normalisation is checked by a test rather than by eye.
| Phase | 5K | 10K | Half | Marathon |
|---|---|---|---|---|
| Settle | 0–10% | 0–20% | 0–15% | 0–10% |
| Control | 10–50% | 20–60% | 15–70% | 10–75% |
| Work | 50–80% | 60–80% | 70–88% | 75–90% |
| Commit | 80–92% | 80–90% | 88–96% | 90–97% |
| Empty | 92–100% | 90–100% | 96–100% | 97–100% |
A hill is not a runner running badly, so the target moves with the gradient instead: 16 sec/km per percent of climb, 8 per percent of descent, because uphill costs about twice what downhill gives back. The screen says CLIMB, never TOO SLOW, and the time lost goes into the same spreading machinery as any other deficit.
Every mission the watch can issue offline, in any city, with no signal. One instruction, one quantity, and something the wearer finishes by moving rather than by pressing. The last four are Fitness Mission’s pot; everything above them is Discover City’s.
| Mission | Finishes when |
|---|
Roughly one in four is a wild card with nothing at the end of it, and that is load-bearing rather than filler. If FlowMission only ever navigated between highly rated points of interest it would be a walking-tour app with a worse screen — and nobody tells anyone about the time an app routed them efficiently between two four-star landmarks.
The breadcrumb answers three questions and no others: have I been in this cell, how many have I entered that I had not, and which direction from here has the fewest. One bit per 60-metre cell instead of a point per second — an hour is a couple of hundred bits rather than three and a half thousand points.
The rose is the offline substitute for knowing anything at all about the city, and it is a better one than it sounds: the shape of where you have not been is a real fact about a place even when its name is unknown. West is where HEAD WEST comes from. In EXPLORE TOWARD HOME, the sectors pointing away from the start stop being candidates.
It is deleted at the summary screen. That costs a real feature — the second evening in a city cannot be made better than the first — and the trade is made knowingly rather than quietly.
It is not Garmin LiveTrack and it does not replace it. Connect IQ cannot start LiveTrack, raise Assistance, or send a message — those are system features and no API hands them to an app. What an app can do is make a web request, over the phone or over LTE with no phone anywhere near.
Which is enough for the thing LiveTrack structurally cannot do. A dot has no idea where you were going or when you meant to be back, so it cannot tell anybody you are late. FlowMission knows both — the return point is where START was pressed, and the budget is a continuously computed promise about when you will be back at it.
And the far end alarms on silence, not on an alert. An app that promises to shout for help can only keep that promise while it is working — a flat battery, no signal, a wrist that has stopped moving. Every real emergency is exactly the case where the shout does not happen. So FlowMission does not plan to shout: it says I will be back at 19:47, repeatedly, while it still can, and the far end raises the alarm when 19:47 passes in silence. Absolute, never a countdown — a countdown means nothing once the sending stops, which is the moment it needs to mean something.
Every two minutes, and immediately on three events regardless: setting off, turning for home, and arriving. A failed send backs off — doubling, to a quarter of an hour — rather than retrying into a dead radio. Off by default, inert until the wearer supplies their own endpoint, no identity beyond a random token per activity, and the trail is never sent. There is no FlowMission server.
The frames above are drawn. This one is not: it runs the same rules — the same detour factor, the same recovery caps, the same eight-sector rose, the same one-in-four wild cards — against the twenty-four places far-end/places.js actually returned for central Copenhagen, facts included. Press replay and it gives you a different evening, which is the entire product argument in one button.
It is a re-implementation of the same rules in JavaScript, not the Monkey C itself — the constants are copied from the source and the shape is the same, but the app on the watch is the app on the watch. Every place name and every fact below is real and came out of OpenStreetMap.
One file, no dependencies — anybody who is going to be trusted with knowing where somebody is should be able to read the whole of what they are running.
Overdue and still sending is overdue — somebody is late and you can see it. Overdue and gone quiet is the alarm. It survives its own restart, because a restart at the wrong moment must not clear an alarm that is about to matter.
The page says what it means, too: the time they gave has passed and nothing newer has arrived — it does not mean something is wrong, it means nobody can tell.
The place question had three requirements: coverage of small European cities, a licence permitting caching, and a taxonomy separating historic square from supermarket. OpenStreetMap meets all three, and the third better than anything else — that taxonomy already exists, argued over by people standing in front of the thing.
Verified against Copenhagen: twenty real places, four per category maximum, and facts that are restatements of tags rather than inventions.
Ordered by what unblocks what, rather than by what is most interesting.
A cable and two minutes: app/tools/install.sh builds the release image and copies it into GARMIN/APPS. Three questions the simulator cannot answer — whether the detour factor converges in a real city, whether the fatigue allowance covers the last kilometre, and whether one wild card in four actually feels good on an evening. Blocked on nothing. Nothing below is worth building first.
The receiver is written and works. What is left is deciding where it lives — a box at home, a small VPS, something on the home network — and giving the watch the address. An afternoon and a decision about who is watching, not a build.
Same service, same decision: an address in the watch’s lookupUrl, and the invented side quests become named ones with real facts attached. Blocked on 2, since it is the same box.
The evening you do want the famous things. The engineering is the smallest part: tours are authored, themed and reviewed, and where they come from is a publishing question. Blocked on 3, and a content pipeline.
There is no Connect IQ API that hands an app the elevation profile of the course the watch is following, so LOAD COURSE is named and dark. When there is one, the plan can see the hills before the runner does. Blocked on the platform.
Items 2, 3 and 4, all three. The far end is written and alarms on silence. The place question is answered — OpenStreetMap, verified against Copenhagen. And trails now persist per city, off by default, coarse to five kilometres, three cities, thirty days.
The home-city objection had an answer that needed no rule: where everything is eventually remembered the novelty rose goes flat and the picker falls back to bearings. It degrades into being no help rather than into being an accusation.
A map. The moment there is a line to follow, every mission becomes a suggestion about a route rather than a thing to go and do.
A leaderboard, a streak, a share card. The app has one line of praise and it is Back on time — praise for the app, not the wearer.
A backend that thinks. Race Brain is deterministic and explainable, and that is not a limitation to lift later: an instruction a runner cannot be told the reason for is one they stop following.
Whether an hour of this is actually good.
Everything here is written as though it is, and the only evidence so far is that the idea survived being specified — and then survived being built five times over the same engine.
Step 1 is one evening’s work, and it is worth more than the rest of the list put together.
Four modes run offline — Discover City, Race Brain, Free Ride and Fitness Mission. The engine, the trail, the return budget, the picker, the race plan, the effort model and all fourteen mission kinds are Monkey C, building clean for five devices with no warnings: fēnix 9 Pro 43/47/51 mm and Venu 3 / 3S.
Twenty unit tests pass in the simulator, and the figures on this page are their output rather than illustrations. Release build: 41 KB of code, 11 KB of data. No background service and no store to drain — an adventure only exists while it is being had.
The phone link, Opportunities, Trivia, the tracker and the far end are all written. The watch asks over Bluetooth or LTE, rate-limits itself, and rounds every position to about a hundred metres; far-end/server.js answers, alarms on silence, and looks places up in OpenStreetMap.
What is left is an address. There is no FlowMission server and never will be — the endpoint is the wearer’s own box. Without one, none of it arms and the offline engine carries on exactly as it did. The feature does not degrade; it is absent.
No point of interest is interesting enough to be worth being late for, and no deficit is worth the kilometre that would take it back. Where goals conflict the promise wins silently, by choosing differently — not by warning and carrying on.
So return time is a gate rather than a term: a candidate that cannot be reached and left behind in the time available is removed before anything is scored. A term can be outvoted; this must not be.
It will not optimise. Two FlowMissions from the same hotel should be two different evenings, so the picker draws from what survives its filters rather than taking the best of them — ranking produces the same evening twice.
It will not nag. A finished mission buzzes once, a discovery twice, a phase change twice; in a race, four patterns mean four things and nothing else vibrates. The wearer is outdoors, in traffic, in a city they do not know.