File to endpoint, server-side
Nothing to install, no keys to manage. The same pipeline runs whether you drop a file on the scene above or POST raw bytes to the API.
Drop
GeoTIFF / COG, GeoJSON, or zipped Shapefile. Drop onto the scene, or send raw bytes to POST /upload-*.
Normalize
Vector: ogr2ogr → WGS84 FlatGeobuf. Raster: GDAL → sharded, multiscale Zarr v3 store.
Tile
Vector: tippecanoe → PMTiles. Raster: pyramid rendered on demand to RGBA8 PNG.
Serve
A public XYZ endpoint, CORS *. Paste into Leaflet, MapLibre, OpenLayers, deck.gl or QGIS.
No dataset handy?
It really uploads: you get a real public endpoint.
Endpoints
Everything the scene above does is one HTTP call away. Every tile and JSON route sends Access-Control-Allow-Origin: *.
| Route | Returns |
|---|---|
| POST/upload-vector?format=geojson|shapefile | body = file bytes → { "key", "tiles", "minzoom", "maxzoom" } |
| POST/upload-raster?format=geotiff|cog | body = file bytes → { "key", "tiles", "minzoom", "maxzoom" } |
| GET/tiles/:key/{z}/{x}/{y}.pbf | vector XYZ tiles (MVT) |
| GET/raster/:key/{z}/{x}/{y}.png | raster XYZ tiles (RGBA8 PNG) |
| GET/osm/:style/{z}/{x}/{y}.png | basemap tiles (atlas · paper · onyx · terra · fjord · meridian) |
| GET/osm/styles | style list (JSON, with URL templates) |
| GET/health | 200 ok |
Tip: add ?key=<name> to an upload to pick your own layer key; omit it and one is generated.
Six self-hosted basemaps
OpenMapTiles data served from a self-hosted tileserver behind this domain: no key, no third-party quota. Covers below are real tiles from /osm/<style>/{z}/{x}/{y}.png; select one to load it live.
Your data, on the map.
One drop away from a public XYZ endpoint. Nothing to sign, nothing to install, nothing to run.