← How to play

The Discord bot

One slash command — /sheetwright — puts your living character sheet in your table's Discord server. Everything acts through the same rules as the web app: rolls land in the campaign dice log, pool spends show up live on an open sheet, attack damage updates the GM's encounter.

Getting connected

  1. Run /sheetwright link in any server with the bot. It replies (only to you) with a magic link, valid 15 minutes.
  2. Open the link while signed in to Sheetwright — your Discord account is now connected, once, for every server.
  3. Pick who you play with /sheetwright character name:<who> — the bot autocompletes your active characters.

/sheetwright link action:disconnect disconnects at any time. Everything below requires a linked account and a picked character.

Player commands

Action results post as table-safe summaries the whole channel sees; sheet, status and list replies stay private to you.

Command What it does Example
link [action] Connect your Sheetwright account — action:disconnect severs it again /sheetwright link
notifications [state] Opt in to (or out of) DMs: you're up, new handout, unclaimed loot, an intrusion awaits — off until you turn them on /sheetwright notifications state:on
character [name] Pick which of your characters you play here (autocompletes) /sheetwright character name:Vess
sheet Your character sheet — with buttons for any prompt waiting on you /sheetwright sheet
roll dice [result] [note] [target] [approach] [difficulty] Server-side dice (d20, 2d6+1…) into the campaign dice log. Playing at a physical table? Add result with the total your real dice showed and it is logged instead of rolled — range-checked (a d20 can't come up 27) and marked entered in every log. In a social scene, naming a target or approach (or a bare difficulty) makes it a real social task through the engine; a bare roll auto-attaches to the one active scene you're in, with a one-tap "Not part of it" undo /sheetwright roll dice:d20 target:The Conductor approach:charm
/sheetwright roll dice:d20 result:17 note:swinging
task difficulty [skill] [assets] [effort] [stat] [note] A Cypher System task roll against difficulty 0–10; Effort is paid from the chosen pool, Edge applies automatically /sheetwright task difficulty:4 skill:trained effort:1 stat:intellect note:Decipher the glyphs
attack target damage [ability] [cypher] [skill] [assets] [effort] [stat] [difficulty] Attack an enemy in the active encounter — difficulty defaults to the target's level, damage lands in the GM's encounter. Name an ability (Onslaught and friends) and its cost is paid with the same roll, Edge applied once, from the ability's pool unless you pick a stat. Name a cypher and it is marked spent with the roll, hit or miss /sheetwright attack target:Guard damage:4 ability:Onslaught effort:1
initiative [skill] [assets] [effort] Roll initiative (a Speed task) when an encounter starts /sheetwright initiative effort:1
defend [prompt] [skill] [assets] [effort] Answer a pending defense prompt (defaults to your oldest open one); a failed defense applies damage automatically /sheetwright defend effort:2
help target Help another PC — they gain one asset /sheetwright help target:Marla
move zone Move to an adjacent zone in the encounter /sheetwright move zone:The scree
pool stat amount Spend (negative) or restore (positive) pool points /sheetwright pool stat:might amount:-2
resource name amount reason Adjust a trackable custom resource (Soul Points and friends) — negative spends, positive restores, and the reason lands in the resource's audit history /sheetwright resource name:Soul Points amount:-1 reason:Powered the ward
recover Make your next recovery roll (1d6 + tier), using slots in order /sheetwright recover
xp amount Adjust your XP (positive gains, negative spends) /sheetwright xp amount:2
cypher [name] List your cyphers, or mark one used /sheetwright cypher name:Detonation
abilities List your abilities with their Pool and tracked resource costs and the remaining tracked uses /sheetwright abilities
use [ability] [cypher] [effort] [stat] Use an ability, paying every Pool and tracked resource cost at once and counting a tracked use (going beyond a use limit warns, never blocks) — pick stat for the Effort Pool when the cost alone doesn't decide it (custom-only or multi-Pool costs). Or name a cypher instead: it is announced to the table and marked spent /sheetwright use cypher:Detonation
lookup query Look up a creature in the bestiary /sheetwright lookup query:broken hound
encounter status What's happening right now, spoiler-free — in combat, the live turn order with whoever is up marked /sheetwright encounter status
intrusion accept · decline · status Answer the GM intrusion waiting on you (+2 XP / −1 XP), or list the open ones you can see /sheetwright intrusion accept
clock status Where the party's clocks stand /sheetwright clock status
rewards list · claim reward Browse the party's loot queue and claim a reward for your character /sheetwright rewards claim reward:Ray emitter
arc view · start · log Privately view your arc journal, start an arc, or log a milestone and its XP /sheetwright arc view

Prompts come with buttons: defenses offer [Roll defense] and [With Effort…], a natural 19/20 offers [Take +damage] — choosing a special effect instead happens on the web via the link in the reply.

GM commands

Everything a GM does lives under /sheetwright gm, so players never scroll past commands that aren't theirs. First pick which of your campaigns you run here with gm campaign — the GM's mirror of a player picking a character; no linked character is needed to GM. The bot checks that you are the picked campaign's GM (GM features need a subscription, like on the web), and GM replies are always private to you, so the table sees nothing it shouldn't.

Command What it does Example
gm campaign [name] Pick which of your campaigns you run here (autocompletes) /sheetwright gm campaign name:The Sunken Vault
gm log session Privately archive this channel or thread into an existing session log (autocompletes); same-source reruns replace the snapshot /sheetwright gm log session:Session 12 — The Glass Road
gm encounter [name] The full encounter picture, privately — turn order with every initiative roll, who is up, NPC health, concealed threats. Needs no character in the campaign; name an encounter when several are active /sheetwright gm encounter
gm start · next · end Start the prepared encounter, advance the turn, end the scene /sheetwright gm next
gm convert Flip the active encounter in place: a social scene turns violent, or a combat becomes a parley — same cast, same log /sheetwright gm convert
gm damage target amount [piercing] Apply direct damage to one participant (Armor applies) /sheetwright gm damage target:Vess amount:3
gm effect target name kind [value] [duration] [applies_to] Apply an asset / eased / hindered effect for an action, a round, the encounter, or until removed /sheetwright gm effect target:Guard name:Dazed kind:hindered duration:round
gm request pc target [approach] [note] Ask a named player for a social roll vs. an NPC ("Persuasion vs. the Conductor") — they get the prompt on their sheet, web view and DM, and their answer lands pre-attached with your target and approach /sheetwright gm request pc:Vess target:The Conductor approach:reason
gm intrusion pc description Propose a GM intrusion against a PC — they answer with accept/decline (from Discord or the web) /sheetwright gm intrusion pc:Vess description:The bridge rope snaps
gm tick clock [amount] Advance or rewind a clock (negative rewinds) /sheetwright gm tick clock:Reinforcements amount:1
gm assign reward character Hand a staged reward straight to a character /sheetwright gm assign reward:Ray emitter character:Vess

gm encounter shows you the full picture (privately): the live turn order with each initiative roll, who is up, NPC health and concealed threats — no character in the campaign needed. Playing a character at the table, the player-side clock status and encounter status show you the same; players get the spoiler-free view. Initiative rolls reorder the turn list on their own. Some steps deliberately stay on the web runner: reordering the turn list by hand, announcing NPC attacks, multi-target actions, the effect side of a special choice, and resolving the encounter with rewards.

Archive play from a Discord thread

Create and curate the session log on Sheetwright first. Then stand in the Discord channel or thread where play happened and run /sheetwright gm log session:<session>. The bot reads the available history once, stores it oldest-to-newest in a separate GM-only transcript, and leaves your summary, discoveries, threads, dates and XP untouched.

  • One source belongs to one session log. Re-run from the same source to pick up edits/deletions; clear the transcript on its web page before switching channels.
  • One snapshot may contain at most 2,000 readable messages and 2 MiB of formatted text. Attachments remain named Discord links, not copied files.
  • Only the GM can view or search it. Player pages, recap, notifications and broad MCP session responses never include transcript text. JSON and Markdown campaign exports do.

If Discord returns empty messages, your admin must enable the privileged Message Content Intent. A 403 means the bot needs View Channel + Read Message History there. Rate-limit and incomplete-history failures change nothing and tell you when to try again.

GMs: bring the bot to your server

  1. Add Sheetwright to your Discord server — you need the Manage Server permission there. The bot asks for View Channel + Send Messages + Read Message History: enough to DM opted-in players, post configured table prompts, and read a channel only when its GM explicitly imports a session transcript.
  2. Have every player /sheetwright link and pick their campaign character. You link too, then pick the campaign you run with /sheetwright gm campaign — GMing needs no character of your own.
  3. Existing installs may need the current invite opened again, or Read Message History granted on the play channel. Campaign membership on Sheetwright still decides who can do what.

Slash commands work in every channel the bot's commands are allowed in — use Discord's Server Settings → Integrations to restrict them to a game channel if you like.

Combat prompts in your channel: "roll your defense!"

When you announce an NPC attack — the NPC attack card on the encounter page, or request_defense over MCP — the bot can tell the table directly, instead of waiting for the player to notice their pending prompt. The post names the defender and the stat ("Isolde Delaney must roll a Speed defense"), @-mentions them when they've linked their account, links the encounter, and carries [Roll defense] and [With Effort…] buttons — one tap in Discord resolves the defense through the same engine as the web sheet. Only the defender (or you) can press them; anyone else gets a polite refusal.

Turning it on takes two minutes:

  1. Make sure the bot can post: invite it with the current install link above (it asks for View Channel + Send Messages), or — if it already lives in your server from an earlier install — grant it those two permissions on the channel you want, e.g. a #dice-and-prompts channel.
  2. Copy the channel's ID in Discord: User Settings → Advanced → Developer Mode on, then right-click the channel → Copy Channel ID.
  3. Paste it into "Discord channel for prompts" on your campaign page (it sits with the other table dials under the campaign name, GM-only) and save.

That's the whole setup. Prompts post a few seconds after the announcement and stay honest: a defense you cancel, resolve for the player, or clear by continuing the turn is silently never posted. The post reveals only what a pending prompt already shows the table — the defender and the stat, never damage, difficulty, riders or a hidden attacker. Players who haven't linked their Sheetwright account are named in plain text instead of mentioned; clearing the field returns the campaign to DM-only pings, where the defender gets the same buttons privately if they opted in with /sheetwright notifications state:on.

The companion escape hatch for play-by-post: when the table answers a prompt in the chat and moves on without Sheetwright, the pending defense would block Next turn. Clicking it anyway then surfaces "Cancel prompts & continue" with a reason that lands in the audit log — the initiative never gets stuck on a prompt the fiction already resolved.

A play-by-post week, start to finish

Play-by-post is where the bot and the campaign pages click together: Discord is the table, Sheetwright keeps everyone oriented. Nothing posts for you and nothing enforces a pace — the bot answers commands, DMs the players who asked to be pinged, and keeps the campaign pages current. Here's a worked week at a Ninth World table: the GM is running the vault delve from the GM guide, the players are Mara and Jori.

Once, at setup

  • The GM adds the bot to the server; everyone runs /sheetwright link. Players pick their character, the GM picks the campaign with gm campaign.
  • Everyone who wants pings runs /sheetwright notifications state:on — DMs are strictly opt-in, per player. The GM can additionally name one channel on the campaign page where combat prompts ("roll your defense!") post for the whole table.
  • The GM makes a thread per open scene (#the-flooded-stair) and puts its link and label on the scene card, so the scene — and the party's "Whose move is it?" card — always point at the right thread.

Monday — the GM opens the scene

The GM posts the framing in the thread, marks the scene active on the scenes page and sets its waiting state to players, ticking Mara and Jori. Both get a DM — "you're up" with the scene's title and a link — and the campaign's handouts page now answers play-by-post's eternal question: whose move is it?

Tuesday — Mara acts

Mara replies in character, then rolls right in the thread: /sheetwright task difficulty:4 skill:climbing effort:1 — the result posts as a table-safe summary the whole thread sees and lands in the campaign dice log. It's a natural 1. The GM, on a phone, answers with /sheetwright gm intrusion ("the rusted rail tears loose"); Mara gets the "an intrusion awaits" DM and takes the XP with /sheetwright intrusion accept.

Wednesday — the world moves

The GM ticks the Rising water clock (gm tick) and reveals a handout — the star-chart mosaic, an image on a note addressed to Mara alone. Mara's DM says a new handout waits; nobody else is pinged, and nobody else can open it. Anyone can check /sheetwright clock status or the handouts page between posts.

Thursday — slow-motion combat

The encounter prepared on the scene starts (gm start). Combat works exactly like at a live table, just slower: players roll initiative as they come online and attack with /sheetwright attack. When the GM announces the warden's counterattack, the bot posts "Mara must roll a Speed defense" with @Mara and a [Roll defense] button straight into the prompts channel (see channel prompts) — or a pending defense simply waits on its player, with the same buttons on /sheetwright sheet. Nothing times out; and if the table resolves a moment in the thread and moves on, the GM continues the initiative anyway — the encounter page cancels the stale prompts with the reason on the record.

Friday — loot, and the quiet player

The GM stages the warden's cypher: every member gets the "unclaimed loot" DM, and Jori claims it with /sheetwright rewards claim. Jori has otherwise been silent all week — the spotlight strip on the GM's scenes page sorts him first (waited on since Monday, no roll, no reward before this), the GM's cue for a friendly out-of-game nudge. The "you're up" DM fired Monday and won't repeat — pings happen when the waiting state newly points at someone, never on a timer.

Sunday — wrap the beat

The GM marks the scene resolved, activates the next one, nudges the thread's history and wraps the week into a session log. A player back from vacation doesn't reread four hundred posts: the Recap page (Campaign → Handouts → Recap) assembles what the table saw — sessions played, clues found, revealed threads that moved, the encounter's outcome, new handouts and the dice log — over a 7, 14, 30 or 90-day window. It's spoiler-free for everyone, the GM included.

The contract in one line: your posts are yours, the waiting state is guidance rather than enforcement, and every number — rolls, pools, clocks, XP, loot — stays honest in one place while the story happens in the thread.