The story of your game session — a plain-English word with real Norse roots, picked over the earlier working name (“Tafl”) for being clearer at a glance.
A private browser playtest table for kits made in Kit Forge — the closest
practical recreation of Tabletop Simulator for the web: free-form dragging, flipping,
rotating, stacking, markers and sticky notes, synced live between players. No rules engine —
the table only syncs state (“never say illegal move”). A room is joined by a shared password
plus a short code — themed here as a rune (e.g. SAGA-82K) — and everyone at a table is
your party.
Built as a game-agnostic sibling of LOL, FIGHT TIEM!’s playtest table — same architecture (Colyseus + React Three Fiber), generalized so any Kit Forge export works, not just one game’s cards. “SAGA” is this table’s own name (chosen for an LBCC Vikings-themed deployment) — Kit Forge itself stays a generic, unbranded tool usable by anyone.
.kittable.json file.A LOL, FIGHT TIEM! deck from Card Forge loads the same way: use Send to playtest there and drop the
.lftdeck.json (each card becomes a poker-size card with its finished art and the card back; a card
in several decks of one file spawns once per deck).
npm install
cp .env.example .env # set TABLE_PASSWORD
npm run dev
Server on http://localhost:2568, client on http://localhost:5195.
This needs a real Node process running somewhere (unlike Kit Forge itself, which is static) — any host that runs long-lived Node + WebSockets works (Render, Fly.io, Railway, a school’s own server). Two things matter for reaching it from a locked-down school network:
wss://your-table.example.com) pass through nearly every school firewall/proxy; a raw custom
port often does not. All three hosts above give you this by default.npm run build then npm start serves the built client, the API
and the websocket room from the same origin — students just open a link, no separate server
address to configure, no software to install (browser-only, same as Kit Forge itself).Room state is in memory: a server restart ends running tables (mid-game state isn’t persisted
yet — see ROADMAP.md). Uploaded images go through a pluggable AssetStorage
interface (apps/server/src/storage/); only local disk is implemented today, so a host with a
persistent disk (or willingness to lose uploads on redeploy) is what you want for now.
Mirrors the pattern in packages/kit-adapter and apps/server/src/table/tableOps.ts:
tableOps.ts is the entire “free-form VTT engine” (grab/move/drop/stack/flip/rotate/markers/
notes) as plain, game-agnostic functions over a Colyseus schema — no Kit Forge- or game-specific
code in it at all. packages/kit-adapter is the only piece that knows about Kit Forge’s export
format; swapping in a different card-maker’s export later would only mean writing a new adapter.