Skip to main content

Mobile App

The FastGIS mobile app is an Expo / React Native client for field capture, route planning, offline curvy-road discovery, and real-time elevation profiling. It connects to the same FastGIS server as the browser UI.

Tabs​

TabPurpose
NavigateFull-screen MapLibre map — route planning, circular-route generator, POI search, curvy-road discovery, offline tile queries, turn-by-turn navigation
CaptureGPS field capture — track recording, waypoint photos/audio/notes, sync to server
MapStatic map viewer and overlay manager
ProfileElevation transect tool — draw a line on the map, run GRASS r.profile against any loaded DEM, inspect the chart
ConnectionServer connection, environment management, saved analyses, app settings

Navigate is the default tab when the app opens.


Live engine data (OBD-II)​

The app can read live engine data straight from the motorcycle over a Bluetooth-LE OBD-II adapter (ELM327 family — e.g. the Vgate iCar Pro 2S). Open More → OBD-II (Bluetooth), tap Scan, and pick the adapter — likely dongles are sorted to the top. There is no iOS Settings pairing step: BLE adapters connect inside the app.

Once connected the screen shows what your bike actually serves, live: engine RPM, vehicle speed, coolant temperature, throttle position, engine load, battery/module voltage — plus an extended probe that asks once per connection for fuel level, odometer, distance-since-service, fuel rate and intake temperature, and reports honestly which of them the ECU answers. Motorcycles vary widely here: a KTM 890 Adventure, for example, answers the core set plus distance and intake temperature, and declines the fuel PIDs.

