v0.4.0 · engine Apache-2.0

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

terminal
$ 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.

Why GridPin

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.

How it works

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.

1

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.

2

Point the engine

CLI, Python, or DuckDB — the Rust engine memory-maps the sheet and is ready instantly. No import, no schema.

3

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.

Command line CLI
# 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
Python pip install gridpin
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
DuckDB gridpin_ext
-- 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.

Coverage

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.

Quality

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 setRowsGridPinPhotonNominatim
Germany · distorted addresses2,00082.1%46.9%15.8%
Germany · clean addresses2,00082.8%83.2%81.2%
Spain · distorted addresses1,59033.8%29.6%20.8%
Brazil · distorted addresses2,37620.7%19.8%9.6%
Brazil · health-facility register (as typed)1,00036.2%28.2%20.7%
Independent reference coordinates, the same queries for every engine, empty answers counted as misses. We show the sets where GridPin leads or is level; method, significance and identity are on the test bench page.

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.

Pricing

Flat price. Unlimited requests.

You're paying for fresh sheets, not for lookups. Run a billion queries — the price doesn't move.

Paid plans are in preparation. The free sheets below are complete and have no time limit — what paid plans add is a fresh rebuild every month and a commercial licence. Write to contact@gridpin.dev and we'll tell you when they open. Prices below are what we are planning, not an offer: they are not binding and may change before anything opens.

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
Download sheets

Starter

$59 / mo

For one country in production — in preparation

  • One country of your choice
  • Fresh sheets monthly
  • Forward + reverse + batch
  • Email support
Notify me
Snapshot — $199 one-time (in preparation). This month's fresh build of all available countries — the same sheets subscribers get — without a subscription. One invoice, no card on file, nothing to cancel. No updates afterwards. Yours to keep and use as long as you like. Notify me.
OEM / embedding — from $1,500 / yr. Ship GridPin and sheets inside your own product. Talk to us.

“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.

FAQ

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.