The map that grew a third dimension
Runara now draws its own trail maps from OpenStreetMap data and replays your runs through real 3D terrain and buildings, all rendered on your iPhone. How a privacy-first app ended up with its own planet.

The build log has been quiet for a while, and the version number has not: since the last post, Runara went from 1.1.1 to 1.6. Screen styles happened in there, the five design languages a watch screen can wear now, and the configurator became a gallery of live previews. Those updates felt like the app becoming more itself. The last two months were something else. The last two months, the map grew a third dimension, and Runara quietly stopped borrowing anyone else's cartography.
My own planet, apparently
Offline maps have been in Runara since May: frame a region on the iPhone, export the tiles, and the watch renders them itself in the middle of nowhere. The tiles came from Apple Maps, which is a fine map of roads that happens to also contain mountains. The screens I actually stare at mid-workout are forest trails, and on a general-purpose map a forest trail is a faint grey afterthought.
So Runara now has its own map. It is called OSM Outdoor, it is built from OpenStreetMap data, and it is a trail map first: hiking paths and tracks drawn as dashed amber lines you can read at a glance, hillshade so the terrain has shape, landcover so a forest looks like a forest, peaks and mountain huts labeled, because those are the landmarks that matter when you are up there. The style is dark, like everything in this app, and the volt route line sits on top of it like it was always meant to.
The part I did not expect when I started: to render a map style yourself, you need the planet. There is now a Protomaps build of the entire world's OpenStreetMap data, plus an elevation mirror for the hillshade, sitting in an object-storage bucket that the app reads over plain HTTP range requests. No tile server, no API, no per-request anything, just static files and math. The iPhone pulls the vector data for your framed region, renders the cartography itself, and ships the finished tiles to the watch over the same local pipeline as before. Your watch never talks to the bucket. Your workouts still never talk to anything.
Choosing a map source per region is there if you want it, Apple Maps did not go anywhere. But OSM Outdoor is the default now, and two settings shipped alongside because real use demanded them: the watch now renders every map surface from your downloaded bundles by default instead of streaming when it happens to have connectivity, which means the cartography stops flickering between two styles mid-run and the battery stops paying for a stream you did not ask for. And when your old regions came from the other source, one tap re-exports them all into your preferred map and swaps them on the watch in place. The zoom-level steppers in the export sheet are gone too. Every export now just covers the full detail range. Nobody should have to reason about zoom levels while planning a trail run.
The flyover gets real terrain
The 3D flyover has been my favorite feature since it shipped: a chase camera flying your recorded route while a dot re-runs the workout. But its third dimension was always someone else's, whatever the platform map felt like drawing that day. This release rebuilt it from the ground, literally up.
feat(flyover): OSM 3D - true SceneKit terrain engine with real buildings
The new OSM 3D style builds the scene itself: real terrain meshes from elevation data, so ridgelines rise and fall and actually occlude the route behind them; the OSM Outdoor cartography baked onto the terrain as its skin; and buildings extruded at their real OpenStreetMap heights, decoded from raw vector tiles, triangulated roof by roof. Your route is a ribbon draped over all of it, colored by heart rate or pace or climb, revealed meter by meter as the dot advances. Fly a run through your city and the blocks you ran between stand up around you. Fly a ridge line and the mountain is just there, in the right shape, because it is built from the same elevation data the hillshade reads.
And because the terrain engine does not care what its skin is, there is a second new style for free: Satellite 3D drapes satellite imagery over the same meshes and the same buildings. Same flight, same ribbon, photographic ground. A little toggle turns the 3D buildings on and off instantly mid-playback, which sounds minor until you realize it means the engine keeps the meshes warm the whole time.
All of it renders on the iPhone, plays like every other style, and exports through the same video pipeline. And it had bugs, because of course it did. My favorite from the fix pass: every run's warm-up rendered as a grey line, because heart rates below zone 1 fell through the color mapping, and the first kilometre of every run is exactly where your heart rate is below zone 1. The most visible stretch of every single flyover, grey. It is fixed, warm-ups now take the coolest color on the ramp, which is the honest place for "easier than zone 1".
The poster on the fridge
One more sharing thing, small and deliberate. The flyover video ends on a closing card, the route's shape in volt over four numbers. That card can now stand alone: a share button on every workout detail page renders it as a still poster, one tap, no sixty-second export, no flyover required at all. It works for a treadmill session that has no route to fly, because sharing a workout is a property of the workout, not of the replay. It is a PNG the size of a phone screen, and it looks like the app: ink, volt, numbers, parrot.
The small honest rest
Three more things shipped that will never headline anything but change how the app feels daily. Audio cues are configurable per sport now, each workout type can follow your global setup, carry a complete configuration of its own, or stay silent, which exists because pool swims should not talk and long runs maybe should. The training-load chart projects a week past today, a dotted "if you rest" tail, so the question the chart exists to answer, when will I be fresh again, is finally answered by the chart itself instead of by squinting at where the curve seems to be heading. And the day cursor is permanent now, parked on today, with its readout in a proper header instead of floating over the plot.
The co-author line kept evolving too, for those following that thread: parts of this release were built with a Claude model holding a million tokens of context, which for this codebase means the model effectively has the whole app in its head at once. The shape of the collaboration is unchanged from what I wrote in June. It writes more of the code than ever. Deciding that warm-up grey is a bug and not a rendering choice still requires having run with the thing on your wrist.
Out now
Runara 1.6 is on the App Store as a free update. The planet bucket is the first server this project has ever had, so let me be precise about what it is: static map data, read by your iPhone when you export or re-render a region, and by nothing else, at no other time. No account, no analytics, no workout data leaving your devices, same as day one. The mountain gets rendered on your phone, and it stays there.
See you on the trails. They are dashed amber now.
3D Flyover
A chase camera flies your recorded route over 3D terrain and exports a share-ready video, right on the iPhone.
→Offline Maps
Export map tiles on iPhone and the watch keeps mapping your route on the worst trail, no cloud needed.
→Spoken Audio Cues
Optional bilingual voice cues for splits, time, zones and intervals, all generated on-device.
→Training Load
CTL, ATL and TSB charts turn your workouts into a readable picture of fitness, fatigue and form.
→