Next to it, More → CAN bus scanner finds and decodes the signals a bike broadcasts on its CAN bus through the same adapter, read-only. A preflight card asks the adapter the five questions that decide whether a capture is worth making (firmware, device, is the ECU awake, is a protocol pinned, is filtering available) and can force CAN 11-bit/500k when nothing was pinned; enumerate lists every id on the bus for ten seconds; watch records chosen ids losslessly with a live per-byte table, a change timeline and glove-sized event marks (gear, clutch, brakes, sidestand, indicators, steady speeds) so a byte can be lined up against what you did. Decoded signals live in a per-model registry (the KTM 890's gear position ships confirmed), and every capture exports as a log plus a JSON summary. Captures end honestly: a silent adapter or a dropped link stops the clock, keeps the data and says so aloud. GPS speed and accuracy ride along in the log — never coordinates. This is the groundwork for wheel-speed distance tracking and gear display on bikes that broadcast them.

A guided session (from the scanner screen) runs that protocol for you and speaks it, in the app's language: nine stand stages with the engine running — rear brake, front brake, clutch, each indicator, throttle, gears, kill switch, sidestand — and two ride stages. For a switch it records the bus three times, released → pressed → released, and reports the byte whose values changed only while pressed and came back afterwards (the third recording is the prediction); counters and checksums are ignored. On the ride it asks for 20, 40 and 60 km/h and marks the steady windows from GPS itself, and marks every gear change from the decoded gear. Skip, retry and abort are one big button each; a dropped link pauses the session and it resumes where it was. Findings go to the registry as candidates, and the session exports a tour.json the laptop analyser can re-check against the same logs (analyse_capture.py --tour).

The screen stays awake while connected, and works alongside CarPlay (minimise the companion overlay to reach it while the head unit is active).


Signing in​

Open More → Connection and sign in with your username and password. The server URL is pre-filled; change it only if you run your own server. The app keeps the session token in the phone's secure storage and signs you back in on relaunch.

One phone per account​

An account is signed in on one phone at a time (plus one desktop session, which is separate). If you sign in on a second phone, the app tells you which phone holds the account and when it was last active — or that it is riding right now — and asks before taking over:

  • Cancel changes nothing on either phone.
  • Sign in here signs this phone in and the other one out.

Signing in again on the same phone never asks. An account can change phones up to five times in 24 hours.

The phone that was signed out stops being part of the account within seconds when it is online: it stops sharing its location (friends no longer see its dot), leaves any call and group ride, and no longer rings for calls. It shows Signed out — alice signed in on iPhone · iOS 26.4 at 14:02. A phone that was offline shows the same notice the next time it comes online or is opened. Offline maps and navigation keep working while signed out, and captures that were not uploaded stay on the phone.

Devices​

More → Connection lists where the account is signed in: this phone and, if there is one, the desktop session, each with when it was last active. Tap Sign out under the desktop to end a session you left open on a shared computer; it is signed out at once and told it was signed out from this phone. The desktop client can do the same to a lost phone. An administrator can also sign an account out on every phone, desktop and browser at once — the devices say so when they are signed out.


The Navigate tab is a full-screen MapLibre map with floating controls and a set of bottom sheets.

Floating controls​

ButtonAction
⊙GPS follow — tap to re-centre the map on your position and lock the camera to follow you. Tap again (or pan the map) to unlock.
+ / −Zoom in / out
2D / 3DToggle perspective tilt
⊕Open the POI category tray (see below)
☰Map settings and basemap selector (see the Adventure basemap)
⊞Routing wizard — the entry point for all route planning

In portrait these stack as a single right-side column. In landscape the same buttons sit in a horizontal bottom row, with the central Route pill flanked by zoom/perspective controls on the left and POI / GPS / nav-toggle on the right.

The Map tab mirrors this exact layout: same button sizes, same gaps, same right-column-portrait / bottom-row-landscape pattern (Map's primary action — the Capture FAB — sits in the visual centre slot equivalent to Navigate's Route pill).

Routing wizard​

Tap ⊞ to open the ride wizard. Four options are available:

OptionDescription
📍→📍 Plan a routeA-to-B route with waypoints, vehicle type, and routing preferences
↺ Create a loopCircular tour from your GPS position or map centre
〰 Find curvy roadsDiscover scenic and twisty roads from the curvature database
⏺ Record RideStart a GPS field session — track, waypoints, photos, audio, notes

POI chip bar​

Tap ⊕ to reveal the POI category tray. Selecting a chip overlays the corresponding points of interest on the map. Chips are multi-select: tap several to see, say, fuel and food together — each category keeps its own colour and icon, the round button shows the chip's icon for one selection and a stacked-layers glyph with a count for several, and tapping an active chip removes just that category.

The nearest-POI pill at the top of the map shows the single closest place of the active category with a live distance. Tap it to open the results list: every hit of that category, nearest first, each row with its icon, address and distance badge, opened on the very place the pill was showing with its card expanded. Tapping a row expands it in place — opening hours, phone and website where the map data carries them — with four actions: view on map, set as destination, add as stop, and details (the full place sheet with bookmarking). Every sheet you reach from a result carries a back arrow to what opened it: the dropped-pin card and the place sheet return to the list on the same row; the route planner returns to the result, pin or place that set the destination or stop; the wild-camp tools (camp near here, walk me there, nearest water) return to the pin card, and from there to the list. The same holds for the text search: a result's planner or pin sheet leads back to the search. With several categories active the pill becomes a pager: swipe it to switch category (the map stays put), and the list opens with that category's filter pill preselected — the other categories are one tap away. Distances follow you as you ride; after a "Search this area" they stay measured from that centre.

Dense result sets are clustered into bubbles until you zoom close enough for the markers to fit: a dozen fuel stations spread out at z12, while three hundred restaurants in a city centre stay clustered two or three zooms longer. Tap a bubble to zoom into it.

ChipCategory
⭐Saved places
📦Field captures (from the Capture tab)
🏛Attractions
〰Curvy roads (runs a quick curvature query)
⛰Mountain passes
📍Meeting points
⛽Gas stations
🍴Food & restaurants
⛺Camping
🏨Biker-friendly hotels
🅿Motorcycle parking
🍦Ice cream

Tap a chip again to hide its layer. Tap the map or close the tray to collapse the bar.

The Search pill at the top of the map takes a place name, an address, a coordinate pair, or a category with a spatial hint ("fuel near me", "food in the area", "gas along the route"). Results use the same rows as the POI list — icon, address, distance badge — and each row expands in place into the same card (view on map, set as destination, add as stop, save to bookmarks). A Best match / Nearest toggle above the rows orders a name query either by how well the name matches (the default: "Bergen" the city beats a Bergen street 200 m away) or purely by distance from you; the choice sticks. Category and along-route queries are nearest-first regardless. Recently picked places appear above the fresh results and expand the same way.

Map overlays​

Tap ☰ to open map settings. The Overlays section lists eight toggleable data layers:

OverlayDescription
📷 Speed camerasFixed speed camera locations sourced from OpenStreetMap. Requires a server connection.
⛽ Gas stationsFuel stops in the current map area. Requires a server connection.
🏖 BeachesScored sandy beaches from the beach-seeker dataset. Requires a server connection.
⛰ Slope shadingSteepness in % grade, from the GLO-30 terrain model. Requires a server connection.
🌀 CurvatureEvery road coloured by twistiness per km. Requires a server connection.
🚦 Live trafficClosures, roadworks, queues and accidents from the national road authorities of nine countries, Norway included. Requires a server connection.
🌧 Weather timelineRain, wind gusts and temperature as scrubbable, playable animations over the map — on the Map tab (beside the lean and acceleration HUD) and on Navigate. Rain shows the last hours of weather radar, our own two-hour nowcast and the forecast; gusts and temperature are the hourly forecast for the day ahead. Pick the variable on the bar; a legend strip names the colours; a tap on the card folds it into one round button while riding. A fourth layer, visibility 🌫, draws fog and haze only where they limit the view (under 5 km). Rain shows its phase — a pale hatch where it will fall as snow, a lighter one for sleet, a red one for freezing rain — and thunderstorm cells as ⚡ marks; the timeline gets a yellow tick at every forecast hour at which your own position is under thunder. When a route is planned, the plan sheet prints the rain (❄ / 🌨 / 🧊 by phase, ⚡ for thunder), gusts (with a compass arrow for where the wind blows — the gust layer itself draws the arrows) and temperature expected at each stop's arrival time, read from the same frames. All frames come from our own ingest of open data (EUMETNET OPERA radar, MET Norway, DWD ICON-EU), never from a third-party tile service. Requires a server connection.

Each overlay is toggled independently. Overlays stay active when you switch between sheets or tabs.

Who the data belongs to​

The i button in the top-right corner of the map lists the sources behind what you are looking at — the basemap and every overlay you have switched on. The list changes as you toggle layers, so it always names what is actually on screen. Most of this data is free because someone requires it to be credited: OpenStreetMap under ODbL, the Norwegian road database under NLOD, the orthophotos under each national programme's own terms.

Live traffic​

Incidents are drawn in severity colours — red for a closed road, orange for a major restriction, amber for a minor one, blue for information.

The authority's own wording is always kept as published. English is shown alongside it: a translation where that authority's licence permits one — which matters in Finland, whose feed is Finnish-only — or a summary built from their status codes where it does not. Norwegian text is never translated, because Statens vegvesen's terms forbid it. Swiss messages are not translated either, for a different reason: they are labelled records rather than sentences — mostly street addresses — so the labels are rendered in English from a fixed glossary and the place names are left exactly as published, which is what you need when matching them against a road sign.

Where it works today: Italy, Switzerland, Germany, Spain, France, the Netherlands, Sweden and Finland, plus indicative winter closures for Norwegian mountain passes. Coverage is not uniform, because each country decides what its road authority publishes — Germany is motorways only, France omits the toll-motorway concessions, and Spain excludes Catalonia and the Basque Country, which run their own services. Italy is the broadest of the set and reaches down to city streets. An empty map in a covered country usually means there is genuinely nothing to report on that stretch.

Two things to know about it:

  • Closures change your route. Server-planned routes avoid closed roads by default, and when you navigate, the app checks the incidents along your route — you get a spoken heads-up as you approach one, and on the car screen a small traffic pill (see below).
  • Offline routing knows nothing about it. When the phone plans a route on-device, live traffic is not part of that calculation.

The separate Road works overlay is gone. It asked the Norwegian NVDB directly and drew an orange dashed line — nothing more; none of that database's detail was ever shown. Norwegian roadworks now come through Live traffic along with everyone else's, from Statens vegvesen's own situation feed, which adds closures, queues and accidents, a severity for each, the period it applies to, and the credit the licence requires. If you had the overlay switched on, the toggle simply will not be there after this update.

On the car screen (CarPlay / Android Auto)​

The head-unit map has two states, and one Recenter button that means the right thing in each.

  • With no route running the map follows your GPS: your vehicle marker is drawn on it and the map keeps up as you ride, so the surroundings stay current even on a routeless day out — with a capture session open or while recording just the same. It stays north-up, and following never touches the zoom, tilt or rotation you chose.
  • Panning disengages the follow and brings back the centre reticle — the pick point that the Navigate here button routes to. Zooming does not disengage it: zooming around your own position is still following.
  • A preview only borrows the map. A route you are planning on the phone, a loop candidate, a library track, or the results of a Services search are zoomed out to fit once, so you can see the whole shape. The map does not stay there: as soon as you have ridden about 150 m away — or you tap Recenter, or the preview closes — it comes back to you at the zoom you had before. Nothing you looked at on the phone can leave the car map parked on it.
  • Recenter snaps back to your position and re-engages the follow. Ending or cancelling a route also returns the map to following.
  • With a route running the map switches to the course-up navigation camera, with the marker pinned to a fixed point on screen while the map slides underneath it.

The companion Services page works in both states. With a route running it searches ahead along the route, as described under Services ahead while navigating below. With no route it searches around you: tap a service and the nearest places come up nearest first, each with its distance and direction ("640 m · SW"), replaced by the road distance and riding time ("1.8 km by road · 5 min") a moment later once the routing engine has answered — on the phone's own engine when you have offline routing data, so it works without signal. Tap a row to see it on the car map, then Navigate to start turn-by-turn to it; the car map switches to the navigation camera and the page switches to route mode. The search reaches as far as Settings → Routing → Services search radius (50 km by default), and the empty state names that radius so you know what to widen. Which services the page offers — and in what order — is yours to set: Settings → Routing → Service buttons (one to six of the map's POI categories; gas, camping and beach by default), reachable in-console from the ⚙ in the page header. The same list drives the phone's services-ahead sheet.

