<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>FastGIS Blog</title>
        <link>https://fastgis.eu/guide/blog</link>
        <description>FastGIS Blog</description>
        <lastBuildDate>Mon, 21 Sep 2026 22:30:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[The weather you ride into]]></title>
            <link>https://fastgis.eu/guide/blog/the-weather-you-ride-into</link>
            <guid>https://fastgis.eu/guide/blog/the-weather-you-ride-into</guid>
            <pubDate>Mon, 21 Sep 2026 22:30:00 GMT</pubDate>
            <description><![CDATA[Two days ago the rain overlay was a still picture from someone else's tile]]></description>
            <content:encoded><![CDATA[<p>Two days ago the rain overlay was a still picture from someone else's tile
server. Today the Map tab carries a weather timeline of our own — radar,
nowcast and forecast; rain, wind gusts, temperature and visibility; snow,
thunder and wind direction on top — pan-European, with 1 km detail in the
Nordics, and the same numbers printed under every stop of a planned route.
This post is the whole of it in one place.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="one-bar-four-layers">One bar, four layers<a href="https://fastgis.eu/guide/blog/the-weather-you-ride-into#one-bar-four-layers" class="hash-link" aria-label="Direct link to One bar, four layers" title="Direct link to One bar, four layers" translate="no">​</a></h2>
<p>The bar sits at the bottom of the map, beside the lean and acceleration
HUD, and on the Navigate tab. Pick a layer — 🌧 rain, 💨 gusts, 🌡
temperature, 🌫 visibility — then play, pause or drag through time. The
track is tinted by what kind of frame you are on: blue for what the radar
saw, amber for our two-hour nowcast, violet for the model forecast to the
day ahead. Tap the card and it folds into one round button while you ride;
tap the button to get it back. A small line under the card tells you when
the server will next look for new data, and a ⟳ asks it to look now — the
server is honest about the cap, so a tap never hammers anyone's servers.</p>
<p>Every layer is served by our own service. Nothing on the phone talks to a
weather provider; the worker ingests open data on a schedule into immutable
frames and the app draws tiles from those.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-each-layer-knows">What each layer knows<a href="https://fastgis.eu/guide/blog/the-weather-you-ride-into#what-each-layer-knows" class="hash-link" aria-label="Direct link to What each layer knows" title="Direct link to What each layer knows" translate="no">​</a></h2>
<p><strong>Rain</strong> is the last hours of the pan-European radar composite (EUMETNET
OPERA), our own extrapolation of it for the next two hours, and the ICON-EU
model forecast after that. In the Nordics, MET Norway's own radar nowcast
and 1 km forecast are pasted in. Since today the rain frames also carry
their <strong>phase</strong> — a pale hatch where it will fall as snow, a lighter one
for sleet, a red one for freezing rain — and <strong>thunderstorm cells</strong> as small
⚡ marks (orange when hail is forecast). Load the layer and the bar asks the
server what <em>your own position</em> sees at each forecast hour: the hours with
thunder get a yellow tick, and a ⚡ before the time while you are on one.</p>
<p><strong>Gusts</strong> are the hourly maximum gust from ICON-EU, 1 km in the Nordics
from MET, coloured from 30 km/h (below that a gust is weather, not a
hazard) through 50, 70 and 90 to 120. Arrows on a lattice show where the
wind <strong>blows</strong>, growing with the gust; calm areas keep a short grey barb so
the direction is never missing.</p>
<p><strong>Temperature</strong> is the 2 m forecast with a hard edge at 0 °C — frost is a
threshold, not a gradient — and the 1 km Nordic detail that shows the cold
valleys between the warmer slopes.</p>
<p><strong>Visibility</strong> draws fog and haze only where they limit the view, grey from
200 m and gone at 5 km, so an empty map means you can see. Nordic detail
comes from MET's MEPS model, which also knows where its cells are foggy.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-same-numbers-under-every-stop">The same numbers under every stop<a href="https://fastgis.eu/guide/blog/the-weather-you-ride-into#the-same-numbers-under-every-stop" class="hash-link" aria-label="Direct link to The same numbers under every stop" title="Direct link to The same numbers under every stop" translate="no">​</a></h2>
<p>Plan a route and each stop's line in the plan sheet reads the weather
expected at <em>that stop's arrival time</em>, from the very frames the map shows:</p>
<blockquote>
<p>❄ 2.1 mm/h ⚡ · 💨 31 km/h ↗ · 🌡 −1 °C · 🌫 0.8 km</p>
</blockquote>
<p>— snow, with thunder, a 31 km/h gust blowing north-east, a degree below
zero, and 800 m of visibility. Visibility is only mentioned under 5 km; a
clear morning does not need a number. Because the caption and the tile are
sampled from one dataset, they can never disagree.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-the-1-km-comes-from">Where the 1 km comes from<a href="https://fastgis.eu/guide/blog/the-weather-you-ride-into#where-the-1-km-comes-from" class="hash-link" aria-label="Direct link to Where the 1 km comes from" title="Direct link to Where the 1 km comes from" translate="no">​</a></h2>
<p>Across Europe the forecast layers sit on ICON-EU's 7 km grid. In the
Nordics, MET Norway's 1 km post-processed forecast is read for every hour —
its values pasted into the European frames, and, since today, drawn as
frames of its own on top, so the valley-by-valley structure is visible
rather than averaged into 8 km blocks. The paste is retried whenever MET's
servers come back after an outage; an outage never costs the run its
European picture.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-it-costs-and-what-it-does-not">What it costs, and what it does not<a href="https://fastgis.eu/guide/blog/the-weather-you-ride-into#what-it-costs-and-what-it-does-not" class="hash-link" aria-label="Direct link to What it costs, and what it does not" title="Direct link to What it costs, and what it does not" translate="no">​</a></h2>
<p>All of this comes from open data under open licences — EUMETNET OPERA via
MeteoGate, DWD's open data, MET Norway's thredds — credited on every tile's
<code>X-Attribution</code> header and in the app's credits. No commercial weather
service is involved, and the phone's traffic is only to our own API.</p>
<p>The frames are immutable and the tile URLs never change meaning, so an
older build of the app keeps working through every one of these releases;
it simply does not see the newer bands and layers. Everything above is on
the current build.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Rider app</category>
            <category>Data</category>
        </item>
        <item>
            <title><![CDATA[Which way it blows, and how far you see]]></title>
            <link>https://fastgis.eu/guide/blog/which-way-it-blows-and-how-far-you-see</link>
            <guid>https://fastgis.eu/guide/blog/which-way-it-blows-and-how-far-you-see</guid>
            <pubDate>Mon, 21 Sep 2026 21:00:00 GMT</pubDate>
            <description><![CDATA[Two more answers on the weather timeline, closing the hazards set that]]></description>
            <content:encoded><![CDATA[<p>Two more answers on the weather timeline, closing the hazards set that
started this morning with snow and thunder: the gust layer now says <strong>from
where</strong> it blows, and a fourth layer says <strong>how far you can see</strong>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="arrows-on-the-gusts">Arrows on the gusts<a href="https://fastgis.eu/guide/blog/which-way-it-blows-and-how-far-you-see#arrows-on-the-gusts" class="hash-link" aria-label="Direct link to Arrows on the gusts" title="Direct link to Arrows on the gusts" translate="no">​</a></h2>
<p>A 60 km/h gust is survivable as a headwind and frightening from the side.
The gust layer draws a lattice of small arrows over its colours, pointing
where the wind blows and growing with the gust; on the calm parts of the
map, where the colours fade out below 30 km/h, a short grey barb still
gives the direction. The plan sheet carries the same arrow after each
stop's gust value — <code>💨 31 km/h ↗</code>.</p>
<p>The direction comes from the forecast model's wind components across
Europe and from MET Norway's 1 km forecast in the Nordics, inside the same
frames the layer already draws; directions are combined as vectors, never
averaged as angles, so a wind from just west of north never comes out as
"from the south".</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-visibility-layer">A visibility layer<a href="https://fastgis.eu/guide/blog/which-way-it-blows-and-how-far-you-see#a-visibility-layer" class="hash-link" aria-label="Direct link to A visibility layer" title="Direct link to A visibility layer" translate="no">​</a></h2>
<p>Pick 🌫 on the bar and the map shows fog and haze — and nothing else. The
layer is grey where visibility drops under 5 km and darkens towards 200 m;
clear air is not drawn at all, so an empty map means you can see. In the
Nordics it comes from MET Norway's MEPS 2.5 km model, which also knows where
its cells are foggy; across the rest of Europe from ICON-EU. Fog also marks
the rain layer and the stop captions with 🌫, and a stop's line mentions
visibility only when it is under 5 km (<code>🌫 0.8 km</code>) — a clear morning does
not need a number.</p>
<p>Same frames, same manifests, same tile URLs as before: an older build of the
app simply does not see the new band and the new layer.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Rider app</category>
            <category>Data</category>
        </item>
        <item>
            <title><![CDATA[Snow or thunder on the pass]]></title>
            <link>https://fastgis.eu/guide/blog/snow-or-thunder-on-the-pass</link>
            <guid>https://fastgis.eu/guide/blog/snow-or-thunder-on-the-pass</guid>
            <pubDate>Mon, 21 Sep 2026 14:30:00 GMT</pubDate>
            <description><![CDATA[The weather timeline could tell you how much rain, how hard the wind and]]></description>
            <content:encoded><![CDATA[<p>The weather timeline could tell you how much rain, how hard the wind and
how cold. It could not tell you the two things that actually decide a
mountain day: whether the 3 mm/h at 2 °C on the pass falls as <strong>rain or
snow</strong>, and whether there is <strong>thunder</strong> in the hours ahead. From today it
does both, on the same rain frames, with nothing new to switch on.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rain-or-snow">Rain or snow<a href="https://fastgis.eu/guide/blog/snow-or-thunder-on-the-pass#rain-or-snow" class="hash-link" aria-label="Direct link to Rain or snow" title="Direct link to Rain or snow" translate="no">​</a></h2>
<p>Where the rain layer shows precipitation, it now shows its phase too. Snow
pulls the colour halfway to a pale blue-white under a fine diagonal hatch;
sleet is a lighter tint with a sparser hatch; freezing rain keeps its colour
under a red hatch. The rain colours themselves have not moved — your eye is
trained on them — and where nothing falls, nothing is drawn. The legend
strip under the bar shows the three swatches (❄ 🌨 🧊), and when you plan a
route, each stop's line reads <code>❄ 2.1 mm/h</code> instead of <code>🌧 2.1 mm/h</code> where it
is going to snow at your arrival time.</p>
<p>The phase comes from the forecast model's own split of precipitation into
snow and rain (DWD ICON-EU, pan-Europe, with its present-weather code
marking freezing rain), and in the Nordics from MET Norway's 1 km
snow-phase probability — the same file the timeline already reads for the
1 km detail. Snow is snow from a 70 % share; between 30 and 70 % it is
sleet.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="thunder">Thunder<a href="https://fastgis.eu/guide/blog/snow-or-thunder-on-the-pass#thunder" class="hash-link" aria-label="Direct link to Thunder" title="Direct link to Thunder" translate="no">​</a></h2>
<p>Thunderstorm cells are drawn on the rain frames as small yellow ⚡ marks
(orange when hail is forecast with them), spaced so they read as a hazard
rather than a wash — and drawn even where the rain colours are transparent,
because a storm cell is a hazard whether or not the frame shows rain under
it. The source is the model's present-weather code across Europe and MET's
1 km thunder probability in the Nordics.</p>
<p>The bar itself now knows about thunder at <strong>your</strong> position: whenever the
rain timeline loads, the app asks the server what your own spot on the map
sees at each forecast hour, and the hours that answer "thunder" get a yellow
tick on the track and a ⚡ before the time while you are on them. Plan a
route and the stop lines carry ⚡ (or 🌩 with hail) after the rain value at
that stop's arrival time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nothing-else-changed">Nothing else changed<a href="https://fastgis.eu/guide/blog/snow-or-thunder-on-the-pass#nothing-else-changed" class="hash-link" aria-label="Direct link to Nothing else changed" title="Direct link to Nothing else changed" translate="no">​</a></h2>
<p>Same frames, same tile URLs, same manifests: the phase and the hazards are
two extra bands inside the frames the timeline already draws, so an older
build of the app keeps working and simply does not see them. The frames from
before today render exactly as they did.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Rider app</category>
            <category>Data</category>
        </item>
        <item>
            <title><![CDATA[Gusts and degrees on the timeline]]></title>
            <link>https://fastgis.eu/guide/blog/gusts-and-degrees-on-the-timeline</link>
            <guid>https://fastgis.eu/guide/blog/gusts-and-degrees-on-the-timeline</guid>
            <pubDate>Sun, 20 Sep 2026 19:30:00 GMT</pubDate>
            <description><![CDATA[This morning the map got a rain timeline. This evening the same bar carries]]></description>
            <content:encoded><![CDATA[<p>This morning the map got a rain timeline. This evening the same bar carries
two more things a rider wants to know before a day out: <strong>wind gusts</strong> and
<strong>temperature</strong>, hour by hour for the day ahead, from the same open model
that already gives the rain forecast.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-changed-for-you">What changed for you<a href="https://fastgis.eu/guide/blog/gusts-and-degrees-on-the-timeline#what-changed-for-you" class="hash-link" aria-label="Direct link to What changed for you" title="Direct link to What changed for you" translate="no">​</a></h2>
<p><strong>Three layers, one bar.</strong> The weather bar now has a picker — 🌧 💨 🌡 —
and shows one of them at a time. Rain is what it was: radar for the last
hours, our own nowcast for the next two, the forecast after that. Gusts and
temperature are hourly forecasts to +24 h; the scrubber starts at the next
hour and plays forward.</p>
<p><strong>Colours that mean something on a bike.</strong> Gusts are drawn in km/h with
rider thresholds: nothing under 30 km/h, then yellow at 30, orange at 50,
red at 70, purple at 90 and beyond — the map only colours air that will push
you around. Gusts are the <em>maximum</em> over each hour, not the average, because
the maximum is the one that moves the bike. Temperature is a field, so it is
never blank: cold blues, a <strong>hard edge at 0 °C</strong>, greens through the
comfortable range, orange and red past 30. A legend strip under the scrubber
names the scale for whichever layer is up.</p>
<p><strong>It remembers.</strong> The layer you pick stays picked across tabs and restarts.
The ⟳ button still asks the server for fresher data, now for the layer you
are looking at, with the same honesty about the cap.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-is-built">How it is built<a href="https://fastgis.eu/guide/blog/gusts-and-degrees-on-the-timeline#how-it-is-built" class="hash-link" aria-label="Direct link to How it is built" title="Direct link to How it is built" translate="no">​</a></h2>
<p>The two new layers come from the DWD's ICON-EU model — the same open-data
tree, grid and run schedule as the precipitation forecast, so the server's
ingest simply learned to take three fields instead of one and to check each
one's completeness on its own. Each field is warped once to web-mercator and
kept as immutable per-run frames; the tiles are rendered on demand under the
variable's own palette and cached forever. Everything stays behind one small
<code>layers.json</code> that tells the app what the server serves, so a phone written
against this shape needs no update when the next layer arrives.</p>
<p>On the phone the store became variable-aware and the rain URLs did not move
— an app from this morning keeps working against tonight's server, and
tonight's app against a server that only serves rain.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-next">What is next<a href="https://fastgis.eu/guide/blog/gusts-and-degrees-on-the-timeline#what-is-next" class="hash-link" aria-label="Direct link to What is next" title="Direct link to What is next" translate="no">​</a></h2>
<p>MET Norway's 1 km hourly forecast inside the Nordic footprint (the same
trick the nowcast already uses for their radar), and the layers sampled along
a planned route so the plan sheet can say what rain, gust and temperature to
expect at each stop's arrival time.</p>
<p><code>/weather/layers.json</code>, <code>/weather/{variable}/frames.json</code> and
<code>/tiles/{variable}/{frame}/{z}/{x}/{y}.png</code>, documented under Developers →
Weather timeline. Forecast data © Deutscher Wetterdienst (ICON-EU); radar
© EUMETNET OPERA via MeteoGate; Nordic nowcast © MET Norway.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Rider app</category>
            <category>Data</category>
        </item>
        <item>
            <title><![CDATA[Rain you can scrub]]></title>
            <link>https://fastgis.eu/guide/blog/rain-you-can-scrub</link>
            <guid>https://fastgis.eu/guide/blog/rain-you-can-scrub</guid>
            <pubDate>Sun, 20 Sep 2026 09:30:00 GMT</pubDate>
            <description><![CDATA[The rain overlay used to be one still picture: the latest radar frame from]]></description>
            <content:encoded><![CDATA[<p>The rain overlay used to be one still picture: the latest radar frame from
a third-party tile service, shown on the Navigate tab and nowhere else.
From today it is a timeline — the last two hours of weather radar as
frames you can play, pause and drag through, on the Map tab beside the lean
and acceleration HUD, and on Navigate. The frames come from a service of
our own, built on the pan-European EUMETNET OPERA radar composite.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-changed-for-you">What changed for you<a href="https://fastgis.eu/guide/blog/rain-you-can-scrub#what-changed-for-you" class="hash-link" aria-label="Direct link to What changed for you" title="Direct link to What changed for you" translate="no">​</a></h2>
<p><strong>Play the rain.</strong> Switch on the 🌧 overlay (Settings → Map → Overlays,
now called <em>Rain timeline</em>) and a thin bar appears in the bottom band of
the map: ▶ plays the frames at one every 0.6 s and holds on the newest
before looping; drag anywhere on the track to scrub. The label shows the
frame's clock time and how far behind "now" it is — <em>−45 min</em>, <em>−1 h 15
min</em>. A white tick marks the newest observation.</p>
<p><strong>On the Map tab, not just Navigate.</strong> The Map tab had no overlay
pipeline at all before; it has one now, and the lean slider and the accel
card move up out of the bar's way so nothing overlaps (the owner's device
pass will settle the landscape details).</p>
<p><strong>Honest about freshness.</strong> OPERA publishes a composite every 15 minutes,
about 20 minutes behind real time. If our ingest falls three steps behind
— the server's beat has died, the publisher is refusing us, the disk is
full — a ⚠ appears on the bar rather than a stale picture pretending to be
current. The ⟳ button re-reads the frame list; when the capped
user-triggered refresh lands it will show <em>next in 6 min</em> instead of
failing quietly.</p>
<p><strong>One source, all of Europe.</strong> The composite is the merged product of
around 170 national radars from Portugal to Finland, on a 2 km grid. The
old service had quietly dropped its forecast frames and its terms were for
personal use only; it is gone from the app and from the credits page.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-is-built">How it is built<a href="https://fastgis.eu/guide/blog/rain-you-can-scrub#how-it-is-built" class="hash-link" aria-label="Direct link to How it is built" title="Direct link to How it is built" translate="no">​</a></h2>
<p>Phones never talk to a weather upstream. A scheduled task on our server
lists the last two hours of composites from the MeteoGate Open Radar Data
API, downloads each new Cloud-Optimized GeoTIFF (about 3 MB) from its
24-hour cache, and warps it <strong>once</strong> to web-mercator — 0.45 s — into an
immutable frame on disk. Tiles are rendered from those frames on demand
(12–33 ms each, then cached forever, because a frame id names one product
time and is never rewritten), with one logarithmic mm/h palette for every
source so the picture will not change its look when the nowcast and
forecast bands arrive.</p>
<p>The phone reads one small manifest — the ordered frame list, a tile URL
template, a legend and a freshness block — and mounts the current frame
plus three neighbours on each side as raster layers, switching them by
opacity as you scrub. Seven sources on the native bridge at most, however
long the timeline gets.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-next">What is next<a href="https://fastgis.eu/guide/blog/rain-you-can-scrub#what-is-next" class="hash-link" aria-label="Direct link to What is next" title="Direct link to What is next" translate="no">​</a></h2>
<p>Two hours of the past is the first band. The plan adds an hourly forecast
to +24 h from DWD's ICON-EU model, a nowcast of our own extrapolated from
the radar motion, and — for the Nordics — MET Norway's 1 km radar and
forecast composited over the European product. The scrubber already has
the three bands drawn in, tinted differently, waiting for the frames.</p>
<p>Frames and tiles: <code>/weather/rain/frames.json</code> and
<code>/tiles/rain/{frame}/{z}/{x}/{y}.png</code>, documented under Developers → Weather
timeline. Radar data © EUMETNET OPERA, via MeteoGate, CC BY 4.0.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Rider app</category>
            <category>Data</category>
        </item>
        <item>
            <title><![CDATA[Curvy roads, scored by us]]></title>
            <link>https://fastgis.eu/guide/blog/curvy-roads-our-own</link>
            <guid>https://fastgis.eu/guide/blog/curvy-roads-our-own</guid>
            <pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The curvy-roads finder has run on a database we downloaded from someone]]></description>
            <content:encoded><![CDATA[<p>The curvy-roads finder has run on a database we downloaded from someone
else's site since the beginning. From today it runs on roads we score
ourselves, from OpenStreetMap, for every country in the catalogue — with
Germany, France and the Balkans in for the first time, every road result
listed once instead of twice, and the scenic, water and elevation filters
finally backed by data.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-changed-for-you">What changed for you<a href="https://fastgis.eu/guide/blog/curvy-roads-our-own#what-changed-for-you" class="hash-link" aria-label="Direct link to What changed for you" title="Direct link to What changed for you" translate="no">​</a></h2>
<p><strong>More roads, everywhere.</strong> Against the old database, the new one holds
77 % more "twisty" kilometres across Europe and 92 % more at the lowest
preset. Germany and France go from a few hundred kilometres to 99,000 and
278,000 twisty ones; Serbia, Bosnia, Montenegro and Albania, which the old
source never covered, are fully in. Only Austria comes out a shade lower at
the twisty preset, and we know why.</p>
<p><strong>Every result once.</strong> The old database had been loaded twice and half of
it was a second copy, which is why a search used to list the same road on
two consecutive lines. The new one is built with a uniqueness rule and cannot
double up.</p>
<p><strong>Whole roads, not fragments.</strong> A road in OpenStreetMap is drawn as many
short pieces — a new piece at every junction, every change of speed limit,
every village name. Scored one by one, most pieces of a twisty road fall
under the threshold and vanish. We now join the pieces of a road back
together first, following its road number through villages, roundabouts and
the short bridge ways that used to break the chain, and cut only where a
road runs dead straight for five kilometres. Luxembourg's N10, which came
out as forty fragments, is one road again.</p>
<p><strong>The filters mean something now.</strong> "Scenic roads only" used to return
nothing: it now follows recognised tourist routes — Norway's National
Tourist Routes, the Romantische Straße, the Deutsche Alpenstraße, the Stelvio,
the Großglockner and about 150 others — and flags the roads that actually run
along them. "Near water" was never filled in; it is, from the coastline,
lakes and rivers of every country. Elevation is there for every road, from
our own copy of the Copernicus 30 m terrain model, and the population-density
filter covers 29 countries instead of one.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-it-took-some-doing">Why it took some doing<a href="https://fastgis.eu/guide/blog/curvy-roads-our-own#why-it-took-some-doing" class="hash-link" aria-label="Direct link to Why it took some doing" title="Direct link to Why it took some doing" translate="no">​</a></h2>
<p>The first attempt lost up to 97 % of the twisty kilometres in some countries,
and the coverage report we built for exactly this purpose said so before
anything shipped. Three things had to be true before the numbers turned: score
whole roads rather than map pieces, do not cap a road's length (the presets
were calibrated on uncapped roads), and separate the long straight stretches
so a 227 km road at twelve degrees per kilometre does not outrank a genuinely
twisty ten. Each was checked against the old data country by country.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-has-not-changed">What has not changed<a href="https://fastgis.eu/guide/blog/curvy-roads-our-own#what-has-not-changed" class="hash-link" aria-label="Direct link to What has not changed" title="Direct link to What has not changed" translate="no">​</a></h2>
<p>The presets and the offline curvature packs work as before; download the
updated pack when the app offers it. The "scoring method" switch is now a
<strong>rank by</strong> switch over the same roads — bends, intensity (turning per
kilometre), tightness (hairpins per kilometre) or climb — instead of three
separately scored databases; one of those measured how densely a road was
drawn rather than how twisty it was, so it had to go. The map's curvature
overlay is a separate layer and is unchanged for now.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Rider app</category>
            <category>Data</category>
        </item>
        <item>
            <title><![CDATA[The gate across the track]]></title>
            <link>https://fastgis.eu/guide/blog/the-gate-across-the-track</link>
            <guid>https://fastgis.eu/guide/blog/the-gate-across-the-track</guid>
            <pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Dirt-first routing sends you down forest roads, and forest roads have gates.]]></description>
            <content:encoded><![CDATA[<p>Dirt-first routing sends you down forest roads, and forest roads have gates.
Most you open and close behind you. Some are padlocked, and the only thing
worse than a locked gate 40 km in is one nobody told you about. Routes now
carry their gates: drawn on the track, avoided when they are shut, and called
out on the way.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="closed-gates-are-routed-around">Closed gates are routed around<a href="https://fastgis.eu/guide/blog/the-gate-across-the-track#closed-gates-are-routed-around" class="hash-link" aria-label="Direct link to Closed gates are routed around" title="Direct link to Closed gates are routed around" translate="no">​</a></h2>
<p>The routing tiles know a gate exists. They do not know it is locked: <code>locked=yes</code>
and seasonal <code>*:conditional</code> closures are not parsed into them at all. So the
server reads the gates on your route straight from OpenStreetMap and decides,
for your vehicle and your departure date, whether each one is passable.</p>
<p>A gate that is locked, private, or closed for the season is routed around. A
passable one stays the router's call — opening a gate for 20 km of gravel is
usually a good trade, and dirt-first weighs it as one. <strong>Avoid closed gates</strong> is
on by default, in the rider app under Settings → Routing, and in the desktop
planner's advanced settings.</p>
<p>Sometimes there is no way around: a locked gate on a dead-end track, or one at
the place you are going. Then the route is kept and you are told, because a
router that quietly sends you at a padlock is worse than one that admits it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="told-before-and-told-again-on-the-way">Told before, and told again on the way<a href="https://fastgis.eu/guide/blog/the-gate-across-the-track#told-before-and-told-again-on-the-way" class="hash-link" aria-label="Direct link to Told before, and told again on the way" title="Direct link to Told before, and told again on the way" translate="no">​</a></h2>
<ul>
<li class="">The plan lists the gates on the route, and a closed one gets a red warning
naming it: <em>Gate at 2.4 km — locked</em>.</li>
<li class=""><strong>Start</strong> asks before it begins. On CarPlay and Android Auto, where there is
no dialog to tap, the warning is spoken right after the first instruction.</li>
<li class="">Gates are drawn on the track — white with an amber ring when passable, red
when closed — on the phone, on the car screen, and on the desktop map.</li>
<li class="">Navigation announces them: <em>"Gate in 300 m. Close it behind you."</em> A closed
one gets its own warning with the alert tone, a kilometre out and again at
250 m. Toll booths and bollards are announced too, in all ten languages.</li>
<li class="">A roadbook generated for the route carries the gate as a line of its own.</li>
</ul>
<p>If you go off-route and the app re-plans, the gates come with it. A reroute also
stops treating the gate you just turned back from as "where you were going" —
before, a route recomputed 100 m short of a padlock would send you at it again.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-far-dirt-first-may-detour">How far dirt-first may detour<a href="https://fastgis.eu/guide/blog/the-gate-across-the-track#how-far-dirt-first-may-detour" class="hash-link" aria-label="Direct link to How far dirt-first may detour" title="Direct link to How far dirt-first may detour" translate="no">​</a></h2>
<p>Gravel is slower than tarmac, which is the point, and it is usually not much
longer. Occasionally it is: the strongest preset can find a corridor that adds
half the trip again. <strong>Max detour</strong> now caps that in <em>distance</em> — 1.2×, 1.5×
(the default) or no cap at all — and when the cap bites, the plan steps down a
preset and offers you the one you asked for:</p>
<blockquote>
<p>Moderate applied — the full Strong route is 1.4× the length of the plain route.
<strong>+28 km · +1 h 24 min compared with this route.</strong> Use the full Strong route.</p>
</blockquote>
<p>One tap takes it, and the ride's reroutes keep it uncapped. Évora to Beja is a
good example: 83 km at 38% unpaved inside a 1.2× cap, or 112 km at 71% unpaved
if the gravel is the reason you came.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-it-does-not-know-yet">What it does not know yet<a href="https://fastgis.eu/guide/blog/the-gate-across-the-track#what-it-does-not-know-yet" class="hash-link" aria-label="Direct link to What it does not know yet" title="Direct link to What it does not know yet" translate="no">​</a></h2>
<p>Routes computed <strong>offline on the phone</strong> are not gate-checked — there is no
OpenStreetMap lookup out there. The app says <em>Gates not checked on an offline
route</em> rather than pretending the road is clear; the gate data for offline packs
is the next piece of this. Free-text winter-closure notes ("Vinterstenging") are
shown, never enforced: a note is not a rule.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Rider app</category>
            <category>Desktop</category>
            <category>Routing</category>
        </item>
        <item>
            <title><![CDATA[An ETA that rides at your pace]]></title>
            <link>https://fastgis.eu/guide/blog/eta-at-your-pace</link>
            <guid>https://fastgis.eu/guide/blog/eta-at-your-pace</guid>
            <pubDate>Mon, 14 Sep 2026 11:00:00 GMT</pubDate>
            <description><![CDATA[Open TET sub-trail I-01 in Sardinia the other way round and the app used to]]></description>
            <content:encoded><![CDATA[<p>Open TET sub-trail I-01 in Sardinia the other way round and the app used to
say 14 hours 18 minutes for 169 km. Nobody rides it that slowly. Today the
same trail plans at about 6 hours 40 minutes. While you ride, the estimate now
learns how fast <em>you</em> actually go, and it remembers that for next time.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-the-estimate-was-so-slow">Why the estimate was so slow<a href="https://fastgis.eu/guide/blog/eta-at-your-pace#why-the-estimate-was-so-slow" class="hash-link" aria-label="Direct link to Why the estimate was so slow" title="Direct link to Why the estimate was so slow" translate="no">​</a></h2>
<p>The planned time is the router's time, road by road. Where OpenStreetMap has a
posted speed limit, that limit is the speed; everywhere else the router uses a
typical speed for that kind of road. That works well on tarmac. On unpaved
tracks with no speed tag, the router's own figure is 5 to 7 km/h. I-01 has
83 km of those, and they alone accounted for more than 12 of its 14 hours.</p>
<p>AL-01 in Albania looked slow for a different reason: most of its gravel carries
a real posted limit of 20 km/h in OpenStreetMap. That limit is kept.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="realistic-times-on-unpaved-tracks">Realistic times on unpaved tracks<a href="https://fastgis.eu/guide/blog/eta-at-your-pace#realistic-times-on-unpaved-tracks" class="hash-link" aria-label="Direct link to Realistic times on unpaved tracks" title="Direct link to Realistic times on unpaved tracks" translate="no">​</a></h2>
<p>Trips built from a GPX or a TET trail now time gravel and compacted roads at no
less than 20 km/h, dirt at 15 km/h and paths at 10 km/h. A posted limit is
never exceeded, and the route and its turns do not change, only the time:</p>
<table><thead><tr><th>Trip</th><th>Before</th><th>Now</th></tr></thead><tbody><tr><td>I-01 reversed, 169 km</td><td>14 h 17 min</td><td>6 h 37 min</td></tr><tr><td>I-01 native, 168 km</td><td>14 h 27 min</td><td>6 h 40 min</td></tr><tr><td>AL-01 reversed, 173 km</td><td>7 h 45 min</td><td>6 h 28 min</td></tr></tbody></table>
<p>The TET trails are rebuilt on the server over the next few nights; each one
switches to the new time as soon as it is rebuilt, and your phone picks it up
the next time you open the trail online.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-eta-learns-your-pace-while-you-ride">The ETA learns your pace while you ride<a href="https://fastgis.eu/guide/blog/eta-at-your-pace#the-eta-learns-your-pace-while-you-ride" class="hash-link" aria-label="Direct link to The ETA learns your pace while you ride" title="Direct link to The ETA learns your pace while you ride" translate="no">​</a></h2>
<p>A floor is the same for everybody, and gravel pace depends on the rider. So
every 4 km the app now compares your moving time with the planned time for the
same stretch, and re-estimates the rest of the route. It keeps two separate
estimates, one for roads and one for tracks and gravel, so a fast motorway run
never makes the trail look shorter. Traffic lights, photo stops and coffee
breaks do not count. The remaining time, the arrival clock, the next-stop ETA
and the CarPlay and Android Auto estimates all follow it, and a small
<strong>your pace</strong> caption says so.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="and-it-remembers">And it remembers<a href="https://fastgis.eu/guide/blog/eta-at-your-pace#and-it-remembers" class="hash-link" aria-label="Direct link to And it remembers" title="Direct link to And it remembers" translate="no">​</a></h2>
<p>When navigation stops, the app remembers your pace for that vehicle. The next
ride starts from it, halfway between your usual pace and the plan (a new trail
or a wet day is slower than your average), until the first 4 km of that ride
take over. Before you start, the planner shows both numbers, for example
<em>7:45 h · ≈ 5:17 h at your pace</em>.</p>
<p>Tap the <strong>ⓘ</strong> next to a planned route's time, or the pace caption in the HUD,
for a short explanation. Everything can be turned off in <strong>Settings →
Navigation → Adapt ETA to my pace</strong>, and <strong>Forget my pace</strong> clears what the app
remembers.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Rider app</category>
            <category>Routing</category>
        </item>
        <item>
            <title><![CDATA[Every TET trail, ready both ways and offline]]></title>
            <link>https://fastgis.eu/guide/blog/tet-ready-both-ways</link>
            <guid>https://fastgis.eu/guide/blog/tet-ready-both-ways</guid>
            <pubDate>Mon, 14 Sep 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[This morning's post said any track can now be ridden either way with legal]]></description>
            <content:encoded><![CDATA[<p>This morning's post said any track can now be ridden either way with legal
turn-by-turn, built when you import it. For the Trans Euro Trail we went one
step further: the server now builds every one of its 331 sub-trails, both
directions, in all ten navigation languages, before anyone asks. Opening a TET
trail no longer builds anything on the phone, and a country offline pack now
carries its trails, so you can import and ride them in airplane mode.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="built-once-on-the-server">Built once, on the server<a href="https://fastgis.eu/guide/blog/tet-ready-both-ways#built-once-on-the-server" class="hash-link" aria-label="Direct link to Built once, on the server" title="Direct link to Built once, on the server" translate="no">​</a></h2>
<p>Every night the server checks each TET sub-trail against three things that can
change its trip: the trail itself (a new TET release), the map tiles, and the
builder. Anything that changed is rebuilt; everything else is left alone, so a
normal night finishes in seconds. When the map is rebuilt, you get the previous
trip, marked as stale, until the new one lands.</p>
<p>Opening a sub-trail asks for that ready-made trip. Later online opens check, in
about a second, whether a newer one exists and download it only if so. The
longest trails, like FIN-01 at 2,413 km, no longer need the phone to do the
work.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tet-in-the-country-pack">TET in the country pack<a href="https://fastgis.eu/guide/blog/tet-ready-both-ways#tet-in-the-country-pack" class="hash-link" aria-label="Direct link to TET in the country pack" title="Direct link to TET in the country pack" translate="no">​</a></h2>
<p>Downloading a country that has TET now also installs its TET tracks, in your
navigation language: about 1 MB for Albania and a few MB for the bigger
countries. With the pack installed you can import a sub-trail with no
connection and ride it either way with turn-by-turn. The pack gets an update
badge when the server has a newer build or you switch navigation language.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-turn-by-turn-stops">Where turn-by-turn stops<a href="https://fastgis.eu/guide/blog/tet-ready-both-ways#where-turn-by-turn-stops" class="hash-link" aria-label="Direct link to Where turn-by-turn stops" title="Direct link to Where turn-by-turn stops" translate="no">​</a></h2>
<p>The first full build also measured, trail by trail, where the router cannot
follow the drawing legally. That report found two builder weaknesses: one short
stretch the map matcher could not follow cost the turn-by-turn of a whole
150 km window, and a 40 m deviation could take a 10 km instruction with it. Both
are fixed. Across the network the kilometres without turn-by-turn went from
1,916 to 530; 99.8 % of the 110,797 km now have turns in both directions.</p>
<p>What remains shows on the trail card: when a direction has half a kilometre or
more the router cannot follow, it says so, for example "Reversed: 38.5 km
without turn-by-turn". Clean directions show nothing.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Rider app</category>
            <category>Routing</category>
            <category>Data</category>
        </item>
        <item>
            <title><![CDATA[Ride any track either way — legally, with turns]]></title>
            <link>https://fastgis.eu/guide/blog/ride-any-track-either-way</link>
            <guid>https://fastgis.eu/guide/blog/ride-any-track-either-way</guid>
            <pubDate>Mon, 14 Sep 2026 09:00:00 GMT</pubDate>
            <description><![CDATA[Follow a GPX in the direction it was recorded and the turn-by-turn is good.]]></description>
            <content:encoded><![CDATA[<p>Follow a GPX in the direction it was recorded and the turn-by-turn is good.
Follow it the other way and, until today, the line sent you round every
roundabout on the empty side of the road. A recorded track is a path, not a
route: reversed, it runs against one-way streets, divided carriageways and
roundabouts. As of today every imported GPX, TET sub-trail and Library line
rides in either direction on a legal route with full turn-by-turn.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-it-went-wrong">Why it went wrong<a href="https://fastgis.eu/guide/blog/ride-any-track-either-way#why-it-went-wrong" class="hash-link" aria-label="Direct link to Why it went wrong" title="Direct link to Why it went wrong" translate="no">​</a></h2>
<p>The map-matcher we use does not fail on a track that cannot be ridden as
drawn. It answers with the first legal piece and hides the rest in a field the
app never read, so a 22 km reversed ride collapsed to its first 60 m, failed
a sanity check, and was ridden as the reversed drawing — clockwise round 12 of
its 13 roundabouts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-happens-now">What happens now<a href="https://fastgis.eu/guide/blog/ride-any-track-either-way#what-happens-now" class="hash-link" aria-label="Direct link to What happens now" title="Direct link to What happens now" translate="no">​</a></h2>
<p>A track keeps one built trip per direction. The builder starts from the
original points, never from a matched shape: it map-matches them into
continuous legal pieces, bridges every gap with a legal route whose ends are
trimmed back and forward along the pieces (a bridge that starts inside the
illegal spot loops back through the same junction), picks the bridge closest
to your drawing rather than the shortest, and then checks the assembled line
with a second legal map-match. Where there is no road at all — a hiking trail,
a field — the stretch stays follow-the-line and says so.</p>
<p>On the owner's roundabout-rich track the reversed ride went from twelve
wrong-way roundabouts to none, with no U-turns and every metre covered by
turn-by-turn. A left-hand-traffic town and a divided carriageway behaved the
same; two-way country roads need no bridges at all and ride exactly as before.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="in-the-app">In the app<a href="https://fastgis.eu/guide/blog/ride-any-track-either-way#in-the-app" class="hash-link" aria-label="Direct link to In the app" title="Direct link to In the app" translate="no">​</a></h2>
<ul>
<li class="">Both directions are built when you enhance a track, so opening it reversed
works offline and starts at once. Joining mid-track slices the built trip at
your position instead of re-matching it.</li>
<li class="">Set off against the loaded direction and the app notices within a few
seconds, switches to the other direction's trip where you are, and tells you.
No reroute storm.</li>
<li class="">Chevrons on the track line show the ridden direction, and wherever the legal
line leaves your drawing — the other side of a roundabout, a bridge across a
stretch you cannot ride that way — the drawing stays visible as a faint dashed
ghost, on the phone and on the car screen.</li>
<li class="">Library lines recorded on a ride or drawn on the desktop now rejoin the
track after a detour instead of being replanned to their end.</li>
<li class="">Trail source codes no longer leak into spoken instructions.</li>
</ul>
<p>The builder is also an API for your own tools: <code>POST /grass/routing/track-direction</code>
takes a track and answers with the legal trip for either direction, the bridges
it added and their extra length, and the validation result.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Rider app</category>
            <category>Routing</category>
        </item>
        <item>
            <title><![CDATA[The car screen now draws the phone's map]]></title>
            <link>https://fastgis.eu/guide/blog/the-car-draws-the-phones-map</link>
            <guid>https://fastgis.eu/guide/blog/the-car-draws-the-phones-map</guid>
            <pubDate>Sun, 13 Sep 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[Plug the phone into CarPlay or Android Auto and the car screen used to show a]]></description>
            <content:encoded><![CDATA[<p>Plug the phone into CarPlay or Android Auto and the car screen used to show a
map of its own. The route was a thick white line. The basemap ignored your
language, POI choices and night mode. The turn arrows on Apple's card were not
quite the ones on the phone. As of today the car draws the same map as the
phone, and the vehicle marker behaves the way Google Maps taught everyone to
expect.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="one-route-line">One route line<a href="https://fastgis.eu/guide/blog/the-car-draws-the-phones-map#one-route-line" class="hash-link" aria-label="Direct link to One route line" title="Direct link to One route line" translate="no">​</a></h2>
<p>The white line was an accident: the car borrowed the <em>Selection highlight</em>
setting, which exists to highlight a track you tap. The route is now the phone's
blue line on both screens, with a dark edge and round ends so it stays readable
on a sunlit head unit and over satellite imagery. Plan previews are blue too, and
rain or storm stretches ahead are painted on the route in the car as on the
phone.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="one-map">One map<a href="https://fastgis.eu/guide/blog/the-car-draws-the-phones-map#one-map" class="hash-link" aria-label="Direct link to One map" title="Direct link to One map" translate="no">​</a></h2>
<p>The car now loads exactly the style the phone loads: your server, label
language, POI categories, badge density and, without signal, your offline map.
With the Adventure theme on <strong>Auto</strong>, the car switches to night when the car
does (usually with the headlights), even while the phone is still in day mode.
Navigation opens flat like on the phone, and the zoom, vehicle marker and
speed-limit sign are the phone's sizes scaled to the car screen.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-same-symbols-including-the-cluster">The same symbols, including the cluster<a href="https://fastgis.eu/guide/blog/the-car-draws-the-phones-map#the-same-symbols-including-the-cluster" class="hash-link" aria-label="Direct link to The same symbols, including the cluster" title="Direct link to The same symbols, including the cluster" translate="no">​</a></h2>
<p>Turn arrows use the phone's colours: teal for left, orange for right. Apple's
maneuver card, which also feeds the instrument cluster and the dashboard, now
shows the phone's roundabout symbol: the real exit direction and the exit
number, not one generic icon. Within 2 km of a junction it also shows the lanes,
with yours lit. What the car is told a maneuver <em>is</em> now matches the picture:
motorway exits, merges and roundabout exit angles were all being described
slightly wrong to the cluster. Fuel, camping and beach results from the Services
page appear as the phone's round badges.</p>
<p>Checking the roundabout symbol turned up a bug on the phone as well. The small
chevron that shows the direction of travel around a roundabout was computed in a
way that depended on where on Earth the roundabout is. In Bergen, four of five
roundabouts pointed the wrong way. That is fixed on both screens.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-marker-that-knows-which-way-you-face">A marker that knows which way you face<a href="https://fastgis.eu/guide/blog/the-car-draws-the-phones-map#a-marker-that-knows-which-way-you-face" class="hash-link" aria-label="Direct link to A marker that knows which way you face" title="Direct link to A marker that knows which way you face" translate="no">​</a></h2>
<p>While you are stopped or crawling, the vehicle marker now points where the
phone's compass says you are facing, corrected for a phone mounted in landscape.
Once you are moving it follows the road, because a compass on a handlebar or in
a dashboard cradle is disturbed by the vehicle's metal. A translucent blue circle
around the marker shows how accurate your GPS position is. With a good fix it
hides under the marker; in a tunnel exit, a deep valley or between tall buildings
it grows, so a marker that is only approximately right looks approximate.</p>
<p>Android Auto gets all of this through the same code; its own check on a head
unit is next.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Rider app</category>
            <category>Routing</category>
        </item>
        <item>
            <title><![CDATA[Our own tiles: harbours, gates and a lighter map]]></title>
            <link>https://fastgis.eu/guide/blog/our-own-tiles</link>
            <guid>https://fastgis.eu/guide/blog/our-own-tiles</guid>
            <pubDate>Sun, 13 Sep 2026 09:00:00 GMT</pubDate>
            <description><![CDATA[Until this week the Adventure basemap was a FastGIS style on top of stock]]></description>
            <content:encoded><![CDATA[<p>Until this week the Adventure basemap was a FastGIS style on top of stock
OpenMapTiles tiles. Everything the style could learn, it had learned; what was
left was what the tiles never carried. So now we bake the tiles ourselves, with
a profile of our own, and the map shows harbours, gates on forest roads and
track grades. It also stopped carrying thousands of points of interest it could
never draw.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="harbours-that-are-not-paper">Harbours that are not paper<a href="https://fastgis.eu/guide/blog/our-own-tiles#harbours-that-are-not-paper" class="hash-link" aria-label="Direct link to Harbours that are not paper" title="Direct link to Harbours that are not paper" translate="no">​</a></h2>
<p>OpenMapTiles has no marinas, docks, breakwaters or quays. In Bergen the moles
and quay aprons of Vågen were drawn as open land; at Sanxenxo the marina was an
outline around nothing. Our tiles now carry a harbour layer. Basins are a quiet
tint over the water, quays and moles are decks with a structure edge, and a
breakwater is the line the sea breaks on. A footway that runs along a jetty is
now drawn as the jetty, not as a dashed path across the water.</p>
<p><img decoding="async" loading="lazy" alt="Vågen, Bergen at z14: before and after" src="https://fastgis.eu/guide/assets/images/wave5-harbour-bergen-z14-4d4a8eb3e87ecb7af3dbbfe7c6edfb82.png" width="1608" height="600" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-gate-before-the-forest-road">The gate before the forest road<a href="https://fastgis.eu/guide/blog/our-own-tiles#the-gate-before-the-forest-road" class="hash-link" aria-label="Direct link to The gate before the forest road" title="Direct link to The gate before the forest road" translate="no">​</a></h2>
<p>A locked gate is the fact a rider most wants before committing to a gravel
road. The new tiles carry gates, bollards and cattle grids, but only where a
road or track actually runs through them, and the map shows them as small
badges from z15. A gate tagged as locked is red. The bollards of city footways
and the lift gates of car parks are left out, and every barrier badge yields to
a road name or a point of interest when they collide.</p>
<p><img decoding="async" loading="lazy" alt="Gamle Geirangerveg, Strynefjell at z16: the gate where the old road leaves route 63" src="https://fastgis.eu/guide/assets/images/wave5-gate-strynefjell-z16-104990573b04b319060f112382740f9a.png" width="1608" height="600" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-lighter-map-with-the-right-badges">A lighter map, with the right badges<a href="https://fastgis.eu/guide/blog/our-own-tiles#a-lighter-map-with-the-right-badges" class="hash-link" aria-label="Direct link to A lighter map, with the right badges" title="Direct link to A lighter map, with the right badges" translate="no">​</a></h2>
<p>The stock tiles carried every point of interest OpenStreetMap knows: waste
baskets, bike stands, hairdressers. The map could draw none of them. Our
profile keeps only what the map draws, and ranks what a rider stops for first:
fuel, charging, hospitals, campsites, huts, shelters, drinking water. Springs
and wells now count as water. A Munich centre tile went from 7 290 points of
interest to 1 998, and from 342 KB to 200 KB. The whole Europe archive is 2.4 GB
smaller.</p>
<p>Because a point's rank now counts only against things the map can draw, the
badge budget was retuned so a city centre keeps the density it had. Munich at
z16 shows 45 badges instead of 35, and the road names stay readable.</p>
<p><img decoding="async" loading="lazy" alt="Munich centre at z16: before and after the retuned budget" src="https://fastgis.eu/guide/assets/images/wave5-density-munich-z16-0b7eb27be7e2fa6c2949aa443dbd2781.png" width="1608" height="600" class="img_ev3q"></p>
<p>The tiles also carry what a rider picks a stop by, ready for the map and the
app to use. A fuel station lists its fuel types, a charger its sockets and
capacity. A campsite says whether it takes tents or charges a fee. A shelter
says whether it is a hut or a bus stop. Surface now reaches the regional view
from z8. Tracks carry their grade, smoothness and whether motorcycles may use
them.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="if-you-have-the-offline-europe-map">If you have the offline Europe map<a href="https://fastgis.eu/guide/blog/our-own-tiles#if-you-have-the-offline-europe-map" class="hash-link" aria-label="Direct link to If you have the offline Europe map" title="Direct link to If you have the offline Europe map" translate="no">​</a></h2>
<p>A Europe map you already downloaded keeps working and draws exactly as it did.
Every new layer is optional in the style, and we checked that the old tiles
render the same labels with the new style at every test site. The app does not
replace a downloaded map on its own. To get harbours and gates offline too,
delete the <em>Europe map</em> under <em>Offline basemap</em> in the app's settings and
download it again. The new download is 2.4 GB smaller.</p>
<p>The details of what the map draws are on the
<a class="" href="https://fastgis.eu/guide/docs/product/adventure-basemap">Adventure basemap</a> page.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Basemap</category>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[A map that reads like a rider's map]]></title>
            <link>https://fastgis.eu/guide/blog/a-map-that-reads-like-a-rider-map</link>
            <guid>https://fastgis.eu/guide/blog/a-map-that-reads-like-a-rider-map</guid>
            <pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The Adventure basemap has always answered the one question every other map]]></description>
            <content:encoded><![CDATA[<p>The Adventure basemap has always answered the one question every other map
makes you click for: what is that road made of. This week it learned to
answer the rest of a rider's questions without being asked — where the ferry
runs, which name is the pass, where the town stops, and which badge to keep
when two collide. Four passes, each checked on real pixels before it shipped.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="things-that-were-in-the-tiles-all-along">Things that were in the tiles all along<a href="https://fastgis.eu/guide/blog/a-map-that-reads-like-a-rider-map#things-that-were-in-the-tiles-all-along" class="hash-link" aria-label="Direct link to Things that were in the tiles all along" title="Direct link to Things that were in the tiles all along" translate="no">​</a></h2>
<p>The tiles we build carry more than the style read. Ferry routes were there and
never drawn. Places had a rank and a capital flag; the style gave Bergen and a
hamlet the same size ramp. Peaks had a prominence rank and saddles had names
and elevations; Stelvio was invisible. Water names came as lines along the
lake; the style anchored them at a vertex. Runways, land use, protected areas:
all present, all unread.</p>
<p><img decoding="async" loading="lazy" alt="Sognefjord at z11: ferries, before and after" src="https://fastgis.eu/guide/assets/images/ferry-sognefjord-z11-c909be175b561d14f40387c4ebf11757.png" width="804" height="300" class="img_ev3q"></p>
<p>So the first pass was correctness. Ferries draw from the regional view and
carry their timetable's name. Scrub, heath and fell above the treeline take
their own tone instead of the lawn green. Route shields stop appearing on
Munich's staircases and start splitting <code>E 16;E 39</code> into one number. Indoor
and underground things stay indoors. The night theme stops leaking six day
colours. Maritime borders stop looking like ferries.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-hierarchy">A hierarchy<a href="https://fastgis.eu/guide/blog/a-map-that-reads-like-a-rider-map#a-hierarchy" class="hash-link" aria-label="Direct link to A hierarchy" title="Direct link to A hierarchy" translate="no">​</a></h2>
<p>The second pass gave labels a pecking order. Countries and states appear at
the continental view, set light and spaced. Cities step in by rank, then
towns, villages and hamlets, so a z6 view of Bavaria is no longer a wall of
equal names. Suburbs become a quieter upper-case tier. Peaks come in one rank
per zoom, highest summit winning a collision, and passes get their own glyph
and outrank the summits around them — a pass is where you are going.</p>
<p><img decoding="async" loading="lazy" alt="Stelvio at z13: passes and peaks" src="https://fastgis.eu/guide/assets/images/stelvio-passes-z13-d4f2ddc1a67b5ff3837fcec8435fe3ee.png" width="804" height="300" class="img_ev3q"></p>
<p>The same pass added a language: labels in the language the app speaks, the
local name underneath from z12, because that is what the sign at the
roundabout says.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="land-water-areas">Land, water, areas<a href="https://fastgis.eu/guide/blog/a-map-that-reads-like-a-rider-map#land-water-areas" class="hash-link" aria-label="Direct link to Land, water, areas" title="Direct link to Land, water, areas" translate="no">​</a></h2>
<p>The third pass tinted land use faintly enough that a town reads as a town
from z10 without a single road losing contrast, gave farmland its own tone,
drew protected-area edges and names, and put runways and IATA codes on the
map — a runway is the best orientation cue after a railway.</p>
<p><img decoding="async" loading="lazy" alt="Munich airport at z12" src="https://fastgis.eu/guide/assets/images/munich-airport-z12-7362cbd9000cb8c7bb50d1ea1299529c.png" width="804" height="300" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="badges-with-a-riders-priorities">Badges with a rider's priorities<a href="https://fastgis.eu/guide/blog/a-map-that-reads-like-a-rider-map#badges-with-a-riders-priorities" class="hash-link" aria-label="Direct link to Badges with a rider's priorities" title="Direct link to Badges with a rider's priorities" translate="no">​</a></h2>
<p>The fourth pass replaced the hand-drawn badge glyphs with CC0 silhouettes
from Maki and Temaki, on our own badge frame, and added six categories the
tiles already carried: mountain huts, supermarkets, sights, motorcycle
parking, toilets and ATMs. More importantly, badges are now placed by a
rider's priority. OpenMapTiles ranks a bar above a fuel station; on this map
fuel wins that collision every time.</p>
<p><img decoding="async" loading="lazy" alt="Munich at z16 with every category on" src="https://fastgis.eu/guide/assets/images/munich-poi-z16-c4634ea3823daf5c9e919f6a1820e2aa.png" width="804" height="300" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-was-checked">How it was checked<a href="https://fastgis.eu/guide/blog/a-map-that-reads-like-a-rider-map#how-it-was-checked" class="hash-link" aria-label="Direct link to How it was checked" title="Direct link to How it was checked" translate="no">​</a></h2>
<p>Every pass rendered the same fourteen sites in headless Chrome, day, night and
surface mode, before and after, with a census of placed labels per layer.
Rows that should not change came back byte-identical. The renders sat in
front of a person before anything was pushed. That harness is now in the
repository, so the next change to the map pays for none of it again.</p>
<p>The map is on in the rider app under <em>FastGIS Adventure</em>, and on the desktop
client's basemap picker. The full description is on the
<a class="" href="https://fastgis.eu/guide/docs/product/adventure-basemap">Adventure basemap</a> page.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Basemap</category>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[The app opens on what you are riding]]></title>
            <link>https://fastgis.eu/guide/blog/the-app-opens-on-what-you-are-riding</link>
            <guid>https://fastgis.eu/guide/blog/the-app-opens-on-what-you-are-riding</guid>
            <pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[EpicRide has always opened on a map. You arrived, a route planner loaded,]]></description>
            <content:encoded><![CDATA[<p>EpicRide has always opened on a map. You arrived, a route planner loaded,
and whatever you actually came for was somewhere behind it. From today the
desktop client opens on a <strong>Dashboard</strong> of what you are riding, and the
planner is a place you go.</p>
<p>Behind that change is a new object: an <strong>event</strong>. A time, a roster, and the
library records you ride.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-thing-a-route-file-cannot-tell-you">The thing a route file cannot tell you<a href="https://fastgis.eu/guide/blog/the-app-opens-on-what-you-are-riding#the-thing-a-route-file-cannot-tell-you" class="hash-link" aria-label="Direct link to The thing a route file cannot tell you" title="Direct link to The thing a route file cannot tell you" translate="no">​</a></h2>
<p>A GPX file is a shape. It cannot say who is coming, when you leave, where you
stop for fuel, or which of the six people on the ride still has not answered.
Riders have been solving that with group chats and screenshots for as long as
there have been group rides.</p>
<p>An event is where those answers live. It has a start, a roster with roles, a
schedule of stops, and the records it uses. It has a page you can link to —
and so does every part of it, because organising is a sharing activity and an
organiser pastes links all day.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="one-idea-at-four-sizes">One idea at four sizes<a href="https://fastgis.eu/guide/blog/the-app-opens-on-what-you-are-riding#one-idea-at-four-sizes" class="hash-link" aria-label="Direct link to One idea at four sizes" title="Direct link to One idea at four sizes" translate="no">​</a></h2>
<p>The temptation with something like this is to build the small version, then
build a separate serious version later for the people running real events. We
did not. A trip you are planning alone, a Sunday ride with friends, a tour
operator taking clients out and a rally with waves and time controls are the
<strong>same object</strong>, with different vocabulary and different capabilities.</p>
<p>The role ladder underneath never changes: owner, organiser, staff,
participant, spectator. What changes is what you read. The row that says
<em>Rider</em> on a group ride says <em>Client</em> on a tour and <em>Competitor</em> at a rally,
and the person running it goes from <em>Organiser</em> to <em>Operator</em> to <em>Promoter</em>.
One ladder, four vocabularies, no second product.</p>
<p>Which of those things you may do is decided by the server and sent with every
event it hands you. The client renders that list; it never works it out for
itself. So taking someone's role away takes effect on their next request
rather than whenever their browser gets round to reloading.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="starting-one-should-be-cheap">Starting one should be cheap<a href="https://fastgis.eu/guide/blog/the-app-opens-on-what-you-are-riding#starting-one-should-be-cheap" class="hash-link" aria-label="Direct link to Starting one should be cheap" title="Direct link to Starting one should be cheap" translate="no">​</a></h2>
<p>Creating an event asks for a title and a preset. That is all. No date, no
roster, no route — a trip of one should not cost more than saving a route
does, and everything else is a decision you can make later or never.</p>
<p>There is a shorter path still. Anywhere the Library is on screen — the Library
page, the picker inside the planner — a saved route now offers <strong>Attach to
event</strong>, and the first button in that dialog is <em>New trip from this</em>. The
route names the trip, the trip points at the route, and you land in its
console. One click, from a line on the map to something people can be invited
to.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nothing-is-copied">Nothing is copied<a href="https://fastgis.eu/guide/blog/the-app-opens-on-what-you-are-riding#nothing-is-copied" class="hash-link" aria-label="Direct link to Nothing is copied" title="Direct link to Nothing is copied" translate="no">​</a></h2>
<p>An event stores which library record it uses and how: route, roadbook,
waypoints, briefing, GPX pack, media, result track. It does not take a copy.</p>
<p>This is the same rule sharing has followed since the Library became one
primitive: a reference, never a duplicate. The record stays yours, in one
place, with one owner. Fix the route the night before the ride and it is fixed
for everyone holding the link — nobody is riding last week's file.</p>
<p>There is exactly one exception, and it is the one that has to exist. When a
<strong>rally</strong> is published, its documents are frozen at that version, because an
organiser has to be able to prove what a competitor was handed. Trips, group
rides and tours stay live references, because there a correction reaching
everyone at once is worth more than a paper trail.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-the-dashboard-shows">What the Dashboard shows<a href="https://fastgis.eu/guide/blog/the-app-opens-on-what-you-are-riding#what-the-dashboard-shows" class="hash-link" aria-label="Direct link to What the Dashboard shows" title="Direct link to What the Dashboard shows" translate="no">​</a></h2>
<p>Three sections, in the order they matter: invitations waiting on your answer,
what is running right now, and what is coming up. If you are new, all three
are empty — so instead of an apology that page offers the three things worth
doing, and gets out of the way.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-next">What is next<a href="https://fastgis.eu/guide/blog/the-app-opens-on-what-you-are-riding#what-is-next" class="hash-link" aria-label="Direct link to What is next" title="Direct link to What is next" translate="no">​</a></h2>
<p>The console covers the roster, the schedule and the documents. The live wall —
the realtime map of an event in progress, the one screen that serves five
friends and three hundred competitors — is the next surface, and it is where
this gets interesting.</p>
<p>Read the <a class="" href="https://fastgis.eu/guide/docs/product/events">Events page</a> for what is there today.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Desktop</category>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[One library, everywhere]]></title>
            <link>https://fastgis.eu/guide/blog/one-library-everywhere</link>
            <guid>https://fastgis.eu/guide/blog/one-library-everywhere</guid>
            <pubDate>Sun, 06 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[EpicRide's Library used to be two tabs and a scroll: everything you had]]></description>
            <content:encoded><![CDATA[<p>EpicRide's Library used to be two tabs and a scroll: everything you had
saved, fetched in one go and filtered in the browser. Today it becomes a
<strong>primitive</strong> — one component that is the Library page, the picker inside
the planner and the roadbook editor, and the save form everywhere something
can be saved. And <strong>rally roadbooks move into it</strong>: a saved book is now a
library record like a route or a ride, so it can be shared, exported,
searched and linked to the track it came from.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="search-that-was-always-there">Search that was always there<a href="https://fastgis.eu/guide/blog/one-library-everywhere#search-that-was-always-there" class="hash-link" aria-label="Direct link to Search that was always there" title="Direct link to Search that was always there" translate="no">​</a></h2>
<p>The catalogue behind the Library had a full search plane for months — free
text over names, descriptions and tags on a proper index, tag filters,
paging — but only on a door the desktop could not open. That plane now sits
on the endpoint every client uses, so the desktop <em>and</em> the phone can ask
for "gravel" and get the ride whose description mentions it, page through a
long history, sort by length, and scope a query to a map extent or a
date window. Nothing about the old answer changed for callers that never
asked to page.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="one-verb-set-computed">One verb set, computed<a href="https://fastgis.eu/guide/blog/one-library-everywhere#one-verb-set-computed" class="hash-link" aria-label="Direct link to One verb set, computed" title="Direct link to One verb set, computed" translate="no">​</a></h2>
<p>What you can do with an item — show it on the map, load it into the
planner, insert it into a route, edit its geometry, generate a roadbook,
share, export, delete — used to depend on where you had clicked. It is now
one table, evaluated by a pure function of the item, the mount and your
role, so a saved route offers the same verbs in the list, in a picker and
on its own page. A verb your plan does not include is shown locked, not
hidden. Select several items and the bulk bar offers only the actions that
apply to <strong>every one</strong> of them — never a partial apply, because a bulk
action that quietly skips a row is how a rider loses data they believe they
moved.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="filters-in-the-address-bar">Filters in the address bar<a href="https://fastgis.eu/guide/blog/one-library-everywhere#filters-in-the-address-bar" class="hash-link" aria-label="Direct link to Filters in the address bar" title="Direct link to Filters in the address bar" translate="no">​</a></h2>
<p>The Library page keeps its query in the URL. Search for a word, pick a
category, hit "Search this area", copy the address, paste it in a new tab:
the same list. A filtered library view is a link you can send.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="roadbooks-are-library-items">Roadbooks are library items<a href="https://fastgis.eu/guide/blog/one-library-everywhere#roadbooks-are-library-items" class="hash-link" aria-label="Direct link to Roadbooks are library items" title="Direct link to Roadbooks are library items" translate="no">​</a></h2>
<p>Until now a saved roadbook lived in a small store beside the library:
capped, unshareable, invisible to export. A roadbook is now a <strong>record of
its own</strong>, with the track it is projected onto as its geometry and the book
in its payload, linked back to the item the track came from. The editor's
first save opens the Library's save form; later saves update the record in
place. Books saved before today are moved in the first time you open them —
nothing to do in advance, nothing lost. And because a roadbook is now the
same kind of thing as a route, sharing it is the sharing you already have:
the person you send it to sees the book and can download its track.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lessons">Lessons<a href="https://fastgis.eu/guide/blog/one-library-everywhere#lessons" class="hash-link" aria-label="Direct link to Lessons" title="Direct link to Lessons" translate="no">​</a></h2>
<p>The interesting bug was found in the browser, not in a test: saving a book
in place was overwriting the tags typed on its item page, because the save
sent a tag list it had no business sending. The fix is a rule — a save in
place carries the book and its track, and nothing that belongs to the
record — and a test that pins it.</p>
<p><strong>Dig deeper:</strong> the <a class="" href="https://fastgis.eu/guide/docs/product/desktop-client">desktop client</a> and the
<a class="" href="https://fastgis.eu/guide/docs/product/roadbook-editor">roadbook editor</a>.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Desktop</category>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[A roadbook editor for the desk]]></title>
            <link>https://fastgis.eu/guide/blog/a-roadbook-editor-for-the-desk</link>
            <guid>https://fastgis.eu/guide/blog/a-roadbook-editor-for-the-desk</guid>
            <pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[For a month the roadbook program has been building its foundations: a data]]></description>
            <content:encoded><![CDATA[<p>For a month the roadbook program has been building its foundations: a data
model that carries the official FIM/FIA structure, an exporter that real
rally readers accept, a symbol library drawn glyph by glyph, a print module
measured off the FIA's own Diagram 1. Today the last and largest piece
ships: <strong>a full roadbook editor in EpicRide</strong>, and with it the whole
pipeline — from any GPX to a printed, regulation-shaped book — is live.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-you-edit-is-what-prints">What you edit is what prints<a href="https://fastgis.eu/guide/blog/a-roadbook-editor-for-the-desk#what-you-edit-is-what-prints" class="hash-link" aria-label="Direct link to What you edit is what prints" title="Direct link to What you edit is what prints" translate="no">​</a></h2>
<p>The editor shows your book as the official page: the 148 mm Diagram-1 rows
with the distance, tulip and description boxes at their measured widths,
the red danger frames, the green close-note boxes, the orange speed-zone
frames, the comma decimals. A splitter zooms the paper without ever
distorting it, because the same millimetres drive the A5, FMI and moto-roll
print layouts — now led by a proper <strong>page-1 cover</strong> with the event block,
the day's waypoint radii and the change log.</p>
<p>Behind every edit sits the same server engine that generates and bakes the
TET books. The editor never re-implements a rule: change a danger level,
paint a speed zone, drop a note — the book comes back renumbered,
re-measured, and re-linted, with the findings panel (one DSS, <code>!!!</code> needs a
safety waypoint, no box over 400 m…) one click away from the row it names.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ride-it-at-the-desk">Ride it at the desk<a href="https://fastgis.eu/guide/blog/a-roadbook-editor-for-the-desk#ride-it-at-the-desk" class="hash-link" aria-label="Direct link to Ride it at the desk" title="Direct link to Ride it at the desk" translate="no">​</a></h2>
<p>The flow we ended up loving: open any GPX, start a blank book, and
<strong>walk the route</strong>. A cursor steps along the track — or jumps straight to
the <strong>next bend</strong> — and each <strong>add note</strong> drops a vignette that then
<strong>populates itself from the data underneath</strong>: the generator reads the
stretch around it and fills in the junction tulip, the crossing roads, the
road name and surface, the exit heading, the terrain stamps. You decide;
the machine does the drawing. One <strong>re-split</strong> pass afterwards inserts the
regulation continue notes into whatever gaps remain.</p>
<p>Every piece of the vignette is hand-editable too: the tulip's arms and
branches (click a handle, point it), the full 144-symbol lexicon in four
abbreviation dialects, waypoints with regulation radii, CAPs, free text.
Arm <strong>change tracking</strong> and your edits become versioned <strong>MODIF</strong> /
<strong>NEW NOTE</strong> records, the way an opening car issues them.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-track-is-a-first-class-citizen">The track is a first-class citizen<a href="https://fastgis.eu/guide/blog/a-roadbook-editor-for-the-desk#the-track-is-a-first-class-citizen" class="hash-link" aria-label="Direct link to The track is a first-class citizen" title="Direct link to The track is a first-class citizen" translate="no">​</a></h2>
<p>Roadbooks live and die by geometry, so the editor owns the track as well as
the book: snap a hand-drawn GPX onto the road network (stretches with no
map data keep their shape), drag vertices where reality disagrees, and —
only when you say so — re-measure the book's distances from the corrected
line. By default the authored distances stay untouched: they come from the
road's true arc length and are usually better than any GPX chord sum.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="keep-it-carry-it-hand-it-over">Keep it, carry it, hand it over<a href="https://fastgis.eu/guide/blog/a-roadbook-editor-for-the-desk#keep-it-carry-it-hand-it-over" class="hash-link" aria-label="Direct link to Keep it, carry it, hand it over" title="Direct link to Keep it, carry it, hand it over" translate="no">​</a></h2>
<p>Books save to a per-account <strong>library</strong> on the server and reopen exactly as
left — track included — or travel as a single portable <strong>project file</strong>.
Getting a book out is one click: <strong>OpenRally GPX</strong> for Piste, DMD2 and the
rest of the reader ecosystem, or the print book for paper and roll holders.</p>
<p>The full walkthrough lives in the guide:
<a class="" href="https://fastgis.eu/guide/docs/product/roadbook-editor">the roadbook editor</a>.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Desktop</category>
            <category>Routing</category>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[The roadbook rides itself]]></title>
            <link>https://fastgis.eu/guide/blog/the-roadbook-rides-itself</link>
            <guid>https://fastgis.eu/guide/blog/the-roadbook-rides-itself</guid>
            <pubDate>Thu, 03 Sep 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[Since July the rider app has been able to turn any track into a rally-style]]></description>
            <content:encoded><![CDATA[<p>Since July the rider app has been able to turn any track into a rally-style
tulip roadbook — the <strong>Rally</strong> side of the Road ⇄ Rally toggle reads the
corners straight off the GPX shape, no road network required. It was a
document: something to scroll with a thumb at a fuel stop. Today it becomes a
navigation mode.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ride-not-read">Ride, not read<a href="https://fastgis.eu/guide/blog/the-roadbook-rides-itself#ride-not-read" class="hash-link" aria-label="Direct link to Ride, not read" title="Direct link to Ride, not read" translate="no">​</a></h2>
<p>Open any track's roadbook, flip it to <strong>Rally</strong>, and there is now a <strong>Ride</strong>
button. It builds a turn-by-turn session from the track's geometry alone:
every bend is classified by its clustered turn angle — <em>kink, mild, sharp,
elbow, hairpin</em> — with S-bends linked into chicanes, and each one becomes a
maneuver the normal navigation engine drives. Nothing is looked up. No
map-matching, no tiles, no server, no signal. If the points are on the phone,
the roadbook rides.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-the-hud-shows">What the HUD shows<a href="https://fastgis.eu/guide/blog/the-roadbook-rides-itself#what-the-hud-shows" class="hash-link" aria-label="Direct link to What the HUD shows" title="Direct link to What the HUD shows" translate="no">​</a></h2>
<ul>
<li class=""><strong>A tulip glyph</strong> instead of a road arrow — the same approach-line-and-exit
shape you would draw in a paper roadbook, coloured by direction.</li>
<li class=""><strong>Distance to the next note</strong>, counting down odometer-style along the
track as you cover ground, not as the crow flies. On a stack of hairpins the
"nearest note" is often three switchbacks above you; along-track distance
never makes that mistake.</li>
<li class=""><strong>CAP</strong>, the compass heading to hold out of the bend — <code>CAP 135° SE</code> — the
rally navigator's oldest trick for confirming you left a junction the right
way.</li>
<li class=""><strong>Danger chips</strong>: <code>!</code>, <code>!!</code>, <code>!!!</code> from radius, blindness and downhill
grade.</li>
</ul>
<p>Spoken cues follow suit — "hairpin left, 160", "S-bends" — in the navigation
voice language you already chose.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-it-deliberately-does-not-do">What it deliberately does not do<a href="https://fastgis.eu/guide/blog/the-roadbook-rides-itself#what-it-deliberately-does-not-do" class="hash-link" aria-label="Direct link to What it deliberately does not do" title="Direct link to What it deliberately does not do" translate="no">​</a></h2>
<p>A roadbook ride never replans. Going off the line does not summon a router to
"fix" the route (there is none to summon, and on a trail the fix is usually
worse than the problem). The HUD drops to a calm <em>following your track</em> hint,
the voice says so once, and the cues resume the moment you are back on the
line. That quiet path existed in the engine for months as an anticipated
case; this is the first mode to actually ride it.</p>
<p>An advisory corner-speed and gear suggestion (<code>v = √(μ·g·r)</code>, with a grip
coefficient you set) is in there too — <strong>off by default</strong>, and it stays off
unless you turn it on in Settings → Navigation. Estimates about grip are not
something an app should volunteer.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-it-stands">Where it stands<a href="https://fastgis.eu/guide/blog/the-roadbook-rides-itself#where-it-stands" class="hash-link" aria-label="Direct link to Where it stands" title="Direct link to Where it stands" translate="no">​</a></h2>
<p>Verified in the simulator with GPS playback along a real Norwegian pass —
eleven hairpins, every one announced and advanced in order. The field test on
the bike is still owed, and that is where the note spacing and the CAP
lead time will get their real calibration.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Rider app</category>
            <category>Routing</category>
        </item>
        <item>
            <title><![CDATA[Talking to the bike]]></title>
            <link>https://fastgis.eu/guide/blog/talking-to-the-bike</link>
            <guid>https://fastgis.eu/guide/blog/talking-to-the-bike</guid>
            <pubDate>Thu, 03 Sep 2026 09:00:00 GMT</pubDate>
            <description><![CDATA[This was the week the app stopped inferring what the motorcycle was doing and]]></description>
            <content:encoded><![CDATA[<p>This was the week the app stopped inferring what the motorcycle was doing and
started asking it. A Bluetooth OBD-II adapter, two garage sessions, one
surprise hiding in monitor mode — and by the end, live engine data on the
phone and a gear indicator nobody sold us.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-three-day-arc">The three-day arc<a href="https://fastgis.eu/guide/blog/talking-to-the-bike#the-three-day-arc" class="hash-link" aria-label="Direct link to The three-day arc" title="Direct link to The three-day arc" translate="no">​</a></h2>
<p>The OBD-II work had been parked for months as a deliberately unmerged spike:
a pure ELM327 protocol layer with tests, a BLE transport, and a diagnostic
screen — all waiting on one question no amount of code review could answer:
<em>does the bike actually respond?</em> Motorcycles are notorious for implementing
a thin, inconsistent slice of the OBD-II standard, or none at all.</p>
<p>Then the adapter arrived (a Vgate iCar Pro 2S), and the question got answered
in stages.</p>
<p><strong>Bench day.</strong> Ignition on, scan, connect — and the first quiet surprise: the
adapter advertises the <code>18F0</code> BLE service, not the <code>FFF0</code> layout its own
documentation suggests. The transport's autodiscovery fallback (any service
with one notifiable and one writable characteristic) carried the day, and
<code>18F0</code> is now first in the known-layouts list. Then the second surprise: the
KTM 890 <strong>ignores <code>0100</code></strong>, the standard "which PIDs do you support?" query.
A capability-first design would have concluded the bike supports nothing.
Polling PIDs directly told a different story: RPM, speed, coolant, throttle,
load and battery voltage, all live, all plausible — 12.5 V with the engine
off, 14.2 V charging the moment it fired up.</p>
<p><strong>Probe day.</strong> The owner's real asks were odometer and fuel. So the screen
grew an <em>extended probe</em>: ask each interesting PID once per connection and
report answered / no-answer, honestly, per line. The verdict on the 890:
fuel level, true odometer, fuel rate, mass-air-flow and gear — silent.
But <strong>distance-since-codes-cleared (<code>31</code>) answers</strong>, and that is enough:
anchor it once against the dash and the app can track total distance from
then on. Maintenance tracking gets ECU-exact kilometres; fuel planning stays
on the learned-consumption path that never needed the ECU at all.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-hunt">The hunt<a href="https://fastgis.eu/guide/blog/talking-to-the-bike#the-hunt" class="hash-link" aria-label="Direct link to The hunt" title="Direct link to The hunt" translate="no">​</a></h2>
<p>The best part of the week came from the signals OBD-II <em>doesn't</em> hand over.
The ELM327 has a monitor mode that eavesdrops on the bike's broadcast CAN
bus — received wisdom says cheap clones drop frames and give up. Filtered
tightly, this one doesn't. Twenty-five broadcast CAN IDs reach the diagnostic
connector, and among them:</p>
<ul>
<li class=""><strong>Gear position</strong>, plainly broadcast — decoded and confirmed through all
six gears against prediction,</li>
<li class="">the <strong>IMU cluster</strong>, identified by a sign flip while riding circles,</li>
<li class="">a <strong>speed frame</strong> whose fields go to zero at a standstill — raw material
for a wheel-speed odometer with far finer resolution than the 1 km ticks
of PID <code>31</code>.</li>
</ul>
<p>The capture tooling moved from a laptop script into the app itself, with GPS
interleaved into every log as the calibration reference. And because the next
step is a calibration ride, the capture screen now has three glove-sized
buttons — <strong>20 / 40 / 60 km/h</strong> — that stamp labelled steady-speed windows
straight into the log while riding. Tap when you're holding the speed, tap
again when you leave it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-this-lands">Where this lands<a href="https://fastgis.eu/guide/blog/talking-to-the-bike#where-this-lands" class="hash-link" aria-label="Direct link to Where this lands" title="Direct link to Where this lands" translate="no">​</a></h2>
<p>Live engine data is on the phone today (<strong>More → OBD-II (Bluetooth)</strong>), the
screen keeps itself awake, and the whole feature works with CarPlay active —
which on this bike means <em>always</em>, since the head unit comes up with the
ignition. The plan from here: fuse the fine-but-drifting wheel-speed integral
with the coarse-but-honest kilometre counter, fold the proven signals into
ride recordings, and give the rally-roadbook mode the distance source it has
been waiting for.</p>
<p>The bike had a lot to say. We just had to stop asking politely and start
listening.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Rider app</category>
        </item>
        <item>
            <title><![CDATA[The mountains, in your pocket]]></title>
            <link>https://fastgis.eu/guide/blog/the-mountains-in-your-pocket</link>
            <guid>https://fastgis.eu/guide/blog/the-mountains-in-your-pocket</guid>
            <pubDate>Wed, 02 Sep 2026 12:00:00 GMT</pubDate>
            <description><![CDATA[Two weeks ago the map stopped being flat: the routing]]></description>
            <content:encoded><![CDATA[<p>Two weeks ago <a class="" href="https://fastgis.eu/guide/blog/the-map-was-flat">the map stopped being flat</a>: the routing
graph learned elevation, the road score grew a climb axis, and the server could
finally tell a mountain road from a merely bendy one. All of it, though, lived
behind an API. This week it reaches the phone.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bends-or-climb--your-call-in-four-places">Bends or climb — your call, in four places<a href="https://fastgis.eu/guide/blog/the-mountains-in-your-pocket#bends-or-climb--your-call-in-four-places" class="hash-link" aria-label="Direct link to Bends or climb — your call, in four places" title="Direct link to Bends or climb — your call, in four places" translate="no">​</a></h2>
<p>The <strong>curvy-roads finder</strong> grew a <em>Rank by</em> switch: <strong>Bends</strong> is the classic
curvature ranking, <strong>Climb</strong> orders the same search by a 0–100 climb rating
instead. The two lists genuinely differ — the bendiest road near you and the
biggest mountain road near you are rarely the same road — and each result now
shows its climb rating alongside elevation range and gain.</p>
<p>The <strong>loop generator</strong> got the same choice. <em>Include curvy roads</em> has always
woven the best road nearby into your loop; now a <strong>Bends / Climb</strong> picker
decides what "best" means, so a mountain loop is one tap instead of a hope.
It is mirrored on CarPlay and Android Auto.</p>
<p>The <strong>route planner</strong> gained a <em>Scenic bias</em> slider — off by default, because
it asks the server for extra work per request. Slide it up and the route is
biased toward the best-rated roads in the corridor, again with the bends-or-
climb choice. The engine's cost model is untouched: the server scores the
roads and simply tells Valhalla some edges are cheaper.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-second-number-beside--unpaved">A second number beside "% unpaved"<a href="https://fastgis.eu/guide/blog/the-mountains-in-your-pocket#a-second-number-beside--unpaved" class="hash-link" aria-label="Direct link to A second number beside &quot;% unpaved&quot;" title="Direct link to A second number beside &quot;% unpaved&quot;" translate="no">​</a></h2>
<p>A planned route's summary already showed how much of it is dirt. It now also
shows how <em>demanding</em> it is: a <strong>difficulty</strong> rating — surface roughness
amplified by climb, on exactly the scale the <code>max_difficulty</code> routing ceiling
uses — with the hard kilometres spelled out beside it. It is deliberately a
second number, never folded into the unpaved share: "40% unpaved" and "40%
unpaved, 12 of them steep loose climbs" are different rides, and the ride you
were promised should match the ride you get. Steep tarmac stays easy — steep
is not the same as difficult.</p>
<p>The offline fold computes the same number on-device from the elevation the
routing tiles now carry, so the badge survives losing the network.</p>
<p>All of this ships in ten languages and rides the next phone build.</p>
<hr>
<p><strong>Dig deeper:</strong> the <a class="" href="https://fastgis.eu/guide/docs/product/rider-app/overview">rider app guide</a> covers
each control in place.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Rider app</category>
            <category>Routing</category>
        </item>
        <item>
            <title><![CDATA[How far to the next stop?]]></title>
            <link>https://fastgis.eu/guide/blog/how-far-to-the-next-stop</link>
            <guid>https://fastgis.eu/guide/blog/how-far-to-the-next-stop</guid>
            <pubDate>Wed, 02 Sep 2026 11:00:00 GMT</pubDate>
            <description><![CDATA[Plan a route with a lunch stop and a mountain pass in the middle, start]]></description>
            <content:encoded><![CDATA[<p>Plan a route with a lunch stop and a mountain pass in the middle, start
navigating, and until today the app would tell you exactly one thing about
time: when you'd reach the <strong>end</strong>. The intermediate stops — the whole reason
the route has that shape — were invisible from the saddle.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partials-everywhere-the-trip-is-shown">Partials everywhere the trip is shown<a href="https://fastgis.eu/guide/blog/how-far-to-the-next-stop#partials-everywhere-the-trip-is-shown" class="hash-link" aria-label="Direct link to Partials everywhere the trip is shown" title="Direct link to Partials everywhere the trip is shown" translate="no">​</a></h2>
<p>Multi-stop routes now carry per-stop arithmetic through the whole app:</p>
<ul>
<li class=""><strong>In the HUD</strong>, three new cycling metric slots: <strong>NEXT STOP</strong> (distance to
the next intermediate stop), <strong>STOP ETA</strong> (the arrival clock at it), and a
<strong>STOP</strong> counter ("2/4"). The final-destination ETA is untouched.</li>
<li class=""><strong>Before you ride</strong>, the route planner's stops editor lists each stop's own
leg distance, riding time, and projected arrival clock — so you can see at
a glance that lunch lands at 14:30, not 12:00.</li>
<li class=""><strong>On CarPlay and Android Auto</strong>, a new <strong>Stops</strong> button during multi-stop
navigation opens a dedicated list page: every stop with its remaining
distance and arrival time. The car's own estimate still means the final
destination — CarPlay models one trip, one estimate, and pretending
otherwise would corrupt the ETA the car shows in its cluster.</li>
</ul>
<p>The engine room is deliberately boring: the navigation store already kept the
route's legs, and the ETA estimator already weighted remaining time by
Valhalla's per-maneuver durations (so a route mixing motorway and switchbacks
doesn't drift). Per-stop partials are prefix-sum subtractions over that same
distribution — the last stop's numbers are <em>identical</em> to the trip totals by
construction, and a test pins that identity at arbitrary points along the
route.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-the-honest-answer-is-a-dash">When the honest answer is a dash<a href="https://fastgis.eu/guide/blog/how-far-to-the-next-stop#when-the-honest-answer-is-a-dash" class="hash-link" aria-label="Direct link to When the honest answer is a dash" title="Direct link to When the honest answer is a dash" translate="no">​</a></h2>
<p>The interesting design work was deciding when <strong>not</strong> to show a number.</p>
<p>An out-and-back track — Sommeiller, Jafferau — is one leg whose geometry is a
palindrome. The turnaround is not a stop, and "Stop 1 of 1" would be
noise pretending to be information. A TET section or imported GPX rides as a
chain of stitched legs whose boundaries are chunking artifacts, not places
anyone plans to stop. And after an off-route reroute rebuilds the trip as
"approach + trail", reaching the trail again is a milestone, not a stop.</p>
<p>In all of those cases the stop metrics show a plain <strong>—</strong>. The rule the
implementation follows, and the tests enforce: degrade to blank rather than
lie.</p>]]></content:encoded>
            <category>Changelog</category>
            <category>Rider app</category>
        </item>
    </channel>
</rss>