Progress log
What we've been building
Every version of Moveee and what changed in it — updates, fixes and improvements as they ship. Currently on v1.21.36.
v1.19.19
Rides: tempo and threshold blocks are detected as intervals now
2026-07-20- Improved Interval detection on the ride page now catches sustained tempo, sweetspot and threshold work — not just the sharpest peaks. Before, on a hard ride the detector measured 'hard' relative to the rest of the ride, so a long block at threshold became the ride's normal and was missed. It's now capped at a tempo line anchored to your FTP, so any effort held above ~tempo for 15 seconds or more is flagged, however hard the rest of the ride was. A 40-minute 305 W block that showed nothing before is now picked up in full.
v1.19.18
Dev: reloads always serve the latest code
2026-07-20- Fixed In development the browser could keep running an old version of the app's JavaScript after a change, so a plain reload showed no difference until a hard refresh. Development HTML pages are now sent no-store, so every reload picks up the current code.
v1.19.17
Indoor: the sea reaches the coast now
2026-07-20- Fixed On coastal routes the water stopped short of the shoreline, leaving a thin strip of raised land between the sea and the real coast. The sea is classified on an 80 m grid, and a grid square straddling the coast counted as land — so the water fell up to half a square short. It now bites back to the actual coastline, so the sea meets the shore instead of hovering offshore.
v1.19.16
Indoor: more detail and variety on the buildings
2026-07-20- New Procedural buildings wear more relief now, and wear it differently from one another. A raised base course runs along the foot of the wall, grander buildings get raised strips up their corners and a moulding dividing the ground floor from the ones above, pitched roofs get a capping tile down the ridge, and chimneys get a clay pot. What each building wears is decided by what it is — a civic hall or a block of flats comes out with corners and a floor band, while the shed next door stays plainly clad — so a street reads as a mix of buildings rather than one repeated. It all rides on the detail a building already carried, so a fully dressed building is no more expensive to draw than a bare one was.
v1.19.15
Indoor: the drop log is readable now
2026-07-20- Fixed The "why frames dropped" log was cutting its lines off, so you couldn't read the part that mattered. The text is smaller, the panel is wider, and it now scrolls sideways as well as down — so you can drag across and read the full breakdown instead of losing it to an ellipsis.
v1.19.14
Indoor: real bridges and tunnels, built from the map
2026-07-20- New Where the real map says a road is carried on a bridge, you now ride over an actual bridge instead of flat tarmac — with a deck, parapets and piers standing in whatever the road spans. The kind of bridge follows the real one: a masonry crossing gets stone arch rings, a steel one gets a through-truss you ride inside, a long motorway crossing gets a slender-piered viaduct, a footbridge gets timber planks and a handrail, and a big span gets towers with cables and hangers.
- New Tunnels are built too, with a proper portal at each mouth. Alpine avalanche galleries are open down the valley side on pillars rather than being a closed bore, so you keep the view out as you ride through.
- Improved Each structure is welded into a single object, so even a long viaduct costs one draw call, and the number built per stretch of map is capped to protect the frame rate.
v1.19.13
Indoor: the drop log now names where the triangles come from
2026-07-20- Improved When the frame rate drops because of triangle load, the log now says which models are responsible — for example "20M triangles — 8.1M nature/pine (57%), 3.2M citypack/city_buildings (23%)". Copies of the same model are counted together, including the instanced ones like trees and crops, so you can see at a glance which asset is costing you the frame rate.
v1.19.12
Indoor: a log of why the frame rate dropped
2026-07-20- New Next to the FPS counter there's now a small log that explains every dip below 50 fps — and where on the route it happened. Instead of just seeing the number fall, you get the likely reason: still building scenery, too many separate objects, triangle load, render scale, or CPU. A run of slow frames from the same cause collapses into one line with the worst reading, so it reads as a short history rather than a wall of numbers. Admin only, and it appears with the FPS counter.
v1.19.11
Indoor: dropped the banner over the HUD
2026-07-20- Changed Removed the "Click any object to inspect & fix it" banner that sat above your ride metrics in the object-review tool. Messages during a ride appear below the metrics bar, so nothing covers your power, time and speed.
v1.19.10
Fixed: deleting two routes in a row
2026-07-20- Fixed In your route library, deleting a route left the page in a state where the next delete did nothing until you refreshed. Now you can delete several routes one after another without reloading. Saving a route's name or sharing settings was affected by the same problem and is fixed too.
v1.19.9
Indoor: retired another city building
2026-07-20- Changed One more city-pack building has been withdrawn after review, so it no longer appears anywhere in the world. The rest of that pack is unaffected.
v1.19.8
Indoor: click the real map to jump there (admin)
2026-07-20- New Admins can now click anywhere on the real map to jump straight to that part of the route — handy for checking a junction or a stretch of road without riding to it. The click only chooses where along the road to go: you always land on the road itself, never beside it, even if you click well off into a field.
v1.19.7
Indoor: the Global light sliders actually work now
2026-07-20- Fixed The Global light sliders moved but the world never changed — every slider was silently falling back to its default value instead of reading where you'd dragged it. Sun, sky, reflections and exposure now all take effect live as you drag, and the percentage readouts update with them.
v1.19.6
Indoor: Global light sliders now change the world as you drag
2026-07-20- Fixed The new Global light sliders moved but nothing happened on screen unless the world mood was set to Cycle. The lighting is only recalculated while the day/night cycle is animating, so on a frozen mood — Golden light, Dawn, Night — your slider change had nowhere to land. The lighting is now re-applied the moment you move a slider, whatever mood you're in.
v1.19.5
Changelog entries are numbered by the tool, not by hand
2026-07-20- New A changelog task now works out the next version itself and appends the entry under a file lock, so two sessions shipping at the same time can no longer take the same version number.
- New A check task validates every changelog: that it parses, that no version is used twice, and that each change has text.
v1.19.4
Indoor: Global light controls in settings
2026-07-20- New New "Global light" panel in the admin settings with four live sliders — Sun, Sky/ambient, Reflections and Exposure — so you can trim the whole world's lighting and see it change as you drag. They ride on top of the day/night cycle, so dawn still looks like dawn; the trim just shifts the level. Your settings are remembered, and there's a Reset button.
- Fixed The new reflection environment was lifting the brightness of the whole world, not just the metal objects it was meant to fix. Reflections now default to a low setting that keeps the world at the brightness it had before — and if you want it flatter still, drag Reflections to zero.
v1.19.3
Indoor: no more objects stuck in the dark
2026-07-20- Fixed Some objects in the library rendered almost black and refused to brighten no matter how much light you added. They were exported as fully metallic, and a metal doesn't light up — it only shows what it reflects, and the world had nothing for it to reflect. The world now has a proper sky-and-ground environment for materials to catch, and imported objects are clamped out of that unlightable range, so every object in the library responds to light and to the Lightness slider.
v1.19.2
Indoor: no more spikes in the landscape
2026-07-19- Fixed The real elevation data occasionally contains a bad reading, and a single bad point was rendering as a sharp needle stabbing out of an otherwise natural hillside. Those spikes are now detected and smoothed away before the terrain is built. Real hills, ridges and steep slopes are untouched — only the lone bad points that can't be real landscape get flattened.
v1.19.1
Indoor: gravel roads are as narrow as they really are
2026-07-19- Improved Every mapped road used to be drawn at a fixed width for its type, so a gravel farm track came out as wide as a paved road. Gravel and unpaved ways are now drawn narrow — and where OpenStreetMap actually records a road's width (or its lane count), we use that real number instead, so a genuinely wide gravel road still comes out wide. Paved roads are unchanged for now; they'll follow once this proves out.
v1.19.0
Indoor: crop fields are actually full now
2026-07-19- Improved Crop fields used to spread a thin scatter of plants across the whole polygon, so a field read as a few clumps on grass. Now the crop tufts overlap into solid cover and the per-field budget is much higher, so a field you ride past looks like a real, fully-planted field. Framerate is protected by filling distant fields more thinly — you can't see the gaps far away — and by a per-chunk ceiling, so the coverage costs nothing where it doesn't show.
v1.18.9
Indoor: farmland grows more than one crop
2026-07-19- Improved Farmland used to be wheat, wheat and more wheat. Now each field is planted with one crop picked per field — wheat or corn — so neighbouring fields differ and the countryside reads as real, varied farmland. A field always keeps its own crop, and it's a one-line change to add more crop types as you supply them.
v1.18.8
Indoor: forest fills right up to the road
2026-07-19- Improved Roadside woods kept an 11 m bare band along the road, so a forest you rode past looked half-empty near the tarmac. Trees now fill to within 7 m of the road (still clear of it), so a wood by the road reads as a proper wood instead of thinning out just where you can see it.
v1.18.7
Indoor: pavements hug the curves
2026-07-19- Fixed City pavements are laid from rigid kerb pieces, and on a bend a full-length piece chords straight across the curve and drifts off the road edge. Now the pavement automatically switches to short half-length pieces through every curve, so it follows the bend cleanly — while straights keep the longer pieces. Sidewalks line up on curves now, not just on the straights.
v1.18.6
Indoor: power lines cross the road and stop breaking up
2026-07-19- Fixed Overhead power lines used to stop dead wherever a pole couldn't stand — at a road, a railway or rough ground — so the wires randomly cut out and never crossed the road. Now the pole is skipped there but the cable carries on, sagging across the gap and over the road like a real line, so a run stays connected end to end.
v1.18.5
Indoor: a real wind you can feel
2026-07-19- New The ride now has a living wind — a breeze whose direction wanders and whose strength gusts. It hits your aerodynamics for real: ride into a headwind and, at the same power, you slow right down; turn and pick up a tailwind and you fly; a crosswind opens your effective frontal area and costs you a little too. Same watts, different speed depending on which way the wind is blowing.
v1.18.4
Indoor: one roundabout, not two stacked on top of each other
2026-07-19- Fixed OpenStreetMap often maps a single roundabout as several overlapping ways, and we were building a full ring, island and set of approaches for each one — two roundabouts stacked ~10 m apart, which is what made the junction read as a shapeless dark blob. Now a roundabout whose centre lands on one already built is skipped, so each junction is drawn exactly once. Verified in-world at the Kotlje roundabout.
v1.18.3
Indoor: roundabouts no longer smear into one dark blob
2026-07-19- Fixed The roads approaching a roundabout used to draw a second slab of tarmac straight across the junction, on top of the roundabout's own ring — so the whole area read as one irregular dark blob. Each approach road now stops flush at the roundabout's edge and hands over to the ring's own flared entry, so the junction reads as a clean circle with roads meeting it.
v1.18.2
Route builder: choose what your route follows
2026-07-19- New The route builder now has a 'Follow' choice — Roads, Paths, Gravel, or Trails — so you decide what the route sticks to. 'Roads' keeps you on real roads even through towns, instead of veering onto the cycle-path network the way it did before; 'Paths' prefers cycleways and quiet bike routes; 'Gravel' favours gravel roads and tracks; 'Trails' sends you onto paths and singletrack for MTB. It defaults to Roads (or Gravel/Trails to match your discipline).
v1.18.1
Indoor: roundabouts look like real roundabouts
2026-07-19- Improved Roundabouts got a proper makeover: a raised, buff-paved mountable apron ringing the central island, a defined kerb line, a bright edge line around the circulating lane, and give-way 'shark-teeth' markings painted across every entry. The flared approaches were also reined in so they meet the circle cleanly instead of smearing into one dark blob. It now reads as a roundabout, not a black patch with an island.
v1.18.0
Indoor: the road is paved where it's really paved
2026-07-18- New The ridden road now changes surface along the route to match the real world — asphalt where OpenStreetMap says it's paved, gravel on the unpaved stretches, and concrete on cobbled/paved sections — instead of one texture for the whole ride. Each stretch is textured from your route's actual surface data, so a ride that turns off tarmac onto a gravel track now looks like it.
- New New rides pick up their surfaces automatically when saved; existing routes are being backfilled in the background.