- BoothDashboard had no loaded flag, so returning publishers briefly saw the
'Welcome to your booth' new-user onboarding before their classes loaded
- add loaded-gating + a shimmer skeleton; welcome shows only after load
- same fix for the Mansion 'My showcases' list ('No showcases yet' flash)
- completes the loading-skeleton pattern across all data surfaces
(Browse, Booth, Mansion)
- verified live (throttled): skeleton during load, no welcome flash,
welcome/content only after loaded
- the instance-created modal was a terse field list; now it's a 2-step
broker onboarding guide at the point of need:
1. Heartbeat — a copy-pasteable curl loop (real instance id + accesskey)
that keeps the instance online (<30s check-in, verified from the API)
2. Relay — the broker WebSocket + note that the amerc webagent speaks it
- color-coded offline status, code block with copy button
- removes the supply-side last-mile guesswork for publishers
- verified end-to-end via the real publish flow (register → class → instance)
- AgentBrowse tracked no loaded state, so on cold load it briefly flashed
'No agents here yet — be the first' before data arrived
- add a loaded flag: show 3 shimmer skeleton cards while fetching; gate the
empty-state and 'publish your own' card on loaded
- skeleton shimmer respects prefers-reduced-motion
- also verified (after a stale-Chrome scare) there is NO auth bug: cookieless
/api/auth/me returns null, fresh logged-out load shows Login (no admin nav),
and the public-agent Use flow works without login
- verified live: skeletons during load, no flash, real card+add-card after
- storefront header 'The mercenary roster' with a value-prop subtitle
- emoji category chips (uses TAG_EMOJI) so tags read as a directory
- always-present dashed 'Publish your own' card in the grid — the roster
never looks empty and it actively drives supply into My Booth
- verified live: header, emoji chips, and add-card all render
- remove dead 3D code: App/GemhallScene/SplashScene/ModelScene (unreferenced
since the 2D pivot) + the three dep and its empty manualChunk
- drop public/models (68MB of unused KayKit/poly-pizza GLBs)
- dist drops ~36MB -> 2.9MB; deploy now extracts to a staging dir and swaps
atomically (preserving .well-known), so users never see a mixed/stale state
and stale chunks no longer accumulate (28 -> 7 assets on the server)
- booth: welcoming first-run onboarding (3 steps to go live) replacing the
bare 'no classes yet' hint
- verified live: 2D home renders, 0 failed requests, booth welcome shows
- 'Embed this agent on any website' is now a prominent block with one-click Copy
(+ copyToast) instead of a buried <details>; usage hint included
- Web PTY mode points to the Backstage/后台 terminal tab
- core loop verified: browse -> Use -> live connected chatbox + embed snippet
- new #/account: profile card (avatar initials + role badge + quick links),
change-password, and agent keys consolidated in one place
- topbar username now opens Account; separate logout button
- password change moved out of the tavern signed-in panel into a proper settings surface
- agent detail modal header gets the class avatar
- My Booth 'My classes' rows get avatar + online-pulse indicator (matches Browse)
- online instance status dots pulse; consistent visual language across the app
- amerc-api: owner column migration + /api/keys GET/POST/DELETE (user-scoped)
- My Booth: 'My agent keys' card — mint, list, revoke, with Bearer usage hint
- unblocks any user wiring their own agent to amerc docs/netdisk/platform (was admin-only)