gpui-maps is a vector-map engine written in Rust. It draws on your GPU, inside your GPUI window, and the same code runs on iOS and in the browser as WebAssembly. No web view, no JavaScript, no access token.
© OpenStreetMap contributors · OpenFreeMap · Sentinel-2 cloudless by EOX · NASA
The whole planet, with clouds, night and stars, down to a single street. Drag to spin; pinch, or hold ⌘ or Ctrl and scroll, to zoom. Open full screen
Your first map in three commands.
Clone the repository and run the first example. It opens a window on Singapore with an open, keyless basemap.
$ git clone https://github.com/swatmobility/gpui-maps $ cd gpui-maps $ cargo run --example hello_map Compiling gpui-maps v0.7.0 Finished `dev` profile Running `target/debug/examples/hello_map`
use gpui_maps::basemaps::{self, Basemap}; use gpui_maps::map_view::MapView; let b = basemaps::load(Basemap::Liberty)?; let map = cx.new(|_| MapView::new( 103.85, 1.29, 12.0, 1024.0, 768.0, b.style, b.source, rt.clone(), ));
A map is a GPUI view, so you add it to a window like any other element. Read the getting-started guide.
Everything a map needs, in one engine.
The live maps above use a few of these. The rest are in the examples and the docs.
- Tiles
- Vector tiles over HTTP, PMTiles, MBTiles and raster tiles. Runs fully offline from a single
.pmtilesfile, with no account, key or outside service, so it works on private networks with no internet. - Data
- GeoJSON, CSV, FlatGeobuf, GeoParquet and Cloud-Optimised GeoTIFF, with hover and click picking.
- Visualisation
- Arcs, animated trips, heatmaps, hexagon and grid binning, dot density, clustering.
- 3D
- A globe with atmosphere and sky, building extrusion, and glTF models.
- Navigation
- Turn-by-turn route following on Ferrostar's Rust core: manoeuvres, rerouting and a follow camera, drawn by the engine.
- Capture
- Render a camera or a scripted map story to PNG or video, with no window.
- Big data
- Dot-density and H3 hexagon layers that stream their tiles live from ClickHouse, read-only and behind a SQL guard.
- Dashboards
- Charts linked to the map, defined in one JSON file with the SQL inline, for ClickHouse and Postgres (
swat-maps-dash). - Catalogues
- STAC 1.1 catalogues of open geodata, read into map layers with their licences (
swat-maps-stac).
Your coding agent can drive the map.
An app built on gpui-maps can open a local HTTP port that describes itself. An agent lists the actions, calls them, and reads the map's state back as JSON, so it can move, inspect and test the map without screenshots.
$ GPUI_MAP_AGENTIC_PORT=7334 cargo run --example basic_map &
$ claude
> Fly to Tokyo Station and tilt it so the buildings show.
● Bash(curl -s localhost:7334/ | jq -c '[.actions[].name]')
⎿ ["map.state","map.tiles","map.layers",…,"map.fly_to",…]
● Bash(curl -s -X POST localhost:7334/map/fly_to \
-d '{"lon":139.7671,"lat":35.6812,"zoom":16,"pitch":60,"ms":1500}')
⎿ {"ok":true,"camera":{"lon":139.7671,"lat":35.6812,"zoom":16.0,
"pitch_degrees":60.0,"bearing_degrees":null},"eased_ms":1500.0}
● The map is over Tokyo Station at zoom 16, tilted 60° so the
buildings stand up. Read map.state to confirm what it drew.
- Self-describing.
GET /returns every action with its method, path and parameters, so the agent never works from a stale list. - Local only. The port binds to 127.0.0.1 and is off unless your app turns it on.
- Reusable. The
gpui-agentic-httpcrate gives any GPUI app the same surface, with an MCP server and a skill for Claude Code.
Connect Claude Code.
Start your app with its agentic port open, then pick either way, or both. They also work for any other GPUI app built on gpui-agentic-http.
$ cargo install gpui-agentic-http $ claude mcp add gpui-maps -e AGENTIC_HTTP_PORT=7334 \ -- agentic_mcp_server
Every action becomes a Claude Code tool. A new action shows up as a tool by itself.
$ mkdir -p .claude/skills $ cp -r gpui-agentic-http/skills/agentic-app \ .claude/skills/
Claude Code finds the app's port and calls its actions over HTTP. Nothing to configure.
Rust everywhere: desktop, mobile and WebAssembly.
One engine, written once in Rust with WGSL shaders. It compiles to a native macOS view, an iOS app and a WebAssembly module, and draws the same map on each.

Open the live web demo Loads a 15 MB WebAssembly module. Works best in a browser with WebGPU.
SWAT Studio: every example in one app
A free Mac app that opens the engine's demos side by side: styles, the globe, 3D buildings and vehicles, 25 transit networks on the clock, data visualisation, ClickHouse dashboards, PMTiles and GeoParquet. Built from the examples in the repository.
Download for Mac All releases Free. Signed and notarised. macOS 13 or later, Apple silicon and Intel.
Also in the repository
swat-maps-docA map document format: datasets, layers, filters, scales and tooltips, with undo and redo.swat-maps-dashA dashboard format and a guarded SQL template compiler.swat-maps-stacA reader for STAC catalogues of open geodata.
Plain Rust with no GPUI dependency. They build for WebAssembly.
Free for everyone. Supported for teams.
Open source
Free
- MIT or Apache-2.0, your choice
- Commercial use included, no sign-up
- Questions and bugs in GitHub issues
Commercial support
Talk to us
- Agreed response times and a private channel
- Long-term support releases
- Features built to your schedule
- A commercial agreement for procurement