Fine. No-status lands here too, because the state the watch sits in before it has history shouldn’t look like a fault.
Olive drab · #94A06B → #5F6947 → #323829 → #070806
A side project in Monkey C. Sketched it in a notebook, built it as Clay, liked the layout but not the colours, and rebuilt it as Recon.
Nine warm ramps, one per training status, and a sky dial painted from real sunrise and sunset times.
Same baselines to the pixel. Three signals instead of nine ramps, and the sky dial deleted.
My old face had four numbers I kept swiping to find and a dozen I never looked at. I plan this kind of thing on paper now, away from the computer. Agentic coding goes much better when I sit down already knowing exactly what I want and how to get there, so the agent is implementing decisions instead of making them.
Training status is marked most important on the page. The other three are the ones I check without thinking.
Circled on the page. Sunrise and sunset get an arc of their own rather than a line of text.
No, unless the arc includes 24 hours, but we only want 12. Written at the bottom of the page before the build, and it held.
An arc for the goal you are chasing, an arc for the light you have left, and the time in the middle.
The paper held. The only thing that moved was the row order: the sketch had steps in the middle, the face puts heart rate, body battery, steps.
The sketch, built as drawn. Nine training statuses, so nine warm ramps, plus a sky dial at six o’clock painted from real sunrise and sunset times.
Same information, same layout, rebuilt as an instrument panel · the one I actually wear
Clay worked, but nine colours was too many. So the second one keeps every baseline from the first, since the layout was the part I liked, and swaps everything drawn into it: condensed DIN instead of a humanist face, tabular figures so the clock stops reshuffling, 120 flat graduations instead of a gradient arc, and the printed sun time instead of the painted dial.
It is a separate app rather than a setting inside Clay, for a boring reason: a sideloaded build gets no settings screen, so a layout toggle would mean reinstalling every time I wanted to switch. Two apps, both on the watch, swapped from the watch menu.
Nine colours can’t answer “is anything wrong?” at a glance. Three can. The status word under the time still says which one it is.
Fine. No-status lands here too, because the state the watch sits in before it has history shouldn’t look like a fault.
Olive drab · #94A06B → #5F6947 → #323829 → #070806
Idling on purpose. Unproductive sits here, not in warning: it means change something, not stop.
Warm sand · #9A8E70 → #635B47 → #343026 → #080706
Past a limit. Two statuses and no others, or red stops meaning anything.
Cool gunmetal · #7E8A92 → #4E575D → #2B3034 → #06080A
Standby was a pale olive first. Same colour as the graduations, to the eye, so on standby days the gauge just stopped reading. Steel fixed it.
| Clay | Recon | |
|---|---|---|
| Typeface | Calibri, soft humanist | Bahnschrift, Windows’ cut of DIN 1451 |
| Figures | Proportional | Tabular, so the clock never reshuffles |
| Clock | Follows the device 12/24 setting | Always 24-hour, zero-padded |
| Step gauge | One arc, rounded caps, gradient | 120 square graduations, flat fill |
| Sun | A dial painted as the sky | The time it happens, printed |
| Palette | Nine warm ramps | Three signals |
| Furniture | None | A corner reticle, one hairline |
Measured in the simulator on the worst case: strained, 160% of goal, all four font sheets loaded.
16.4KB
peak memory, of about 124KB
Memory is the real constraint on a watch face, not CPU. Clay peaked at 25.4KB.
~5×
faster frame than Clay
Clay’s sky dial was ~147 filled circles and about two thirds of its frame. Recon’s whole bezel is 120 line draws.
11
glyphs in the time font
Garmin ships no typeface worth using, so both faces subset a system font to a bitmap font. 0123456789: and nothing else.
It reports no steps and no training status, and it keeps its own copy of your settings. Every screenshot here was made by hardcoding the state, building, shooting, and reverting.
No shell can copy to the watch; it has to go through the Windows shell object. An empty apps folder is what success looks like, because the watch eats the file on disconnect.
All ten need one top and one bottom. Candara was out because its 7 descends. And a subset draws a missing glyph as a tofu box, so the glyph set has to be exact.
Ask for a single sample and you get an iterator that reports valid and yields nothing. And walk deep on heart rate, because the newest entries are usually an invalid-sample marker.