JS embed exactly as the maps manifest ships it: one <script src> plus <doxa-maps-spa>.
The drop-in under public/embed/doxa-maps-build is refreshed from the current maps build
with the maps repo's own sync-dropin tool (--from-config).
- MAPS_BASE in nuxt.config.ts is the single constant; runtimeConfig.public.mapsBase, the
redirect targets and the frame-policy rule derive from it
- The map slots and the full-page maps view read mapsBase at runtime
- /api/maps/token also reports mapsBase, so the static embed page finds the bundles without
a hardcoded folder
- The generated maps output now lives under public/embed/ next to the embed page;
the site's map slots, the full-page maps view and the embed page point there
- /js/doxa-maps-build/** and the older /js/doxa-maps/** answer 301 to the new location,
so links already shared keep working
- Frame policy follows the new path
- The Share button now derives embed URLs from where the bundle is actually hosted
(profile-config.shareUrl -> embedBaseUrl -> window.MAP_EMBED_BASE_URL -> the bundle's own
script URL), so generated links work on localhost, on doxa.life and on any CDN
- Generated map pages try token endpoints in order (override -> https://doxa.life/api/maps/token
-> same-origin /api/maps/token) instead of failing on a single URL
- GET /api/maps/token sends Access-Control-Allow-Origin: * so map pages hosted on another
origin can fetch a token
- useDoxaMap loads mapbox-gl v3.24.0 to match the bundles
- Refresh the doxa-maps drop-in: upg-100 combined map+lists page, share toolbar on every map,
shared legend radius token
Every embedded map now inherits ?utm_source= from its embed URL and stamps it on
people-group click-throughs (pray.doxa.life/<slug>?...&utm_source=<yours>) — the
question-mark traffic attribution the team asked for.
doxa-life already ships the right token source (pk passthrough or 1-hour
sk-minted tk, built precisely for public/ embeds). The page fetches it once and
hands it to the shell via its native ?tk= rung — works in pk AND sk
configurations, zero new token surfaces.
The shell's own ladder already accepts ?tk= (rung 2), so /doxa-maps passes the
same public.mapboxToken every map page on this site uses. The server route added
earlier duplicated the token surface for no benefit — deleted.
- The drop-in now carries the bundler's app shell beside doxa-maps/ (index.html,
nav, icons, pane-wrapper, external bundles, assets), so /js/doxa-maps-build/
index.html IS the composed single-page app — every map, lazy-loaded.
- New page /doxa-maps frames it full-bleed (replaces the /maps easter egg).
- The research page gains the pointer: 'See all DOXA maps →' (mirrors the
prayer→research pattern).
- server route serves the shell's ./api/maps/token.json from the site's own
NUXT_PUBLIC_MAPBOX_TOKEN — no secret in the drop-in.
- public/js/doxa-maps-build/ carries every map as a self-contained embeddable
web component (+ per-map pages, manifest with SRI) — the home/pray/adopt/
research pages load their maps from it via useDoxaMap.
- embeddables/ is removed altogether; the drop-in replaces it.
- New unlisted page /maps: the map room — frames the drop-in's staging index,
every map in one place, always as current as the build in this repo.
Consolidate to a single map output location: remove the stale flat
public/js/*.js bundles and move the drop-in to public/js/doxa-maps-build/. Rewired
useDoxaMap to /js/doxa-maps-build/doxa-maps/<bundle>/<bundle>.js and fixed page comments.
'cdn' was a misnomer — the bundler's output is just static files that can be
served same-origin, enqueued directly into the app, OR via a CDN. 'doxa-maps-build'
names it for what it is: the built output of the doxa-maps bundler. Rewired
useDoxaMap.ts (/doxa-maps-build/doxa-maps/<bundle>/<bundle>.js) and the drop-in README.
useDoxaMap now loads the built bundles from /doxa-maps-cdn/doxa-maps/<bundle>/
<bundle>.js (the doxa-maps bundler output folder placed in public/), replacing
the old flat /js/*.js paths so the maps actually resolve on the live site.
- translateText/translateTexts call OpenRouter chat-completions; glossary
terms are prompt-injected from config/glossaries.ts, generated from the
translation repo's TSVs by scripts/build-glossaries.ts
- model resolution: per-language override in config/languages.ts →
translation.model site setting (new admin field) → TRANSLATION_MODEL env
→ anthropic/claude-opus-5, at low reasoning effort
- blank fragments are held back from the model, which drops them and breaks
the one-translation-per-fragment count the caller maps results back on
- OpenRouter failures map to a typed error with a human-readable message;
an unrecoverable one (no credits, bad key, rejected model) stops the run
instead of repeating the same call for every remaining locale
- machine translations record source 'auto-translate'; 'deepl' stays
readable for snapshots written before the switch
- end each region card with a "See <region> dashboard" link, translated
in all eight locales
- stack the people-group and country count on its own line under the
region title in the card header
- move the Regions entry in the hamburger menu to after Resources
* replace country pages with region dashboards
- move /countries to /regions, with 301 redirects from the old URLs in
every locale
- add a region dashboard: a map of the region's countries with pins
coloured by prayer coverage, headline figures, and prayer, adoption and
engagement progress against the DOXA goals, plus a per-country table
- roll up progress stats per country and region in the shared summary
and serve them from /api/regions
- frame region maps with antimeridian-aware bounds
- add Regions to the hamburger menu and translate the new strings in all
eight locales
* put each region on the regions index in a card with a header band
The region name links to its dashboard with the site's chevron icon, and
the people-group and country counts sit centred beside it on a brand-green
header; the country list is the padded white card body.
remove "Not Adopted" badge from research page cards
hide Adoption tab on research map and rebuild bundle
remove Adopt and Engage tiles from landing page
drop step number from lone Pray tile on landing page
add clickable country link to pray page cards
- enrich pin popup with photo, country, people group, population,
religion, description, and pray / full-profile links
- fetch the extra fields for pins; reuse existing translated labels
- render photos as a centred portrait (4:5) thumbnail, never landscape
reframe "24-hour prayer coverage" and "10 minutes a day" as daily / 100+ people praying
swap the affected t() keys in pray.vue and the two adopt pages
update the matching keys in all 8 locale common.json files
* Update daily prayer coverage threshold
* Show segmented prayer coverage status
* update prayer progress map legend wording
relabel map legend tiers to "No One Praying", "1+ People Praying", and "100+ People Praying" across all 11 locale legend files
update LABELS constant and tier comments in prayer-progress strategy
rebuild doxa-simple-map and doxa-research-map bundles
---------
Co-authored-by: corsacca <corsacca@gmail.com>