GridPin is an open-source geocoder for street addresses that runs entirely on your machine. Each country is one memory-mapped file you download once; forward and reverse geocoding then need no server, no database import, no API key and no rate limit.
Ways to use it:
Python: pip install gridpin
a command-line tool
DuckDB: INSTALL gridpin_ext FROM community
an MCP server for AI agents: uvx gridpin-mcp
An address the file cannot place comes back empty rather than guessed.
Benchmark. Share of first answers within 150 m of an independent reference coordinate; same queries and same truth for all three engines; empty answers count as misses:
Query set
Rows
GridPin
Photon
Nominatim
Germany, distorted addresses
2,000
82.1%
46.9%
15.8%
Germany, clean addresses
2,000
82.8%
83.2%
81.2%
Spain, distorted addresses
1,590
33.8%
29.6%
20.8%
Brazil, distorted addresses
2,376
20.7%
19.8%
9.6%
Where it does not win: on clean German addresses the three are level, on Brazilian distorted addresses GridPin and Photon are level, and Photon leads on clean Brazilian addresses and on the other Spanish sets. Method and full counts: https://gridpin.dev/bench
Disclosure: the code, tests, benchmarks and this post were written with AI coding agents; I direct the work and make the decisions. Feedback is welcome, especially addresses it gets wrong.
Would be nice to not have to deal with terabyte+ PostGIS database shenanigans that take days to build and hundreds of GB of RAM. Looking forward to US coverage and easy updates (or local rebuilds). Will you be directly ingesting TIGER/Line shapefiles?