eBible was ALREADY one of the two pools this repo checked, and that is what made the gap invisible: 120 language codes carried an eBible link while the catalogue lists 1,550 translations across 1,239 codes with canonical books. The pool had been read at roughly a tenth of its content, and ~1,600 people groups were being told "nothing found" about a published translation in their own language. COVERAGE: pins carrying a real URL 5,349 -> 6,985, 43.2% -> 56.4%. Language codes 978 -> 2,068. The resource table grows 581 -> 1,497 rows across 1,314 languages. 1,090 of the new codes had no row in the resources table at all, which is why filling gaps in the existing 862 would have missed most of it. FILL, NEVER OVERWRITE. An existing scripture_url was curated and verified by an earlier pass; the catalogue is broad but not hand-checked, so it only supplies a link where there was none. Where the two disagree, curation wins. CANON TEST: OTbooks + NTbooks > 0. A deuterocanonical-only publication is not the 66-book canon and is dropped; DC books ALONGSIDE OT/NT are not a reason to drop, since the 66 are present either way. Measured on this snapshot: 3 rows carry no books at all. DOMAINS ARE ALLOW-LISTED AFTER A SCREEN, because publicationURL does not always point at ebible.org. Four domains appear and each was fetched and read: ebible.org (1,242), png.bible (302, "Papua New Guinea Scriptures"), alkitab.pw (3, an eBible mirror), and inscript.org (1) — EXCLUDED, because its page establishes no publisher or doctrinal provenance and an unclear source is left out. A domain not on the list is dropped, so a future catalogue update cannot introduce a publisher nobody screened. TWO BROKEN LINKS CAUGHT STRUCTURALLY: nko and nlx publish 'http:///nkoNT/' — a malformed URL with an EMPTY host, broken in eBible's own data. Requiring a non-empty host rejects them; a looser check for the 'http://' prefix passes them happily, which is how a "real" link that resolves nowhere gets shipped. badUrl and badDomain are counted separately for the same reason — folded together, this hid. Verified: the CSV parser was diffed against a reference parser across all 1,550 rows, 0 mismatches, so no URL is attached to the wrong language. A seeded random sample of 20 catalogue URLs resolved 20/20 at 200. All five browser probes still pass — pins, table, deep link, Door43 lift, and 12,379 pins rendered — and the map now shows Papua New Guinea, Indonesia and South America carrying resource colour where they were solid red. |
||
|---|---|---|
| .. | ||
| external-bundles | ||
| people-groups | ||
| posters | ||
| tables | ||
| vendor | ||
| README.md | ||
data/ — the bundler's source-of-truth data
The law: data lives here; public/ is generated. Every folder in data/ is copied into the
served web-root by the build (internal/generate-tree.mjs), exactly like the per-profile data in
plugin-designs/*/data/. You should be able to rm -rf public/ and get it all back with bun run build.
| Folder | Served at | What it is |
|---|---|---|
people-groups/ |
/assets/people-groups/ |
People-group datasets (CSV/JSON) the maps read at runtime |
vendor/ |
/assets/vendor/ |
Third-party runtime assets (e.g. table libraries) |
posters/ |
/assets/posters/ |
Rendered poster webp set (heavy pipeline output; poster walls fetch these) |
tables/ |
/assets/tables/ |
The MERGED served table set (its index.json is the merge; per-profile plugin-designs/*/data/tables are build-time sources) |
external-bundles/ |
not served | Prebuilt map IIFEs vendored from sibling projects (not built here); only the optional layouts/ shell mounted them, so the build no longer copies them into public/ |
Don't edit anything under public/ by hand — change it here (or in plugin-designs/*/data/,
layouts/*/assets/) and rebuild.