The car screen draws the same map as the phone:

  • The same basemap. The car loads the phone's map style: the same server, label language, POI selection and badge density, and your downloaded offline map when you have no signal.
  • Night follows the car. With the Adventure theme on Auto, the car map switches to night when the car does (usually with the headlights), even if the phone is still in day mode. An explicit Day or Night setting applies to both screens.
  • The same route line. The route is blue with a dark edge on both screens, and plan previews and alternates match the phone too. Rain and storm stretches ahead are painted on the route as on the phone. Unpaved and curvy stretches stay on the phone, to keep the car screen easy to read at a glance.
  • The same vehicle marker. On the phone and in the car, the marker points where the phone's compass says you are facing while you are stopped or rolling slowly, and follows the road once you are moving. The phone's compass is disturbed by the bike's metal and electrics at speed, which is why it is not used then. The compass reading is corrected for a phone mounted in landscape. A translucent blue circle around the marker shows how accurate your GPS position is: it hides under the marker when the fix is good and grows when the fix is poor.
  • The same camera. Navigation opens flat (2D), with the same perspective tilt as the phone when you switch to 3D on the companion joypad. The zoom, vehicle marker and speed-limit sign are the phone's, scaled to the size of the car screen.
  • The same place markers. Results from the car's Services page — along the route or around you — use the phone's round category badges; the row you tapped on the phone is drawn larger.
  • The same maneuver symbols. Turn arrows use the phone's colours: teal for left, orange for right, red for U-turns, green for arrival. Apple's maneuver card, which also feeds the instrument cluster and the dashboard, shows the phone's roundabout symbol with the real exit direction and exit number. Within 2 km of a junction it also shows the lanes, with your lane lit. On CarPlay before iOS 17.4, and on Android Auto, the lanes stay in the small chip on the map instead.

While navigating, a small traffic pill appears in the top-right corner whenever live incidents lie ahead on your route: a warning icon tinted by the worst upcoming severity, the distance to the nearest incident, and a count when more than one is still ahead. It uses the same traffic check the phone runs — nothing extra is fetched in the car — and disappears once the last incident is behind you. Where the head unit has a free map-button slot, a matching traffic button opens a list of the incidents ahead, each with its distance and the road authority's own wording.


Standard route planner​

