- 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
content (in the docs DB):
- the public Roadmap was factually wrong — git.amerc.ai and the embedded
webagent shown as not-done though both shipped long ago. Rewrote it as an
accurate Shipped / Next / Later roadmap that links to the changelog
- Welcome: agent keys are self-service now (was 'ask an admin')
- removed the redundant internal 'PM roadmap (impact x effort)' doc, most of
whose items have shipped — consolidated to one clean public roadmap
code:
- theme docs task-list checkboxes with the accent color and drop the
redundant bullet (li:has(> input[type=checkbox]))
- verified live: roadmap shows 8 shipped (checked) + next/later, clean render
- Reveal now accepts a tag prop so it can wrap semantic elements
- 'Live in the tavern' activity items stagger-fade-up as they scroll into
view (as <li>, valid list semantics), matching the feature cards
- gatehouse stats now count up from 0, consistent with the home hero
- both respect prefers-reduced-motion
- verified live: 8 items reveal (opacity 1, not stuck), gatehouse Count
renders, 0 exceptions
- minimal dep-free highlighter for fenced code blocks: strings (green),
numbers (amber), keywords (purple)
- deliberately NO comment rule, so '//' inside URLs (https://, wss://) is
never mis-colored or mangled — the common micro-highlighter pitfall
- applied in the DocsApp post-render pass alongside the copy buttons; the
copy button still yields the exact original text
- verified live: 22 tokens colored, both https:// and wss:// URLs preserved
byte-for-byte, code intact
- the 60fps canvas render loop ran continuously even when scrolled out of
view (the home page is long now — wasted CPU/battery while reading below)
- IntersectionObserver pauses the rAF loop at 0% visibility and resumes it
when the tavern scrolls back in; cleaned up on unmount
- verified live: ~60 rAF/s on-screen → 0 off-screen → 60 on resume, 0 errors
- the site had focus styles only on inputs, so keyboard navigation was
invisible across every button, link, nav item, card and CTA
- add a global :focus-visible ring (cyan, gold for primary CTAs) — shows for
keyboard users only, follows each element's radius
- label the decorative tavern canvas (role=img + aria-label); its overlay
hotspots remain separately focusable/labeled
- verified live: Tab focuses a nav button with a 2px cyan ring, matches
:focus-visible, canvas announced as 'Animated tavern scene'
- fix fenced code blocks: reset the doubled inline-code background on
'pre code', readable monospace styling (applies to all technical docs)
- DocsApp decorates rendered code blocks with a hover copy button
- seed a 'Connect your broker' guide (guides/) — the lasting reference for
the supply-side last mile: heartbeat loop (curl + Node) to stay online,
the relay WebSocket, and how it fits together (accurate from the API)
- verified live on docs.amerc.ai: guide renders, 3 code blocks, 3 copy
buttons wired, clean styling
- 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
- wrap the routed Scene in a key={route} container so each page mounts with
a subtle fade-up — a premium app feel on every navigation
- the wrapper preserves the flex/scroll layout (flex:1, min-height:0, column)
so the per-page scroll containers (gm-home, td-page) still scroll
- respects prefers-reduced-motion
- verified live: transition wrapper present, home + inner pages still scroll
(2813>744), navigation works, layout intact
- 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)
- topbar version (vX.Y.Z) is now a button linking to the changelog — the
natural 'what's new' entry point (moved out of the logo button)
- footer 'All systems operational' pill now links to the status page, with
a hover lift
- both new utility pages are now reachable from natural entry points
- also audited the full home page on mobile (390px): hero CTAs wrap, flow
diagram stacks vertically, session preview stacks, live screen renders,
and zero horizontal overflow — no regressions from recent additions
- verified live: both links route correctly
- the in-game cyan screen no longer shows a fake chart; it now cycles the
real CLASSES / ONLINE / SESSIONS counts (big number + label) over a dim
sparkline, with a cross-fade between metrics
- stats flow from Home into TavernGame via a ref the render loop reads, so
the canvas animation stays running while data updates
- ties the brand centerpiece to real product data — the tavern's TV shows
the live business
- verified live: screen renders the live class count legibly
- new #/changelog route: a vivid vertical timeline of releases with version
badges, titles, dates and highlights (14 entries, 0.30 → 0.51)
- communicates the product's continuous shipping cadence — trust + transparency
- scroll-reveal on each entry; linked from the footer Resources column
(replaced the placeholder Roadmap link)
- verified live: 14 entries render, latest first
- 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
- replace the game-instruction subline with the actual value proposition
(chatbox / web terminal / public URL · no infrastructure, just skills)
- add prominent hero CTAs: gold primary 'Browse Agents', outlined secondary
'Publish yours' — visitors no longer have to discover the scene is clickable
- Georgia-styled buttons with hover lift, sit below the animated tavern
- verified live: both CTAs + value prop render
- 'See a session' block: an animated chat widget that plays a scripted
agent conversation (ship a code change, then expose the preview via
Showcase) with typing indicator + message pop-in, looping
- shows the core product experience (chatting with/driving an agent) that
text alone can't convey; clearly labeled 'a scripted preview of a session'
- side copy + 'Browse real agents' CTA; respects prefers-reduced-motion
(renders the full convo statically) and cleans up its timers
- verified live: widget renders, animates, 0 console errors
- animated 'You -> amerc edge -> Your users' architecture diagram on the
home features section: three nodes (broker+agent / relay+proxy+auth /
chatbox+terminal+url) connected by flowing-dot links
- makes the non-obvious 'agent mercenary layer' model legible at a glance
- horizontal on desktop, stacks vertical on mobile, animation respects
prefers-reduced-motion; wrapped in the scroll-reveal
- verified live: 3 nodes, 2 links render, visible
- new #/status route: probes Tavern/API/Docs/Git/Webagent and shows a
per-service dashboard (pulsing beacon, colored pills, latency, state)
- same-origin /api/health gives real status+latency; cross-origin services
use a no-cors reachability probe with a 6s timeout
- auto re-checks every 20s + manual Re-check; honest footer note on method
- linked from the footer Platform column
- audited PM (whiteboards/netdisk/portfolio) via a throwaway admin — all
clean, no changes needed; account removed after
- verified live: all 5 services operational
- Reveal component: feature & use cards fade-up as they enter the viewport
(IntersectionObserver, staggered), with a :not(.in) pattern so the card
hover-lift is never fought by the reveal transform
- Count component: hero stats ease-out count from 0 on load
- both respect prefers-reduced-motion and fall back to always-visible when
IntersectionObserver is unavailable (no stuck-invisible content)
- verified live: all 3 cards reveal to opacity 1, stats animate
- 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
- replace the lonely floating login form with a two-column 'Join the tavern' page
- left: pitch — headline, three benefit rows (hire/publish/deliver) with icon
tiles, cross-app SSO note, live stats
- right: the auth board (login/signup) in a clean static card
- responsive: stacks form-first on mobile (<=860px)
- verified live on desktop + mobile
- replace barren login gate with a full services hall visible to everyone
- hero banner (emblem, value prop, cyan accent, login CTA)
- Showcase room: LIVE badge, feature chips, subdomain URL preview, and
'log in to claim a subdomain' CTA when logged out; full register UI in
- Netdisk relay + Hosted webagent as designed SOON rooms (shimmer, feature chips)
- new mansion hall CSS; drop old thin mn-card/mn-soon styles
- verified live logged-out render at desktop width
- amerc-api: GET /docs + /docs/:id are public (reads); writes still require auth
- DocsApp/ConsoleShell: publicView mode renders docs read-only when logged out,
with a 'Log in to edit' header CTA; edit/new/delete hidden for anonymous
- Docs nav link now shown to everyone
- seeded 5 quality guides: Quickstart, Publish an agent, Embed a chatbox, Showcase, API reference
- hover a character (barkeep / two patrons) -> parchment speech bubble with flavor
- clicking routes to Browse / My Booth / Mansion — adds life + feature discovery
- verified bubble renders on hover
- '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
- OpenGraph + Twitter card tags with the concept-art tavern as the preview image
- sharper title/description, theme-color for mobile browser chrome
- removed unused Press Start 2P font request (perf)
- (verified mobile nav/hamburger + layout already responsive — no fix needed)
- 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
- /api/agents/activity: derived recent events (classes published, instances run,
sessions started, showcases opened) — no new schema
- landing feed with per-kind icons + relative time, auto-refreshes every 15s
- social proof / 'platform is alive' on the home page
- tavern hero now scrolls into a product section: 3 feature cards (browse/publish/deliver)
with CTAs, a 'three ways to use an agent' row (chatbox/web-terminal/reverse-proxy), + footer
- scroll cue under the hero; explains the product to first-time visitors
- footer on all inner pages: wordmark, tagline, link columns (Product/Resources/Platform)
- live status pill (checks /api/health + shows N online · N live sessions) with green pulse
- sticky-bottom layout; makes the app feel complete + builds trust
- 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)
- Home is now the concept tavern art composed in layers (background image +
interactive hotspot layer for nav/Browse Agents/Enter My Booth + live stat chips)
instead of procedural canvas art
- fonts switched to Georgia serif site-wide (matches the art); topbar hidden on home
- removed unused TopDownTavern procedural renderer
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>