Offline geocoder — a country in a file.
No server, no database import, no per-request fees.
GridPin packs a country into a memory-mapped file. Forward and reverse geocoding, millisecond exact lookups on a single laptop core — no server, and the engine and every query stay offline.
Fits: local, privacy-sensitive or high-volume address workloads in Brazil, France, Germany (15 of 16 Länder), Italy, the Netherlands, Serbia and Spain. Does not fit today: worldwide coverage, a hosted endpoint, or POI-first search outside France.
Rust engine · CLI · Python wheel · DuckDB extension · MCP server · batch mode
$ gridpin query france.bin "8 Boulevard du Port, Amiens" -k 1 {"lat":49.897442,"lon":2.290084,"precision":"house","confidence":0.94, "street":"Boulevard du Port","housenumber":"8","commune":"Amiens","postcode":"80000", …} $ gridpin reverse france.bin 49.894600 2.294900 # millisecond, fully offline {"lat":49.894538,"lon":2.294934,"precision":"house","confidence":0.95, "street":"Passage du Bailliage","housenumber":"19","commune":"Amiens","distance_m":7.3, …}
Zero calls home
The engine sends no telemetry and no license pings — not a byte of what you geocode leaves your machine. The only network use is you downloading a sheet.
Opens instantly
Memory-mapped country files. No database, no data import, no warm-up.
Forward & reverse
Address to coordinates and coordinates to address, single or batch.
Speaks your stack
CLI, Python wheel via pip, a DuckDB extension for SQL, and an MCP server for AI agents.
Your geocoding bill is rent.
Make it a purchase.
Hosted geocoders charge per request, forever — and the biggest one won't even let you keep what you paid for.
| Approach | Cost at 1M req / month | Keep your results? | Runs on |
|---|---|---|---|
| Google Maps Geocoding | ~$3,550 / mo | Storing forbidden; coordinates for 30 days max | Google's cloud |
| Mapbox Permanent | ~$4,500 / mo | Yes — at 7.5× the temporary price | Mapbox's cloud |
| Geoapify on-prem | €700 / mo + setup | Yes | Your server |
| Nominatim self-host | Your ops time | Yes | A beefy server, days of import |
| GridPin | $0 static Freeplanned fresh-data plans from $59/mo; no per-query fee | Yes — forever. It's your file. | Any laptop |
The optional France POI layer comes with every tier; it is best-effort and may lag the address release by a little.
Cost comparison: List prices as of 2026-08, 1M requests/month; hosted-API figures are provider list prices before storage add-ons — see each provider's current terms.
The grid is ours. The pin is yours. We ship fresh data sheets; every result you compute belongs to you — store it, join it, sell your product on top of it, forever.
Three steps. No server anywhere.
A sheet is one data file per country — a few regional datasets add a small companion file, and the optional POI layer is its own file. The full set is the atlas. Fresh sheets ship monthly on subscription; free builds are static, with no update schedule.
Download a sheet
France is a single 365 MB sheet with 26.1M addresses — most countries are one file (a few regional datasets add a small companion). Put it anywhere on disk.
Point the engine
CLI, Python, or DuckDB — the Rust engine memory-maps the sheet and is ready instantly. No import, no schema.
Geocode offline
Forward, reverse, and batch — exact lookups in well under a millisecond per core. On a plane, in an air-gapped VPC, on a laptop.
# forward: top hit as JSON $ gridpin query france.bin \ "19 Rue Béranger, Paris" -k 1 {"lat":48.866402,"lon":2.363412, "precision":"house", …} # reverse $ gridpin reverse france.bin \ 48.8664 2.3634 # batch: JSONL in, JSONL out $ gridpin batch france.bin \ in.jsonl out.jsonl -k 1
import gridpin g = gridpin.Geocoder("france.bin") # mmap, instant hits = g.geocode("8 Bd du Port, Amiens", 1) print(hits[0]["lat"], hits[0]["lon"]) near = g.reverse(49.8945, 2.2949, 1) # exact lookups: ~3,000/s per core; # geocode_many() batches across cores
-- install: see docs → Install LOAD gridpin_ext; SELECT gridpin_load('france.bin'); -- forward, straight from SQL SELECT gridpin_geocode(address) FROM customers; -- reverse SELECT gridpin_reverse(lat, lon) FROM gps_pings;
AI agents get the same engine through an MCP server — claude mcp add gridpin -- uvx gridpin-mcp.
The agent downloads a sheet once, checked against the signed release, and geocodes offline.
How it works.
Seven country sheets. More coming.
Sheet format v7; Germany added in September 2026 (v0.2.0), Spain in September 2026 (v0.3.0), Brazil in October 2026 (v0.4.0). New sheets are added country by country — tell us which one you need next.
| Country | Sheet size | Addresses | Source | Data license | POI layer |
|---|---|---|---|---|---|
| France | 365 MB | 26.1M | BAN national registry | Licence Ouverte | ✓ optional, 231 MB |
| Germany 15 of 16 Länder; Bavaria not covered |
213 MB | 19.27M | Overture / OpenAddresses, 15 Länder; BNetzA postcode witness | dl-de/by-2-0 · dl-de/zero-2-0 · CC BY 4.0 (per source) | — |
| Italy | 247 MB | 25.9M | Overture / ANNCSU | CC BY 4.0 | — |
| Netherlands | 103 MB | 9.9M | Overture / Nationaal Georegister (BAG) | Public Domain Mark 1.0 | — |
| Serbia | 32 MB | 2.6M | Overture / RGZ | data.gov.rs Terms of use | — |
| Spain | 185 MB | 15.27M | Overture / CartoCiudad (IGN/CNIG) | CC BY 4.0 | — |
| Brazil | 677 MB | 67.19M | Overture / IBGE CNEFE 2022 | CC0 1.0 (IBGE public data) | — |
A sheet is smaller than its own raw source. France's national registry download is an 885 MB gzip that unpacks to 4.9 GB of CSV — the finished sheet is 365 MB, and that already includes every index: typo automata, spatial cells, ranking. You download less than the raw data and get a ready-to-query engine file instead of a CSV to import.
Optional POI layer for France: 231 MB of places from Overture (mixed permissive: CDLA-Permissive-2.0 / Apache-2.0 / CC0-1.0) — geocode "pharmacie gare de Lyon", not just street addresses.
Prebuilt binaries cover Linux x86_64 (x86_64-unknown-linux-gnu),
macOS Apple Silicon (aarch64-apple-darwin) and Windows x86_64
(x86_64-pc-windows-msvc); any other target (Intel macOS, Linux arm64/musl,
Windows arm) builds from source with stable Rust.
Which country should we build next?
Nothing to sign up for and nothing to fill in but the country itself. We keep one number per country — no cookie, no identifier, nothing stored on your device, nothing that says it was you. What we hold.
Messy input is where GridPin wins.
Real addresses arrive with typos, shortened street types and the town in the wrong place. Share of queries answered within 150 m of the true address:
| 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% |
| Brazil · health-facility register (as typed) | 1,000 | 36.2% | 28.2% | 20.7% |
CI: cargo test on three operating systems, plus a public smoke test
that builds Monaco from a raw OSM extract and runs live queries on every commit.
Flat price. Unlimited requests.
You're paying for fresh sheets, not for lookups. Run a billion queries — the price doesn't move.
Free
$0
For side projects and evaluation
- France, Germany (15 of 16 Länder), Italy, the Netherlands, Serbia, Spain, Brazil
- Static builds, no update schedule — monthly rebuilds are subscriber-only
- Forward + reverse + batch
- Engine is Apache-2.0, forever
Starter
$59 / mo
For one country in production — in preparation
- One country of your choice
- Fresh sheets monthly
- Forward + reverse + batch
- Email support
Pro
$149 / mo
For teams that geocode everywhere — in preparation
- The whole atlas — all available countries
- Fresh sheets monthly
- Provenance journal per build
- Invoice billing
- Email support (priority)
“Notify me” opens your mail client; if nothing happens, write to contact@gridpin.dev.
When paid plans open: annual billing = 10× the monthly price — two months free.
All plans: unlimited requests, results are yours forever.
Questions people actually ask
Can I store the geocoding results?
Yes — forever. That's the point. Everything GridPin computes on your machine is yours: cache it, put it in your database, ship it in your product. Compare: Google's terms forbid storing results and cap coordinates at 30 days; Mapbox charges 7.5× for permanent storage rights.
Free has all available countries too — why pay $199 for a Snapshot?
Freshness. Free builds are static — they can be far behind the registry. A Snapshot is today's monthly build, the exact sheets subscribers receive, plus a proper invoice for procurement. It deliberately costs more than one month of Pro: it's the no-subscription option — one invoice, no card on file, nothing to cancel. If a subscription works for you, a month of Pro is cheaper. And if older data is fine for your use case — honestly, use Free.
How does this work with GDPR?
Your customer addresses never leave your infrastructure: no API call to geocode, no third-party processor, no data transfer to review — the geocoder runs where your data already lives, and the engine sends no telemetry at all. The only network action is you downloading a sheet, and it carries no query data.
How fresh is the data?
Subscribers get fresh sheets monthly (Pro also gets a provenance journal for every build). The free tier gets static builds, with no update schedule. Each sheet states its source and build date.
Is it open source?
The engine (Rust), the DuckDB extension, the data pipeline, and the docs are public under Apache-2.0. The paid part is the data service: fresh, tested, ready-to-use sheets every month — plus country-specific rule tables that ship inside the paid data files.
What hardware do I need?
A laptop. Sheets are memory-mapped, so they open instantly and don't need to fit in RAM. On a single arm64 core, exact lookups run at ~3,000/s and reverse geocoding at ~1,800/s; typo-tolerant fuzzy matching is much slower (tens of ms per query), so batch messy input across cores. See the benchmarks for the per-shape method and numbers.