Skip to content

Reality check: run · play · maintain

An honest, workflow-first audit of Campfire from the three seats that matter — the DM who runs a campaign, the player who plays in it, and the admin who keeps the server alive. Each step is marked ✅ works · 🟡 rough · ❌ missing. This is the "what would I actually need?" pass, grounded in what's really built.


👑 The DM — "run the campaign"

Step State Notes
Create a campaign ✅ Guided wizard, become DM automatically
Choose a rule system ✅ A DM (not just an admin) can install a rule pack — D&D 5e (Open5e), Pathfinder 2e, or Open Legend live in one click; other systems via mirror URL or an uploaded open-licensed dataset — as a background job
Get my players in ✅ Generate an invite link / join code from Members → Invite (per role, expiring, revocable); the player opens it, creates their own account, and lands in the campaign — no admin needed
Set the table's safety expectations (session zero) ✅ A session-zero charter — lines & veils, agreed safety tools, house rules, tone — that the whole table reads and the DM edits
Build the world (quests/NPCs/locations/map) ✅ Full CRUD, DM secrets, pin map, uploaded map image
Plan the story ahead (arcs / beats / branches) ✅ A DM-only Storylines planner: arcs group ordered beats, beats carry labelled branches toward other beats
Track in-world time ✅ A Timeline of dated in-fiction events (free-text dates, eras, DM secrets, hideable) plus a "current in-world date"
Reuse prep (templates / clone a campaign / import a module) 🟡 Clone a campaign in full or as a prep-only template, and import a Campfire JSON export (round-trips the export, e.g. moving a campaign between servers) — but no published-adventure/module import
Prep an encounter ahead of time ✅ "Preparing" state, add monsters from compendium
Run combat at the table ✅ Initiative, turns, HP (incl. temp HP and 5e death saves), conditions, dice, add several identical monsters at once, HP writes back to sheets
See changes live on my players' devices ✅ Combat streams over SSE (instant); the dashboard, quest board, party HP and notes refresh on a ~5s poll that pauses when the tab is hidden
Award XP / level the party ✅ XP tracking with 5e thresholds, party-wide DM awards, and a guided level-up (level +1, new max HP, damage carried over)
Hand out loot / track the party's gold ✅ Party treasury (coin) and per-character inventory items
Write the session recap ✅ Manually, or ask an AI to draft it; record per-session attendance (which characters played)
Sweep the scribe inbox into canon ✅ Player notes → quests/NPCs manually, or click Sweep inbox for AI-proposed edits (needs a campaign AI provider)
Schedule the next session ✅ Set a date with player RSVPs and a public ICS feed subscribers can add to their calendar
Let an absent player catch up ✅ Notifications (recap posted, next session) plus a read-only recap share link to send a guest
Pause / complete / archive a campaign ✅ A real read-only "completed" state, enforced server-wide (not just cosmetic)
Hand off to a co-DM ✅ Add another member as dm; multiple DMs supported; the last DM is protected
Delete a campaign ✅ Cascades cleanly (children, uploads, tokens, members)

Biggest DM gaps: combat depth (concentration, legendary/lair actions, mechanical conditions) is shallow — fine for a tracker, a limit for crunchy tables — and there's no published-adventure/module import. (XP, loot, scheduling, a real archive state, live combat, and getting players in without the admin have all since landed.)


🎲 The player — "play the campaign"

Step State Notes
Get an account ✅ Open a DM's invite link and create my own account, or self-register if the admin turned on self-service signup (an admin can still hand-create it)
First login with nothing assigned ✅ The hub tells me to ask my DM to add me (no dead-end "create a campaign" trap)
Join a campaign ✅ Follow the DM's invite link to self-join with the role they set, or the DM adds me by username
Make my character ✅ Create my own (and keep more than one — a backup PC, a familiar), or the DM links one to me; I can delete a character I own
Fill in the full sheet ✅ HP, conditions, stats, bio, portrait — plus saving throws, skills, actions, and spell slots
Import my D&D Beyond character ✅ Paste a public D&D Beyond sheet's id or URL and it imports (unofficial, read-only; the sheet must be set to Public)
Play at the table on my phone 🟡 Mobile nav works, but live combat is two taps into "More" and the "Live" chip only shows on the dashboard
Tick objectives / edit my HP & conditions / roll dice ✅ All allowed for players; dice now on the dashboard too
Take notes (private / to DM / to party) ✅ Three visibility levels, anchored to any entity
Level up ✅ A guided level-up from the sheet's Experience card; I can see XP progress toward the next 5e threshold
Read recaps & shared notes between sessions ✅ Everything's there when I log in
Get told when something happens ✅ An in-app notification bell — new recap, a reply to my note, "you were added," next session
Reset my own password if I forget it 🟡 I can file a forgot-password request; since the server may have no mail transport, an admin approves it and relays a one-time reset code — no fully self-serve email reset yet

