Two new pieces close the basemap gap: vector basemaps in the live map — register Maptoolkit community styles and custom style.json URLs — and an offline tile packager that harvests a drawn AOI from any XYZ/TMS source, raster or vector, into a .mbtiles pack with style, sprites, and glyphs bundled. A vendored MapLibre viewer renders the pack with zero network.
Draw a rectangle or polygon over the service territory, point at a tile source, pick the zoom range, and watch the live tile-count and size estimate before you commit. The harvester runs as an async job and drops a self-contained pack folder you can open — or copy to another machine — with no connection at all.
{z}/{x}/{y} XYZ/TMS template or remote style.json; format auto-detected (vector MVT or raster), zoom range and pack name yours.pack.mbtiles + manifest; vector packs also bundle the rewritten style, sprites, and glyphs so labels and icons work offline.GET /api/basemaps/styles → builtin + custom POST /api/offline/packs { "aoi": "polygon", "zooms": "8–14", "source": "https://…/{z}/{x}/{y}.mvt" } → pack.mbtiles + style.json + sprites/ + glyphs/ ● offline viewer /offline-map/?pack=storm-aoi // vendored MapLibre GL — zero network
Pack the projected impact area at z8–z14 before landfall — EOC screens and crew laptops keep a full basemap when backhaul dies.
Packs are plain folders: build on a connected machine, sneakernet to the air-gapped network, serve from localhost.
Tile sources you choose, attribution enforced, and a mandatory terms acknowledgment when harvesting from a pasted remote style.
Honest boundary: Maptoolkit community basemaps are online-only — their license prohibits harvesting Maptoolkit tiles, sprites, or glyphs for self-hosting, so they are deliberately not offered as offline presets. Offline packs come from operator-supplied or ODbL-clean sources; the operator is responsible for source terms.