Skip to main content

The unglamorous week that everything depends on

· 4 min read
Massimo Di Stefano
FastGIS author

No new screens this week. Instead: the data underneath every screen got fresh, and stays fresh, and now tells us when it isn't.

Two silent failures, found

The best bug reports come from things that never threw an error.

32 of 64 regions had no POI import. Ireland had zero fuel stations. Nothing errored, nothing alerted, no log line said so. The map looked exactly as a map should look — the fuel stations were simply not on it, and you would only find out by needing one.

A dark sky near Bergen returned nothing. A rejected request was rendering as an empty result, which is indistinguishable from a truthful "no stargazing spots here" — and a user has no way to tell the difference between an app that found nothing and an app that failed to look.

Both are now fixed, and both are the reason for everything below.

The refresh train

A quarterly EU data-refresh pipeline, written down as a runbook rather than lived in someone's head: fresh Geofabrik extracts for 32 countries, legal-maxspeed injection for the nine countries with statutory speed tables, an osmium merge into a single PBF — multi-PBF Valhalla builds segfault — TET overlay re-application, the tile build, and a route benchmark harness that compares the new tiles against golden routes before anything goes anywhere near live.

The overlay step has a subtlety worth naming: OSM churn deletes nodes that the trail conflate still references, so the pipeline resurrects the missing ones from the previous run's augmented extract. A sudden jump in that count means the overlay has aged out and needs re-conflating, which is a much better signal than discovering it in a broken route.

It is pinned off a faulty CPU core on the build host, because a tile build scheduled onto that core corrupts the routing graph rather than crashing — which we know because it did, and because a corrupt graph fails days later in a place with no signal.

Speed limits, offline

Legal speed limits now come from an on-device profile computed with Valhalla's traceAttributes, so the HUD sign works with no signal at all.

Most European roads carry no explicit maxspeed tag in OSM — the limit is the national default for that road class, which every rider knows and no database states. So the profile fills those gaps from statutory tables, falls back to live data when it has a connection, and lets a detected camera override everything. Three sources, one number on the screen.

Update badges that tell the truth

A pack freshness manifest, and update-available badges driven by it: the phone compares each installed region's tileset version against the server's and badges only what is genuinely behind.

Plus the fix that made them honest. A stale pooled SQLite handle had the badge looping forever, insisting on an update that had already been installed — the single fastest way to teach someone to ignore a badge permanently.

Beaches, generalised

The beach seeker stopped being Norway-specific. Sweden shipped — sea and lake both — with an SGU jordarter geology prior doing the heavy lifting, and per-region crowdsourced review pages so riders can correct it.

Also

Italian-locale address search was quietly falling back to a different geocoder after a 400 error. The vehicle register writes "901 Norden" while Husqvarna writes "Norden 901". The odometer is now anchored rather than inferred from GPS, because inferring it was always going to be wrong eventually.

Why we like weeks like this

Every feature we ship stands on this. A gorgeous route on stale tiles is a beautiful lie, and we would rather ship a plain truth.


Dig deeper: the developer docs for the manifest format.