Open via ⊞ → Plan a route.

  1. Search for a start and destination, or use Use my location for GPS origin. The field search is the same engine and the same rows as the map Search pill (including the Best match / Nearest toggle); one tap on a row fills the field.
  2. Add optional via-points (intermediate stops) — drag to reorder, tap ✕ to remove.
  3. Choose a vehicle type:
IconVehicleRouting costing
🏍MotoMotorcycle — full costing options
🚗CarAuto — ferry, toll, highway avoidance
🚲BikeBicycle — ferry avoidance
🚶WalkPedestrian — ferry avoidance
  1. Tap Calculate route — the route appears on the map and the summary shows distance and ETA. On a multi-stop route the stops editor also lists a per-stop breakdown — each stop's own leg distance, riding time, and projected arrival clock — so you can sanity-check the day before setting off. A background surface trace then fills in two more numbers: the % unpaved share (tap it to highlight the unpaved stretches on the map) and a Difficulty rating — surface roughness amplified by climb, on the same 0–1 scale as the max_difficulty routing ceiling, with the hard kilometres (difficulty above 0.5) spelled out beside it. Steep tarmac stays easy: only steep rough ground raises the number.
  2. Tap ▶ Navigate to begin turn-by-turn guidance.
  3. Tap ⛰ Elevation profile in the route summary to fetch and render the elevation chart.

Once the planner panel slides down you'll see a compact route summary chip floating over the map (route label + distance + ETA). The chip has three actions:

  • ▶ (green) — start turn-by-turn directly without re-opening the planner sheet.
  • ✕ Clear — discard the route.
  • The replan icon (📍→📍) on the left of the chip reopens the planner if you want to edit waypoints or options.

Once turn-by-turn is running the ▶ Start and ✕ Clear buttons are replaced with a ◎ Hide / ◉ Show toggle that turns the background-map route line on/off without interrupting navigation.

Motorcycle options​

Expand ▶ Advanced in the route planner to access fine-grained Valhalla costing sliders (highways, hills, trails, bad surfaces, ferry, tolls, top speed, wind screen) and the shortest-distance toggle.

The same panel carries the Scenic bias slider (off by default): it asks the server to bias the route toward the best-rated roads in the corridor, with a Bends / Climb picker for which axis "best" means. It is strictly opt-in — a biased request takes the server a little longer to compute — and only applies to server-computed routes; on-device routing ignores it.

Gates on the route, and how far dirt-first may detour​

Motorcycle and car routes planned online are checked for gates, bollards and toll booths (from OpenStreetMap). They are drawn on the route — a white badge with an amber ring for a passable one, red for a closed one — and the planner lists them under the summary.

  • Closed gates are avoided. A gate that is locked, private or closed for the season (a seasonal restriction in force on the day you ride) is routed around. Turn this off in Settings → Routing → Gates & detours → Avoid closed gates. Passable gates are the router's call: a dirt-first route opens one when the gravel behind it is worth it.
  • A closed gate is never passed silently. When no way around exists — a locked gate on a dead-end track, or one at your destination — the planner shows a red warning, Start asks you to confirm, and navigation says it again after the first instruction.
  • Navigation announces gates. "Gate in 300 m. Close it behind you." A closed gate gets a distinct warning with the beep at 1 km and again at 250 m, and a red banner. Toll booths and bollards are announced too. On CarPlay and Android Auto the gate shows as a pill and on the map. A roadbook generated for the active route carries a Gate — close it behind you line (red with the reason when it is closed).
  • Max detour (Settings → Routing → Gates & detours): a dirt-first route may be at most 1.2×, 1.5× (default) or any multiple (No cap) of the plain route's length. Over it, the server steps down to a weaker preset. The planner then offers the full route — Moderate applied — the full Strong route is 1.9× the length of the plain route — with the extra km and time, and one tap re-plans it without the cap. That choice holds for the reroutes of the ride.

Routes computed offline on the phone are not checked: the planner says Gates not checked on an offline route rather than implying there are none. Selecting an alternative route shows Gates not checked for the same reason — only the main route is checked.

Waypoint injection​

While turn-by-turn navigation is active, open a curvy-road detail card and tap Inject stop or Inject full segment — the waypoint is smart-inserted at the lowest-detour position in the current route and navigation restarts automatically on the updated route.

Services ahead while navigating​

The fuel-pump button in the HUD's bottom bar opens the same results list in route context: one pill per configured service (Gas / Camping / Beach by default — change the set and the order under Settings → Routing → Service buttons, up to six of the map's POI categories) searches along the route ahead of you, rows are ordered by distance ahead with the detour in the badge ("12 km · +800 m"), and Add as stop inserts the place into the live route and restarts guidance. Online, the search is one corridor query over the whole remaining route on the server: true distance along the road, true detour, and a warning line when the longest stretch without that service is 20 km or more ("Longest stretch without one: 42 km, from km 12"). Offline, or if the server cannot answer, the app falls back to sampling the route with its downloaded POI packs. The CarPlay Services page uses the same search and the same detour wording.

Per-stop ETA on multi-stop routes​

On a route with via-points, the HUD's cycling metric slots include three stop-aware metrics alongside the whole-trip ones: NEXT STOP (distance to the next intermediate stop), STOP ETA (projected arrival clock at that stop), and STOP (a "2/4"-style counter). The final-destination ETA is unchanged — partials are computed from the same per-maneuver time weighting, so the last stop's numbers always match the trip totals. On CarPlay / Android Auto the car's own estimate still means the final destination; a Stops map button (visible only during multi-stop navigation) opens a dedicated list page with each stop's remaining distance and arrival time.

