Product: Will DM (virtual tabletop for maps, fog, light, and a physical world)
Audience: New Dungeon Masters
Document status: Living draft — update as features ship
Manual version: 0.2 · 2026-07-31
App phase: Phase 1 (design + table foundation)
How this manual is maintained
In-app (clickable): open [/guide](/guide) from Home or any campaign (Training guide).
Guided learning: on the campaign as DM, toggle Coach on/off anytime. Progress is kept on this browser so you can leave it off for most of a campaign build and turn it back on for the last stretch.
Search: ⌘K / Ctrl+K (or Search) indexes the board, lessons, this guide, and actions — Enter jumps to the thing.
Source of truth:docs/training/DM-TRAINING-MANUAL.md· PDF: DropboxWill DM/Training/· rebuild withpython3 docs/training/build_manual_pdf.py
1. What Will DM is (in one minute)
Will DM is a map-first virtual table for D&D-style play:
- You (the DM) design and run a shared board: floors, walls, furniture, lights, monsters, prizes, familiars, and player tokens.
- Players join with a code or link and see a fog of war view — only what light and their vision reveal.
- The world is physical: structures have sturdiness, fragility, and hit points; doors open; walls can be breached or reduced to rubble.
- Almost everything the DM does that matters is meant to save to the database so the table survives reloads and later multiplayer sync.
Place hierarchy & transcendent characters
Places nest outward from the playable board:
Map (board) ⊂ Structure ⊂ Surround ⊂ Area ⊂ City ⊂ World
A Character is not owned by a single campaign. Traits, skills, magic, items, and ledger events (acquired / learned / lost / transcended) live on the character and remain valid wherever they go. Campaigns and maps only host a presence (where the token sits). See docs/architecture/WORLD-AND-CHARACTER.md.
2. Your first 15 minutes (checklist)
| Step | Action | Result |
|---|---|---|
| 1 | Open the app home page | Campaign list + join form |
| 2 | Click Start campaign | Wizard: name, rules, world/place, first map |
| 3 | Land in the design studio | Library · map · inspector (not the live table) |
| 4 | Note the join code (top of campaign page) | Players will use this |
| 5 | Stay in Dungeon Master view | Full board + design tools |
| 6 | Open the map wizard (if available) or use Facets Manor / templates | Floors, walls, lights, furniture seed into the DB |
| 7 | Drag a monster from the left library onto the map | Token placed & saved |
| 8 | Click a table or wall → use the Structure inspector | Scores / open door / test smash |
| 9 | Press F or Full screen for map stage | Immersive board; Esc exits |
| 10 | Share join code or Copy player link | Friends claim seats |
3. Roles at the table
Dungeon Master (you)
- Full map, all floors, hidden monsters, structure tools, libraries.
- Design mode dock (left) + inspector (right).
- Invites players via code or player link.
Player
- Fog of war; vision from their character + lights.
- Joins with code, claims a seat, optional character token.
- Role can be locked from invite URL so they cannot flip to DM tools in that tab.
Spectator
- Join as spectate from home; limited presence at the table.
Seats (important)
A seat is “who is sitting at the virtual table,” not the character sheet itself.
- Claiming a seat creates a
TableSeatrow in the database. - Your seat token is stored on this browser (localStorage) so you can rejoin.
- If you clear site data or switch devices, claim a seat again (or use the
?seat=link from join).
4. Design studio — building the board
The design studio (/campaign/:id/design) is the admin workbench. The live table (/campaign/:id) is seats, fog, fullscreen, and sync. Switch with the header pills. Start campaign (/campaign/new) creates the table; it does not dump you into live play.
Left: Library (Design dock)
- Filter and drag monsters, prizes, familiars onto the map.
- Drop snaps to grid; placement is written to the database.
- Floor tabs: place objects on the active floor.
Center: Map
| Control | What it does |
|---|---|
| Drag empty map / Hand / Space | Pan |
| Pinch or zoom slider | Zoom |
| Center map (when expanded) | Fit whole map with padding |
| F / Full screen | Expand map stage |
| Esc | Exit full screen |
| Drag any object (DM) | Move freely; position saved on release |
| Click object | Select → inspector |
Faint labels (DM only for now): every relevant object has a quiet label under it. Color family = type (structure, light, monster…). Damage state is in color (amber/orange/gray), not extra words. Players do not see these labels yet; later, talents / items / spells can grant shared vision.
Right: Inspector
- Walls / tiles: structure scores, test attacks, restore rubble.
- Obstacles (tables, doors, furniture): same structure tools + open/close for doors.
- Lights: bright radius (save button).
- Tokens: summary; drag on map to reposition.
Structure & physical world
1. Select a wall, door, or table.
2. Set sturdiness (hard to break) and fragility (chips easily).
3. Save DM scores → persists to DB.
4. Preview an attack (magic missile, shatter, …), then Apply if you accept it.
5. Restore structure to reverse rubble when you change your mind.
6. Doors/gates: Open / Close toggles passage (saved).
Software recommends; you always decide. Applied hits change HP, damage state (intact → damaged → breached → rubble), and whether the piece blocks sight or movement.
5. Inviting players & seats
From the home page
1. Enter join code.
2. Enter name at the table.
3. Choose Player / DM / Spectate.
4. Optional: place a character token with that name.
5. Claim seat & join → redirected into the campaign; seat remembered on this device.
From the campaign (DM)
- Copy code or Copy player link (PlayerLinkBar).
- Table seats panel: who is seated, claim/leave, refresh.
Player first session
1. Join with code + name.
2. Confirm seat badge appears.
3. Select their character in “View as” if multiple tokens exist.
4. Explore only what light and vision reveal.
6. Persistence — what actually saves
This section is the contract with the DM: if you meant it to stick, it should live in Postgres, not only on screen.
Always persisted (database)
| Action | How it saves |
|---|---|
| New campaign / map | Created on Start campaign |
| Wizard / layout apply | Tiles, floors, obstacles, lights written in a transaction |
| Place monster / prize / familiar | POST → new row |
| Drag move (token, light, table, wall, …) | PATCH position on pointer release |
| Light radius “Save” | PATCH |
| Structure scores “Save DM scores” | PATCH |
| Structure hit Apply | HP, damageState, destroyed, blocksLos/Move |
| Open / close door | PATCH portal + blocks flags |
| Restore structure | PATCH |
| Claim seat | TableSeat row (+ optional Player token) |
| Rejoin seat | lastSeenAt updated |
Device-only (not the campaign world)
| Data | Where | Note |
|---|---|---|
| Your seat token | Browser localStorage | Needed to rejoin this seat; not the map itself |
| Pan / zoom / full screen | Session UI | Convenience only |
| Design dock collapsed | Session UI | Not world state |
What does **not** auto-save yet (know the gaps)
- Live multiplayer: other browsers do not yet stream your moves in real time (refresh or reload to pull server state).
- Some inspector text for monsters/prizes is display-only until HP editors land.
- Leaving a seat on a device does not delete the seat row for everyone (roster purge is future work).
DM best practices for “I meant that to stick”
1. After dragging, release the mouse/finger and wait a beat (PATCH fires on release).
2. Sturdiness / fragility / light radius auto-save shortly after you stop adjusting (Save still works).
3. After previewing a smash, click Apply this result if you want rubble for real.
4. Prefer wizard apply over hand-editing then closing the tab mid-request.
5. Before a session, hard-refresh once so everyone sees the latest DB state.
6. Write down the join code; it is the campaign key for players.
7. Map stage & table habits
- Full screen for the session board; Esc or Shrink when you need the rails.
- Center map after expanding so the whole estate fits with edge padding.
- Use floor tabs so you do not place upstairs monsters downstairs.
- Hand tool or hold Space to pan without grabbing tokens.
- Hidden monsters: players should not see them; keep them hidden until reveal (token flag).
8. Suggested first adventure flow
1. Seed or wizard a manor / dungeon.
2. Place party tokens (or have players claim seats with create-token).
3. Place 2–3 lights players will need.
4. Hide a prize and a monster.
5. Share code; players join.
6. Narrate; move lights; open a door; optional structure hit on a weak door.
7. End session; board remains in the database for next week.
9. Troubleshooting
| Symptom | Try |
|---|---|
| Object moved but snaps back after refresh | Confirm you released the drag; check network; re-drag once |
| Structure hit did nothing lasting | You may have previewed only — use Apply |
| Player sees full map | They opened DM link; use player role / locked invite |
| Lost seat on new computer | Re-claim seat; character may already exist on roster |
| Empty map | Run wizard / seed; confirm campaign has a map |
| Labels missing | DM-only labels; ensure you are in DM view |
10. Roadmap (manual will grow here)
Planned / in progress areas this manual will expand into:
- ☐ Live multiparty sync of positions and structure
- ☐ Share labels by talent / magic item / skill / spell / potion
- ☐ Portal travel between floors
- ☐ Play-mode movement rules (not free design drag)
- ☐ Inventory / prize claims
- ☐ Initiative and engagement polish
- ☐ Seat purge / host tools
11. Glossary
| Term | Meaning |
|---|---|
| Board / map | The pixel board with grid, floors, objects |
| Floor | Level (ground, upper, cellar, …) |
| Obstacle | Furniture, doors, terrain props |
| Tile | Floor slab or wall segment with materials |
| Structure | Durability layer (sturdiness, fragility, HP, damage state) |
| Seat | A person at the virtual table (with secret rejoin token) |
| Player (model) | Character token / sheet hub |
| Fog of war | Player view limited by light + vision |
Document control
| Version | Date | Notes |
|---|---|---|
| 0.1 | 2026-07-31 | First training PDF: get started, design, seats, persistence |
| 0.2 | 2026-07-31 | In-app /guide link, toggleable deep coach, ⌘K indexed search |
Next update triggers: multiparty sync, share-vision labels, portal travel, play-mode movement.