The map shaded COUNTRIES and stopped there, so the one question it could not answer was the only one that matters in the field: for THIS group, what exists right now? 12,379 people-group pins now sit on it, each one clickable into the resources for its language. THE JOIN. people-groups-slim.json carries Lat/Long per people-group-in-country; people-group-resources.json carries the real scripture_url/film_url per LANGUAGE. The key is ISO 639-3 (slim.LanguageCode == resources.iso639_3), never the group name — a group is reached in its language, not its nationality, and names collide across unrelated languages. MEASURED at build time: 5,981 of 12,379 pins (48.3%) join a resource record and 5,109 (41.3%) join one carrying a real URL, across 862 language codes. The other 59% is not a gap in the data to be hidden — it IS the subject. A pin with nothing found sorts ABOVE a covered one, so the gap wins the z-fight at world zoom rather than disappearing under a green dot. NO URL IS INVENTED. Every link is copied from the resources table, which records its own checked_pools/unchecked_pools, and the sheet keeps saying "none found means absent from the pools checked, never proof that nothing exists". has_audio keeps its third state: absent means the pool was never queried, not a no. PIN COLOURS READ OFF BANDS rather than declaring a fourth palette, so a pin and the country under it can never disagree about what "nothing found" looks like. The table is generated into data/tables/ — the REPO ROOT copy, which is what generate-tree publishes. The plugin-local data/tables/ is a stale divergent duplicate that nothing serves; building into it ships a file no page fetches. Verified on the served tree at 1280x800: 12,379 pins loaded AND rendered, layer and source present, and a click on Han Chinese returns ebible.org/cmn2006/ plus jesusfilm.org languageId=53352, both rendered as real anchors in the sheet and both answering 200. window.__grState() exposes those counts so the next check does not have to guess at screen coordinates to hit a 3px dot. |
||
|---|---|---|
| .. | ||
| 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.