mapstyle
A whole OpenStreetMap map in one offline HTML page:
the roads for driving, walking and cycling over a full base map, from one duckOSM database.
Documentation · Live map · Get started · Gallery · JavaScript API
Quick start
pip install mapstyle "duckosm @ git+https://github.com/Khoshkhah/duckOSM"
curl -LO https://download.geofabrik.de/europe/monaco-latest.osm.pbf
duckosm build --pbf monaco-latest.osm.pbf -o monaco.duckdb \
-m driving -m walking -m cycling
mapstyle monaco.duckdb # -> monaco_all.html: one file, opens offline
import mapstyle as ms
ms.render_map("monaco.duckdb").save("monaco.html") # the whole map
ms.render_map("monaco.duckdb", mode="walking", paths="komoot") # paths in front
ms.render_map("monaco.duckdb", theme="grey") # a quiet map for data
ms.render_map("monaco.duckdb", planner=True).save("planner.html") # a route planner demo
ms.render_map("monaco.duckdb", dashboard=True).save("dashboard.html") # a dashboard
What you get
- Every travel mode on one map, or one brought to the front:
all,driving,walking,cycling; four looks for paths (google,osm,komoot,cyclosm); and three themes for the whole map:osm(detailed),google(clean),grey(quiet, for your data on top). - A full base map from the same database: the sea, land use with openstreetmap.org's textures, water, buildings, railways, parking, transit, traffic lights and crossings. No tile server, no API key.
- Roads drawn right at junctions: two-way roads as two lanes, bridges and overpasses over, tunnels
under, crossings over their street. The drawing order of the roads is roadstyle's:
a casing number and a fill number for every road, read from the database when
duckosm levelsstored them, else computed while the page is made, so a joint of roads at different levels shows no ring. - A route planner demo: drag a start and an end and see duckOSM's route on the map (routing itself is duckOSM's job).
- A dashboard: filter by mode, road class and layer, colour by mode, inspect what you click.
- A JavaScript API: every page is a roadstyle page
(
rsQuery,rsFilter,rsColor, …) plusrsSetModes,rsSetKindsandrsSetInteraction; 3D, Street View and vector tiles for large areas come with it.
Walking: paths in front |
A raised walkway over a roundabout |
The route planner demo |
The dashboard |
How it fits together
| Project | Its part |
|---|---|
| duckOSM | OpenStreetMap → one DuckDB file: the driving, walking and cycling networks and the base-map layers |
| mapstyle | reads that file (with duckdb only) and styles all of it as one map |
| roadstyle | draws the page: MapLibre GL, the road styling, the JavaScript API |
The look is data: four YAML files in src/mapstyle/styles/ (travel modes,
path styles, colours, layers). See Styles.
Command line
mapstyle DB [-o OUT] [--mode {all,driving,walking,cycling}] [--paths {google,osm,komoot,cyclosm}]
[--theme {osm,google,grey}]
[--no-layers] [--planner] [--dashboard] [--tiles] [--basemap BASEMAP]
For AI agents
- Using mapstyle: the agent skill
skills/mapstyle/SKILL.mdhas the install, the one call, the options, the JavaScript API and the traps in one page. In Claude Code:/plugin marketplace add Khoshkhah/mapstyle, then/plugin install mapstyle@mapstyle. - The docs as text:
llms.txtandllms-full.txt(every page, one file). - Changing mapstyle:
AGENTS.mdhas the commands and the project's rules.
More: AI agents.
Development
git clone https://github.com/Khoshkhah/mapstyle && cd mapstyle
python -m venv .venv && .venv/bin/pip install -e ".[dev,tiles]"
.venv/bin/pytest # builds a Monaco database with a duckOSM checkout next to this one
Tests look for duckOSM in ../duckOSM (with its .venv), or wherever DUCKOSM_DIR /
DUCKOSM_EXE point; MAPSTYLE_TEST_DB reuses a database you already built. Design notes are in
docs/design/.
License
MIT. Map data © OpenStreetMap contributors (ODbL); the sea from Overture Maps, built from OpenStreetMap's coastline.
Metadata
Release files for mapstyle 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mapstyle-0.4.0.tar.gz | 62.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mapstyle-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 118.0 kB
Release files / mapstyle-0.4.0.tar.gz
| Download URL | mapstyle-0.4.0.tar.gz |
|---|---|
| Size | 62.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5d16d4a2685d33a185eaf9c1aa83f0a7e1119dee8c8584fb4c8dc1555fef075d
|
|
BLAKE2b-256 checksum How to use checksums |
73650a19b184a54df357682c8f23fbf05dfc57bf1942c76aa71e58915b4ae1e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency logRelease files / mapstyle-0.4.0-py3-none-any.whl
| Download URL | mapstyle-0.4.0-py3-none-any.whl |
|---|---|
| Size | 55.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9006c6e99a6da6f6d878ca1641b3060f02330b9880665a288069b6e49007ac32
|
|
BLAKE2b-256 checksum How to use checksums |
a4a5da6961cbb9f4d9991683e31160fb4f0c57ced4d002c10a5aa80907b39aa4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency log