Roadmap
What's coming, what's being weighed up, and what's already landed. The Tavern's work stays out where you can see it.
Parking lot for disconnected graph nodes
detect nodes with no explicit edges (in or out) and no parent relationship at layout time. Render them in a collapsible right-side tray within the graph wrapper rather than letting dagre float them in leftover space. From the tray, drag...
Stage asset composer: wall/door/lighting geometry + VTT export
Current stage asset composer (BL-079/ADR-0068) handles decorative environmental assets (free placement, scaling, rotation, z-ordering) but treats them all as flat decoration. A richer version would treat walls/doors/windows as...
Richer roadmap description formatting
The roadmap detail field is a plain text column rendered through Kramdown (markdown-to-HTML) on the detail page. It works but is basic -- no persisted structure, no editor affordances, and card/list truncation on plain markdown text can...
AI-generated adventure cover art
in-app "Generate" button on the adventure edit page that calls an image generation API with a DM-written prompt. Needs ADR covering: which API (PixelLab for pixel art vs Replicate/DALL-E/etc. for painterly/illustrative), token storage,...
Activate social OAuth in production
register OAuth apps with Google (console.cloud.google.com), Facebook (developers.facebook.com), and GitHub (github.com/settings/developers). Populate `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET`, `FACEBOOK_APP_ID`, `FACEBOOK_APP_SECRET`,...
User levelling system
XP earned for activity in the Tavern: running sessions, voting on schedules, submitting feature votes, creating articles, adding characters, completing campaigns, etc. Levels unlock cosmetic rewards (profile flair, badge titles, avatar...
Feature voting
users can submit and upvote feature requests. Vote weight is global: DMs (anyone who owns at least one campaign) carry more weight than players. Future extension: bonus votes per session run, rewarding active use. Public roadmap page...
Automated time-advance triggers
tie time advancement to game mechanics: long rest (+8 hours), short rest (+1 hour), travel (distance-based), session start/end. DM configures which actions auto-advance time. Builds on ADR-0031 time-of-day and play surface time controls.
Push character template changes down to existing characters
when a world's character sheet template changes (new attributes added, mechanics tweaked), existing characters don't retroactively pick up the diff. They were seeded at creation, then frozen. For mature systems this is correct...
Global characters
currently Character belongs to a single Campaign. A DM might want a character that exists at the user level and can be played across multiple campaigns/worlds with campaign-specific state per appearance (level, inventory, memories)....
Pantheon system
world-level Pantheon model containing Gods/Deities. Each deity has a name, domains (War, Knowledge, Trickery, etc.), description, alignment, symbol, and associated articles. Domains could be a structured list or link to GameElements....
Rich text editor upgrade (Trix -> Lexical)
Trix doesn't support tables, which means pasted/synced content with markdown tables renders as raw pipe text. Lexical (or similar) would add table support, better block handling, and a more modern editing experience. Key constraint:...
Session poll show page
dedicated `GET /campaigns/:id/poll` page for sharing poll links. Stable URL unaffected by tab state. Shows full scheduling widget (or "next session" banner if already confirmed). Lists other open...
Share session poll
"Share poll" button in the scheduling widget header. Copies `"📅 Vote on our next [Campaign Name] session! → [URL]"` to clipboard via the existing `clipboard` Stimulus controller. Button visible to...
Scroll schema v2
Scroll schema v2 at `story/sessions/scrolls/schema.md`. Every event carries a required `scribe_id` (UUID v4) and a millisecond-precision `ts` — together they give each event a globally-unique,...
`/txt-scribe` skill
Archivist-invocable event writer and router. Takes prose or structured shorthand, emits v2 events (UUID scribe_id + millisecond ts), writes the JSONL line, pushes the matching Moment with...
`bin/sync-session`
Ruby runner, append-only and idempotent, `flock`-protected. PULL phase fetches `player_note` Moments via MCP, appends them as `player_note` events keyed on `moment_id`, and sets `in_reaction_to`...
MCP parity for Scroll dedup
`moments.scribe_id` column added (indexed). `create_moment` accepts optional `scribe_id`; when a Moment already exists with that scribe_id on the session, the existing record is returned with...
Scribe natural language resolution
Archivist combat/session awareness baked into `.claude/agents/archivist.md`. During a live session the Archivist classifies all DM input (attack, spell, movement, condition, narration, reveal,...
`combat_log` Moment kind
compact monospace display (no avatar, border-left, timestamp + content), Feed shows all kinds, Timeline sidebar excludes `combat_log` via `curated` scope, broadcast skips `timeline-moments` for...
Archivist session convention
added Live Session Mode section to `.claude/agents/archivist.md`. Documents the two-layer model (internal vs output), narrate flow, Scribe capture convention, live log format, and post-session...
`/txt-narrate` skill
Archivist produces atmospheric present-tense read-aloud prose, calls `create_moment` via MCP (`kind: "narration"`) to broadcast live to players, appends to live log. Handles session ID from args or...
`bin/session-log`
tail script for the Scribe window. Tails latest or specific `story/sessions/prep/session-NNN-live.md`.
Image galleries (polymorphic)
shipped as a generic `Image` model (`imageable_type`/`imageable_id`, `has_one_attached :file` with thumb/card variants, caption, sort_order) so any future owner (Character, Adventure, Campaign,...
Adventures missed in ADR-0043 cascade
the Thornwick showcase surfaced a gap: the "Waking of the Greymoor" adventure was flagged `visibility: public, status: published` but `AdventuresController#show` had blanket `authenticate_user!`...
Thornwick public showcase
ported the Archivist project's original Thornwick world into production as the first fully public showcase campaign. World 3 (public), Campaign 6 "The Waking of the Greymoor" (public), 13 canon...
Cascading privacy + Nemesis leak remediation
`/explore` was leaking 115 public-flagged articles from the private "Nemesis Untold!" campaign (private campaign in a private world, but individual articles had `private: false`). Flipped all 115...
Explore page redesign
expanded from worlds-only to full showcase: worlds, campaigns, lore (grouped by kind), rule systems, adventures, game elements. Jump nav, per-section empty states with sign-up CTAs, fork button...
TTS hooks in settings.json
closed. TTS is called directly from CLAUDE.md; no hook wiring needed.
Copy TTS hooks out of rt_win symlinks
closed. Symlinks work; rt_win is stable. Acceptable risk.
Global cross-project conventions
closed. Jay clarified this was about ADR/TTS/MCP patterns; these are already documented in global CLAUDE.md and project CLAUDE.md files.
Public content for SEO and LLM indexing
three-layer public model shipped. Worlds/campaigns/articles with `private: false` are accessible without auth. Pundit policies updated to handle nil user; show actions in Worlds/Campaigns/Articles...