Stacks / Backend
Nominatim + GraphHopper / uMap
Maps you host. Nominatim is GPL-3.0 geocoding; GraphHopper is Apache-2.0 routing; uMap is AGPL-3.0 custom maps — Google Maps without the API meter.
The problem
Google Maps meters geocoding, routing, and embeds. You wanted OpenStreetMap data on hardware you run. Nominatim is GPL-3.0 search/geocoding (needs an OSM planet or extract — disk is the honest cost). GraphHopper is Apache-2.0 routing. uMap is AGPL-3.0 if the job is a custom map you embed. This is not Google Street View, traffic, or every Places review. Organic Maps / OsmAnd are clients, not this server stack.
Replaces
Google Maps
Estimated SaaS saved
$1,200
per year, small team, before lock-in
Start on RailwayNextcloud if this is files, not maps
Placeholder: this is a heavy box. Nominatim wants a large volume for an OSM extract; GraphHopper wants a graph build; uMap is the lighter custom-map app. A single Railway service is often the wrong size — a VPS with disk is the honest path. No one-click template in this repo yet — Start on Railway.
The stack
- Nominatim
GPL-3.0 OpenStreetMap geocoding and search
- GraphHopper
Apache-2.0 routing engine for OpenStreetMap
- uMap
AGPL-3.0 custom OpenStreetMap maps you embed
Cost table
| You stop paying | Typical / year | Self-host instead |
|---|---|---|
| Google Maps Platform (small team) | $1,200 | Nominatim and/or GraphHopper + OSM data |
Agent setup prompt
Replace Google Maps APIs with Nominatim (geocode/search), GraphHopper (routing), and/or uMap (custom embed). - Nominatim: import an extract, not a toy sqlite, if you actually query a region. GraphHopper: build the graph from OSM. uMap if the job is a map you draw. - Disk and RAM are the cost. Do not claim Street View, live traffic, or Places. Write AGENT_PROMPT.md.
Also as markdown: /stacks/osm-maps.md
FAQ
- Do I need all three?
- No. Nominatim for search. GraphHopper for directions. uMap for a custom map on a site. Start with the slice you pay Google for.
- Will this fit on Railway?
- uMap might. Nominatim usually wants a large volume and a long import. Treat a VPS as the default.