What changed
Generated from the git history, not kept by hand — so it records what happened rather than what somebody remembered to write down. Every entry that names a bug names one of mine.
2026-09-16
- 14 · Structured data on 5,922 pages, which emitted none
The cheapest remaining thing a search engine could be told, and it was not being told any of it.
- 9-13 · Five audits the build gate never made, and what they found
check-data.py refuses to publish broken data. None of this is broken — it is publishable and probably wrong, which is the class of fault that has cost this project most, because nothing stops it. Arienzo 44 km from Arienzo. Somerset in Los Angeles. Eleven New York collections filed in Morocco.
- Untrack every generated file under site/public
site/public is Astro's static root, so what the build writes lands beside the one file that is real — styles.css — and `git add -A` sweeps it up. An ignore rule does not untrack what git already tracks, which is how a 64 MB surnames.json reached the repository twice: once in data/ and once here.
- 1 · Cemeteries in the record regions, and a harvester that splits what it cannot swallow
2,952 cemeteries inside the fourteen record regions — Campania 748, Posen 873, Calabria 496, Carnia 283 — restoring the burial layer the family map had and this one dropped when it generalised.
- 45 · Strike the kit promotion, with reasons
Owed seven times, deferred seven times, and each deferral turns out to have been a correct instinct rather than a delay.
- 41 · OpenStreetMap's archives, in a file of their own because ODbL is share-alike
726 archives from OpenStreetMap, and 572 of them are more than 500 metres from anything already on this map — a 79% new rate, far higher than the overlap I assumed when I nearly skipped this. OpenStreetMap knows about archives Wikidata does not.
- 37, 39, 44 · Per-surname pages, and two more doors that want a key
37 · 3,495 SURNAME PAGES, AND NOT ONE MORE. There are 480,635 surnames here and 449,216 of them are a row in a national register and nothing else — a name and a number. A page each for those would be 450,000 pages of thin content, which is the definition of a doorway page and is rightly punished as one.
- 36, 38 · Wikidata gives up its archives and refuses its surnames
38 · 4,929 ARCHIVES, 84 COUNTRIES, EVERY ONE WITH COORDINATES. This has been top of the worklist since the first plan and lost to a harvest five times running. The archives layer goes from 167 institutions to nearly five thousand — Italy 2,261, Germany 541, Belgium 252, Brazil 248, the United States 247.
- 42-43 · Province and county, and the end of guessing it from distance
A collection is attached to a place by how nearly it reaches it, and the middle rungs of that ladder were DISTANCE: within 75 km counted as local. Distance is the wrong tool for an administrative question and is wrong in both directions — two towns forty kilometres apart can sit in different provinces with different archives, and a long thin province can run three hundred kilometres end to end while being exactly the filing unit that matters.
- 34-35 · A letter to write, and two countries recorded as not-found
34 · THE NETHERLANDS SHOULD BE ASKED, NOT SCRAPED. The Meertens Nederlandse Familienamenbank is the authoritative Dutch source, it is a research database rather than open data, and it answered 403 — which is a door, not a lock to pick. requests/meertens-familienamenbank.md is a letter ready to send from David's own address: what the project is, what it already draws on, and three specific questions including whether a CC BY extract would be acceptable, held separately so the attribution travels rather than being lost in a CC0 merge. Not sent — writing to a third party on his behalf is his call.
- 31-33 · Denmark, Finland and Sweden refuse, and the refusals are the deliverable
Three countries sought, three walls, three different walls — and a documented negative is worth more than a silent gap, because without it the next person spends the same afternoon finding the same three.
- 30 · A page that measures what this map does not know
Every other page here says what is present. /coverage/ says what is missing, country by country, because a map that only advertises its coverage is quietly claiming the rest.
- 29 · Link-rot for 3,488 collections, in one request
The obvious way to check three and a half thousand collection links is to fetch three and a half thousand URLs, against a service that has already rate-limited this project once for asking too often.
- 27 · One surname card per cluster, not one per spelling
Searching «Llerena» returned six panels — LLERENA, LLERENAS, LERENA, LORENA, LARENA, LERINA — each saying much the same thing, because every one of them is a hit in its own right. They are one family of spellings.
- 26 · Audit the 146 loose geocodes: three were right, one was in Los Angeles
Arienzo was 44 km from Arienzo and 145 more places had been matched the same way — on a shortened phrase, after the full one missed — and never checked. scripts/check-geocodes.py checks them against GeoNames' own admin hierarchy: where a much larger place of the same name sits more than 10 km off, say so.
- Fix the build I broke by untracking the dataset
Untracking data/surnames.json was right and left the pipeline unable to make it. CI checked out, found no file, and scripts/build.py fell back to a stub with no `counts` key — so nothing failed there. It failed four steps later in surnames.astro with «cannot read properties of undefined», and only on CI, because locally the file was always sitting on disk from the last run.
- Stop tracking data/surnames.json — it was never meant to be in git
The ignore rule was added when the file passed 39 MB, but git keeps tracking what is already in the index, so the rule did nothing and the next commit carried 64 MB of it. Untracked properly now.
- Spain, Norway and the United States: 293,210 surnames become 480,635
Four national registers now, and the honest report on the ones that refused.
- Poland's national register: 6,151 surnames become 293,210
The Wikidata harvest gave variants and almost no geography — 6,151 names, 1,542 of them with a country. What actually says «this name is found here» is a government publishing its own register, and Poland publishes a very good one.
- Place page: explicit spacing around the filed-under sentence
Cosmetic. The rendered HTML was already correct; making the JSX spacing explicit rather than newline-dependent keeps it that way.
- Why the map looked like a map of Croatia, and the 660 places that were already here
David asked why, after three large harvests, the dots were still almost all Croatian. The answer was a gap in this project rather than in the world.
- Surnames: the other way in, and a dataset you can take away
A place is not the only thing somebody arrives holding. Very often all they have is a name on a certificate and no idea which country to start in. The find box answers that now: type Xubrinich and it says Žubrinić, attested in Croatia, and offers Croatia's collections and archives.
- Every Italian state archive on Antenati — from the one file they publish for crawlers
119 institutions, Aosta to Vibo Valentia, placed in the towns they stand in. Italy goes from seven archives on this map to 126, and among them are Caserta, Napoli, Catania and Vibo Valentia — which is to say the Falco ground and both halves of the Mazza one.
- The harvest goes worldwide: 3,488 collections, 95 countries, 7.4 billion records
The FamilySearch harvest was filtered to the ground the seven archives work on. Widening it to everything cost nothing — every place was already cached, so the whole world took two seconds and not one further request of FamilySearch.
- Every FamilySearch collection that reaches ground this map knows about
2,566 collections, from Campania to the eastern Cape, each with its year span, its record count and a link — attached to the places and regions they cover.
- A link checker that can tell a dead site from its own bad network
Fifty-nine providers all said «checked 2026-09-16» and nothing in the world was ever going to change that date by itself. This is the thing that notices, and it runs every Monday.
- The other six archives' ground, and the eight regions it stands on
The jurisdiction layer is what this map has that nothing else does, and it covered six pieces of ground, all of them Adriatic. Extending it by guessing at "the big emigration regions" would have been a map of where research might happen. David asked instead for the ground the seven sibling archives are actually working on, which is a far better question, and the answer was nothing like the guess:
- Six pages become 1,304: the map was invisible to everything that cannot run JavaScript
A map whose every place lives inside a JSON file that JavaScript fetches has, to a search engine, nothing in it. Record Atlas had six crawlable addresses and 1,239 things to say. It also had no sitemap, no robots.txt, and no way for anybody to send anybody else a link to Gračišće — which makes it a demo rather than a reference.
- The gazetteer: Breslau answers Wrocław, anywhere on earth
Of the three problems this map exists for, the first — THE NAME CHANGED — is the only one that does not need a shelf to answer. It needs a gazetteer with the historical exonyms in it, and one exists: GeoNames, CC BY 4.0. 45,985 places carrying 115,922 other names they have been written under, in 245 countries. Type Breslau and it says Wrocław. Czernowitz, Chernivtsi. Memel, Klaipėda. Pressburg, Bratislava.
- An empty shelf is a gap in this map, not a gap in the record — so say so
Typing "Ireland" returned a blank map. That is not an empty result, it is a false one: there is no Irish shelf here yet, but IrishGenealogy.ie is free without an account, the National Library has every Catholic register to 1880 photographed, and there are archives standing in Dublin. The map knew all of that and showed none of it, because the find box only ever looked at places.
- The archives layer: 41 institutions, 23 countries, and the map stops being Croatian
The map claimed to be worldwide and showed Istria. Three layers were designed and two were built, and the missing one was the only one that could be global today — because an archive can be placed the moment you know which city it is in, while a shelf needs somebody to have walked its catalogue.
- Record Atlas: the shelf, taken out of one family and pointed at the world
The Defranceschi archive's map answers three questions about one family's ground. Two of them — where a named person can be put, where the family is buried — are family facts and cannot generalise. The first one can: a place, carrying every collection of records that covers it, is a worldwide idea that was trapped in a family archive. This takes it out.
- Initial commit