These metrics deliberately go blank (—) when "next stop" would be a lie: single-leg routes, out-and-back tracks whose turnaround is not a stop, and imported-GPX / TET trail rides whose internal legs are stitching chunks rather than places you stop.

How the ETA is estimated — and adapted to your pace​

The planned time comes from the routing engine, road by road. Where OpenStreetMap has a posted speed limit, that limit is the speed. Where it has none, the engine uses a typical speed for that kind of road. Stops are never included. Unpaved tracks are the weak spot: an untagged track is planned at walking-to-jogging pace (5–7 km/h). So a TET trail with a lot of track can show an ETA two or three times longer than an experienced rider needs. Follow-the-line stretches that could not be matched to roads use 35 km/h for motorcycles.

While you ride, the ETA learns your real pace. Every 4 km it compares your moving time with the planned time for the same stretch. Traffic lights, photo stops and a coffee break don't count. It keeps two separate estimates: one for slow stretches (tracks, gravel, anything planned under 25 km/h) and one for roads. Fast tarmac riding therefore never shortens the trail estimate, and a slow gravel section never inflates the road estimate. The remaining time, the arrival clock, the next-stop ETA, and the CarPlay / Android Auto estimates all use it. A small your pace caption appears under the time metrics once your pace differs from the plan by 5 % or more. Before the first 4 km, and whenever you ride exactly to plan, the ETA is the planned one.

What you learn in a ride is kept across reroutes and direction switches. When navigation stops, the app remembers your pace per vehicle (from about 20 km of navigated riding on, weighing recent rides more). The next ride then starts from it, halfway between your usual pace and the plan, captioned your usual pace until the first 4 km of that ride take over. Before a ride, the planner and the route strip show a second figure next to the planned time, e.g. 7:45 h · ≈ 5:10 h at your pace: the same number the HUD shows at the start line.

Tap the ⓘ next to a planned route's total time, or the your pace caption in the HUD, for a short in-app explanation of how the ETA is estimated and what the app remembers about your pace. Settings → Navigation → Adapt ETA to my pace turns all of this off (planned estimate only, nothing remembered). Forget my pace, just below it, clears the remembered pace.

Off-route handling​

While turn-by-turn is running, the app continuously projects your GPS position onto the active route polyline. If you stray further than the off-route threshold for several consecutive GPS ticks (defaults: 150 m / 3 ticks for motor, 90 m / 6 ticks for bicycle, 52 m / 9 ticks for walking), one of two things happens:

  • Motorcycle, car, bicycle — the route is recalculated automatically from your current position to the destination. You hear "Off route. Recalculating." and the new route line replaces the old one on the map. No tap needed; your hands stay on the bars/wheel.
  • Walking — the app surfaces a Tap to recalculate prompt instead. Pedestrians can safely stop and confirm, and the prompt also avoids triggering an expensive reroute every time you legitimately cut across a plaza.

You can tune the sensitivity in Settings → Safety alerts → Off-route detection:

  • Off-route threshold (50–400 m, default 150) — the motor-vehicle baseline. Bicycle uses ×0.6 of this, walking ×0.35.
  • Off-route strikes (2–8, default 3) — consecutive bad fixes before triggering. Bicycle uses ×2 of this, walking ×3.

The per-vehicle multipliers are not user-editable; the rationale is that slower / less-road-constrained costings need a narrower threshold but more strikes so shoulder positioning doesn't false-alarm.

Your own trails — the imported-tracks library​

Any GPX you bring — from a trail publisher's download page, a forum, a friend on WhatsApp — lands in Imported tracks (Library → Import Track → From file, or share a .gpx to the app). The file stays on your phone: it is never uploaded, and a share of a track you imported from someone else's dataset withholds its route.

Trans Euro Trail. Library → Import Track → From the Trans Euro Trail lists the 36 countries and opens the one you pick on transeurotrail.org inside the app, where you read their terms and safety notice and tap their Download GPX Track link. That tap is the only thing the app intercepts: it pulls the file from their server to your phone, shows the progress banner, and the file lands in Imported tracks as TET · Norway with each sub-trail as its own track, named the way the trail is (N-01 · Blåhø-Støa), whatever the file was called. No Safari, no Files app. The app acts as a browser: the file goes from their site to your phone on your tap, never through our servers, and we hold no copy. A button in the page's header opens the same page in your browser if you prefer.

The library is a two-level tree, and each level appears only when it helps:

  • A file with several <trk> tracks (a trail country file with its sub-trails, a multi-day itinerary) shows as a file row with its tracks under it. Each track is what you select, ride, roadbook and style — nobody rides fifteen legs at once, so the file row itself has no Ride. A file with a single track is just one entry, no folder. Files start open while the library is small and collapse once there are more than a few.
  • Country headers group the files once the library is big enough to need them (four or more entries in more than one country), from public-domain outlines of every European country, whether or not it has an offline pack. A Trans Euro Trail file is filed under the country its own track names carry. Any other file is filed by where its tracks actually run, not by the centre of the box around them (a country as long and bent as Norway has its box centre next door); the map is read in one-degree tiles, and a tile that straddles a border counts for both of its countries rather than against either, so an Alpine trail that never leaves Italy stays under Italy. A track that never leaves such shared tiles sits under both names, and a track outside every mapped country under Elsewhere. Tap a country header to fold that country away and tap it again to bring it back; the header keeps the count of tracks and kilometres while folded, and picking a track on the map unfolds its country. A trail that genuinely runs through two or more countries (its main country holds less than four fifths of it) sits under Across borders instead; a short hop over a border keeps a trail at home. A small library, or one all in one country, stays a flat list.
  • Inside a country, three groups once there is more than one kind of thing: TET for the files recognised as Trans Euro Trail downloads, Trails for every other route or line, and Waypoints for the files that carry <wpt> points. Each group folds like the country. Open a file under Waypoints to list its points (name, type, altitude): tap one to fly the map to it, tap the bookmark icon to keep it in your bookmarks. Waypoints are kept from the import onwards, so a file brought in before this shows none until it is imported again.
  • While a file imports, a banner at the top of whatever screen you are on shows the file name, the phase (reading, reading the tracks, preparing, saving) and a percentage; tap it to fold it into a small ring in the corner, tap the ring to unfold it. A country file with a dozen tracks takes a few seconds and the app stays usable meanwhile.
  • Rename any file or track from its card; a file's new name also becomes the prefix its tracks get when saved to the Library.
  • Removing a file removes its tracks and any turn-by-turn built for them; the confirmation says how many. Files imported before the tree existed are split into their tracks the first time the list loads, from what the phone already stores — a file that cannot be split safely stays a single entry.

