- internal/playground → internal/plugin-gallery; playground-smoke → plugin-gallery-smoke;
generate-spa → generate-gallery (scripts: gallery, smoke:gallery; smoke:playground stays as alias)
- generate-gallery exports renderGallery(model, { mode }) — the dev plugin serves the same page
at / from the discovered registry (dev mode imports the dev entries, ladder popovers on);
the build writes public/index.html from the manifest (byte-identical to before)
- Docs and probes use the gallery vocabulary
A global prayer movement cannot run on one website: coverage stalls when there
is one place to see the task and one place to sign up. The opening now leads
with that insight and the fix (the same living map on every partner team's own
site — ownership breeds stewardship), trains three roles in the T4T spirit
(map maker / map multiplier / prayer mobilizer, t4tonline.org), and adds THE
PLAYBOOK: list partner teams -> keep the list in a secure collaborative CRM
(Disciple.Tools; the list is an attack surface) -> commission mobilizers ->
embed everywhere (Share button + utm attribution) -> train the trainer. The
craft story, glossary and quickstart remain for the map-maker persona.
- ShareButton resolves its link from where the bundle is hosted (profile-config.shareUrl ->
embedBaseUrl -> window.MAP_EMBED_BASE_URL -> the bundle's own script URL); profiles pass
tree-relative embed pages, so links work in the playground, on doxa.life and on any CDN
- Generated leaf pages try token endpoints in order (override -> configured absolute URL ->
same-origin) and only then offer the paste-once box; build config points at the canonical
https://doxa.life/api/maps/token
- Dev playground extracted from vite.config.js into internal/playground/{discover,render,dev-plugin}.mjs;
serves /assets/* like the built site so data-driven maps initialise; passes assetsBase +
shareUrl to every element; header ladder with a Start-here primer and the five kinds of
mounting files (single-element, preset-element, multi-view-element, composite-element, app-shell)
- New gates: smoke:playground (every element boots, with status text + data diagnostics),
smoke:share (Share URL resolves and reopens the same map), sync:dropin (mirror public/ into a
host checkout, never credentials), deploy:dev (build + sync)
- MapToolbar + ShareButton on every map profile; UPG-100 composite (map + prayer lists) on the
pane layout; shared --map-radius token consumed by the legend components
- docs/reference.md: profile types table, profile-config assetsBase/shareUrl/embedBaseUrl, gates
- The build now emits public/_headers implementing the embeddability split
(direct-embed pages framable anywhere; staging preview-only) — Netlify/CF
Pages consume it automatically; serving/traefik-embed-headers.yaml is the
proxy-side reference. The contract is auditable in-repo, not just documented.
- README: docs table gains how-to, layouts/README (the SPA machinery), and
docs/architecture; Quickstart gains bun run serve + bun run phone.
The headline capability was buried mid-bullet. Now the opening leads with it: one
build composes all your maps, tables, and dashboards into a single-page app that
runs as a website, installs as a mobile app, and embeds on partner sites — with
side-by-side desktop + phone screenshots of the composed SPA as proof.
Also: the story gains the collapsed-platform / mobile-dream beat, and claims are
squared with the audit (Vue is what ships — React concepts transfer; Android
project committed today, iOS scaffolds via Capacitor).
Reorder sections so it reads like a journey (indirect, no cheesy labels): the dream
+ the wall you hit → the language (glossary) → what you get → the powers → the honest
decision → the commitment → first steps → the data caveat → docs → the mission.
Same ideas + section content; only the order changed so the most impactful part (the
story) leads.
Lead with the one-liner + the two commands immediately after the tagline; punchier
bullets; condensed the data caveat. Same content, fewer words, essence first.
- README rewritten as a BLUF-first vision cast for vibe coders (key-terms glossary,
origin story, features, requirements, data caveat, developer's note).
- library/components/WARNING.md: prototype in your app-profile; only proven,
parameterized components graduate into the shared library.
- generate-tree.mjs: inject Subresource Integrity (sha384) + crossorigin into the
standalone page <script> tags and the copy-paste embed snippets (manifest = registry).
- Scrubbed identity-tied phrasing from comments/docs, keeping the technical rationale
and the mission content.
Standalone repo that builds embeddable JAMstack map bundles (web components),
composes them into a lazy-loaded SPA via layouts/, and optionally wraps a
Capacitor Android/iOS app — one build, choose your output/CDN. Diátaxis docs.
History reset to a single clean commit; no PII, IPs, or internal terms.