Biggest player gaps: live combat is a couple of taps deep in mobile nav. (Notifications, full sheet depth, XP visibility, a public D&D Beyond sheet import, owning multiple characters, account entry, and self-service password recovery have all since landed.)


🛠️ The admin — "maintain the server"

Step State Notes
Install it ✅ One image, one volume; first visit creates the admin account
Create player/DM accounts ✅ Admin → Users one at a time, or let DMs bring their own via invite links, or flip on the self-service signup toggle. (Still no bulk import)
Turn on SSO ✅ Configure OIDC from Admin → OIDC single sign-on with a Test connection check — no restart — or via env vars; env values win and are badged in the UI
Recover a forgotten password 🟡 Users can file a self-service request; since there's no mail transport I approve it and relay a one-time reset code (or still reset directly from Admin → Users)
Install rule content ✅ A per-source picker: D&D 5e (Open5e), Pathfinder 2e and Open Legend live in one click; Pathfinder 1e, Starfinder, 13th Age and OSR from a mirror URL or upload — installed as a non-blocking background job with per-section progress; a DM can self-serve (uninstall stays admin-only)
Back up the server ✅ Copy /data, or pull a WAL-safe whole-server archive (DB via VACUUM INTO + all uploads) from GET /api/v1/backup, restore it with POST /api/v1/backup/restore, and optionally schedule on-disk backups (BACKUP_SCHEDULE_ENABLED). Per-campaign JSON/Markdown export also exists
See how the server is doing ✅ The Admin overview (/admin) shows a metrics snapshot — entity counts, on-disk DB size, uptime, running version, and recent activity
Audit admin actions ✅ A server-wide audit (Admin → Audit, /admin/audit) of admin actions not tied to a campaign — account creation, settings changes, pack installs — alongside the per-campaign log. The same page discloses audit retention (default 365 days, auto-prune off unless enabled), supports dry-run counts, legal hold, archive-before-prune, backup freshness checks, and last-job status.
Manage storage ✅ A storage console (Admin → Storage, /admin/storage): total upload bytes, per-campaign quotas with over-quota flags, the real on-disk total, and an orphan summary for cleanup
Review who has API/AI tokens ✅ Users manage their own tokens, and an admin can list and revoke another user's tokens (and mint one on their behalf)
Upgrade ✅ Bump the image tag; migrations auto-run and are idempotent; /data carries across
Keep admin power separate from campaign secrets ✅ A server admin holds no implicit campaign role — DM secrets (and the campaign list itself) require an actual membership; server power ≠ story access

Biggest admin gaps: none of the historical big ones remain — observability (the Admin overview metrics), the server-wide audit trail, storage management, and backup/restore have all since landed, as have the self-service account flows (invites/signup/reset). What's left is polish: no bulk user import, and password recovery still needs an admin to relay the reset code (no built-in mail transport).


The through-line

The historical themes that once cut across all three seats have now shipped: between-session engagement (notifications and shareable recap links — the app now speaks up when you're not looking at it), account lifecycle (invites, optional self-signup, self-service password reset — see Admin vs DM), the operator-confidence backup/restore story (see Backups & upgrades), and operator observability (the Admin overview metrics, a server-wide audit trail, and the storage console).

What's left is depth rather than whole missing seats: crunchier combat mechanics, smoother mobile live-combat nav, published-adventure import, and maturing the still experimental AI Dungeon Master seat (co-DM / driver — see What an AI can do).

Everything here feeds the Roadmap & status; the items already being built are marked 🔨 there.