Self-host
A single Docker image with embedded Postgres and your own volume. Runs air-gapped. You own the data, the bandwidth and the cost curve.
01 / Quickstart
# the whole stack in one container
docker run -p 8080:8080 \
-v mapwright:/data \
ghcr.io/mapwright/mapwright Prefer compose? The same image, with your own Postgres and S3 when you outgrow the single box:
# docker-compose.yaml services: app: image: ghcr.io/mapwright/mapwright ports: ["8080:8080"] environment: DATABASE_URL: "postgres://user:pass@db:5432/mapwright" STORAGE_BACKEND: "s3" S3_BUCKET: "my-tiles" volumes: ["mapwright:/data"] volumes: mapwright:
02 / What's in the box
One container, amd64 + arm64. The whole serving stack in one place.
Metadata DB built in — or point at your own with DATABASE_URL.
Tilesets, styles and assets persist on a volume you control.
Static maps + raster tiles render in-process, natively.
03 / Scale when ready
Start on one box; add managed Postgres, object storage and a routing engine as you scale — all by environment variable, no rewrite.
STORAGE_BACKEND=s3 to serve tiles from object storage and scale out.
REDIS_URL shares cache, request log and key invalidation across instances.
Attach an external routing engine for directions, matrix and isochrone.
Point Mapwright at your own geocoding backend to drop the public-rate cap.
04 / Free build & license
The open build is gated; a one-time $2,000 license unlocks the full stack on a single install, forever. See the full comparison.
US tiles included (bring your own planet or regional tiles), streets style, static maps, driving-only directions and address geocoding. Runs on your own infrastructure — ideal for evaluation and light projects.
One-time, one install, perpetual. Unlocks worldwide/planet tiles, all 5 styles, every routing profile (matrix, isochrone, matching, optimization), POI geocoding and planet tile download.