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...
Player free-text interaction from the Feed
Combat sound effects on encounter start
NPC "voice sheet" pre-computed at session-build time
Spun out of BL-099's research note (2026-09-03, docs/session-running-improvements.md) rather than folded into it -- a different, smaller mechanism for the same underlying complaint. The standing predictive-drafting agent BL-099...
Click initiative entry to open record modal (monster/PC)
Players can post images to the Feed, land in Campaign gallery
No MCP tool to browse/search the ElevenLabs voice library
Session 40: assigned tts_voice_id to five NPCs (Thraxx, Danny, Sella, Surviving Raider, Coll Ashwater) purely from memorised premade-voice IDs, with no way to verify or browse ElevenLabs' actual library via any available tool. At least 3...
DM sessions run with 727 MCP tools loaded — 240k tokens of dead weight from unrelated connectors
Session 40, checked via /context: this project's own .mcp.json only declares 4 servers (txtavern, pixellab, txtavern-postgres, honeybadger). Everything else present in the session — WIN, ngk, Gmail, Google Calendar/Drive, Microsoft 365,...
Design a live game-running surface for the DM, native to the Claude Code CLI
Came out of the Session 40 retro (docs/session-running-improvements.md) and a follow-up design conversation. Two constraints, both explicit from Jay: 1. **Interaction model is not 1:1 prompt/response.** Tonight's live session ran as an...
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:...
Adventure builder: node graph view
`adventure_node_edges` table (from/to/label). `AdventureNodeEdge` model + policy + controller. `adventure-graph` Stimulus controller (auto grid layout, SVG bezier edges with arrowheads). Graph tab...
Article audience model
redacted placeholder in `articles/show.html.erb` when `dm_notes` is present and the viewer can't see them. Lock icon + three greyed bars. No model change. ADR-0073.
Adventure builder: stage-to-node linking
`article_id` made nullable, `stage_id` added to `adventure_components`. `belongs_to :stage, optional: true` + `:stage` role enum. `_component_badge` handles both. `add_adventure_component_tool`...
Adventure builder: beat content readability
removed `truncate` from beat description in `_beat.html.erb`. Full description now wraps.
Private article indicator
lock badge added to sticky header and main content header in `articles/show.html.erb` when `@article.private?`.
Stage full-canvas viewport
`stage` layout (no sidebar), `stage-viewport` Stimulus controller (pan/zoom, pointer capture, wheel zoom, Ctrl+0 fit-to-viewport, panel toggle), HUD overlay pattern (`data-hud` attr prevents pan,...
Keepers as MCP distributed personas
`keeper://{name}/prompt` MCP resources (archivist, herald, artificer, sentinel) + `initialize_keeper` tool scaffolds local project structure and returns CLAUDE.md snippet....
Hide session join link after session ends
join link card only shown while status is scheduled/prepping/live; hidden on completed/cancelled.
Session show page tab navigation
Recap (first, default), Feed (play surface + moments log), Prep Notes (DM), Session Lore (DM). Recap shows empty state with "Write the recap" CTA. Join link moved into identity block above tabs.
Global sessions index
`/sessions` page with all sessions across user's campaigns, sorted by date desc, with campaign name, status badge, and date. Sessions + Schedule nav entries added to desktop and mobile sidebar.
Global scheduling page
`/schedule` page with Live Now, Upcoming, and Open Polls sections across all user's campaigns.
Stage asset composer (Inkarnate-style map builder)
`StageAsset` model, 25 SVG sprites (nature/structures/hazards/markers), `stage-asset-composer` Stimulus controller, asset picker panel, placement overlay, ActionCable sync via StageChannel, 4 MCP...
Theatre of Mind battle surface
`theatre_of_mind` Stage kind, JRPG split-screen view (party left, enemies right), portrait cards with HP bars and conditions, initiative ticker, `stage-form` Stimulus controller hides grid/image...
Pluggable initiative modes
extended `initiative_mode` enum to `manual`, `dex_based`, `side`, `popcorn`. Migration adds `side_phase` string column. `dex_based` auto-rolls on `start_encounter!` from linked character's DEX...
Character sheet focus mode
`play-surface` Stimulus controller reused from game sessions. "Work on character" button in the sticky header + mobile panel. Focus shell: `ps-header` (portrait thumb, name, class badge, level,...
D&D Beyond character sync
`DdbCharacterSyncService` with HTTP fetch (30s Rails cache), group-based sync (Identity/Abilities/Combat/Notes/Inventory), diff preview modal (Stimulus `ddb-sync` controller, `<dialog>` element),...
Campaign-scoped article notes
`CampaignArticleNote` join model (`campaign_id`, `article_id`, `has_rich_text :notes`). One note per campaign per article (unique constraint). DM of the campaign can create/update/destroy. Shown in...
Sentinel agent definition
updated `.claude/agents/sentinel.md` with the campaign audit mode: the four checks (unresolved links, orphans, privacy leaks, stale articles), auto-fix workflow, MCP tools table, and guidance for...
Sentinel campaign audit skill
extended `.claude/commands/txt-sentinel.md` with a new `audit [campaign_id]` mode. Calls `run_sentinel` via MCP, auto-fixes unresolved wiki-links by calling `resolve_article_reference` per...
Sentinel for the DM's world
`SentinelService` with four checks: unresolved `[[...]]` wiki-link placeholders, orphan articles (no inbound refs + not session-tagged), privacy leaks (private articles referenced from public...