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 container Structure meta track notes derived values symbols road types junctions compatibility media.json conformance full example FAQ

Why .rdbk

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

FieldTypeMeaning
titlestringRequired. Human-readable roadbook title.
descriptionstringOptional. Free text shown on the public roadbook page.
authorstringOptional. Name of the roadbook author.
organizationstringOptional. Organizing club / event organizer.
modifiedstringOptional. Last-modified date, ISO YYYY-MM-DD.
logostringOptional. The roadbook's image as a data: URI, embedded like the symbols.
map_allowedfalseOptional. 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_radiusintegerOptional. The validation radius (metres) of every note without a validation_radius of its own.
generatorstringOptional. 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).

FieldTypeMeaning
track_indexintegerRequired. The point of track the note sits on.
textstringThe instruction.
road_type1–5The road you leave the note on — see road types. Default 2, a track. It stays in force until a later note changes it.
cap0–359CAP — the compass heading to hold after the note, as the author set it.
cap_typestringOnly with a cap: average, calculated or turning. Default exit.
speed_limit_kmhintegerThe speed limit in force from the note, km/h; 0 lifts it.
danger1–3FIA-style danger grading. Renders as ! / !! / !!! in red inside the diagram box (never in the text column). Absent = no danger.
waypoint_typestringThe 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_radiusintegerThe note's validation radius (metres). Without it: meta.default_validation_radius, then the type's default, then 30 m.
symbolsarrayPositioned symbols — see symbols.
junctionsarrayJunction vectors — see junctions.
imported_tulipobjectA 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.
blocksarrayMaterial 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).
compatibilityobjectWhat 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.

ValueMeaning
numThe note’s position in the list, from 1.
lat, lonThe track point the note sits on.
distanceMetres along the track from its first point.
partial_distanceMetres along the track from the previous note (0 for the first).
bearing_in, bearing_outThe track’s heading arriving at and leaving the note, from the nearest point at least 1 m away.
road_type_inThe road the note arrives on: the previous note’s road type (the first arrives on its own).
cap_distanceWith a CAP: the straight-line metres to the next note.
length, note countThe 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.

FieldTypeMeaning
namestringRequired. Its image: the key in the top-level symbols library.
position[x, y]Required. Centre position in reference units, from box centre, +y up.
sizenumberRequired. Box size in reference units (square).
anglenumberRotation, degrees clockwise. Default 0.
mirroredtrueMirrored 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_typeRoadStroke
1Tarmac double line
2Track solid line (the default)
3Low-visible track long–short dashes 24 · 8 · 8 · 8
4Off track short square dashes 8 · 8
5Bike 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

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.

Open a .rdbk in the Reader Validate a .rdbk