CYCLING COMMONS
The map everyone carries, and nobody can read
Cycling knowledge is scattered across a dozen closed apps. Cycling Commons gathers it in one open place, and makes sure nobody can close it again later.
Owned by everyone
Open data, free to use - commercial apps included.
Chosen by riders
They vote on what the best riding really is.
About places, never people
It maps the world, not the rider.
Every rider carries that map in their head. And that is where it dies. Cycling Commons is where it lives instead: one open atlas of the world's best riding, built by riders, free for anyone.
The problem: everything lives somewhere else
Climbs are in one app. Recommended routes in another. Places to sleep in a third. Road surface and closures nowhere at all. What a rider adds to one app stays locked inside it, so people stitch a dozen tools together and the data never joins up.
OpenStreetMap is open, but raw, and thin on exactly the cycling layers that matter. A fountain is sometimes in there. Whether it runs in July is not. Which of the four climbs nearby is actually worth the detour, certainly not.
The curation layer is the real value
Cycling Commons is not a second database with an open licence bolted on. The value is the layer on top: riders do not just contribute facts, they curate, vote, and keep them fresh. That is the cycling judgment raw data lacks and closed apps lock away.
So it is not just an endless list, but an answer to the question a rider actually asks: what is the best riding here? Arrive somewhere new and you see what riders there voted for this season. Utility data like water points is the opposite case - there we aim for full coverage, because you want all of them.
About the world, never about you
One principle is not up for discussion: the Commons is the map, not the rider. Everything in the dataset is about the world. Your identity, your history, your heart rate, your movements - none of it goes in. Not anonymised, not with consent, not later. It is simply never collected.
The map is public. The person is not.
How it grows, and stays open
You spot something only someone who is there would know - a tap, a closure, a viewpoint - and add it, confirm it or vote on it. With Scout that is one tap on the bars, in the middle of your ride. Every rider, and every app built on the open data, gets a better map back.
It is a governed commons, grounded in the work of Elinor Ostrom, so nobody can close it later - not even the people who started it. Durable facts go back to their source, starting with OpenStreetMap.
Behind the scenes
For anyone who wants to know what it runs on, how it is governed and what is in it.
Technical architecture
- Symfony on nginx and PHP-FPM - server-rendered site plus JSON API
- PostgreSQL with PostGIS - geospatial storage for climbs, water points and routes
- Python/FastAPI geodata pipeline, Valhalla routing and MapLibre vector maps
- Built on OpenStreetMap - durable facts are contributed back to OSM and to every other external source where that is possible
- Terraform and Ansible - every server defined in code, nothing configured by hand
Governance and licensing
- Open data under ODbL - query it, export it, build on it, commercial use included
- Code under AGPL v3 - free software: run it, study it, change it, fork it, commercial use included
- Media under CC BY-SA 4.0 - photos and video may be shared and adapted, commercial use included, with credit and under the same licence
- Governed as a commons on Ostrom's principles - designed so it cannot be enclosed later
What is in the atlas
- Utility: road surface, water points, bike services, hazards, shelter and train access
- Experience: climbs, scenic views, heritage, recommended routes and bike-friendly stays
- Curation instead of overload - riders vote on the best riding in each region
- Never personal data - the Commons maps the world, not the rider
Build and quality gates
- Multiple workflows in GitHub Actions - app, pipeline, tools, wiki and credits each tested on their own
- PHP: PHPUnit, PHPStan, Psalm, PHP-CS-Fixer and Rector. Python: pytest and Ruff. Node: the built-in test runner
- Gitleaks runs on every push and on every local commit - no secret reaches the history
- REUSE lint, SPDX headers, licence and translation checks block the merge when something is missing
The fountain that saved a hot July. The climb worth the extra hour. The back road that is somehow always empty.