Address API
US address + IP geolocation on Cloudflare Workers + D1. Architecture validated, parked for an integration seam.
What it is
A US address + IP-geolocation lookup API. Cloudflare Workers in front, D1 as the datastore (sharded 51 ways plus geo/meta), KV for hot lookups, R2 for the canonical data dump. Full-address resolution against a real dataset, no third-party call-outs.
Why it matters
A cooperative-owned geolocation and address-validation API is a small but real revenue candidate. Every existing option is a metered SaaS from a company you have to trust with your users' addresses. This one runs entirely on cooperative infrastructure and can be priced flat.
It is also the shape of what "InertSpace tools" could become as a category: small, sharp, honest APIs that solve one thing.
Current state
Where it is right now: parked as of May 26, 2026. Architecture validated end-to-end against Wyoming data. Live demo at address-worker.inert.workers.dev.
What "validated" means concretely: Wyoming loaded end-to-end: 138,818 addresses, 179,242 units, 106 MB of D1 storage, 35-second full upload. Live query latencies: autocomplete 2.5 ms, geo bounding-box 1.6 ms, address + unit join 0.6 ms. All shards + hot-cache namespaces provisioned. Six D1 dialect quirks documented and patched along the way.
Converter validated on the full 27 GB source dump: parse pass runs 128 million rows in about 4.5 minutes; shard pass produces 66 files totalling 26 GB in roughly 25 minutes.
Cost while parked: essentially zero above the existing Workers base. If fully activated, D1 storage runs about $45 to $50 per month, plus a one-time ~$1 in writes during the initial load. Selective-state loading is supported (WY ~$0.08/mo, CA ~$5/mo), so an API for one region can be turned on without paying for all fifty.
Canonical data: the 2.7 GB source dump is preserved off-site for one-button revival. Full restart runbook lives with the code.
What is next: an integration seam. This is parked on a missing connection point, not on missing demand, and the distinction matters. The service works; what it does not yet have is a place inside the rest of the stack where something calls it and depends on the answer. Address lookup is a feature of other things, never a destination in itself, so the sensible order is to find the host first. The full US load follows the seam rather than preceding it, because loading fifty states to serve nobody is just a monthly bill.
Connections
Independent of the rest of the constellation. Shares the Cloudflare Workers platform with Edge Oil. Owned by the Cooperative.
Build log
Six days of intense work, then parked. Everything since is the wait for a seam to plug into.
-
May 20, 2026
Worker + converter scaffolded
Two projects stood up in one day: the Worker that serves the API and the pipeline that turns a MariaDB dump into fifty-one sharded databases plus geo/meta.
-
May 23, 2026
Multi-line INSERT parsing
The source dump's multi-line INSERT format needed a real parser, not a regex. Written and tested against the full pile.
-
May 24, 2026
Pipeline stages implemented, state sharding across 16 parallel workers
Full pipeline lands. State-to-shard mapping runs across 16 parallel workers. One stage turns out to be unnecessary: D1 is the endpoint we can write to directly.
More
- Stage 1: parse. The 27 GB source dump into a normalized row stream. ~4.5 minutes for 128 million rows.
- Stage 2: shard. Split by state into 66 files totaling ~26 GB. ~25 minutes across 16 parallel workers.
- Stage 3: skipped. It was going to write to an intermediate SQLite. Turns out D1 can accept the shard files directly.
- Stage 4: upload. Push shards into D1 databases. This is the long pole: 8 to 15 hours for the full US.
- Stage 5: KV populate. Prime the hot-cache namespaces. ~30 minutes for 128 million keys.
-
May 26, 2026
D1 dialect patched · Wyoming validated · parked Hold
Six D1 SQL-dialect quirks documented and patched (R-tree gone, B-tree bounding-box for geo instead). Wyoming loads end-to-end with sub-3ms query latency. The pipeline is proven. Everything gets parked at that point, waiting on a seam to integrate into rather than on anything left to build.
More
- The six D1 quirks: no PRAGMA statements, no BEGIN/COMMIT transactions, AUTOINCREMENT only inline (not with column CONSTRAINT), CREATE INDEX has to be separate from CREATE TABLE, no cross-table constraint foreign keys, no R-tree extension.
- R-tree loss forced a rewrite of geo lookups: bounding-box queries against B-tree indexes instead. 1.6 ms average, so no real cost.
- Wyoming validation: 138,818 addresses, 179,242 units, 106 MB of D1 storage, 35-second upload, sub-3ms queries across autocomplete, geo, and join.
- Every finding gets documented in the revival runbook so an unpause doesn't have to rediscover any of it.
-
Now · rechecked Aug 31, 2026 You are here
In hold, essentially zero cost, one-button revival
No active development. A full revival runbook is written down. The long pole is uploading all shards (roughly 8 to 15 hours), plus about half an hour to prime the hot-cache namespaces. Bindings are already wired, so no redeploy is needed after data loads.
Still parked, deliberately, with nothing changed since May. It is parked on a missing integration seam rather than on missing demand: the service works, and what it lacks is a place in the stack that calls it and depends on the answer. A parked project that stays parked is a decision holding, not a project going stale.
-
Trigger
A seam, then the full US load
The unpark condition is a place in the stack that calls this and depends on the answer. Once there is one, reload all 51 shards from the preserved dump, publish a price sheet, and open the API. Estimated ongoing cost ~$45 to $50/month in D1 storage. Selective-state loading is a real option (WY ~$0.08/mo, CA ~$5/mo), so the first seam does not have to pay for fifty states to be served.