rdbk_version 1application/x-roadbook.rdbk
The .rdbk standard
One file, the whole roadbook. A .rdbk holds the route, its notes and everything they draw, so any app can open it, follow it and keep it — offline, on any device, years later.
The reference format for digital roadbooks. With no official standard in the field, .rdbk has become the open format that riders, clubs and event organizers around the world know and prefer — for 4×4, motorbike and bike.
Validate a .rdbk See an example
Why .rdbk
- Self-contained. A
.rdbkembeds the symbols it uses (as data URIs), so it renders identically anywhere — offline, years later — with no external icon packs to lose. - Plain JSON inside. Open
roadbook.jsonin any text editor, parse it with one line in any language, diff it in git. - Map-ready. The full GPS track travels with the notes, so any reader can draw the route and place you on it.
- Symbols are first-class. Each note can carry positioned, rotated, scalable pictograms and colored junction vectors — not just a line of text.
Container (the file)
A .rdbk file is a ZIP container. Inside it, roadbook.json holds the roadbook — the document described below, every symbol it draws and every voice note embedded in it — alongside optional bundled photos:
my-roadbook.rdbk (ZIP)
├─ roadbook.json // the roadbook — the document below
├─ media.json // optional — where each bundled photo was taken
└─ photos/… // optional — geotagged photos
Photos are optional: they travel only when the exporter includes them. The file's MIME type stays application/x-roadbook.
Document structure
roadbook.json is one JSON object. It holds what the author decided and nothing that can be computed: every distance, bearing and count is derived from the track by whoever reads it, so a file can never contradict itself.
{
"rdbk_version": 1, // the version of this standard the file follows
"meta": { … }, // the roadbook's details
"track": [ … ], // the GPS polyline (ordered points)
"notes": [ … ], // the notes, in track order
"symbols": { … }, // the embedded symbol library (name → data URI)
"compatibility": { … } // optional — kept for other formats, one block each
}
Coordinates are WGS-84 decimal degrees with at most 6 decimals. Distances are integer metres. Headings are degrees clockwise from true north (0–359). A value at its default — an empty text, the track road, no rotation — is left out: there is one way to write each thing.
meta
| Field | Type | Meaning |
|---|---|---|
title | string | Required. Human-readable roadbook title. |
description | string | Optional. Free text shown on the public roadbook page. |
author | string | Optional. Name of the roadbook author. |
organization | string | Optional. Organizing club / event organizer. |
modified | string | Optional. Last-modified date, ISO YYYY-MM-DD. |
logo | string | Optional. The roadbook's image as a data: URI, embedded like the symbols. |
map_allowed | false | Optional. false hides the map from a reader while navigating (e.g. competitions where map-reading would be cheating). Absent = a map is allowed. |
default_validation_radius | integer | Optional. The validation radius (metres) of every note without a validation_radius of its own. |
generator | string | Optional. The program that wrote the file. |
track
An ordered array of at least two points: the route. Notes sit on its points, by index. A point may carry its elevation (integer metres) and its time_ms (the fix time, milliseconds since 1970 UTC), kept from a recording.
"track": [
{ "lat": 45.827120, "lon": 9.411640, "elevation": 1245, "time_ms": 1783065600000 },
{ "lat": 45.827400, "lon": 9.411800 }
]
notes
The heart of a roadbook: at least one note, each on a point of the track, in track order (every track_index greater than the previous one).
| Field | Type | Meaning |
|---|---|---|
track_index | integer | Required. The point of track the note sits on. |
text | string | The instruction. |
road_type | 1–5 | The road you leave the note on — see road types. Default 2, a track. It stays in force until a later note changes it. |
cap | 0–359 | CAP — the compass heading to hold after the note, as the author set it. |
cap_type | string | Only with a cap: average, calculated or turning. Default exit. |
speed_limit_kmh | integer | The speed limit in force from the note, km/h; 0 lifts it. |
danger | 1–3 | FIA-style danger grading. Renders as ! / !! / !!! in red inside the diagram box (never in the text column). Absent = no danger. |
waypoint_type | string | The FIA waypoint type, by name: masked · control · security · navigation · precise · visible · eclipse, the markers start · finish · ss_start · ss_end, the zones dz/fz · dn/fn · dt/ft and the controls cp · pc · stop. |
validation_radius | integer | The note's validation radius (metres). Without it: meta.default_validation_radius, then the type's default, then 30 m. |
symbols | array | Positioned symbols — see symbols. |
junctions | array | Junction vectors — see junctions. |
imported_tulip | object | A tulip imported from another format (e.g. OpenRally): { "image": data URI, "shown"?: false }. While shown it is the whole vignette; "shown": false draws the note's own tulip instead, the original kept. |
blocks | array | Material the note carries — a photo, an advert, a text — before it, after it or beside it, in the third column of its row: { "type": "photo" | "ad" | "text", "placement": "before" | "after" | "side", "image"?: data URI, "text"?: string }. Never a waypoint: not numbered, mapped, scored or exported as one. A voice note is { "type": "voice", "audio": data URI, "lead_distance"?: int }: heard, not shown — a reader plays it by itself lead_distance metres before the note (default 100). |
compatibility | object | What another format said about this note — see compatibility. |
{
"track_index": 184,
"text": "Bear right onto the gravel track",
"road_type": 3,
"cap": 247, "cap_type": "average",
"speed_limit_kmh": 30,
"danger": 2,
"waypoint_type": "masked",
"symbols": [ { "name": "S03_30km.svg", "position": [40, 22], "size": 32 } ],
"junctions": [ { "from": [0, 0], "to": [45, 25], "road_type": 4 } ],
"blocks": [ { "type": "text", "placement": "before", "text": "Deep ford after the bridge — slow down." } ]
}
Derived values
Never written, always computed — the same way by every reader, so two apps show the same numbers. Distances are haversine on a sphere of radius 6 371 000 m, rounded to whole metres.
| Value | Meaning |
|---|---|
num | The note’s position in the list, from 1. |
lat, lon | The track point the note sits on. |
distance | Metres along the track from its first point. |
partial_distance | Metres along the track from the previous note (0 for the first). |
bearing_in, bearing_out | The track’s heading arriving at and leaving the note, from the nearest point at least 1 m away. |
road_type_in | The road the note arrives on: the previous note’s road type (the first arrives on its own). |
cap_distance | With a CAP: the straight-line metres to the next note. |
| length, note count | The track’s length and the number of notes. |
Symbols (symbols)
A note's symbols places pictograms on a fixed 230 × 162 reference box. The origin is the box centre; +y points up. This makes a note render the same at any display size.
| Field | Type | Meaning |
|---|---|---|
name | string | Required. Its image: the key in the top-level symbols library. |
position | [x, y] | Required. Centre position in reference units, from box centre, +y up. |
size | number | Required. Box size in reference units (square). |
angle | number | Rotation, degrees clockwise. Default 0. |
mirrored | true | Mirrored left to right. Default false. |
The images live inside the file, in the top-level symbols: a map from name to data: URI. Every name a note uses MUST be there — that is what makes a .rdbk portable. The library may hold more: the author's own symbols, kept for later.
"symbols": {
"S03_30km.svg": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0i…",
"P07_ponte.png": "data:image/png;base64,iVBORw0KGgoAAAANS…"
}
Road types
The strokes are the FIA Road Book Lexicon's (Cross Country, 2026). In the vignette every road is 8 units wide; the dash patterns are in the same units.
| road_type | Road | Stroke |
|---|---|---|
1 | Tarmac | double line |
2 | Track | solid line (the default) |
3 | Low-visible track | long–short dashes 24 · 8 · 8 · 8 |
4 | Off track | short square dashes 8 · 8 |
5 | Bike lane | solid line (the format’s own; the FIA knows no bicycles) |
A note's vignette is a tulip: the road you arrive on enters from the bottom edge to the box centre (its road_type_in), the road you leave on exits from the centre with an arrow at the real turn (its road_type), and the junctions branch from the centre. Where the author drew a road point by point on the track around the note, it follows that shape — derived when drawn, never stored. Colours are the reader's choice; the stroke is the standard.
Junction vectors (junctions)
A note can draw the other roads of its junction: vectors on the same 230 × 162 box, from from to to, each with its road_type (default 2) and the stroke it gives.
"junctions": [
{ "from": [0, 0], "to": [45, 25] },
{ "from": [0, 0], "to": [-30, 40], "road_type": 4 }
]
compatibility
An optional object, at the top level and on a note, with one block per other format, named after it — openrally, gpx. It keeps what that format said and the .rdbk has no field for, so the round trip back loses nothing. A reader that does not know a block ignores it; a writer MUST keep it.
"compatibility": {
"openrally": [ { "tag": "wpm", "attrs": { "open": "800", "clear": "90" }, "text": "" } ],
"gpx": { "sym": "Flag, Blue", "osmand_icon": "special_flag_stroke", "osmand_color": "#1010a0" }
}
media.json
Where each bundled photo was taken: { "photos": [ { "file": "photos/…", "lat"?, "lon"? } ] }. Every file is an entry of the container.
Conformance
- A
.rdbkis a ZIP container with a UTF-8roadbook.jsoninside; extension.rdbk, media typeapplication/x-roadbook. - A conforming reader MUST refuse a file whose
rdbk_versionit does not know, compute the derived values as this page defines them and draw each road with its stroke. - A conforming writer MUST embed every symbol its notes use, MUST NOT write a derived value and SHOULD leave out every value at its default.
- A key a reader does not know is ignored;
compatibilityblocks are kept on a round trip. - A conforming reader MUST render a note’s
blocksaround it — before or after, in order — and MUST NOT number them, place them on the map, score them or emit them as GPX/KMZ waypoints. - The .rdbk validator checks a file against every rule on this page, in the browser.
Full minimal example
{
"rdbk_version": 1,
"meta": { "title": "Demo loop", "author": "Alex Driver", "modified": "2026-09-25", "generator": "RDBK.app" },
"track": [
{ "lat": 45.8271, "lon": 9.4116 },
{ "lat": 45.829, "lon": 9.4135 },
{ "lat": 45.8305, "lon": 9.415 }
],
"notes": [
{ "track_index": 0, "text": "Start" },
{ "track_index": 2, "text": "Finish",
"symbols": [ { "name": "I01_arrivo.png", "position": [0, 0], "size": 40 } ] }
],
"symbols": { "I01_arrivo.png": "data:image/png;base64,iVBORw0KGgoAAAANS…" }
}
Frequently asked questions
What is a .rdbk file?
A .rdbk file is a digital roadbook: a ZIP container holding a self-contained roadbook.json — the GPS track, the numbered notes with their distances, CAP headings, tulip diagrams, voice notes and the symbols they use — plus optional geotagged photos. It is the open standard for digital roadbooks.
How do I open a .rdbk file?
Open it in the free RDBK.app Reader — in the browser, as an installed web app or in the iOS and Android apps — and navigate it with live GPS, even offline. Being a ZIP with JSON inside, any developer can read it with a few lines of code in any language.
Is .rdbk free and open?
Yes. The full specification is public on this page, and anyone may read, write and build on the format — no fee, no licence, no registration. Its reference implementation is RDBK.app.
Why has .rdbk become the standard for digital roadbooks?
Because there was none: every device and app kept roadbooks in its own closed format, and a route rarely survived the move from one to another. .rdbk filled that gap with one open, documented, self-contained file that renders the same anywhere, years later — which is why off-road riders, clubs and organizers have adopted it as the format to share roadbooks in.
How do I turn a GPX into a roadbook?
Load the GPX into the free RDBK.app Editor: the track is drawn on the map, you add the notes, tulips and CAP headings, and export a .rdbk. The same roadbook exports back to GPX, with the notes as named waypoints, whenever you need it.
Does .rdbk work with OpenRally and GPX?
Yes. The RDBK.app Editor imports and exports OpenRally, and whatever OpenRally says that .rdbk has no field for travels in the note’s compatibility block, so a roadbook moves between tools without losing anything. A plain GPX becomes a roadbook in a few clicks.
What is RDBK.app?
The free suite for digital roadbooks built on .rdbk: the Recorder captures a route with notes, photos and voice notes, the Editor turns it into a roadbook, the Reader navigates it with live GPS, the Tripmaster measures the trip and the event tools rank the results. On the web, as an installable app and on iOS and Android.