Walkthrough: Running a Connected Group Session
Wire DNDCards, DND.chat, and DNDWar into one party game — prep cards, chat and roll, sync HP, then go tactical, all on one campaign.
This walkthrough takes a party from a blank slate to a live session that spans the whole family: the DM preps on DNDCards.com, invites the players, everyone chats and rolls in the DND.chat tavern conjuring those same cards, HP stays in sync, and when the fight needs a map the table moves to DNDWar.com.
The trick is that there's nothing to "connect" — all three sites read and write the same campaign on one shared database. Set it up once; it works everywhere.
What you'll need: one account (the DM signs up once on any family site), and one campaign with the players invited. Everything below is free during beta.
Step 1 — Prep on DNDCards
The DM does the prep in DNDCards.com, the account hub and the canonical cards instance the other sites read.
- Sign up once. The first sign-in creates your
auth.usersidentity and a workspace (the workspace owner is the DM). - Build a campaign and open its board.
- Stock the board with cards — monsters, NPCs, items, locations. You have four
ways to add a card: Invoke an official creature from the SRD,
Bind a new card by hand, AI-generate one, or run the
PDF Shredder on an adventure. Cards carry the
stats[]rows (AC/HP/Challenge) andmonster_datathat combat reads later. - Build character sheets with the shared character builder. Saving a character mints a linked player card on the board and its starting-kit item cards automatically.
Everything you build here lives in the shared cards and characters tables, so
it's already present on the other two sites for this campaign — no export, no
re-entry. See How It All Connects for the data spine.
Step 2 — Invite the party
A campaign becomes a group when you add members.
- From DNDCards, send each player a campaign invite link
(
/api/campaign/invite/[token]). - When a player accepts, they're added as a
campaign_membersrow with role player (the DM is the workspace owner). - Each player needs one account — and it's valid on every family site, because all of them ride the same shared Supabase identity.
Row-Level Security keys on is_campaign_member() across every shared table, so only
the invited party sees the campaign's cards, characters, and rolls.
Step 3 — Play in the tavern (DND.chat)
The group does the talking, rolling, and most combat in the DND.chat tavern — the per-campaign chat room with five channels (The Table, Out of Character, Lore & Notes, Loot & Rewards, Session Plans).
- Players sign in via cross-domain SSO. A "sign in" link from DND.chat sends
them to
dndcards.com/login?from=<chat callback>and back, signed in on both sites with the same account. - They land in the campaign's tavern and start playing. The core verbs:
- /roll (alias /r) — every roll is computed server-side
and written to
roll_eventswith a full breakdown, so the visible message and the audited roll are the same result. - /summon (alias /card) — conjure one of the DM's shared cards onto The Table. This reads the very same cards the DM prepped in Step 1.
- /w — whisper privately to one member.
- /attack — auto attack-vs-AC with auto-rolled damage on a hit.
- /roll (alias /r) — every roll is computed server-side
and written to
- For combat, DND.chat pulls each card's rollable actions from DNDCards over a
Bearer-JWT proxy (
GET /api/cards/[id]/actions, taggedsource: 'dndcards'), so the attacks come from the same statblock you built — no duplicate entry.
The full command list lives in the Slash Command Reference.
Note the disambiguation: /summon is the DND.chat chat command for conjuring a card into the tavern. Invoke is the separate DNDCards/DNDWar action of minting a compendium card. There is no
/summonon DNDCards.
Step 4 — Keep HP in sync
The sheets and the chat tracker stay current on their own.
When a player edits HP on their DNDCards character sheet, DNDCards fires an
HMAC-signed character.hp_updated webhook to DND.chat's /api/webhooks/dndcards,
which syncs the matching chat_initiative rows. It's fire-and-forget — if the
webhook isn't configured it silently no-ops and play continues; HP also syncs back
the other way during combat.
Step 5 — Go tactical on DNDWar
When the fiction calls for positioning, walls, and a battlemap, the group moves to DNDWar.com — for the same campaign.
- Open DNDWar's
/playfor the campaign.resolvePlayCampaignloads the sharedcardsandcharacters— the same rows from Step 1. - The DM uses Invoke a card (tabs: From DND Cards, From the SRD, My Homebrew) to drop those same cards onto the board as tokens. Each token seeds its HP/AC from the linked character sheet, or by parsing the card's HP/AC stat rows.
- Run assisted combat — Start combat, arm an action, click a target, resolve in the panel — or enable Auto-pilot monster turns to let the monsters run themselves.
A matched monster you prepped in Step 1 arrives with real parsed attacks and AC, so there's nothing to re-type at the table.
Optional — a fully-automated table
Instead of a human DM, you can hand the narration to DND.chat's always-on Autopilot DM. Import an adventure — a Markdown/JSON file (deterministic, free, instant) or a PDF shred — and the Autopilot DM narrates scenes and runs mechanical combat through the same audited roll path. It still drives the same shared cards and characters the rest of the family uses.
The payoff
One signup, one membership, one set of
campaigns/cards/characters. Prep, chat, and tactical play are three surfaces over a
single shared world — and any of them also works on its own: solo prep on DNDCards, a
private dice room on DND.chat, or a no-auth /demo fight on DNDWar.
Gotchas
- The adventure handoff needs a tavern first. If you push a shredded adventure to
a campaign that hasn't been opened in DND.chat yet, the write returns
{saved:false, reason:'no_tavern'}. Open the campaign once in DND.chat, then re-import. A non-DM trying the save updates zero rows (RLS). - A new character starts with no AC. The builder creates the row with
ac = null(it never computes AC), so combat falls back to null AC and the player card only shows an AC stat once AC is set. The DM edits it on the sheet or in the resolution panel before the fight. - Players never see exact monster HP or AC. In both the DND.chat tracker and on the DNDWar board, players see only HP-percentage badges and condition chips; the real numbers are read server-side for the math.
- DNDWar is grid-only and has no PDF shredder. There's no theater-of-war/gridless mode — the grid is always on — and PDF import lives on DNDCards; DNDWar only links out to it.
- HP sync is best-effort. The webhook never throws on failure and no-ops if it's unconfigured, so a missing sync won't interrupt play — just edit the tracker directly.
Related: How It All Connects · One Membership, Every Site · FAQ & Troubleshooting
Playing in the VTT
A player's guide to DNDWar.com — join your DM's battle, read the fog-masked board, move your own token within your speed, open doors, and resolve your attacks with one click. What you control, and what stays with the DM.
Slash Command Reference
Every DND.chat tavern slash command — syntax, aliases, what it does, who can use it, and whether it posts to chat.