?codes= filters by LANGUAGE, which is what a partner's list usually is and the wrong filter for a list of peoples. The reach table measured the gap in its own rows: its Mandarin row counts 36 groups, those 36 speak 30 codes, and 55 Doxa groups speak those 30 — so a link from a 36-group row drew 55 pins. Akha's 33 drew 57; SUN's 93 drew 116. The extra groups are real and also have nothing; they belong to a different row. So the map takes ?groups=<slug list> and filters by people group. The slug is doxa.life's own — carried from the roster into the pin rows, and read in the builder off the prayer URL their API built from it, never constructed from a name, because a slug this build invented could name somebody else's people. All 369 of those rows carry a prayer URL, measured before relying on it. Row and map now agree by construction: 0 of 35 rows disagree, and the Mandarin link renders "36 / 2,107" on the map against a row claiming 36. The gate asserts exact equality for a three-slug link and 0 for an unknown slug — the failure that would quietly turn a partner's 40-group embed into the whole roster. The longest link is 1,577 characters, SUN's 93 slugs; well inside what browsers carry, but worth knowing before anyone adds a row with a thousand groups. |
||
|---|---|---|
| .. | ||
| boundaries | ||
| brand | ||
| external-bundles | ||
| fonts | ||
| images | ||
| internet | ||
| legacy/upg-neighbor | ||
| people-groups | ||
| posters | ||
| pplr | ||
| tables | ||
| vendor | ||
| README.md | ||
data/ — the bundler's source-of-truth data
The law: data lives here; public/ is generated. public/ holds only the output folder
(public/<tree>/, named by name in vite.doxa-maps-build-config.json) and a generated README. The
build (internal/generate-tree.mjs) copies what the plugins FETCH at runtime from here into
<tree>/assets/, alongside 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/ |
<tree>/assets/people-groups/ (the fetched cuts only) |
People-group datasets (CSV/JSON) the maps read at runtime |
vendor/ |
<tree>/assets/vendor/ |
Third-party runtime assets (e.g. table libraries) |
posters/ |
<tree>/assets/posters/ (opt-in: bundlePosters / posterSources) |
Rendered poster set (heavy pipeline output; the export button fetches these) |
tables/ |
<tree>/assets/tables/ |
The MERGED served table set (its index.json is the merge; per-profile plugin-designs/*/data/tables are build-time sources) |
pplr/ |
<tree>/assets/pplr/ (the fetched files only) |
The PPLR data maps' derived datasets |
fonts/ |
<tree>/assets/fonts/ |
Vendored typefaces (SIL OFL), e.g. Bebas Neue for the regions clone |
images/ |
<tree>/assets/images/ |
Images the plugins fetch (e.g. the regions list's world-map watermark; see its PROVENANCE) |
brand/ |
not served | Logos and brand imagery (sources; the optional library/layouts/app-wrapper-material shell references them) |
legacy/ |
not served | Archived standalone builds kept for reference (e.g. the original upg-neighbor page) |
external-bundles/ |
not served | Prebuilt map IIFEs vendored from sibling projects (not built here); only the optional layouts/ shell mounted them |
fonts/, images/, brand/ and legacy/ moved here from public/assets/ on 2026-09-25 (card
BUILD-OUTPUT-IS-ONE-FOLDER): they were sources that existed only in the generated folder.
Don't edit anything under public/ by hand — change it here (or in plugin-designs/*/data/,
layouts/*/assets/) and rebuild.