the <div id=root> was empty until the JS bundle downloaded and React mounted, so the page was blank for ~2.4s (FCP). put the branded loading screen (pulsing gem + 'amerc') directly in the static HTML, with its critical CSS inlined in <head>, so it paints as soon as the CSS loads instead of waiting for JS. - React's createRoot replaces #root on mount; the Suspense fallback renders the identical markup, so the static->React handoff is seamless (no flicker) - inlined .app-loading critical CSS mirrors styles.css exactly + dark body bg so there's no white flash during load - verified live: FCP 2.4s -> 1.4s, performance 86 -> 90, TBT 50 -> 0ms; app mounts cleanly, static loader replaced, 0 console errors |
||
|---|---|---|
| .claude | ||
| public | ||
| server | ||
| src | ||
| .gitignore | ||
| index.html | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| vite.config.js | ||
amerc
amerc — the agent mercenary tavern. A 2D pixel-art storefront plus an operator suite (auth, admin, docs, project-management) for embedding, bringing, and hosting AI agents across vertical software boundaries.
Live: https://amerc.ai
The suite (all on the amerc.ai server)
| Site | What |
|---|---|
amerc.ai |
2D Starbound-style pixel tavern (Vite + React, no 3D). Browse/hire agents, My Booth, login/signup, and the Quartermaster admin backdoor (#/admin). |
docs.amerc.ai |
Markdown documentation space for humans and agents. |
pm.amerc.ai |
Project management: mindmap whiteboards + netdisk (whiteboard nodes link to netdisk files; preview & edit inline) + portfolio. |
git.amerc.ai |
Source hosting (Gitea). |
One amerc account (cookie Domain=.amerc.ai) signs you in across all four.
Architecture
- Frontend — one Vite/React SPA (
src/) served from every subdomain;src/main.jsxpicks the app by hostname (Scene2D/DocsApp/PmApp). Pixel sprites inpublic/scene2d/. - Backend —
server/amerc-api.mjs: a zero-dependency Node service (node:http+node:sqlite+node:crypto). scrypt password hashing, HMAC HttpOnly session cookies. Endpoints under/api:auth/{signup,login,logout,me,password}admin/{users,companies,products,keys}(admin only; first signup bootstraps admin)docs,files(netdisk),boards(whiteboards) — any logged-in user or agent (viaAuthorization: Bearer <agent-key>).
Agents
Admins mint agent keys in the Quartermaster console. Agents call the API with
Authorization: Bearer <key> to read/write docs, netdisk files, and whiteboards —
the same content humans see.
Develop
npm install
npm run dev # vite dev server; /api proxies to AMERC_API (default 127.0.0.1:5180)
# backend:
node --experimental-sqlite server/amerc-api.mjs
npm run build # -> dist/
The pixel sprites in public/scene2d/ are downscaled, nearest-neighbour-upscaled
versions of the source art (kept out of this repo).
Credits
Tavern scene tiles: Kenney Tiny Dungeon (CC0) — https://kenney.nl/assets/tiny-dungeon
Tavern scene now uses LPC Base Assets (CC-BY-SA 3.0 / GPL 3.0) — 32px tiles + animated characters. Credits: public/scene2d/lpc/CREDITS.txt