Riding a track in either direction​

An imported GPX, a TET sub-trail or a Library line is a recorded path, not a route: ridden the other way, its drawing goes round roundabouts the wrong way and against one-way streets and divided carriageways. The app therefore keeps one built trip per direction, each a legal, turn-by-turn route:

  • Built at import. Enhancing a track builds both directions in one request to POST /grass/routing/track-direction: the original points are map-matched into continuous legal pieces, every gap (a roundabout half, a one-way, the wrong carriageway) is bridged with a legal route trimmed back and forward along the pieces, and the assembled line is validated by a second legal map-match. Stretches with no road underneath (a hiking trail, a field) stay follow-the-line and are flagged as such. Where the second map-match cannot confirm the line, only the instructions around that spot become follow-the-line; the rest of the track keeps its turns, however long it is. Tracks imported before this get their reversed trip built quietly the next time they are opened online, and so do tracks whose trips an earlier build could not confirm (every track over 200 km, between 14 September and the fix).
  • Open either way. The direction picker (native, reversed, join here forward/backward) rides the matching built trip; a mid-track join slices it at your position instead of re-matching, so it works offline and starts instantly. Opening a track reversed with no built trip yet builds it on the spot when online; offline it rides the reversed drawing follow-the-line and tells you once to follow the road signs at roundabouts.
  • Riding it backwards anyway. If you set off against the loaded direction (on the line, moving, course opposite to the track for about 8 s or 100 m), the app switches to the other direction's trip at your position, says "Riding the track in reverse now", and never reroutes for it. A short track (≤ 5 km) still opens as drawn, but the switch works during the ride.
  • What you see. Chevrons along the track line show the ridden direction; where the legal line leaves the drawing by more than 30 m (a roundabout the other way round, a bridge across a stretch that cannot be ridden that way) the original drawing shows as a faint dashed ghost underneath, on the phone and on the car screen. Bridges report how much longer they are than the drawing; a built trip is never longer than the drawing by more than a few percent.
  • Off-track on any track rejoins the track ahead of you in the ridden direction — including Library lines recorded or drawn on the desktop, which used to be replanned to their end.
  • Realistic times on unpaved tracks. The router's own speed for an untagged track is 5–7 km/h, which made an imported trail with a lot of track look two or three times longer than it rides (a 169 km Italian sub-trail: 14 h 18 min). Built trips therefore 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 speed limit is never exceeded (a gravel road signed 20 stays 20), and the route and its turns are unchanged; only the time is. The same trail now plans at about 6 h 40 min. While riding, the ETA then adapts to your own pace.

Verbal voice cues by vehicle​

TTS announcements ride on top of Valhalla's verbal_pre_* / verbal_transition_alert_* strings when populated. For costings that emit empty strings (notably bicycle, which can leave all verbal fields plus the visible instruction empty), the app synthesizes a fallback line from the maneuver type and street name — e.g. "Turn left onto Bergstien" — so the rider isn't dropped into silence even when the routing service skips the prose.

Rally roadbook navigation (geometry-only)​

Any track's roadbook (a saved ride, an imported GPX, a TET trail, a library record) has a Road ⇄ Rally toggle. In Rally mode a Ride button starts a navigation session driven by the track's shape alone — no map-matching, no routing tiles, no server. Each clustered bend becomes a maneuver classified by its total turn angle (kink 10–30°, mild 30–60°, sharp 60–90°, elbow 90–135°, hairpin >135°; two tight opposite bends link into an S-bend), and the normal turn-by-turn engine advances through them as you cover ground along the track.

The HUD swaps the road arrow for a tulip-style shape glyph (coloured by direction) and adds: the distance to the next note, the CAP — compass heading to hold out of the bend, e.g. CAP 135° SE — and a danger chip (! / !! / !!!) from radius, blindness and downhill grade. Spoken cues are rally calls ("hairpin left, 160", "S-bends") in your navigation voice language.

Generating a roadbook runs on the server as a job: the app asks for one and polls it, so a long track cannot time out mid-generation, and a book generated once for a given track and options is served again at once for thirty days — whoever asks. Desktop and CarPlay callers get the same book synchronously.

A roadbook ride never replans: leaving the line shows the calm following your track hint with a one-time spoken cue, and guidance resumes when you rejoin. Mid-ride vehicle switches keep the track. An advisory corner-speed / gear hint (v = √(μ·g·r)) exists but is off by default — enable it under Settings → Navigation → Roadbook speed hints and set the grip coefficient μ to your surface.

