OBC OpenBikeComputer / docs

OpenBikeComputer documentation

A from-scratch bikepacking computer: offline vector maps in a custom binary format, GPX route navigation with live map-matching, and ride recording — with the firmware and a desktop simulator sharing one rendering path. These docs explain how it all fits together.

These pages are a conceptual companion to the code, not an API reference. The source is already documented in depth; what's hard to reconstruct by reading files one at a time is the shape of the thing — the pipelines, the boundaries, the why. That's what lives here.

The whole pipeline ① Build a map ② Bring a route .osm.pbf OSM extract obc-pack Rust packer .obcm map · LOD pyramid .gpx your ride obc-route gpx → obcr .obcr route · profile obc-app obc-render one render path no_std · zero-alloc obc-sim · web demo desktop · browser LIVE device firmware nRF54LM20 · hardware live sensors GPS · baro · compass to the app
Two ingest lanes — maps and routes — are baked into compact binary formats, then fed to one shared application and render path. The same code runs on the desktop simulator, on this site's landing page (the obc-web-demo wasm host), and on the device — where live sensors feed the app the data the other hosts get from a GPX replay.

The whole project is built around two ideas: compact binary formats a microcontroller can read directly off flash (no JSON, no reparsing, no heap churn), and a single rendering path the simulator and the firmware both run, so the desktop and the device can never drift apart.

Where to find what

The stack at a glance

LayerCrate / fileWhat it does
Map packerobc-packOSM .osm.pbf.obcm (ingest, multipolygon assembly, quadtree build)
Map readerobc-readerParses OBCM directly off bytes — header, styles, LOD table, quadtree, chunk decode
Route readerobc-routeOBCR reading, GPX → OBCR conversion, map-matching, elevation profile
Rendererobc-renderThe shared draw path — projection, culling, rasterising. no_std, zero-alloc
Applicationobc-appCamera, screen stack, input model, ride tracking — one per-frame entry point
Simulator hostobc-simDesktop shell: window, control panel, colour policy, GPX replay, headless capture
Web demo hostobc-web-demoThe landing page's thin wasm host — same crates, a JS-driven frame loop, no GUI framework (shared host glue: obc-host-core)
Conversion bridgeobc-web-convertThe web builder's wasm shim over the same GPX ↔ OBCR routines — route conversion runs in the tab, no server

New here? Start with System architecture for the lay of the land, then the Rendering pipeline. The data formats page is the reference the other two lean on.

A note on these docs

This documentation is open-source and lives in the repo. It's written by hand in Markdown with bespoke diagrams; if you spot something out of date with the code, the code is the source of truth — and a correction is always welcome.