Show HN: Offline tiles and routing and geocoding in one Docker Compose stack (corviont.com)

102 points by packet_mover ↗ HN
Hi HN,

I’m building Corviont, a self-hosted offline maps appliance (tiles + routing + search) for edge/on-prem devices.

Hosted demo (no install): https://demo.corviont.com/

Self-host (Docker Compose repo): https://github.com/corviont/monaco-demo

Docs: https://www.corviont.com/docs

What’s inside:

  - Vector tiles served locally (PMTiles)
  - Routing served locally (Valhalla)
  - Offline geocoding/search + reverse (SQLite Nominatim-based index)
  - MapLibre UI wired to the local endpoints
After the initial image + data pulls, it runs fully offline (no external map/routing/geocoding API calls).

Next (if people need it): a signed on-device updater for regional datasets (verify → atomic swap → reload).

I’d love feedback: where offline maps/routing/search matters for you, and what constraints bite (hardware, fleet size, update windows, regions, deployment style).

10 comments

[ 3.4 ms ] story [ 35.6 ms ] thread
This is super cool. I’ve been kicking around an idea for ages regarding tile-based routing that I think would be excellent for offline routing. You could leverage the quadtree aspect of tiling to encapsulate faster, direct routes (ie highways) and as you go to deeper zoom levels you’d unlock small roads - even down to pathways. This keeps your in-memory graph small while traversing large distances (which would just be highways anyways) and once you eliminated most of the distance your remaining graph traversal on local roads would be small
searching with street name and number offline would be nice. In google maps search only works when online
Does this not require a massive database of tiles?

I ask because I've been looking to self host some sort of map tile server and they seem to have database in the hundreds of GB.

The size of the tiles will depend on how much detail you want.

Maptiler has a bunch of datasets, anywhere from 385MB to 527GB but the OSM dataset is only 70GB. (MBTiles format)

I love it, thanks!

If I may have a feature request, I’d like to have only some of the features turned on - in my case it would be just the reverse geocoder (so I could skip the map and routing data download and storage).

Right now I have my own reverse geocoder for https://weathergraph.app which downloads OSM dumps and builds in-memory KD tree for lookups. Surprisingly, the whole world can fit in 3-4 GB of RAM, and service starts in 90 seconds on a cheap VPS, no database needed, but of course, having a battle tested solution that just works (and someone else maintains it) would help.

Thank you! And yes, Corviont is intentionally a stack of separable services behind one gateway - so "geocoder-only" is exactly the kind of config I want to support (skip PMTiles + Valhalla and ship only the SQLite index + reverse API).

Re: Weathergraph - thanks for the details. Since you already run whole-world reverse geocoding on a single server, that's a bit different from Corviont's current regional/fleet packaging (where you ship only the area you need to each edge/on-prem deployment). A "world geocoder-only" pack could still make sense - but it's a different distribution/update story than my default.

For your use case, do you want reverse results at the city/region/country level - or do you also need street/house number detail? That choice mostly determines how heavy a world geocoder-only pack needs to be.

I like how you packed only the necessities - tiles for maps, routing, and geocoding index in in sqlite. I checked the monaco deployment and missed lookup with street number, as someone else also pointed out.

Why not create a "builder" repo, where people could generate their own local datasets by a bounding box?

Definitely interesting, I don't see an obvious comment on hardware requirements, do you know what those are?

I've played around with OSRM, and Nominatim, etc, but had to do some trickery to run on a raspberry pi.

(For anyone interested in running some of these kind of things on a pi, I talk about it generally here, I need to post an update with more info at some point. http://blog.onaclovtech.com/2025/02/general-purpose-to-speci...)

mild critique: this website looks _incredibly_ vibe coded.