Reset to defaults​

Tap ↺ Reset to defaults at the bottom of the planner to restore all routing options to their factory settings (vehicle, avoid flags, all moto sliders). Locations and waypoints are preserved; the computed route is cleared.


Circular route planner​

The circular route planner generates a loop that starts and ends at the same point. Open it from the Navigate tab via Routing → Circular route.

Start point​

Tap the Start point row to toggle between two sources:

IconSourceNotes
🛰 GPS positionDevice GPSRequires a GPS fix. Greyed out with "No GPS signal" when unavailable.
🗺 Map centerCurrent map centreAlways available. Pan the map before tapping Generate (or Recompute in the preview panel) to start from any point in the world.

Ride profile (motorcycle only)​

The ride profile translates directly into Valhalla costing weights sent to the routing engine — every weight in this table is verified against the engine with A/B route measurements. Highways and Hills are 0–1 preferences (higher = prefer more strongly); Surfaces is how strongly rough ground (gravel, dirt, tracks) is penalised.

ProfileHighwaysHillsSurfacesCharacter
Balanced0.350.50strict tarmacComfortable all-round motorcycle route
Curvy0.200.80strict tarmacMaximises curves and elevation change, avoids fast roads
Scenic0.150.65light trail use allowedPrioritises landscape and viewpoints
Fast0.750.35strict tarmacFaster roads, minimal climbing, smooth surface preferred
Road bike safe0.400.45strict tarmacStrictly avoids unpaved and gravel surfaces
Customslidersliderslider ("Avoid bad surfaces")Set your own percentages via the Advanced tuning panel

The Hills weight rides on elevation-aware costing in the FastGIS routing engine (0.5 is neutral; below it the loop avoids gradient, above it seeks passes). It applies when the loop is generated online; loops generated fully offline on the device currently route as if Hills were neutral.

Ferry and toll avoidance settings from the Route Planner (standard routing sheet) are always blended in on top of these weights.

Choosing a profile also pre-sets the Avg speed used for ETA estimates (Curvy → 45 km/h, Fast → 75 km/h, etc.) — you can override this in Advanced settings.

Weave-ins — curvy roads and beaches​

Include curvy roads (motorcycle and car) weaves the best-rated road near the loop into it as fixed via-points; the loop still converges on the target distance. When it is on, a Bends / Climb picker chooses which axis picks that road — bends is the classic curvature ranking, climb picks the biggest mountain road instead. Climb ranking always uses the server (on-device curvature data has no climb column). Include beaches does the same with beach-seeker beaches, with a sea / lakes / both filter.

Advanced settings​

Expand ▶ Advanced settings (motorcycle and car only) to tune:

SettingRangeEffect
Avg speed15–120 km/hETA estimate only; does not cap actual routing speed
Waypoints2–12More waypoints → more varied loop shape and less chance of out-and-back detours
Reach depth0.30–1.00How far out waypoints are placed. 0.30 = tight radius; 1.00 = pushed to the furthest reachable edge. Lower values work better in fjord/valley terrain to avoid dead-end roads.
Avoid backtrackingtoggleMarks waypoints as Valhalla through stops — the engine passes through without U-turning, reducing same-road overlap
Force departure headingtoggleAdds a directional heading constraint so the route departs in the chosen compass direction (±45°). Disabled when direction is set to Random.

Tour direction​

Tap Tour direction to open a compass rose and pick the preferred outbound heading: N, NE, E, SE, S, SW, W, NW, or R (Random). The engine biases waypoint placement in that direction but does not guarantee a straight outbound leg.

After generating​

Once the route preview appears:

  • The panel shows actual distance and estimated duration.
  • Tap ▶ Start navigation to begin turn-by-turn guidance immediately.
  • Tap ↺ Recompute to regenerate with the same settings — if you have panned the map and the start source is set to Map center, the recompute uses the current map centre, not the one when the panel first opened.
  • Tap 💾 Save to store the route.
  • Tap ⛰ Show elevation profile to fetch and display the elevation chart for the generated loop.

Curvy-road discovery​

Tap 〰 Find Curvy Roads in the Navigate tab (via the Routing button → wizard).

  1. Scoring method — choose Total (default), Density, or Radius. Each algorithm measures curvature differently: Total accumulates degrees of turning along the road, Density divides that by distance so short and long roads compare fairly, and Radius scores the tightness of individual corners. The app rescales the threshold for you when you switch.
  2. Rank by — Bends (default) or Climb. Two separate axes on purpose: the bendiest road near you and the biggest mountain road near you are rarely the same road. Climb ranking orders results by a 0–100 climb rating (elevation range, metres climbed per km, mean altitude) and needs a server connection — on-device curvature data carries no climb column, so offline results stay curvature-ordered.
  3. Preset — Twisty, Scenic, or Mixed sets the baseline curvature threshold for the selected algorithm.
  4. Search radius — 25–200 km around your GPS position or the current map centre.
  5. Tap Find roads near me → (or Search here → after panning the map).
  6. Results appear as a ranked list and coloured line segments on the map.
  7. Tap any road to expand its detail card:
    • Stats: curvature score, length, distance from you, climb rating, elevation range, elevation gain, water proximity.
    • ⛰ Show elevation profile — fetches and renders the full elevation chart inline. Tap a point on the chart to highlight that position on the map.
    • Route actions: Start here, Add stop, Route to it, Add full segment.

Tap ▶ Advanced in the sheet to access fine-grained filters: road class, surface type, min sinuosity, population density, scenic-only, near-water, and elevation change thresholds.

Elevation data comes from the best available national DEM for the road's location (see the API reference).


