• v3.11.4 6ee2bb9118

    v3.11.4
    All checks were successful
    CI / Backend lint (ruff) (push) Successful in 26s
    CI / Bot/backend version sync (push) Successful in 23s
    CI / Docker image build (push) Successful in 11s
    CI / Bot tests and audit (push) Successful in 2m27s
    CI / Frontend tests, audit, and build (push) Successful in 2m36s
    CI / Backend migration, tests, and audit (push) Successful in 6m9s
    Release / Create Forgejo release (push) Successful in 12s
    Release / Build and push versioned images (push) Successful in 21s
    Stable

    rbrooks released this 2026-08-07 06:18:26 +00:00 | 511 commits to main since this release

    Silent failures made visible, and a frontend toolchain that had been building
    on an end-of-life runtime.

    No migrations; BOT_CONTRACT_VERSION stays 1, so the backend and bot images can
    be upgraded independently. Self-hosters who build their own images will pick up
    Node 22 for the frontend stages automatically — nothing to change by hand.

    Changed

    • [webapp] Migrated the router from react-router-dom 7 to react-router 8.
      In v8 the react-router-dom package was folded into react-router itself and
      is no longer published, so staying on 7.x meant staying on a line that will
      receive no further fixes. This also clears the last allowlisted advisory
      (GHSA-qwww-vcr4-c8h2): the allowlist is now empty, so the audit gate is a
      real check rather than a formality. No behaviour change — every routing API in
      use is exported unchanged from the new package. (#284)

    • [webapp] The frontend is now built and tested on Node 22 instead of Node 20.
      Node 20 reached end-of-life on 2026-04-30 and no longer receives security
      patches, so the production frontend image was being built on an unsupported
      runtime. CI and both Dockerfile frontend stages move together, deliberately —
      testing on one major while building the image with another is how a
      runtime-only break ships green. This also unblocks #284, since react-router v8
      requires Node ≥ 22.22.0. (#284)

    Fixed

    • [webapp] Approving a wiki proposal with no working LLM quietly produced a
      worse entry.
      When an LLM was unavailable, approving a proposal that updates
      an existing entry pasted both versions together instead of merging them, and
      said nothing — the result was indistinguishable from a successful merge. It
      still falls back to appending, since that beats refusing the approval, but it
      now records that it did. This also covers a misconfigured endpoint rather
      than merely an unconfigured one: a malformed URL was silently treated as "no
      LLM configured", sending GMs to a settings page that already had a value in
      it. That case is now logged too. (#287)

    • [ops] Docker builds no longer ship the whole working tree as build context.
      The repository had no .dockerignore, so every build of every target sent
      ~226 MB of node_modules plus the full .git history to the daemon. On a
      Windows host it also failed outright, because npm's symlinks under
      node_modules/.bin do not survive the bind mount — making it impossible to
      build the production image locally to verify a change. CI never saw it, since
      a fresh checkout has no node_modules.

    • [webapp] A response the model cut short was silently turned into a partial
      result.
      When an LLM stopped because it hit its output budget, the transport
      returned the half-finished body as though it were complete. The tolerant JSON
      parser then salvaged the longest valid prefix from it, so a reply that should
      have carried twelve wiki proposals could arrive as three — indistinguishable
      from a session that genuinely produced three, and logged as a successful
      recovery. Truncated structured responses are now rejected so the caller fails
      loudly and can retry, rather than persisting a quietly incomplete result.
      Truncated prose is still returned, since it is shortened rather than
      corrupted. Covers all four providers — llama.cpp, OpenAI, Anthropic and
      Ollama, each of which signals this condition differently. (#293)

    Downloads
  • v3.11.3 e5059aa82a

    v3.11.3
    All checks were successful
    CI / Docker image build (push) Successful in 18s
    CI / Frontend tests, audit, and build (push) Successful in 1m17s
    Release / Create Forgejo release (push) Successful in 34s
    CI / Bot/backend version sync (push) Successful in 2m23s
    Release / Build and push versioned images (push) Successful in 54s
    CI / Backend lint (ruff) (push) Successful in 2m32s
    CI / Bot tests and audit (push) Successful in 4m41s
    CI / Backend migration, tests, and audit (push) Successful in 8m24s
    Stable

    claude-bot released this 2026-08-06 17:04:39 +00:00 | 522 commits to main since this release

    Wiki entry summaries came out as JSON.

    v3.11.2 was tagged but never deployed to production — this bug was caught on
    the dev deploy and supersedes it. Upgrade straight to 3.11.3. No migrations;
    BOT_CONTRACT_VERSION stays 1.

    Fixed

    • [webapp] Wiki entry summaries were generated as JSON instead of prose. The
      summary generator asked the model for "plain prose only" while the underlying
      transport was still in JSON mode with the lore-proposal instructions attached,
      so entries came out with a summary of {"proposals":[]}. The bug predates
      v3.11.2, but was only reachable through the manual "regenerate summary" button;
      v3.11.2 made summaries generate automatically on every approval, which would
      have written JSON into the summary of every entry a GM approved. (#285)

      Existing installs are unlikely to be affected — the generator had no automatic
      trigger before v3.11.2, so only entries where the manual button was used could
      carry a JSON summary. Re-running "regenerate summary" on such an entry now
      produces prose.

    Downloads
  • v3.11.2 f668a6523d

    v3.11.2
    All checks were successful
    CI / Backend lint (ruff) (push) Successful in 30s
    CI / Bot/backend version sync (push) Successful in 23s
    CI / Docker image build (push) Successful in 10s
    CI / Bot tests and audit (push) Successful in 1m20s
    Release / Create Forgejo release (push) Successful in 12s
    Release / Build and push versioned images (push) Successful in 52s
    CI / Frontend tests, audit, and build (push) Successful in 2m48s
    CI / Backend migration, tests, and audit (push) Successful in 7m52s
    Stable

    claude-bot released this 2026-08-06 01:00:07 +00:00 | 525 commits to main since this release

    The rest of the LLM trigger audit, and a test suite that stops waiting on a
    broker that was never there.

    Follow-ups to the audit that produced v3.11.1: five features that were wired to
    the wrong event, or to no event at all. No migrations, and
    BOT_CONTRACT_VERSION stays 1 — nothing touches /api/bot/*, so images can be
    upgraded independently.

    Fixed

    • [webapp] The session prep sheet only saw the opening of the last session.
      Every recent summary was truncated to a flat 800 characters, against real
      summaries of 1700-2900 — so prep was drafted from roughly the first third and
      never saw where the party ended up. Truncation also kept the beginning,
      discarding the ending, which for prep is the most useful part of a summary.
      The most recent session now gets a near-full budget and, if it ever exceeds
      it, keeps both its opening and its closing. (#271)
    • [webapp] Lore generation could hang forever. If a phase of the multi-pass
      lore pipeline ran out of retries, nothing cleared the session's extracting or
      matching status — the UI showed "generating…" indefinitely, with no error.
      A brief network blip to the LLM host was enough to trigger it. A missing LLM
      endpoint now also fails immediately instead of burning several minutes of
      backoff on a condition that cannot resolve itself. (#287)
    • [webapp] Wiki entries never got their one-line summary. The generator had a
      single caller — the manual "regenerate summary" button — so every entry created
      by approving a bot proposal, promoting a shelf card, or picking a canonical
      name had an empty summary permanently. Summaries are now generated whenever an
      entry becomes canon. (#285)
    • [webapp] Relationship suggestions never saw the session that just happened.
      They were generated the moment the lore pipeline finished, but only consider
      approved entries — and everything just produced was still an unapproved
      proposal. They now run when you approve entries, debounced so working through a
      batch produces one pass rather than one per click. (#286)
    • [webapp] Some GM Workbench generations were missing from history. Three
      paths ran tools without recording them, so those generations never appeared in
      Workbench history and their token usage went uncounted. All inline tool runs are
      now recorded, including failed ones. Caches are unchanged. (#288)
    • [webapp] A queued background job could stall a request. With an
      unreachable Redis, a single enqueue took about two minutes to fail, which
      presented as a hung request rather than a degraded background job. Now bounded
      to under 15 seconds.

    Changed

    • [dev] The backend test suite runs in 36 seconds instead of 16 minutes for
      the same 880 tests. Most of that time was never work — with no broker in the
      test environment, every queued job waited for a connection that could not
      happen. Applies to CI too, which runs Postgres but no Redis.
    Downloads
  • v3.11.1 01c9f86197

    v3.11.1
    All checks were successful
    CI / Frontend tests, audit, and build (push) Successful in 1m54s
    CI / Bot/backend version sync (push) Successful in 24s
    CI / Docker image build (push) Successful in 13s
    CI / Backend lint (ruff) (push) Successful in 42s
    Release / Create Forgejo release (push) Successful in 26s
    CI / Bot tests and audit (push) Successful in 1m52s
    Release / Build and push versioned images (push) Successful in 55s
    CI / Backend migration, tests, and audit (push) Successful in 9m1s
    Stable

    claude-bot released this 2026-08-05 18:32:14 +00:00 | 534 commits to main since this release

    Approval was unreachable, and the quote board was failing silently.

    Three bug fixes found while investigating why a recurring session was offered
    no title suggestions. One new migration (e0f1a2b3c4d5), additive and with
    a best-effort backfill. BOT_CONTRACT_VERSION stays 1 — no /api/bot/* change,
    so images can be upgraded one at a time.

    Fixed

    • [webapp] GM approval was unreachable on a default install. sessions. audio_processing_status conflated where the audio file is with whether the
      GM had signed off on the content. Under the default retention mode
      (delete_after_processing) the status jumps straight to approved — which
      means "audio deleted", not "GM approved" — so the approve endpoint, which
      required ready, could never be called. Everything gated behind it was dead:
      publishing session highlights to players, reposting the GM-corrected summary
      to Discord, journal entries, and next-session title suggestions. Content
      approval now has its own state and its own endpoint,
      POST /sessions/{id}/approve, gated on having a summary rather than on audio
      state. POST /sessions/{id}/audio/approve remains as a deprecated shim.
      Transcript editing and the feedback tally were gated the same way and are
      likewise fixed. (#278)
    • [webapp] Post-summary tasks fired from three places that didn't know about
      each other
      , so a hand-edited summary rebuilt the campaign storyline and
      nothing else. Replaced with a single fan-out that distinguishes the initial
      transcription from a later edit — the recap email and lore extraction no
      longer re-fire because a GM fixed a typo. (#278)
    • [webapp] Title suggestions generated from nothing, and destroyed
      themselves on failure.
      The task read context from completed sessions but
      runs while the session is still confirmed, and on any LLM error it
      overwrote a good suggestion set with an empty one plus a fresh timestamp.
      (#278)
    • [webapp] The quote board was silently empty. Endpoints that accept
      response_format: json_object without enforcing it can return structurally
      invalid JSON, which the strict parser rejected — logging the result as
      "0 highlights", indistinguishable from the model finding nothing memorable.
      JSON parsing is now tolerant of a truncated or over-closed response, shared
      across every structured-output caller, and both repair and total failure are
      logged at WARNING. A related bug cleared existing highlights before checking
      whether the new extraction returned anything, so each retry of a failing
      session destroyed the previous good set. (#279)
    • [webapp] Admin retention warning for "delete after processing" understated
      the consequences; it now tells you to correct the transcript before approving.
      (#278)

    Added

    • [webapp] Title suggestions on the session edit form — sessions created
      from a recurring series are materialized by a background task and never pass
      through the new-session form, so this is the only place they can be titled
      from a suggestion. (#278)
    Downloads
  • v3.11.0 fe082c3e20

    v3.11.0
    All checks were successful
    CI / Docker image build (push) Successful in 15s
    CI / Backend lint (ruff) (push) Successful in 47s
    Release / Create Forgejo release (push) Successful in 18s
    CI / Frontend tests, audit, and build (push) Successful in 1m16s
    Release / Build and push versioned images (push) Successful in 1m11s
    CI / Bot tests and audit (push) Successful in 2m9s
    CI / Backend migration, tests, and audit (push) Successful in 3m26s
    Stable

    claude-bot released this 2026-07-27 19:55:48 +00:00 | 553 commits to main since this release

    The Session Reference Shelf: everything relevant to tonight, in one place.

    A per-session board the GM keeps open during play. Anything generated in the GM
    Workbench persists on the shelf for the whole session — whether or not it ever
    becomes canon — and existing wiki entries can be pinned alongside it, so there is
    no hunting a large wiki mid-scene. Cards hold the position you drop them in and
    are never auto-reflowed; the shelf is a spatial surface, not a list.

    The whole feature works offline: no LLM and no transcription is required for any
    of it (the transcript-driven layer is v3.12). One new migration
    (d9e0f1a2b3c4), and BOT_CONTRACT_VERSION stays 1 — the one new bot event is
    additive, so a mixed-version bot keeps working.

    Added

    • [webapp] The shelf itself — a per-session board of reference cards backed
      by a new ShelfCard model and GM-only API, with freeform drag-to-place
      positions that never auto-reflow, resizable cards, per-card "tonight" notes,
      and removal. (#239, #240)
    • [webapp] Add to shelf from anywhere — a shared control on every GM
      Workbench generation result and on wiki entries, defaulting to the campaign's
      in-progress or next session. (#241)
    • [webapp] Glance-compressed cards — each card shows a scannable face
      (name, a one-line want or hook, ~3 facts, a voice cue) with full detail one tap
      away, so cards read at arm's length instead of as walls of text. (#242)
    • [webapp] Spotlight / "now playing" — promote a card to a large stage;
      number keys 1-9 or the card's stage button pick it, arrows or [ ] swap, Esc
      clears. The board card never moves. (#243)
    • [webapp] Scene packs — bundle cards into named scenes during prep and swap
      the board's scene in one tap during play. Swapping hides cards, it never moves
      them, so every scene keeps the exact layout you left it in. (#244)
    • [webapp] Reveal to table — show a card to the players on Discord, in Quest
      Board, or both. Each card carries a player-safe layer separate from its
      GM-only content; when you haven't written one, the server derives a
      conservative default from read-aloud text and public summaries only — never GM
      notes or secrets — and refuses to reveal rather than guess when nothing is
      confidently safe. Players get a new "At the table" view showing only what has
      been revealed. (#245)
    • [webapp] Fast retrieval — a Ctrl-K fuzzy quick-switcher over tonight's
      shelf first and then the wiki, plus number-key hotkeys for the cards on
      screen. (#246)
    • [webapp] End-of-session sweep — one pass over every card touched tonight:
      promote it to the wiki (an AI draft cleans and merges it through the existing
      review rail), carry it forward, or discard it. (#247)
    • [webapp] Carry-forward pins + session navigation — pin a card and it rides
      forward onto every later session automatically, as an interval over the
      campaign's session timeline. Wiki cards render live; generated cards stay
      frozen to their snapshot. Completing a session harvests each wiki card's notes
      into that entry's GM notes; cancelling prunes untouched carried cards. Plus a
      session switcher, a Workbench entry point, and "copy from another session".
      (#252, #254)
    • [webapp] Warm cold-open — the shelf opens with a "previously on" recap, the
      plot threads still open, and a count of the cards carried in, so session N+1
      starts warm. The recap steps over cancelled and unsummarised sessions to find
      the last one that actually has something to say. (#248)
    • [webapp] AI story-arc suggester — a GM Workbench tool that reads recent
      sessions, arcs, threads, and wiki entries to propose candidate story arcs in
      the result rail; accepting one creates a CampaignArc. (#236)
    • [bot] Revealed cards post to Discord — a new additive shelf_reveal event
      posts a card's player-safe layer to the campaign channel. The GM-only side of
      a card never leaves Quest Board. (#245)
    Downloads
  • v3.10.0 b0a8e9e19c

    v3.10.0
    Some checks failed
    Release / Create Forgejo release (push) Failing after 19s
    CI / Docker image build (push) Successful in 54s
    CI / Backend lint (ruff) (push) Successful in 1m39s
    Release / Build and push versioned images (push) Successful in 1m16s
    CI / Frontend tests, audit, and build (push) Successful in 2m35s
    CI / Bot tests and audit (push) Successful in 4m55s
    CI / Backend migration, tests, and audit (push) Successful in 7m42s
    Stable

    claude-bot released this 2026-07-22 02:17:42 +00:00 | 602 commits to main since this release

    GM Workbench: campaign-grounded generation, right where you plan.

    GM Planning becomes a GM Workbench — a unified surface of AI tools that read your campaign's lore, plot threads, and session history to generate material you can drop straight into play or land into the wiki, all through one generation engine with a persistent scratchpad and the existing draft-review rail (nothing auto-overwrites your canon). BOT_CONTRACT_VERSION stays 1; no new migrations beyond the Phase-0 scratchpad table.

    Added

    • Generation engine + scratchpad foundation — a tool registry and one generalized POST …/workbench/{tool}/generate endpoint (sync inline or async via Celery), an extracted LLM transport, and a GenerationResult history/scratchpad. (#134, #136, #138)
    • Read-aloud descriptions, rumor mill, random tables, loot parcels, the flagship session prep sheet, instant NPCs + voice cues, and recurring-series title suggestions — each grounded in your campaign and landing through the draft-review rail. (#141, #144, #147, #149, #158, #155, #191)
    • Two-pane Workbench layout — a grouped tool palette, a center generation surface, and a persistent history rail. (#153)

    Changed

    • "GM Planning" is now the "GM Workbench" — renamed throughout (nav and header), with the eight generator tools collapsed onto one config-driven panel. (#234)
    • Searchable lore grounding — a searchable, type-grouped picker replaces the flat checkbox list, scaling to large campaigns. (#234)

    Fixed

    • Reasoning LLMs no longer break structured generation — json-mode llama.cpp / vLLM calls disable the model's think block (chat_template_kwargs.enable_thinking=false), so reasoning models (e.g. Qwen3) work with the Workbench.
    • "Nothing to convert" is no longer an error — stat conversion on an entry with no mappable stats shows a gentle informational note (nudging you to generate a stat block from scratch) instead of a red failure banner. (#233)
    Downloads
  • v3.9.1 97e88ae2a0

    v3.9.1
    Some checks failed
    CI / Backend lint (ruff) (push) Successful in 58s
    CI / Docker image build (push) Successful in 1m9s
    CI / Frontend tests, audit, and build (push) Successful in 1m54s
    CI / Bot tests and audit (push) Successful in 2m11s
    Release / Create Forgejo release (push) Failing after 39s
    Release / Build and push versioned images (push) Successful in 1m20s
    CI / Backend migration, tests, and audit (push) Successful in 5m10s
    Stable

    claude-bot released this 2026-07-19 01:02:04 +00:00 | 643 commits to main since this release

    Game-Aware Systems polish: round-trip your stat blocks, and fix them in review.

    Fixed

    • [webapp] Stat blocks survive export/import — a campaign's structured stat
      blocks were silently dropped when the campaign was exported and re-imported;
      they now round-trip intact (and bundles from before v3.9.0 still import
      cleanly). (#214)

    Added

    • [webapp] Edit stats during draft review — when reviewing a generated or
      converted stat block, a GM can now correct individual stat values inline
      (schema-validated) before approving, instead of only approving as-is or
      re-running the LLM. (#213)
    Downloads
  • v3.9.0 861e70a056

    v3.9.0
    Some checks failed
    CI / Docker image build (push) Successful in 42s
    CI / Backend lint (ruff) (push) Successful in 49s
    CI / Frontend tests, audit, and build (push) Successful in 2m11s
    CI / Bot tests and audit (push) Successful in 2m12s
    Release / Create Forgejo release (push) Failing after 18s
    Release / Build and push versioned images (push) Successful in 25s
    CI / Backend migration, tests, and audit (push) Successful in 4m58s
    Stable

    claude-bot released this 2026-07-18 19:41:35 +00:00 | 646 commits to main since this release

    Game-Aware Systems: Quest Board now understands your game system.

    Campaigns can link to a first-class registry of TTRPG systems instead of only
    free text — unlocking richer AI context, versioned schema-validated stat blocks,
    a typed stat-block editor, schema-targeted generation, and an opt-in wizard to
    backfill structured stats from existing entries. Everything is opt-in and
    reversible: free-text campaigns behave exactly as before. Foundation for the
    upcoming FoundryVTT integration. Ships four Alembic migrations. No API contract
    change — BOT_CONTRACT_VERSION stays 1.

    Added

    • [webapp] Game system registry — link a campaign to Dungeons & Dragons 5th
      Edition, Pathfinder 2e, or a system-agnostic "Generic" (or keep free text). A
      registry selector on the create and settings forms, plus a one-click "this
      looks like Pathfinder 2e — link it?" nudge for campaigns whose free text
      matches a known system. Linking never discards your free-text value. (#133, #135)
    • [webapp] System-aware AI — for a linked campaign, session summaries, name
      suggestions, and lore extraction now get real system-specific context (e.g.
      Pathfinder's ancestry/heritage/class vs. D&D's classes and ability scores)
      instead of a bare system name. Free-text campaigns produce byte-for-byte
      identical prompts. (#137)
    • [webapp] Structured, schema-validated stat blocks — versioned per-system
      stat schemas (D&D 5e and PF2e ship v1 schemas for NPCs and creatures) and a
      validated stat envelope on wiki entries, with a typed stat-block editor
      (grouped, per-field-type inputs) on NPC/creature articles and an infobox
      projection. Validation is server-authoritative; stat blocks are GM-only by
      default and snapshotted into version history. (#139, #140)
    • [webapp] Schema-targeted stat generation — the one-click "Generate stat
      block" now produces schema-valid structured stats when a system is linked
      (validating with one retry, and falling back to the free-form generator
      otherwise). (#142)
    • [webapp] Stat conversion wizard — a GM-driven, reviewed, append-only
      wizard that maps an existing NPC/creature's free-form text into a structured
      stat block via the LLM (map, not invent — with per-field confidence and
      source), driven from a per-campaign "review all" queue. Your original prose
      and notes are never rewritten. (#145)
    Downloads
  • v3.8.0 1ca68d2885

    v3.8.0
    All checks were successful
    CI / Docker image build (push) Successful in 11s
    Release / Create Forgejo release (push) Successful in 13s
    Release / Build and push versioned images (push) Successful in 24s
    CI / Backend lint (ruff) (push) Successful in 3m9s
    CI / Frontend tests, audit, and build (push) Successful in 3m52s
    CI / Bot tests and audit (push) Successful in 6m20s
    CI / Backend migration, tests, and audit (push) Successful in 8m16s
    Stable

    claude-bot released this 2026-07-18 09:11:29 +00:00 | 665 commits to main since this release

    Privacy & data lifecycle: you control what's kept, and for how long.

    Configurable retention, per-player erasure, account deletion, and a completed
    audit log — the data-lifecycle groundwork a privacy-respecting (and hostable)
    deployment needs. Ships four Alembic migrations. No API contract change —
    BOT_CONTRACT_VERSION stays 1.

    Added

    • [webapp] Configurable data retention — instance-wide defaults plus
      per-campaign overrides for how long raw audio and transcripts are kept. The
      recommended posture is transcript-only: raw voice recordings are deleted right
      after they're transcribed, and never-approved sessions can no longer hoard
      audio forever. Transcripts can optionally expire after N months (clearing the
      text + search index; summaries and wiki entries are untouched). (#119)
    • [webapp] Per-player erasure — a GM or admin can scrub a departed player's
      contributions from a campaign: their transcript lines become [removed] (the
      timeline stays readable and their words become unsearchable), their voice
      recordings and attributed quotes are deleted, and affected sessions show an
      erasure notice. (#118)
    • [webapp] Account deletion — self-service (Profile → Delete account) and
      admin-initiated. Your memberships and personal data are removed; authored
      content is anonymized to "Deleted user" so campaigns stay intact. You're
      blocked (with guidance) if you're the sole GM of a campaign, and prompted to
      export your data first. Deletion is local-only — signing in again starts a
      fresh, empty account. (#117)
    • [webapp] Audit log — the admin audit log now covers destructive and
      administrative actions with campaign scoping and target identification, a new
      filterable Audit log admin view (by actor, event, campaign, date), and
      automatic pruning after a configurable window. (#120)
    Downloads
  • v3.7.0 8ca61c8df8

    v3.7.0
    All checks were successful
    CI / Docker image build (push) Successful in 42s
    CI / Backend lint (ruff) (push) Successful in 50s
    Release / Create Forgejo release (push) Successful in 23s
    Release / Build and push versioned images (push) Successful in 30s
    CI / Frontend tests, audit, and build (push) Successful in 1m44s
    CI / Bot tests and audit (push) Successful in 2m2s
    CI / Backend migration, tests, and audit (push) Successful in 9m22s
    Stable

    claude-bot released this 2026-07-18 05:05:36 +00:00 | 680 commits to main since this release

    Table Tools: projecting the recording → recap → wiki pipeline onto new
    player-facing surfaces.

    Loot & XP tracking, a player-visible quest log, a session quote board, attendance
    auto-fill from recordings, LLM session-title suggestions, one-click NPC/creature
    flesh-out, and a "Previously on…" pre-session recap. Ships five Alembic
    migrations. No API contract change — BOT_CONTRACT_VERSION stays 1 (every bot
    change this release was purely additive).

    Added

    • [webapp] Party loot ledger + XP & gold tracking — track who's carrying
      what, party XP (pooled or per-member), and a running gold ledger, per campaign
      and per session. Optional "players can add entries" setting; loot can be
      transferred between members and the party pool; everything round-trips through
      campaign export/import. (#112)
    • [webapp] Player-visible quest log — GM plot threads gained a status
      (rumored/active/completed/failed/abandoned), a player-visibility flag, and a
      player-facing summary, so a curated "Quests" view appears on the campaign page
      and via a new /quests bot command — while GM notes stay private. (#115)
    • [webapp] Quote board & session highlights — memorable quotes and key
      moments are extracted from each recording's diarized transcript (hallucinated
      quotes that don't match the transcript are dropped), reviewed by the GM, and
      published to a per-session Highlights panel and a campaign-wide quote board.
      The bot can echo the top quote to Discord on summary approval. (#116)
    • [webapp/bot] Attendance auto-fill from recordings — after a session is
      processed, Quest Board proposes attendance from who was in voice (spoke vs.
      present-but-silent), which the GM confirms in one click; unlinked speakers are
      surfaced, never auto-applied. A propose / auto_apply / off campaign setting;
      manually-set attendance is never overwritten. (#114)
    • [webapp] Thematic session-title suggestions — after each transcript
      approval, Quest Board pre-generates a few on-theme next-session titles in the
      background, offered as instant one-click chips when scheduling (no LLM wait).
      GM-only manual regenerate. (#23)
    • [webapp] One-click "Flesh out" NPC/creature entries — "Generate backstory"
      and "Generate stat block" actions on NPC/creature wiki articles, produced as
      reviewable drafts on the existing LLM draft rail. Append-only (never overwrites
      GM prose), stats are generated coherently from the backstory, and generated
      stat rows are hidden from players by default until the GM opts them in. (#130)
    • [webapp/bot] "Previously on…" pre-session recap — the final pre-session
      Discord reminder now carries a recap: the last approved session's summary plus
      a few open player-visible quests. Campaign toggle (default on); skipped
      automatically until a session has been approved. (#110)
    Downloads