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:...
Lint MCP-authored content for double-hyphens/em-dashes before write
Standing style rule (CLAUDE.md, brand-voice.md): no "--" or em-dash anywhere, including inside MCP-authored article/adventure/moment content. A memory note was saved after Session 38 but the...
Global live-session banner
Consistent sessions list between campaign tab and standalone page
Auto-embark into the live play surface
Inline reference cards in the live Feed
Dev-only auto sign-in, with a real sign-out escape hatch
Play NPC dialogue audio from the Feed
Location-aware Spotify playlists
HTML double-escaping bug affects Article#content_html AND GameSession#recap
Root cause confirmed: this was a data problem, not a rendering bug. Whatever wrote Article #185's content and GameSession #56's recap during session 40 passed HTML-entity-escaped strings (e.g....
Fix `TypeError: no implicit conversion of Symbol into Integer` on characters#show and campaign wallet balances
Fix `TypeError: no implicit conversion of Symbol into Integer` on characters#show and campaign wallet balances. `amount.to_s(:delimited)` isn't valid Ruby (`Integer#to_s` takes a base, not a...
Adventure graph editor enhancements
scope corrected mid-build per ADR-0079 refinement: drag-to-connect edges and zoom controls turned out to already exist (BL-092), so this shipped only the genuine gaps. (1) Persisted node positions:...
In-app scene-to-stage linking
DMs can now link a stage or article to an adventure node from the web app, not just via the `add_adventure_component` MCP tool. New `AdventureComponentsController` (create/destroy) nested under...
Spotify HUD mini-player
fixed bottom bar persisting across all Turbo Drive navigations. `spotify-hud` Stimulus controller polls `GET /spotify/now_playing` every 5s (proxies Spotify `/v1/me/player`). Shows album art, track...
Spotify integration
`spotify_uri` string column on Article, AdventureNode, Adventure, and Stage. User connects personal Spotify account via OAuth (Authorization Code flow) via custom `SpotifyController` (not Devise...
Adventure Story / Structure split
`narrative_notes` text column on `AdventureNode` to hold emotional arc intent separately from structural description. Story tab added as the first tab on the adventure show page, rendering as a...
In-graph drag-to-connect
pointer gesture on `.ag-handle` dot begins a live SVG dashed line from the source node; release over a target node prompts for an optional label then POSTs to `adventure_node_edges#create` (JSON)....
Dagre graph layout for adventure graph
replaced hand-rolled DFS slot algorithm with dagre (Sugiyama-style layered layout). Correct layering for acts-without-scenes, cross-edge handling, cycle detection. Tree edges (parent→child) and...
Adventures index — Netflix-style tile grid
polymorphic images added to Adventure (has_many :images, ALLOWED_IMAGEABLE_TYPES expanded, routes concern :imageable, back_path fix for nested resource). `hero` variant (800×450) added to Image...
Campaign-scoped dm_notes reveal
`article_reveals` join table (article_id, campaign_id). DM right-clicks the DM Notes panel to reveal/unreveal per campaign via `dm-notes-reveal` Stimulus controller with floating context menu....
Adventure node show pages and deep navigation
`show` added to adventure_nodes routes. `AdventureNodesController#show` loads components, children, and edges. Scene page: description + ordered beats (linked) + components (article/stage with...