- the Suspense fallback (shown on every cold load while the app chunk loads,
longer on slow/mobile connections) was a plain monospace 'Loading amerc…'
- replace with a branded screen: a pulsing cyan gem over 'amerc' in gold
Georgia on a dark radial background, matching the logo + error-boundary look
- respects prefers-reduced-motion
- also audited the public mobile surfaces (agent modal, status, changelog) —
all mobile-safe (modal is width:min(640px,96vw) + scroll)
- verified the loading screen renders (blocked the app chunk to capture it)
- the SPA had one static title, so every tavern route and the docs/pm
subdomains all read 'amerc — hire agents like mercenaries' in the tab
- tavern now sets a descriptive title per route (Browse Agents · amerc,
System status · amerc, etc.); docs/pm set 'Docs · amerc' / 'PM · amerc'
- clearer browser tabs, bookmarks and history
- verified live across home/agents/status + docs + pm
- the LPC scene images only started downloading after the Scene2D chunk loaded
and TavernGame mounted, extending the 'loading tavern…' flash
- preload them in main.jsx (gated to the main domain via App===Scene2DApp, so
docs/pm don't fetch them) — they now download in parallel with the JS chunk
- verified live: images requested at 1461ms vs Scene2D chunk at 1467ms (before,
in parallel), canvas renders correctly
- previously, any render error would unmount the whole SPA to a blank white
screen (no boundary)
- add a React error boundary around the routed app (all sub-apps: tavern,
docs, pm) with an on-brand fallback — gem, 'Something went off-script',
Reload + System status links — instead of a void
- verified the catch path locally (a temporary ?boom trigger rendered the
fallback), confirmed the boundary is transparent in normal use, then
removed the trigger; verified live renders normally