Cartopolis
Code Issues 6 Pull requests 5 Projects 1 Releases 1 Packages Activity Actions
A networked 3D virtual world built with Rust and Bevy. https://cartopolis.org
fediverse foss groningen mapping metaverse social
1,308 commits 98 branches 1 tag 274 MiB
- Rust 93.5%
- TypeScript 2.6%
- WGSL 1.8%
- Shell 0.7%
- HTML 0.5%
- Other 0.8%
- Built from the registers — buildings from BAG and 3DBAG, ground from AHN, street trees, lighting and paving from the national and municipal object registers, PDOK aerial photography, live transit.
- Every building has a card — year built, use, units, floor area, status, monument listing, addresses. Walk in and its storeys are there.
- The world around it — real sun, real weather, routing on foot, by bike or by car, and one continuous space from a doorway to orbit.
- Talk where you stand — avatars, local chat scoped by distance, proximity voice, world chat, end-to-end encrypted private chats.
- Point at it — a link opens your exact view in the browser or the app; saved places with photos and map pins.
- Put something there — place and script objects and 3D models, swap a building for an IFC model, export and import content over an HTTP API.
- Moderation — blocking, reporting and account deletion, enforced on the server; a web console for accounts and data pipelines.
- Browser — cartopolis.org. Needs WebGPU.
- Desktop — Linux and Windows on the releases page, or build from source (macOS too). Published binaries need AVX2 and FMA (\~2013+).
- Android — APK at cartopolis.org/apk (arm64, Android 9+). The full client, least tested of the three (notes).
main
HTTPS
Download ZIP Download TAR.GZ Download BUNDLE Open with VS Code Open with VSCodium Open with Intellij IDEA
| Repository files (latest commit first) | Filename | Latest commit message | Latest commit date |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- | ------------------ |
| viberfox-agent 59ae15af94 CI / test cartopolis (push) Successful in 13m30s Details CI / wasm & android targets (push) Successful in 3m3s Details feat(mcp): fix what the first two bot sessions ran into... Read back from the viberfox bot's own sessions. Each problem is now a change: \- \`walk\_to\` takes \`wait\_s\` and answers when the walk ends. The bot had polled \`me\` about once a second, 30-odd times on one walk. \- A walk wedged on a hedge or fence corner sidesteps (left, right, back-and-aside, skipping a route corner) before giving up. Two walks near the Prinsentuin jammed a few metres in. \- \`sign\_out\` and \`sign\_in\` end and restart the session while the client keeps serving. Asked to disconnect, the bot had no way to. \- \`view\` returns a seven-field summary unless asked for \`details\`. It was returning about a hundred measurements the bot never read. \- \`read\_chat\` leaves out the agent's own lines, which doubled every exchange. \- A waiting call whose caller already gave up is dropped. Answering it advanced the chat cursor and spent the line on nobody. \- \`me\` explains unnamed avatars, and lists nobody while signed out. The waits only work once the host allows a call longer than Claude Code's 60 s default; the per-server \`timeout\` in \`.mcp.json\` does that, and the note records it. | 2026-09-27 21:39:51 +00:00 | | |
| .cargo | ci(web): name the browser build's deploy deploy-wasm | 2026-09-23 20:30:17 +00:00 | |
| .claude/skills | docs(slots): say what each slot renders on instead of sending shots to the Deck | 2026-09-27 20:58:45 +00:00 | |
| .forgejo/workflows | refactor(atlas): make the web UI the site root, and stop calling it the console | 2026-09-24 20:34:46 +00:00 | |
| assets | style(chat): follow the v1 mockup's inbox, thread and World view | 2026-09-26 13:28:19 +00:00 | |
| crates | feat(mcp): fix what the first two bot sessions ran into | 2026-09-27 21:39:51 +00:00 | |
| deploy | chore: drop the references to the retired cartopy repository | 2026-09-23 22:01:21 +00:00 | |
| docs | feat(mcp): fix what the first two bot sessions ran into | 2026-09-27 21:39:51 +00:00 | |
| tools | refactor(atlas): make the web UI the site root, and stop calling it the console | 2026-09-24 20:34:46 +00:00 | |
| .git-blame-ignore-revs | build: gate rustfmt in CI, and keep git blame readable across the reformat | 2026-08-06 17:20:50 +02:00 | |
| .gitattributes | refactor(brand): rename viberfox to cartopolis, cool the surface ramp | 2026-08-11 17:52:22 +00:00 | |
| .gitignore | refactor(brand): rename viberfox to cartopolis, cool the surface ramp | 2026-08-11 17:52:22 +00:00 | |
| AGENTS.md | docs: add a contributor guide and point the entry points at it | 2026-07-27 23:52:47 +02:00 | |
| Cargo.lock | feat(chat): send a place and its view into a private chat, and see a chat on the map | 2026-09-26 07:31:34 +00:00 | |
| Cargo.toml | feat(e2ee): add a Bevy-free crate for end-to-end encrypted private chats | 2026-09-26 07:31:33 +00:00 | |
| CHANGELOG.md | docs(changelog): note the tarmac that stopped being drawn on the squares | 2026-09-12 12:42:23 +00:00 | |
| CLAUDE.md | feat(mcp): let an agent walk, talk and build as the signed-in account | 2026-09-27 21:39:51 +00:00 | |
| LICENSE | refactor(brand): rename viberfox to cartopolis, cool the surface ramp | 2026-08-11 17:52:22 +00:00 | |
| LICENSE-APACHE | feat(android): behave like an app the system can suspend, and answer Back | 2026-08-10 22:27:18 +00:00 | |
| LICENSE-MIT | refactor(brand): rename viberfox to cartopolis, cool the surface ramp | 2026-08-11 17:52:22 +00:00 | |
| LICENSE-THIRD-PARTY.md | feat(map): paint land cover under the map, in one style with it | 2026-09-27 21:15:59 +00:00 | |
| README.md | docs(readme): cut it down to bullets | 2026-09-27 20:26:38 +00:00 | |
Cartopolis
A social map of the real world: see how a place is built, and talk about it with the people who are there.
A walkable 3D copy of the real world, built from open public data and shared between everyone looking at it. Runs in the browser, on the desktop and on Android. Free, open source, self-hostable.
Public infrastructure
Sharing a place
For residents, communities, municipalities and governments, and planners and architects.
Screenshots
| | |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
|
| Canal ring | Ring road tunnel by DUO |
|
|
|
| Main station and rail yard | Grote Markt and Martinitoren |
|
|
|
| Forum Groningen | Building card: the town hall |
|
|
|
| Groningen from 3 km | The city from 1.2 km up |
|
|
|
| Eemshaven | Eemshaven from the Wadden Sea |
|
|
|
| Meeting on the Grote Markt | Earth from orbit |
Generated with `cargo shots` from docs/shots.toml.
Where it works
Map, sky, weather, routing and the shared world: anywhere on Earth. Register detail (measured buildings and their records, relief, street objects, aerial photos, transit): the Netherlands, plus municipal data where a city publishes it. Elsewhere the ground is flat and buildings come from OpenStreetMap. Each register is one pipeline in crates/atlas.
Written in Rust on Bevy.
Try it
Running from source
cargo run -p cartopolisStarts offline. Sign in to a server from ☰ ▸ Sign in….
cargo run -p cartopolis -- --connect <host> # split mode: connect to a live sim (TLS)
cargo run -p cartopolis -- --offline # no sim: single user, no auth or persistence
cargo run -p cartopolis_simulator # the sim server, standaloneNeeds Rust, a C compiler and a GPU driver; see the development guide. Run `git lfs install` before cloning — assets are in Git LFS and some are compiled in.
Documentation
Architecture
| Crate | Role | | --------------------- | ------------------------------------------------------------------------------------------------- | | cartopolis\_core | Shared protocol types and tile/coordinate math | | cartopolis\_geo | Bevy-free map geodata: MVT decode, road classes, tree scatter, the routing graph | | cartopolis\_e2ee | End-to-end encrypted private chats (MLS); the server relays sealed bytes it cannot open | | cartopolis\_simulator | The shared-world server (Tokio + SQLite): avatars, chat, voice, objects, accounts; no Bevy | | cartopolis\_atlas | The register pipelines (BAG, 3DBAG, AHN, BGT, …), the terrain server and the operator web console | | cartopolis | Bevy client — rendering, ECS systems, UI | | cartopolis\_android | The Android app shell around the client | | big\_space | Vendored floating-origin fork, for planet-scale coordinates |
Licence
Source: MIT OR Apache-2.0 (LICENSE). Data, avatars and font carry their own terms; LICENSE-THIRD-PARTY.md is the canonical notice list (the credits below mirror it — add new sources there).