Field capture​

Switch to the Capture tab.

Starting a session​

  1. Select or create a GRASS environment (e.g. a project area) from the More → Connection sheet.
  2. Tap Start Recording — the big green CTA on the idle screen — to begin a new GPS session with a default timestamped title.
  3. Use the floating action buttons (or the bottom action bar once the session is recording) to add samples: photo, video, audio, waypoint, note, track point.
  4. Tap the red ■ End in the recording header when finished. The session and all its samples upload automatically when a server connection is available.

Browsing past sessions​

The idle screen lists your Recent sessions below the Start CTA. Each row shows the session title, status (recording / paused / ready / completed) and the timestamp of the last save.

  • Tap a row to open a dedicated session detail view. The view replaces the list and shows: session title and status header, publish-target metadata, and a samples list where each card expands on tap to show its media preview (photo, video thumbnail, audio waveform, note text). Tap the ‹ Back button at the top-left to return to the list.

  • Swipe a row left to reveal two row actions:

    • Push (teal) — uploads any pending samples for that session to the configured FastGIS server.
    • Delete (red) — removes the session and all its samples from this device. A confirmation dialog appears first so a stray swipe doesn't destroy work.

    Both actions are disabled while another publish / delete operation is already in flight.

Where past sessions go after upload​

Once a session has been pushed and there's nothing pending, it stays in the local list as a "synced" record so you can still browse the samples on-device. To re-sync (e.g. after a server reset), use the More → Sync sheet which exposes "Push all" and granular controls.

Storage actions on a synced session​

The session detail view (open a session row, or a capture card in the Library) offers three storage actions — all of them keep the captured data safe on the server:

  • Remove from device — deletes the local copies of the session's captures to free space. The captures stay on the server and stream back into the same views (photo, video, and audio) whenever you're online. Only offered once the session is fully synced.
  • Download for offline — the inverse: re-saves every streamed capture onto the device (rows and media files), so the session works without a connection again.
  • Delete from library — removes the session from your listing, on this device and in the server's session list. This is a soft removal: the captured data and media stay stored on the server, and a permanent server-side delete remains a separate, explicit operation (swipe-delete in the sessions list, or the environment-wide Fresh Start).

Elevation profile tab​

The Profile tab is a dedicated transect tool for detailed elevation analysis against server-side rasters.

  1. Load a GRASS environment that contains a DEM raster (More → Environment).
  2. On the Profile tab, choose the raster from the pill selector.
  3. Tap Start Transect Draw, then tap start and end points on the map.
  4. Tap Run Profile — the server executes r.profile and the chart renders.
  5. Tap Save Profile to Analyses to persist the result as an artifact.

This is different from the route/road inline chart: it uses the full-resolution server-side DEM rather than the automatic online elevation service.


Riding together — live sharing, voice, and group rides​

FastGIS has a full social riding layer built on your friends and groups (More → Live sharing). All of it is opt-in and self-hosted — your location and voice never touch a third-party service.

Live location sharing​

Share your live position with all friends, specific friends, and/or groups for a chosen duration (15 m up to "until I turn it off"). Friends appear on the Navigate map as avatars with a moving / stopped / stale status ring. You can also mint an expiring public link that anyone can open in a browser — no app or account needed.

Group voice — push-to-talk​

Pick a group as your voice channel and talk walkie-talkie style. Riding-safe triggers: an on-map tap button (Navigate, turn-by-turn, and Active Ride), and a Bluetooth helmet media button. Only your active channel is audible, and a banner shows who is talking.

Live calls​

Full-duplex calls — everyone talks at once, like a phone call:

  • 1:1 calls to a mutual friend, and group calls for a whole group.
  • While your call rings you hear the familiar ringback tone; if nobody picks up within about 45 seconds the call ends itself with a "No answer" notice.
  • Join anytime: an ongoing group call shows a "call in progress — join" banner; one tap joins it. Calls persist while at least one person is in them.
  • Background ringing: incoming calls ring on the lock screen with the native iOS call UI, even when the app is in the background.
  • Calls list (More → Calls): every call in both directions — ↘ incoming (missed / answered / declined) and ↗ outgoing (including "No answer"); a missed group call that is still ongoing can be joined straight from the list.
  • During a call, spoken navigation pauses (call > push-to-talk > nav voice); the repeat button on the nav HUD still speaks on demand.

Group Ride — convoy navigation​

One rider (the leader) shares a planned route with a group; everyone rides the same road geometry, so the convoy stays together:

  1. Plan a route in Navigate, then open More → Live sharing → Group ride and tap Start ride on a group. Every member gets an invite.
  2. Accepting is a single consent: it joins the ride, shares your live location with the group, and selects the group as your voice channel. A green "In the convoy" strip stays visible with an instant Leave.
  3. The route heals itself. If the leader takes a detour or reroutes, the new route is pushed to every member automatically. If you drift off, the app quietly routes you back to a point ahead on the group's route — it never replans your own route to the destination.
  4. Leadership is handable. The leader can promote another member (Make leader). If the leader disconnects, the longest-connected member is promoted automatically (they can decline); with no leader the group simply keeps following the last shared route.
  5. Late joiners and reconnecting phones always receive the current route.

Settings and data reset​

Open Connection → ⚙ Settings → Data → Reset offline data to erase all downloaded tiles, the curvature database, POI databases, and cached routes.

What is kept: server credentials, app preferences, field captures, bookmarks.

After tapping Reset, restart the app. Then use the Offline Packs sheet to re-download fresh tiles.

See also: Offline Data Tiles.