Repository navigation
Releases: Lebbitheplow/open-dungeon-master
Release list
v0.27.2 - Builder drafts and Level up, WorldForge's first milestone, typed tool refusals, lighter art
Twenty-six pull requests verified together: a friendlier character builder, WorldForge's first milestone (privacy, merges, reimports, bundles, file losses, one text per entry), clearer tool refusals for the AI DM, and lighter art.
Character builder
- Drafts are kept: a new character's progress is saved on the device and offered back with Resume, on the step it was left (#329).
- Level up from the library: "Level up to N" opens the build one level up and asks for what the level brings (#343).
- Bring a character: a player with library heroes is offered them in the lobby (#331).
- Picking a class and a lineage: every class card names its role and which core class it plays like (#342); a lineage names the classes its bonuses suit (#344); both grids have a filter bar (#345).
- Abilities: the step names what the class leans on and places the scores in one tap (#330); each 4d6 throw is graded in words, not only colour (#333).
- Name dice roll a name that fits the lineage or the world pack's people (#334).
- Saves that fail name what is missing, and Show me goes to it (#332).
- Accessibility: an 11px text floor and 44px targets (#338), real trait disclosures (#335), a keyboard-friendly crop dialog (#336), Escape skips set pieces (#337), and an axe gate in the browser scenarios (#339).
WorldForge
- Canon and privacy agree: a draft lore entry is held back from players, from handouts and, new in this release, is marked as not the party's in the AI DM's lore block; DM-only lore stays DM-only through a file (#347).
- Two authors keep both changes; a clash on one field is shown with the draft kept (#348).
- Reimports keep the campaign's edits, and two worlds sharing ids stay apart (#349).
- A place's picture travels inside a workshop bundle (#350).
- Files name what they would lose before anything is written (#351).
- One text per entry: a lore entry's body is its account, and a place's arrival text and article each keep their job (#352). A one-time startup pass folds lore entries whose two texts hold one another.
Play
- Tool refusals state their kind (retry, rules, limit) where they are written, and say what to do next: the AI asks the player instead of choosing, and stops narrating attempts that never happened (#346, mcerina).
- A falling net can be escaped with take_action escape or a server-rolled Strength check; a workshop copy of a trap keeps its escape rule (#328).
- Grok's notes before a tool call no longer reach the table (#340).
- Begin's table note no longer shows the instruction meant for the AI (#327).
Art and size
- Tome of Heroes race portraits: 93 new portraits and clearer subrace labels (#341), encoded at the set's own quality (0.95 MB).
- Sidebar icons are WebP: 793 KB to 105 KB.
Full Changelog: v0.27.1...v0.27.2
v0.27.1 - A guided campaign creator with your own defaults
A shorter, guided campaign creator with your own saved defaults, @DM questions answered out of character at once, Codex sending its model only ODM's tools, and a round of character-builder fixes.
Campaign creator
- Three steps instead of six: Essentials (name, who runs it, party, setting, theme and premise), Experience (narration and character voices, atmosphere, safety) and Review. Every option is still there, in named groups that say on their closed face what is set inside.
- Who voices the characters? sits beside narration: the narrator reads everyone, or each speaker is given a voice the first time they talk and keeps it. The info explains where to change any character's voice later.
- Personal defaults: save the table you usually run from the review, and every new campaign starts from it. Saving is always its own press, defaults belong to your account on this server, and a campaign's name, premise, theme, world pack, lore and imported prep are never saved.
- The review's rows each have an Edit that opens the right place and offers the way back. DM personalities, variant rules and the Storyboard warning are all reachable by tap now, not only by hover.
At the table
- Table talk naming
@DM("@dm could I jump that gap?") gets a brief out-of-character ruling at once, without moving the story. A question asked while a spotlight waits on other players is answered and the moves already in stay held; the answer is never the passage Reroll and Continue take; a failed answer says so (#314).
Agent programs
- Codex sends its model only ODM's tools and prompt: a Codex home per run keeps your own
AGENTS.mdand skills out, ODM's tools are offered directly, and its token use reaches the usage ledger. The Effort picker offers only the efforts the chosen models list, for Claude Code, Codex and opencode (#317, mcerina).
Character builder
- The diamonds jump ahead to any step whose gates pass, and an edit saves from any step (#318).
- No race or class is shown as chosen before the player picks one (#319).
- The step wipe follows the Effects setting and plays only on Continue into a step not yet seen (#320).
- The companion builder uses the table's world pack, and a library companion can be changed before it joins (#321).
- Each content-pack feat's text is asked for once (#322).
- Each step takes focus at its title, and option cards are read with what they show (#323).
- Players no longer see a server install command when the content pack is missing (#324).
Tests
- Spells spent and rests taken, end to end through a player's moves (#316). New browser scenarios for the builder's jump-ahead, the
@DManswer and the guided creator.
Full changelog: v0.27.0...v0.27.1
v0.27.0 - Every model picked, prep that keeps its length, tours per account, and campaigns ended at the table
No model is named in the code any more: every model ODM sends is one picked from what its backend lists. Also: World Lore and storyboards that hold their whole length, guided tours finished once per account, prep brought in and campaigns ended from the table, per-table stat rerolls, a hold-to-dictate key, and a long list of turn and rules fixes found by new end-to-end tests.
Upgrading from 0.26.x
- Every model is picked (#298). OpenAI pictures, narration on an OpenAI-compatible server, OpenAI dictation and a Whisper service that lists several models each need their model picked in Admin (or set in the environment) if your install relied on a default that is gone. Saved settings keep working. The admin panel says what is missing. See Upgrading in docs/configuration.md. Thanks @mcerina.
- Fast now applies to any OpenAI model that offers it. An install that left Fast on for such a model now pays priority pricing.
- GPT-6 Sol and Luna run their tools on the Responses API with reasoning on, which costs more than the old reasoning-off route.
- The database records its schema revision (#294). From this release on, an older server refuses a database a newer one reshaped instead of syncing its schema over it. Back up before upgrading, as always.
- The rules audit's gate now holds on the AI's own turn (#312). A model that writes its own damage or healing numbers is told to send dice instead, and binding conditions need a save. Thanks @Smoebo.
Your story's prep (#304, #309, issues #301, #302, #305)
- A storyboard's cards are kept whole as prep cards the storyteller can open (
read_card). The arc holds 160 beats and 160 events, and the DM sees the scene's own events inside a measured budget; the Context panel shows what was kept. - Every cap says what it would cut before it cuts: the board, lore entries and bundle imports refuse overflow with a counter, and the editors flag prose that will read badly to a model.
- World Lore retrieval brings every entry that closely matches the moment, up to six, inside a budget measured from the model's window, and names what it left out. The Context panel says what was kept and why.
- Prep can be brought into a campaign already in play, from the table's Setup tab, and every open seat sees it without a reload (#307).
At the table
- End the campaign from the Setup tab (owner or primary DM, behind a confirm). Characters from a player's library take their progress home (#307).
- A visible way back on phones, installed apps and the Steam Deck: a back arrow in the table header, a close on every sheet, a way out of the X-card pause and the TV view (#307).
- Hold-to-dictate key, chosen per device in Settings (#303, issue #291). Thanks @GeekSheikh for the request.
- Coordinated plans in order: the lead numbers the steps every seat sees, and the DM resolves them one after another (#303, issue #292).
- Hover a figure to see its painting large (#300), and the story log shows a speaker's portrait at more than token size (#290). Thanks @Smoebo.
- Per-table rerolls for rolled 4d6 stats, in the same plain words as the server's rule (#295). Thanks @Smoebo.
- Guided tours are finished once per account, in every browser and app; a second account meets its own tours (#308, issue #306).
- Quick Start's clock opens at dusk as its premise says, and the default calendar's third weekday is Midweek (#296).
- The composer's mic hides on a server with no speech engine, and a versatile weapon stops offering two hands beside a shield (#278, #285).
- WorldForge's wiki rows keep their height in a long list (#285, issue #282).
The storyteller
- A move posted while the DM is still thinking is answered, and sits after the narration it was never part of; the same holds when a halted turn is retried (#310).
- A character the enemies just ahead of them put down rolls the death save that begins their turn (#311).
- A reply that is the model's plan rather than narration no longer reaches the table (#297), and a model that starts repeating itself is stopped (#276, thanks @Xargot).
- The DM calls
move_partyin the reply that narrates an arrival, and a return keeps the place it left (#283, thanks @mcerina). - A server set up with no pictures stops queuing maps and scene art against a ComfyUI that is not there (#277).
- opencode 2.x is driven with its own config and a checked lockdown, and leaves no session behind (#299, thanks @mcerina).
- A character joining a table above its level gets the Ability Score Improvements it skipped (#303, issue #293).
Tested the way a table plays
New end-to-end suites drive whole fights, Begin, a turn the backend fails and its Retry, physical dice across a restart, building and levelling a character, two players acting at once, and falling and being healed (#279, #284, #286, #287, #289, #310, #311). Thanks @Smoebo. They found and fixed: a dead enemy told it is dead rather than waiting its turn, a parked table that reads as waiting after a restart, a raised X-card raised again, and a level-up that offers a subclass the character missed.
Server admin
- A restore copies the archive in beside the world and swaps it in, so it works on Docker volumes and never leaves the world half replaced (#294).
- The clone command in the docs names the real repository and clones only the latest commit (#281, thanks @mcerina).
Full changelog: v0.26.4...v0.27.0
v0.26.4 - No model named in code, image models ranked for your hardware, player agents in fewer steps
No model is named in the code any more: every picker lists what its backend serves, judged against the models.dev catalog and this machine's memory. Also: a catalog of 43 ComfyUI image models ranked for your hardware, Claude Code's own model list, a player's agent seated in a few steps, table panels you can move and resize, and a much shorter README.
The storyteller's models (#273, #266, #265)
- The text, utility and agent pickers list what each backend actually serves (
/models, Ollama's tags, an agent program's own list), merged with the models.dev catalog: context windows, tool calls, prices and deprecations. The catalog is bundled, cached beside the database and refreshed daily, and works offline. - Nothing is preselected that the backend does not list. A server that lists exactly one chat model runs it with the field left blank, so a plain llama-server or a single Ollama pull keeps working with no setup.
- Models this machine cannot hold, or that cannot call tools, are kept off the list; one click shows them.
- Claude Code now lists its own models from its
initializeanswer: Opus 5.5, Fable 5.1, Sonnet 5.5 and Haiku 5.5 today. Fast is offered where Claude Code says the model has it, and the light model for bookkeeping is picked by price. A saved model it no longer lists stays visible and keeps running. Thanks @mcerina. - A test now fails if a model ID is written into
src/. Thanks @Smoebo.
Pictures (#263, #272)
- Admin > Images and the guided setup list 43 ComfyUI image models, each with its download and its speed and memory as measured on the hardware tested so far, ranked for the machine ComfyUI runs on. Models that cannot paint there are left off.
scripts/bench-image-models.mjstimes them on your own machine.
Player agents (#270)
- Admin > Player agents: allow a receiver's HTTPS address, live at once, no restart.
- Settings > Connected agents offers a receiver file already filled in for your character, and checks whether the server may reach your address.
node scripts/player-webhook-receiver.mjs --setupasks for the token once, keeps it in the operating system's credential store, signs the receiver's Codex in and registers the webhook. Thanks @Smoebo.
At the table
- The table's panels move, resize and stay where each player put them (#267, client issue 46).
- Ready commits to one action, any readied action can be released off turn, and an enemy out of reach holds its ground while a trigger waits (#271, issue #264).
- On a phone, a dropdown near the bottom of the screen no longer takes the tap that opened it as a choice.
Your world
- Move your world now carries the installed world packs, and an import brings them back (#268, issue #269).
Docs
- The README is now a front page plus a tree of documents under
docs/: install, Docker, the engines, server admin, voice and dice, storage, and the text backends with the DM model's tuning notes.
Full changelog: v0.26.3...v0.26.4
v0.26.3 - Community fixes, six player issues, readable tokens and the lore tools
Everything merged since v0.26.2: the 2026-10-11 audit and its community fixes, six player-reported issues, the leaner cached DM prompt, readable board tokens and UI glyphs, the lore and facts tools for connected agents, and the Story panel that shows Chapter 1 when it exists.
Play
- Settled offers reach the AI DM (#239, PR #247). Accepting or declining an item or coin offer writes a system line the DM reads as the player's answer; the game state lists what still waits and what was settled, and a repeat of the same offer is refused with the reason.
- Each player arranges the Party cards their own way (#240, PR #247). Arrange mode with a drag handle, arrows and Reset; the order is saved on the membership.
- Travel formation (#230, PR #241). The Party panel arranges, saves and proposes it; every DM turn reads it,
start_encounterstands the party by it. - Customize Hand (#231, PR #241). Players choose which cards keep the eight visible seats, saved per sheet.
- Action-economy fidelity (#233, PR #241). One reaction gate for every tool, counters that act on the hit, Channel Divinity options, Psionic Energy and Battle Master maneuvers costing what their text says, feature bonus attacks charged and resolved. PR #235 (mcerina) charges every limited-use feature its action, bonus action or reaction and shows the turn's count.
- Concentration (#252, PR #261). Concentration spells are marked and a cast that would end one asks first, with or without the content pack.
- Coordinated actions (#254, PR #261). The party stages a plan before one AI DM resolution; the plan reaches every seat.
- Ask the DM keeps the end of recent narration (#250, PR #261), and the WorldForge relevance query no longer cuts the newest message either.
- The AI DM plays the enemies a pass left due (PR #243, mcerina), and reads a narrated feature spend as what it was, never as a spell nothing paid for (PR #237, mcerina).
- A leaner DM prompt that stays cached from turn to turn (PR #238, mcerina). The moment-to-moment game state stays in the system message by default (the default local model skipped rolls with it after the history);
DM_MOMENT_AFTER_HISTORY=1opts in for a server that caches the prompt's start.
Characters
- Library build editor (#229, PR #241). Edit build and Duplicate and edit open the builder on a stored character at its own level.
- Subclass training reaches the sheet (#251, PR #261). Life Domain, Lore and the authored subclasses grant their proficiencies at creation, edit, import and level-up; a boot resync adds what existing sheets were missing.
- Fast processing (#255, PR #261) for model connections that offer it, from the admin panel and the apps' Story AI door.
Story
- Chapter 1 shows as soon as it exists (PR #259, Xargot). Its creation is now published to the table; the panel merges the full list it reads; an arc card is tied to its campaign.
- AI Story Setup warns before running over an imported Storyboard (#249, PR #261), and builds on the prepared arc when kept on.
- Load states render as what they are (PR #258, halr9000, #257). The Story panel and the workshop shelf showed "(loadError ?" as text with both branches; a suite now walks every component for the pattern.
Connected agents
odm_write_loreandodm_get_facts(PR #260, halr9000). Create, patch and delete lore entries and read the tracked fact register over MCP, under the routes' own story-authority checks.
Pictures
- Board tokens readable at 40 px. Codex's close-ups and five new genre subjects (PR #248), Grok's ten monster type close-ups (PR #246), the creature families and genre enemy tokens (PRs #242, #244, #245), and aboleths in place of the beholders with creature-art guidance (PR #236), all Smoebo. The placeholder set grows to 27.8 MB.
- Readable UI icons (PR #256). The session tabs, workshop systems and menu verbs redrawn for small sizes with guaranteed contrast.
From the 2026-10-11 audit and its community PRs (already on main)
- The audit (PR #203): portal and stream lifetimes, request limits, lighter table pages, a WorldForge web that never freezes, bounded replay and queues, PDFs that open; pictures for their table only, the story kept forever, worlds that move between devices.
- Weights read right and the Carried tile opens its breakdown (#205, #206, #214, PR #228); text boxes say their limit, the Chronicle follows the newest line (#207, #209, #210, #212, #213, PR #234).
- Xargot: harness EBUSY, rewind of quest and scene state, lobby replacement, cover polling, zero spell-slot capacity, zero narration volume, scene participation limits, admin drafts during agent saves, master mute on stings, image-variant worker startup, ambience refresh and retry, setup model discovery, tunnel cleanup retries (PRs #208, #215 to #227). mcerina: the board after the enlarged view (#211), the chronicle shows whole entries (#232).
- A browser regression harness (
npm run test:browser) drives the built server in a real Chromium, on the server's pages and on the app's native screens; the Linux smoke runs it.
Full changes: v0.26.2...v0.26.3
v0.26.2 - The sound library as a 76 MB Opus download, one tap from the Sound panel; majority-voted thumbnails
The sound library shrinks by half and leaves the apps, which fetch it with one tap, and the placeholder thumbnails are the ones three art reviews voted for.
Sound library (#202)
- Opus. All 89 tracks are re-encoded at 64 kbps: 146 MB to 76 MB, the same 77 cues with the same credits. Six
.oggfiles that secretly carried a Theora video stream are clean now.npm run fetch-ambiencere-encodes anything it adds the same way. - The apps download it instead of shipping it. Client 0.17.2 leaves
public/ambienceout of its bundled server (the library had tripled every installer, and pushed the Android bundle past Play's size limit). An admin at a table with no library sees a Download the sound library button with progress right in the Sound panel, and the table hears the first cue when it lands. The admin panel's Sound library card does the same. - Gentle on a phone. The pack installer creates the folder when it is missing, streams the download to disk and writes one track at a time, so a phone hosting a world holds the zip plus one track in memory, not three copies of the pack.
ambience-pack.zipon this release is the Opus library the apps fetch; a server set up from the source already has it inpublic/ambience.
Pictures (#201, Smoebo)
- 171 placeholder thumbnails replaced and six workshop plates added (region, party, factions, homebrew, plugin, share), chosen by majority vote across three art reviews: 98 Codex and 79 Grok winners, with every vote, hash and size recorded in
docs/art/majority-vote-2026-10-11.json. The placeholder folder grows from 5 MB to 16 MB; the budget check allows 18 MiB.
Model backends
- A backend connection the other side dropped before answering (a local llama-server or Ollama idling out a keep-alive socket in the instant a request lands on it) is asked again once on a fresh socket instead of telling the table "The model is unavailable". A server that is down, a refusal, a timeout and a cancelled request are not retried. Ask the DM logs what the backend actually said.
Full changes: v0.26.1...v0.26.2
v0.26.1 - Table language, the sound panel and its library, several characters per player
A table can play in its own language, a sound panel with a shipped open-licensed library, one player fielding several characters everywhere, and a batch of community fixes.
Table language (#183, mcerina, closes #57)
- A campaign gets a Table language setting (15 languages, English by default). Every model call that writes for people writes in it.
- Nothing on the server reads story or player text through an English word list any more. The AI's turn is read by one utility call per narrated reply that returns quoted claims; the engine still rules on them, so the narration guard, the fake-encounter catch and prose roll asks work in any language.
- Word matching (safety lines, waypoints, lexical retrieval, NPC goal collisions, rulebook search) stems with Snowball for the table's language.
- Embeddings only rank: the retrieval cosine floors, the waypoint embedding tick and the cosine fact dedup are gone; waypoints tick from the DM's step tag or the judge, and the extraction calls decide which facts retire. The README now suggests
Xenova/multilingual-e5-smallfor non-English tables. - Structural data replaces word reading: system lines store their icon, a place and a fight store a kind of scene (map theme, ambience bed, placeholder art follow), names compare and sort by Unicode, who speaks a quoted line is decided on the server and stored, voice gender is a field the DM states.
- Images get English prompts: at a non-English table the story text is rewritten into English inside the image job.
- Also fixed along the way: Ask released its agent slot late, the assist prefill guessed select values, the first suggestion took 8 to 11 s, every new campaign opened in "Thornhollow", embedding failures were silent, and "no thinking" never reached llama-server.
Sound panel and library (#182)
- A Sound panel at the table: now playing, Room and Music rows with takes per cue, Next, per-layer level, and tile pickers for whoever steers the story.
- The library ships with the project: 89 open-licensed recordings for 77 of 78 cues (OpenGameArt, Kevin MacLeod, radio aporee, Wikimedia Commons, Freesound), each credited under its own licence.
npm run fetch-ambiencecurates more,npm run pack-ambiencebuilds theambience-pack.zipthe admin panel installs.
One player, several characters (#190, #194, #199; closes #185, #186, #187, #189, #192, #193)
- Play as moves every combat control at once: the Hand, the turn HUD, the composer placeholder and the board projection follow the selected sheet, and the character whose turn it is acts while the turn lasts.
- The enlarged board carries the Play as strip, the Point and Draw tools, the move hints and target chips, and keeps its own camera.
- Reach is measured to a creature's nearest square, so a Large enemy strikes from its own edge and flanking a Large target means opposite edges or corners.
- A companion-role library character is refused at every player door and can be handed to the DM (
companions/adopt); a sheet update replaces that sheet only, so a player's other characters stay in the party list. - Dice, hit dice, library saves and spoken words follow the sheet the player names; the floor keeps its own refusals (carries #191, laurentsparks-art).
Agents and assistants (#195, #196)
- Agents read the DM's whispers (
odm_get_whispers,odm_whisper_dm), Ask and the timeline say exactly what they read, and the MCP server hands a connecting agent scope-aware instructions (carries #180, Smoebo). - The assistant relay forwards every
Mcp-*header, so the 2026-07-28 MCP handshake and tool calls both pass (carries #181, Xargot). Takes effect when the broker worker is deployed.
Pictures (#198)
- Z-Image Turbo as a ComfyUI image model: the server finds the model's own files from ComfyUI's lists, the admin picker, setup wizard and installer agree, and a missing file is named before a job is submitted (carries #188, Xargot).
Build (#197)
- Dependencies updated (Next 16.4, MCP server 2.3.1, Radix, mediasoup, lucide) and run-time state kept out of the standalone file trace; the LICENSE ships again;
scripts/test-build-trace.mjsguards both (carries #184, mcerina).
Data
- SQLite adds nullable
campaign_messages.glyph,campaign_messages.speech_jsonandnpcs.gender; a place's scene lives in its existingambience_json. Nothing is back-filled: older lines show the neutral icon and no speaker faces.
Full changes: v0.26.0...v0.26.1
v0.26.0 - WorldForge, workshop rules fidelity, a travelling Market and the rules audit closed
The workshop runs the rulebook end to end and gains WorldForge as its own tool, a written Market travels with its prep and stays as the table left it, the 2014 rules audit's 50 gaps close at their roots, connected agents read a long campaign whole and can be woken by signed decision webhooks, the race and class placeholders are painted portraits, and Codex's lockdown uses the keys Codex honours.
Rules at the table
- The 2014 D&D rules audit of the core flow (29 findings) and the 21 related gaps found by mapping each one's reach are closed at ten root causes, each held by a suite that states the SRD rule and reads stored state with forced dice: one save builder for death, concentration and repeat saves (Bless, Bane, exhaustion, Lucky, auras); conditions as per-source instances with durations, end-of-turn saves and a concentration clock for characters and enemies; Aid's maximum HP follows the strongest casting; Legendary Resistance settles the save it answers, Evasion through one helper, the Arcane Ward before resistances; Shield, Absorb Elements and Counterspell need their trigger, one legendary action per completed turn, the lair acts at count 20; one placement of a sphere, cube, cone or line with its origin in range; priced and per-unit material components, a focus or pouch for the rest; Absorption, Immutable Form, Limited Magic Immunity, Martial Advantage and Life Drain, with every unread monster trait shown "By hand". (#177)
- An AI DM's damage, healing and binding conditions need dice the server rolls or an unspent server total; the console keeps its free hand. (#177)
- Rituals are cast only through a ritual caster's own hold or the ritual book; a reaction spell on one's own turn counts toward the bonus action spell rule; Quickened Spell is a Sorcery Points spend that hands the next one-action spell to the bonus action; the spell book and the cast result say "partly by hand" or "narrated" for the 28 spells the server settles only in part; the info line no longer calls every spell "concentration · ritual". (#177)
- Thieves' tools expertise, the artificer's attunement slots, owed choices shown on the sheet, and a subclass spell at its own class's DC. (#177)
Workshop
- Every workshop tool carries and enforces the rules the engine runs: a "Start from" copy of a published monster, spell, magic item, subclass, species, feat or background behaves at the table exactly like the original, hazards (traps, poisons, diseases) are a homebrew kind the engine runs by name, an NPC can fight as an SRD stat block or one of the DM's own, and the checker under the editor reads every kind against the SRD's norms, with a page link to the rule. Copies start as "Variant", forgetting archives, and every book page offers "Start a workshop copy of this". (#169)
- WorldForge, Smoebo's world-building app, is built into the workshop as its own tool: every entry is a record the table already plays (a Character is a Cast member, a Location a place, a Faction a faction), with the rest in one document per workshop. Wiki, Web (links, family tree, chain of command, as truth or belief), Timeline with converting calendars, Atlas with pins and regions, Secrets with keepers, a stub scan and a type manager. Forge, Ask the world, Draft and Paint appear only when the server has the AI for them. WorldForge files import and export whole, a new
worldimport kind and bundles carry it, and the AI DM is told each NPC's hidden truth and the secrets the party has not learned. (#169) - A Market shop written in a workshop travels through bundles and campaign imports with its place, keeper, shelf and policy, and a played shelf stays as the table left it:
open_shopreopens a shop as it stands, restocks refill the prepared shelf, the lead of an AI table may prep shops, imported shops start their restock cycle on the target's clock, duplicate pool lines and duplicate shops are gone, and a keeper must belong to the campaign. A shelf editor with catalog picks, hand lines and coin prices. (#172, fixes #171)
Agents
- Connected agents read a long campaign whole: every tool result is bounded as valid JSON with a note naming what was cut,
odm_get_campaignputs the safety pause, DM status, caps and pending rolls first,odm_get_messagespages the transcript, andodm_get_sheetreads the table's copy of a character. (#166) - Player decision webhooks by @Smoebo: a player's agent can be woken by a signed webhook when a decision is its to make, with an allowlist of receiver origins, HMAC signatures, a SQLite outbox and guarded writes; a Codex receiver and a Claude Code routine path are documented. Review follow-ups: a refused submission no longer locks the decision, the webhook tools appear only when delivery is on, the receiver reads the table's sheet, hosted receivers take an Authorization header and extra headers. (#165, #167, #173)
- Codex's lockdown uses the keys Codex honours (
features.view_image,agents.enabled), the probe names any key the installed Codex ignores on the admin card, and Codex's own Windows install location is searched. (#178)
Pictures
- The faceless race and class silhouettes are painted head-and-shoulders portraits by @Smoebo: 22 races and 51 classes, each masculine, feminine and neutral, so a neutral character in a genre class gets its own plate. 256px WebP at quality 70, about 10 KB each; the placeholder budget rises from 3.5 MB to 4.5 MB. (#174)
Dependencies
@modelcontextprotocol/server2.2.0 (Snyk, insufficiently protected credentials in the SDK's OAuth client providers). ODM's MCP endpoint builds a fresh server per request, which is the shape the new SDK requires. (#164)
Full changes: v0.25.0...v0.26.0
v0.25.0 - Guided setup, assistant links, a steering seat and quick start
Setting up a server is one command and a wizard, ChatGPT, Claude, Grok or Meta Muse can play on a device world through one lasting link, an AI table can seat a person who steers it, a shared server decides who may start campaigns and spend paid AI, a quick start seats four ready heroes in two clicks, workshops carry everything they lean on, and every feat does what its text says.
Setup
npm install && npm run setupmakes the database key (never over an existing database), the content pack, the memory model and the build. The boot banner prints a link that fills in the setup code, and the first admin lands in the guided setup. (#160)- The guided setup (
/setup) walks seven short steps over the admin settings: the storyteller (it scans this computer for llama.cpp, Ollama, LM Studio, vLLM, KoboldCpp, TabbyAPI and Jan and lists their models, or takes an API key, an agent program or a person, each tested live), pictures and voice, players, your own agent over MCP with a lamp that lights on its first call, and a live check of what works. The home screen offers it to an admin whose storyteller is not answering. (#160) - A saved API key only goes to the host it was saved for: the wizard clears it when the storyteller moves host, and Test backend no longer tries it against a newly typed address. (#160)
Agent programs and assistants
- Agent pictures reach the table. A campaign made before agent pictures were switched on kept painting with a ComfyUI that was not there; campaigns on a backend that cannot paint now move onto the working default, maps back on. Admin > Paint a test picture paints a landscape map through the tables' own queue and lists the campaigns that could not paint, and a failed picture says why at the table. (#160)
- Assistant links: a device world gets one permanent link that ChatGPT, Claude, Grok and Meta Muse save as a custom connector. It follows the world to every new share address, carries an existing connection grant (scoped, revocable in Settings, no sign-in), and the relay is rate limited per world with a daily cap. (#161)
At the table
- A steering seat for AI tables: the AI narrates every turn while a person plans with it and steps in, and a disputed ruling is settled by that person or by a table vote. (#144)
- Vitals need confirming: a game setting sends the damage, healing and conditions a DM aims at a player to that player for approval, as item offers are. (#142)
- Every event type declares its audience and an undeclared one reaches nobody; damage figures and the cover brief stay on the server. (#143)
- A quoted line goes to whoever the prose says spoke it (the line's tag, the subject of the sentence before, the action after), not to the nearest name. The same reading picks transcript faces, theatre inserts, narration voices and voice casting; accented names are found, and Say mode no longer quotes a line twice. (#152)
- A list that did not load says so, with Try again, in the DM panels and twenty-one more views, instead of "nothing here yet". (#140)
- Four gap-hunting suites, and the five defects they found fixed: A lasting effect (
set_effect) runs again for both DMs, NPC reactions with a penalty roll, conjured creatures that fade end the caster's concentration, area damage and reactions are not offered at a quiet table, and a rolled level-up hit die shows its dice card. (#135)
Shared servers
- Admin switches for who may start campaigns and whose tables may spend a paid AI backend (a keyed backend on a public host), and a usage ledger per account and campaign, in tokens, under Admin > Usage. (#137, #138)
- Quick start: a one-evening adventure with four ready-made heroes, from the home menu to a seated table in two clicks. New campaign and Quick start hide for accounts the admin keeps from starting campaigns. (#145)
Workshop
- Copies and imports keep every column and every reference: fight extras and map bindings, map layers, place maps and sounds, NPC voices, roll tables' no-replacement, the region map's paths and labels. Archived NPCs stay archived, and a second import keeps what the first brought instead of numbering duplicates. (#153)
- AI-campaign leads can use imported prepared fights and maps: the storyteller sees the prepared fights and can run one, and the DM's private prep notes reach its prompt. (#154)
- Bundles carry their links (cards, fights, maps, the region map, lore pins, NPC voices) and the world pack draft, and a chapter bundle names what it depends on. (#155, #158)
- Storyboard: a fight card uses the fight it picked, a fight the arrows run through becomes a beat, arrows can be one route of several or "only if", and "Add them as act N" joins a later board to an arc already played. (#156, #157)
- A chapter workshop can draw on one shared workshop: its pickers list the shared cast, places, maps and fights, and links stay live. (#159)
Character creator and feats
- Feats teach their spells with free casts (Fey Touched, Shadow Touched, Spell Sniper, Magic Initiate, Ritual Caster), and the combat feats reach the table: Great Weapon Master and Sharpshooter's power attack, Elemental Adept, Gunner, Mage Slayer, Defensive Duelist and Dungeon Delver. (#125)
- Content pack feats (Level Up, Tome of Heroes) grant what their text says, with skill-or-tool picks, their ability point and prerequisites, and every feat's rules reach the engines and the DM prompt. (#147)
- Priced pack gear outside the bundled table can be bought at creation, at the pack's price. (#136)
- A background kit line that offers a kind of tool opens on the tools of that kind. (#127)
- The Abilities step's Final counts feats, improvements and Primal Champion; a barbarian made at 20 gets its +4. (#149)
Full changes: v0.24.9...v0.25.0
v0.24.9 - Local models get their window back, feats grant what they say, GPT-6 and Codex run a table
Local models get their whole window back, an imported workshop seats its importer as DM, the character creator loses no pick and applies what a feat grants, OpenAI's GPT-6 models run their tools, and Codex and Docker installs can run a table again.
Storyteller
- The DM prompt budgets the tool definitions (about 27K tokens on every call) and scales the reply reserve to the window, so a 64K llama-server turn no longer ends empty or with "The fight is over" mid-fight. The Context panel shows a "Tool definitions" row and counts it, and an empty reply that hit the output cap is named in the server log with the prompt size. (#120)
- OpenAI's GPT-6 models call their tools where they can: GPT-6 Sol and Luna on Chat Completions without reasoning, GPT-6.1 Sol and GPT-6 Astra over the Responses API. A model the table has not heard of learns its route from OpenAI's refusal within the same turn, and tools are never dropped in silence on api.openai.com. Admin > Test backend shows the route. (#129)
Workshop
- A bundle imported into the workshop seats its importer as the human DM, so Storyboard, Battle maps, Encounters, Cast and Tables draw their rows. Workshops imported before this release are reseated at boot. Lore counts its entries and Region counts the overworld plus its places. (#121)
Character creator
- A Variant Human picks its feat on the Ancestry step and cannot finish without one; a racial skill that overlaps a class pick is asked for again instead of lost; a pick set aside by changing the race, class or background is announced with a Show me. (#124)
- Feats grant what their text says: Linguist's languages, Skill Expert's skill and expertise, Heavily Armored's armor, Weapon Master's weapons, Tavern Brawler's improvised weapons and the rest, picked beside the feat in the builder and at level-up, and held to by the server. The character page and the table's sheet show "Languages and training". Spell-granting and combat feats remain text for now. (#125)
- Background kit lines that leave a choice follow the pick: "a set of artisan's tools of your choice" is filled from the tool the player chose, and either-or lines (Innkeeper's brewer's supplies or cook's utensils, Destined's dagger, quarterstaff or spear) are pills on the gear step. (#127)
- A kept 4d6 roll is shown as kept, with its date, instead of replaying the throw; switching to point buy or the standard array says the roll stays on record. The reroll threshold is an admin setting under Admin > Server (0 allows no second throw). (#128)
Agent programs and Docker
- Codex may call the table's tools again: ODM's MCP server is pre-approved for Codex, while commands and file changes stay refused. (#131)
- An agent program installed inside the Docker image counts as available. The image carries the system CA store,
AGENT_PROGRAMSbakes a program in at build time, and named volumes keep the program's sign-in and the speech model across updates. (#132)
Full changes: v0.24.8...v0.24.9