Virtual tabletop
A self-hosted, system-agnostic virtual tabletop — a private Roll20 or Foundry replacement you run on your own machine for a small group. One person hosts, everyone else joins in a browser. Nothing leaves your network except the two features you explicitly opt into.
Scenes, uploaded maps, tokens with HP bars and conditions, sight-blocking walls and doors, dynamic lighting, remembered fog of war, drawing, pings and measurement.
Data-driven, so you author the system rather than inheriting one. Numbers, text and computed formula fields, with a formula builder instead of raw syntax.
/roll 4d6kh3, advantage,
exploding dice, success counting, inline [[1d20+5]], whispers and GM-only
rolls, speaking as an NPC.
A synced jukebox for uploaded audio, and a YouTube theater where play, pause and seek propagate to everyone at the table.
A turn tracker the GM builds from selected tokens, openable as its own window and pushable to every player's screen.
An optional, GM-only AI helper with per-section context toggles and a "view exactly what would be sent" button before anything leaves.
You need Node.js 20+ and pnpm. No Docker, and no
database to install — Weave ships an embedded Postgres that lives in a .localpg
folder inside the project.
pnpm install
copy .env.example .env
Then set COOKIE_SECRET to a long random string, and
ADMIN_USERNAME / ADMIN_PASSWORD to your host login.
pnpm dev:db
pnpm db:push
pnpm seed:admin
pnpm dev
Open http://localhost:5173 and sign in. After that first setup,
start.bat does the whole thing on a double-click and takes a backup each
launch.
Open a campaign, go to Menu → Invite player, and send the resulting link. They open it, create an account, and land in your campaign.
They have to be able to reach your machine first. On the same home
network that means your LAN address on port 5173. To play with people outside the house,
the documented path is a Cloudflare Tunnel — it needs no port forwarding
and does not expose your home IP. See docs/DEPLOY.md in the project.
Accounts here are separate from your wyattiscool.com account. Weave keeps its own users in its own database, with its own password hashing. Signing in on this site does not sign you in to Weave, and the two passwords are independent. See the note on the main page about what linking them would involve.
There is no git history for your campaign data — the backups are the version history.
start.bat takes one every launch, backup.bat takes one on demand,
and they land in Desktop\WeaveBackups\<timestamp>\ as source plus a
database dump.
TypeScript throughout. React 18 and Vite on the client with a PixiJS canvas; Node and
Fastify 5 on the server with native WebSocket rooms for authoritative, rev-sequenced
realtime sync; PostgreSQL via Drizzle. Shared Zod contracts, dice and formula engines live
in packages/shared so both sides agree.
@ mentions.