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:...
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...
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.