Code loaded at print time executes on partner pages, so it is pinned like every embed. The bundle carries the generator's sha384 (library/packet/poster-render.integrity.js, written by `bun run pin:poster-render`); posterSheets fetches <assets>/lib/poster-render.js as TEXT, hashes it with WebCrypto, and on a match imports the verified text from a blob: URL — never the network URL a second time. A mismatch refuses to run, with a message naming the URL and both hashes; the print falls back to what it can do without the generator. The page base is captured when posterSheets evaluates, and every URL it resolves (the generator, the boundaries, the places) resolves against it — not the bundle's location, and not a URL a single-page host changed after load. check:poster-render-pinned (gates:pre), two-sided: the pin equals the sha384 of the source and of the served copy (a stale pin names the command — proven by an unpinned edit); a TAMPERED copy is refused and its planted side effect never runs; the genuine copy loads and draws. check:poster-browser-equiv still passes byte-identical through the pinned path. country-posters 1,472,734 bytes (ceiling 1,500,000), my-upg-100-list 1,232,508, both carrying the pin; verify-bundles-shipped PASS; gates:pre 74/74. |
||
|---|---|---|
| .. | ||
| data | ||
| fixtures | ||
| snapshots | ||
| build-gallery.mjs | ||
| build-hd-gallery.mjs | ||
| emit-countries.mjs | ||
| export-public.mjs | ||
| generate.mjs | ||
| make-previews.py | ||
| osm-basemap.mjs | ||
| packet-strings.json | ||
| packet.mjs | ||
| pin-poster-render.mjs | ||
| poster-regions.mjs | ||
| publish-html.mjs | ||
| README.md | ||
| series.json | ||
| serve-persist.sh | ||
| serve.sh | ||
| shoot.mjs | ||
| verify-posters.mjs | ||
library/scripts/posters/ — UPG-100 poster generator
Renders one 3ft × 3ft print poster per zone (28 today) for the my-upg-100-list profile, from the profile's own data. It ships inside the repo alongside that data on purpose — reaching for the data via an env var once silently rendered stale posters (Nepal, Bangladesh, Bhutan vanished).
bun run posters -> posters:shoot -> (WebP previews) -> bun run build
HTML per zone PNG @3000² assets/previews/ app shows them
generate.mjsis the template;shoot.mjsscreenshots to PNG (Firefox only — privacy-first policy).- A template change is not visible in the app until previews are regenerated and the app rebuilt.
- Exported PNGs go to a sibling folder (
../../../upg-100-posters/), neverpublic/— Capacitor packagespublic/wholesale. snapshots/holds frozen template versions (v5 is the approved current); each has its own README.
Full reference — files, env vars, gotchas, measurement discipline: ../../../documentation/architecture/poster-generation.md.