← wyattiscool.com / Weave

Virtual tabletop

Weave

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.

Self-hosted Runs on your machine

What it does

The table

Scenes, uploaded maps, tokens with HP bars and conditions, sight-blocking walls and doors, dynamic lighting, remembered fog of war, drawing, pings and measurement.

Character sheets

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.

Chat & dice

/roll 4d6kh3, advantage, exploding dice, success counting, inline [[1d20+5]], whispers and GM-only rolls, speaking as an NPC.

Shared media

A synced jukebox for uploaded audio, and a YouTube theater where play, pause and seek propagate to everyone at the table.

Initiative

A turn tracker the GM builds from selected tokens, openable as its own window and pushable to every player's screen.

DM assistant

An optional, GM-only AI helper with per-section context toggles and a "view exactly what would be sent" button before anything leaves.

Running it

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.

First time, once

pnpm install
copy .env.example .env

Then set COOKIE_SECRET to a long random string, and ADMIN_USERNAME / ADMIN_PASSWORD to your host login.

Terminal 1 — leave running

pnpm dev:db

Terminal 2 — once each, then start

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.

Getting friends in

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.

Backups

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.

Under the hood

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.

Known limits