Repository navigation
Releases
v0.16.2
Here's a summary of the GitHub release notes:
🚀 Key Highlights
- Enhanced Encounter Management: New capabilities to place, move, label, and delete map objects, along with a dedicated AI driver dock tab.
- Improved Character Customization: Added character-level damage resistances/vulnerabilities/immunities and a configurable character stat strip.
- Discussions Enhancements: Introduced watch/mute/read-state features and first-post audience controls for discussions.
✨ New Features & Improvements
- Discussions: Watch, mute, and manage read-states, plus control first-post audience.
- Encounters: Full control over map objects (place, move, label, delete, click-to-place, drag/resize) and a dedicated AI driver dock tab.
- Dice: Added roll kind for grouped and color-coded logging.
- Characters: Implemented character-level damage resistances, vulnerabilities, and immunities. Introduced adapter-declared character stat strips.
- Inventory: Added item weight and a client-side search box.
- Character Sheet: Added a search box to the Skills card.
🐛 Bug Fixes & Maintenance
- Storylines: Fixed column flow issue preventing flex-basis from turning into element height.
- Encounters: Declared PF2e damage-type vocabulary and expanded category defenses.
- Inventory: Ensured the compendium picker's Add button remains within the card.
- Dashboard: Made handout metadata fields visible.
Full Changelog
What's Changed
- Discussions: watch/mute/read-state + first-post audience (#829) by @AwsomeFox in #2170
- test(web): golden coverage for the VTT cockpit header (issue #1688, step 1 of the spacing decision) by @AwsomeFox in #2166
- feat(encounters): place, move, label, and delete map objects (set pieces) by @AwsomeFox in #2174
- fix(storylines): stop column flow turning flex-basis into element height by @AwsomeFox in #2176
- fix(encounters): declare PF2e damage-type vocabulary + expand category defenses by @AwsomeFox in #2177
- feat(dice): add roll kind so the shared log can be grouped/colour-coded by @AwsomeFox in #2182
- fix(inventory): keep the compendium picker's Add button inside the card by @AwsomeFox in #2185
- feat(encounters): give the AI driver dock its own cockpit tab by @AwsomeFox in #2181
- fix(dashboard): make the handout metadata fields visible by @AwsomeFox in #2190
- Add search box to character sheet Skills card (#2154) by @AwsomeFox in #2186
- feat(characters): character-level damage resistances/vulnerabilities/immunities (#2156) by @AwsomeFox in #2184
- feat: adapter-declared character stat strip (#2159) by @AwsomeFox in #2187
- Map objects: click-to-place, canvas drag/resize (#2175) by @AwsomeFox in #2191
- feat(inventory): add item weight and a client-side inventory search box by @AwsomeFox in #2179
Full Changelog: v0.16.1...v0.16.2
Container image
docker pull ghcr.io/awsomefox/campfire:0.16.2
v0.16.1
Here's a summary of the GitHub release notes:
🚀 Key Highlights
- AI-Generated Portraits: Create character and NPC portraits using AI.
- Encounters as Live-Play Home: Encounters is now the central live-play experience for Drivers.
- Browser Push Notifications: Opt-in to receive browser push notifications.
- Personalized Navigation: Role-safe bookmarks and optional recent history for easier navigation.
✨ New Features & Improvements
- Encounter Enhancements:
- Add
controllerUserIdto combatants for player-controlled summons, companions, and mounts. - Implement creature mechanics for rolls within encounters.
- Link directly from combatant cards to full character sheets.
- Add
- Audit Trail Improvements:
- Add structured timeline event details.
- Include inventory item history payloads.
- Roll System Updates: Introduce shared identity and visibility context for rolls.
- Campaign Customization: Allow custom condition definitions for campaigns.
- Performance: Optimize BattleMap rendering by keeping
dragPosout of its render path.
🐛 Bug Fixes & Maintenance
- Encounter Fixes:
- Correctly close reorder in-flight-gate CAS window.
- Restrict hidden status notifications.
- Narrow HP cache writers off encounter-level turn fields.
- Fix reorder resync latch's clearing signal.
- Web Interface & Design:
- Define the missing
--color-warningtoken in the design system. - Repair VTT cockpit and character sheet layout fidelity.
- Define the missing
- Inventory Correction: Ensure equipping a weapon derives a correct attack across all systems.
- CI/CD & Testing:
- Serialize local test runs across concurrent agent sessions.
- Increase server-tests timeout.
- Add various behavioral and render-containment guards for testing.
Full Changelog
What's Changed
- fix(encounters): close the reorder in-flight-gate CAS window at the response (issue #2116) by @AwsomeFox in #2131
- feat(encounters): add controllerUserId to combatants for player-controlled summons, companions, and mounts by @AwsomeFox in #2034
- fix(encounters): restrict hidden status notifications by @AwsomeFox in #2136
- feat(audit): add structured timeline event details by @AwsomeFox in #2139
- test(encounters): add a behavioural memo-boundary guard for GridOverlay by @AwsomeFox in #2142
- feat(ai): generate character/NPC portraits with AI by @AwsomeFox in #2114
- feat(web): make Encounters the Driver live-play home by @AwsomeFox in #2137
- Add opt-in browser push notifications by @AwsomeFox in #2122
- feat(audit): add inventory item history payloads by @AwsomeFox in #2148
- feat(encounters): roll creature mechanics by @AwsomeFox in #2138
- feat(rolls): add shared identity and visibility context by @AwsomeFox in #2146
- feat(campaigns): add custom condition definitions by @AwsomeFox in #2145
- perf(encounters): keep dragPos out of BattleMap's own render path by @AwsomeFox in #2149
- build: serialize local test runs across concurrent agent sessions by @AwsomeFox in #2147
- fix(encounters): narrow HP cache writers off encounter-level turn fields by @AwsomeFox in #2141
- fix(encounters): key the reorder resync latch's clearing signal on dataUpdateCount, not dataUpdatedAt (issue #2140) by @AwsomeFox in #2143
- ci: give server-tests real headroom over its 10m timeout by @AwsomeFox in #2152
- fix(design-system): define the referenced-but-undefined --color-warning token by @AwsomeFox in #2164
- fix(inventory): equipping a weapon derives a correct attack, in every system by @AwsomeFox in #2151
- feat(encounters): link from the combatant card to the full character sheet by @AwsomeFox in #2153
- test(campaigns): cover weaponProficiencies through a handoff-profile import round trip by @AwsomeFox in #2173
- test(encounters): stage-4 render-containment probes for issue #1917 by @AwsomeFox in #2165
- fix(web): repair VTT cockpit and character sheet layout fidelity by @AwsomeFox in #2171
- Personal navigation: role-safe bookmarks + optional recent history (#840) by @AwsomeFox in #2172
Full Changelog: v0.16.0...v0.16.1
Container image
docker pull ghcr.io/awsomefox/campfire:0.16.1
v0.16.0
🚀 Key Highlights
- Major encounter-system updates: the run page was rebuilt as a VTT cockpit, the character sheet as the design template’s play surface, and the campaign dashboard as the command deck.
- Expanded rules and combat support, including new encounter mechanics, rule pack support, and broader equipment/rules imports.
- Significant quality-of-life upgrades for accessibility, audio/haptics, and dice presentation.
✨ New Features & Improvements
- Encounter management now supports limited-use and recharge monster abilities, DM-only manual initiative reordering, and honoring
hasInitiativeRollacross the encounter lifecycle. - Campaigns can now record durable lifecycle-status provenance, and support co-DM rewrites for story arcs and beats.
- Rules content now imports Open5e mundane weapons and armor, supports primary and supplemental rule packs, and renders AoN-published stats for PF2e/SF2e entries.
- Inventory can derive an equipped item’s action and make it editable.
- Accessibility adds a keyboard path to the map ping intent menu.
- Audio and haptics now include opt-in synthesized dice and turn cues, plus physical 3D dice from the design project.
- Performance improvements reduce encounter rendering cost through memo boundaries, GridOverlay containment, and cache bounds.
- Design/workflow updates include importing the Campfire component library into Claude Design.
🐛 Bug Fixes & Maintenance
- Fixed multiple i18n issues, including namespace/catalog lookup problems, translation-key routing, and JSX text extraction false positives.
- Fixed several encounter bugs around turn order, replay, empty encounters, hidden encounters, death saves, HP persistence, and template HP visibility.
- Fixed campaign rule-system selection so importer-only rule packs cannot be chosen as the campaign’s ruleSystem.
- Prevented a silent server crash when an SSE client disconnects.
- Updated better-sqlite3 to the Node-API line for dependency compatibility.
- Added and refined tests, including the two-connection EncounterOpRaceMarker harness and paired combatant-resource validation coverage.
Full Changelog
What's Changed
- fix(i18n): stop a same-keyed resource from another adapter overwriting its name (#2068) by @AwsomeFox in #2071
- fix(i18n): reach the catalog from two components that asked for an unregistered namespace (#2066) by @AwsomeFox in #2072
- docs(decisions): record target shape for the four reusable-content systems by @AwsomeFox in #2060
- perf(encounters): memo boundaries and an extracted GridOverlay for render containment by @AwsomeFox in #2078
- Two-connection EncounterOpRaceMarker test harness (#2032) by @AwsomeFox in #2049
- feat(a11y): keyboard path to the map ping intent menu by @AwsomeFox in #2055
- feat(encounters): track limited-use and recharge monster abilities by @AwsomeFox in #2062
- feat(encounters): DM-only manual initiative reorder by @AwsomeFox in #2074
- Table audio and haptics: opt-in synthesized dice and turn cues (#1920) by @AwsomeFox in #2050
- fix(i18n): route ping log and announcements through translated sentence keys by @AwsomeFox in #2051
- feat(campaigns): record durable lifecycle-status provenance (#846) by @AwsomeFox in #2082
- perf(encounters): make the GridOverlay memo actually hold, and bound the ref-callback cache by @AwsomeFox in #2083
- fix(encounters): persist a homebrew monster's HP through save-to-library and re-add by @AwsomeFox in #2086
- fix(deps): move better-sqlite3 to the Node-API line (13.x) by @AwsomeFox in #2089
- feat(rules): import Open5e mundane weapons and armor (#2096) by @AwsomeFox in #2098
- chore(design-sync): import the Campfire component library into Claude Design by @AwsomeFox in #2101
- fix(rules): import and render the stats AoN publishes for PF2e/SF2e entries by @AwsomeFox in #2103
- fix(encounters): narrow manualOrder to the DM's actual intent, and fix three reorder defects by @AwsomeFox in #2095
- fix(encounters): refuse to advance an empty running encounter by @AwsomeFox in #2104
- fix(i18n): stop extractJsxTextNodes false-positive on
=> fn<T>(generics by @AwsomeFox in #2108 - fix(encounters): hide template HP on live combatants by @AwsomeFox in #2099
- fix(encounters): re-derive combatant projection on role-match initiative replay (#1962) by @AwsomeFox in #2005
- fix(campaigns): stop an importer-only rule pack from being selected as a campaign's ruleSystem by @AwsomeFox in #2085
- fix(encounters): let the DM roll death saves in a hidden encounter by @AwsomeFox in #2109
- Unify combatant resource validation across character and statblock branches by @AwsomeFox in #2113
- fix(encounters): reland the tie-order and reorder-gate fixes dropped before #2074 merged by @AwsomeFox in #2088
- feat(characters): rebuild the character sheet as the design template's play surface by @AwsomeFox in #2115
- feat(encounters): rebuild the run page as the VTT cockpit by @AwsomeFox in #2117
- feat(inventory): derive an equipped item's action, and make it editable (#2097) by @AwsomeFox in #2100
- fix(encounters): close the next-turn CAS race that dropped turn-beat frames by @AwsomeFox in #2105
- feat(dashboard): rebuild the campaign dashboard as the design's command deck by @AwsomeFox in #2127
- fix(i18n): stop extractJsxTextNodes false-positives on comparison and generic-type shapes by @AwsomeFox in #2129
- fix(events): prevent silent server crash on SSE client disconnect (#2126) by @AwsomeFox in #2133
- feat(encounters): honour hasInitiativeRoll across the encounter lifecycle by @AwsomeFox in #2128
- feat(dice): physical 3D dice roll from the Campfire design project by @AwsomeFox in #2125
- Support co-DM rewrites for story arcs and beats by @AwsomeFox in #2110
- Support primary and supplemental rule packs by @AwsomeFox in #2121
- refactor(encounters): unify adjustCombatantResource's per-branch invariants and pair its tests by @AwsomeFox in #2087
- fix(encounters): add undoTurn empty-roster guard to match next-turn/end-turn by @AwsomeFox in #2132
Full Changelog: v0.15.12...v0.16.0
Container image
docker pull ghcr.io/awsomefox/campfire:0.16.0
v0.15.12
🚀 Key Highlights
- Major updates focus on encounter/combat flow, AI/DM tooling, and campaign management.
- The release adds more real-time, player-facing combat UX: turn changes, HP feedback, initiative updates, monster visibility, and action targeting.
- Several new capabilities improve content authoring and campaign governance, including campaign-scoped rules search, markdown editing, export/history, and shared-instance controls.
✨ New Features & Improvements
- Encounters/combat: initiative strip with per-combatant colors, live HP feedback, token state badges, duplicate combatants, AoE templates, turn-change beats, turn timers, and quick-roll buttons for attacks/damage.
- Player/GM UX: ended encounter summaries, lifecycle guidance, battle-map extraction, combat panels/rows refactors, persistent/attributable map pings, and colorblind-safe combat indicators.
- Characters/equipment: Advantage/Disadvantage/Crit context menu, equip/unequip actions, D&D Beyond import improvements for attacks/spells/slots, movement speed support, and richer spellbook wiring.
- Rules/campaigns: campaign-scoped rules search, quick-lookup panel, DM rules authoring improvements, campaign library UI updates, and shared-instance governance for campaign creation/storage.
- AI/DM workflows: improved stream handling, clearer AI driver comprehension, grounded prompts, consent provenance, and better support for homebrew rule systems.
- Other product surfaces: Markdown editor for prose fields, player display scene control, expanded notifications, campaign history export, and proposal editor improvements.
🐛 Bug Fixes & Maintenance
- Fixed multiple combat loop and turn-action issues, including player turn actions, end-turn idempotency, replay correctness, and resource tracker wiring.
- Resolved UI/behavior bugs across web and encounter screens, such as preserving dice context, handling detailed 400 errors, fixing PWA update buttons, scroll behavior, and route focus.
- Corrected data integrity/import issues, including D&D Beyond speed and damage type imports, statblock clobbering, and restored form draft normalization.
- Addressed AI/MCP/test reliability issues, including iteration caps, stream connections, structured conditions, retry handling, and flaky e2e/test assertions.
- Included accessibility, localization, and maintenance updates such as live-combat localization, improved accessibility focus handling, performance cleanup, refactors, and test hardening.
Full Changelog
What's Changed
- fix(ai-dm): human control, pause body validation, undo lever, and CAS handling (#1501) by @AwsomeFox in #1870
- fix(ai): resolve AI test integrity issues, iteration cap, and harness echo-pass (#1500) by @AwsomeFox in #1873
- fix(encounters): render ended summary and lifecycle orientation (#1470) by @AwsomeFox in #1876
- fix(encounters): prevent native image drag and improve fog discoverability (#1309) by @AwsomeFox in #1874
- feat(web): surface check requests campaign-wide outside encounters by @AwsomeFox in #1871
- feat(web): render ended encounter summary tallies and lifecycle guidance by @AwsomeFox in #1872
- fix(rules): DM rules content authoring, license gate & campaign library UI (#1504) by @AwsomeFox in #1878
- feat(encounters): initiative strip with per-combatant colour identity (#1512) by @AwsomeFox in #1875
- feat(characters): add Advantage/Disadvantage/Crit roll context menu by @AwsomeFox in #1867
- feat: make map pings attributable, perceivable, and persistent by @AwsomeFox in #1882
- fix(co-dm): ground prompts in campaign ruleset (#766) by @AwsomeFox in #1881
- fix(mcp): document structured conditions in update_combatant (#1447) by @AwsomeFox in #1883
- feat: Add MarkdownEditor for prose fields by @AwsomeFox in #1880
- feat: Player Display SSE scene control (fixes #1458) by @AwsomeFox in #1887
- feat(notifications): expand live play and campaign event coverage (#1322) by @AwsomeFox in #1886
- feat(encounters): encounter aftermath mutations for XP, loot, quest, storyline, and timeline (#1448) by @AwsomeFox in #1895
- feat(encounters): add inline quick-roll buttons for attack and damage rolls by @AwsomeFox in #1861
- feat: export complete player-authored campaign history by @AwsomeFox in #1885
- feat(ai-dm): unify stream connections to fix issue 880 by @AwsomeFox in #1888
- fix(encounters): enable player turn actions (#1457) by @AwsomeFox in #1890
- fix(web): preserve detailed 400 error messages and fix PWA update banner buttons by @AwsomeFox in #1892
- test(encounters): turn loop and error path tests (#1465) by @AwsomeFox in #1893
- feat(sessions): DM-private session prep notes (#883) by @AwsomeFox in #1894
- fix(test): correct encounter turn-loop expectations to match server contract by @AwsomeFox in #1948
- fix(e2e): stabilize map-ping-tap coordinate assertions by @AwsomeFox in #1955
- feat(equipment): equip/unequip UI and equipped-item actions in /turn and encounter card (Fixes #1901) by @AwsomeFox in #1951
- fix(a11y): re-attempt route focus when a late h1 arrives by @AwsomeFox in #1957
- fix(encounters): wire ResourceTrackerPanel rest/pips to the real engine by @AwsomeFox in #1947
- feat(characters): carry attacks, spells, and spell slots through D&D Beyond import by @AwsomeFox in #1950
- fix(encounters): wire the in-combat Spellbook to real spells and slots by @AwsomeFox in #1952
- feat(encounters): server-authoritative per-combatant initiative rolls + bulk dice-log evidence (Fixes #1904) by @AwsomeFox in #1953
- fix(cast): observe X-Card safety holds on cast-token Player Display by @AwsomeFox in #1949
- fix(i18n): localize live-combat surface (#1464) by @AwsomeFox in #1889
- chore(git): ignore Claude Code backlog worker worktrees by @AwsomeFox in #1961
- fix(characters): carry DDB feature damage types instead of resolving untyped by @AwsomeFox in #1959
- refactor(web): extract encounter battle map by @AwsomeFox in #1966
- feat(rules): campaign-scoped rules search and entries (#1898) by @AwsomeFox in #1945
- refactor(web): extract encounter combatant row by @AwsomeFox in #1968
- feat(encounters): add token state badges by @AwsomeFox in #1964
- refactor(web): extract encounter combat panels by @AwsomeFox in #1969
- fix(mcp): replay end-turn retries by @AwsomeFox in #1970
- refactor(web): extract DM lifecycle header by @AwsomeFox in #1972
- feat(web): add encounter turn-change beats by @AwsomeFox in #1963
- fix(web): preserve dice tray roll context by @AwsomeFox in #1973
- feat(encounters): add live HP feedback by @AwsomeFox in #1965
- feat(encounters): in-tracker rules quick-lookup panel (#1929) by @AwsomeFox in #1976
- feat(campaign-library): preserve roster on encounter templates by @AwsomeFox in #1978
- feat(web): preserve and infer resolvable specs in sheet action editor by @AwsomeFox in #1977
- feat(characters): add movement speed to Character/Combatant, stop hardcoding 30 ft by @AwsomeFox in #1980
- feat(encounters): duplicate combatants by @AwsomeFox in #1975
- Stop presenting 5e math as system-correct: resolver + generator honesty by @AwsomeFox in #1981
- feat(encounters): shared gating-reason affordance for disabled combat controls by @AwsomeFox in #1988
- Define campaign danger level scope and add contextual help by @AwsomeFox in #1989
- Document and close the encounter-event AI-consent boundary by @AwsomeFox in #1991
- test(encounter): add turn loop, error paths, mobile, rulesets, and death save E2E specs (#1465) by @AwsomeFox in #1879
- Expose adjustCombatantResource over REST and MCP; fix whole-statblock clobber by @AwsomeFox in https://github.com/AwsomeFox/campfire/pul...
v0.15.11
🚀 Key Highlights
- This release focuses on a major encounters/combat UI expansion, adding faster turn management, clearer combat state, and more in-fight controls.[1]
- It also includes broader web and design-system cleanup, plus AI-driver and CI reliability work.[1]
✨ New Features & Improvements
- Added UI controls for objective delete, comment restore, proposal payload editing, and story beat revisions.[1]
- Introduced a tabbed action economy panel for the turn workspace and encounters flow.[1]
- Added encounter tools including quick-roll inline buttons, a sticky in-combat vitals header, an in-combat spellbook panel with slot tracking and cast buttons, an icon-rich combat actions bar, a limited-use resource tracker, and default encounter name / party bulk-add / quick fight support.[1]
- Improved mobile and web UX by making Encounters a standing mobile tab and preserving More access during fights.[1]
- Refactored the web StatusMenuButton to use the design-system component, and codemodded bare .card usage to explicit .[1]
🐛 Bug Fixes & Maintenance
- Fixed AI-driver issues including a Pause 400 error, DM undo of AI actions, and a concurrency bug where the AI could silently win edits.[1]
- Stabilized CI by raising the coverage timeout and fixing the mobile QR viewport test.[1]
- Corrected combat/encounter behavior for exact damage input, one-tap conditions, wake lock handling, gridUnit-aware movement, initiative breakdown, and group selector display.[1]
- Fixed campaign/session tracking by separating latestSessionNumber from recap count.[1]
Full Changelog
What's Changed
- refactor(web): migrate StatusMenuButton raw to (Fixes #1713) by @AwsomeFox in #1840
- fix(ci): raise coverage timeout and stabilize mobile QR viewport test by @AwsomeFox in #1847
- test(ai-driver): prove the eval-harness echo-pass guards fire (#1500, follow-up to #1811) by @AwsomeFox in #1846
- feat: UI controls for objective delete, comment restore, proposal payload edit, and story beat revisions by @AwsomeFox in #1843
- fix(ai-driver): fix Pause 400, add DM undo of AI actions, and stop the AI silently winning concurrent edits (#1501) by @AwsomeFox in #1813
- feat(web): tabbed action economy panel for turn workspace (Fixes #1849) by @AwsomeFox in #1860
- fix(encounters): exact damage input and one-tap conditions (#1468) by @AwsomeFox in #1859
- fix(encounters): add wake lock and gridUnit-aware movement (#1473) by @AwsomeFox in #1857
- feat(encounters): quick-roll inline buttons (#1850) by @AwsomeFox in #1864
- feat(encounters): tabbed action economy panel (#1849) by @AwsomeFox in #1863
- fix(encounters): show initiative breakdown and group selector (#1476) by @AwsomeFox in #1858
- feat(encounters): sticky in-combat character vitals header (Fixes #1854) by @AwsomeFox in #1865
- In-combat spellbook panel with spell slot tracking and cast buttons (#1851) by @AwsomeFox in #1862
- feat(encounters): icon-rich standard combat actions bar (#1852) by @AwsomeFox in #1856
- feat(encounters): limited use resource tracker (#1855) by @AwsomeFox in #1866
- fix(campaigns): separate latestSessionNumber from recap count (#841) by @AwsomeFox in #1839
- Design system: codemod bare .card to explicit (Fixes #1712) by @AwsomeFox in #1841
- feat(encounters): default encounter name, party bulk-add, and quick fight by @AwsomeFox in #1868
- fix(web): make Encounters a standing mobile tab and preserve More access mid-fight (#1472) by @AwsomeFox in #1869
Full Changelog: v0.15.10...v0.15.11
Container image
docker pull ghcr.io/awsomefox/campfire:0.15.11
v0.15.10
🚀 Key Highlights
- This release focuses on accessibility, AI driver reliability, and web/server polish across the app.
- It also adds several user-facing workflow improvements in inventory, character sheets, sessions, and quests.
- Overall, the update strengthens stability, consistency, and rules-system support.
✨ New Features & Improvements
- AI encounter panel now surfaces tool confirmations for clearer live-play feedback.
- Inventory add flows now include a From Compendium option.
- Character sheet accessibility has been improved, including better touch targets and contrast handling.
- Session prep now supports notes, recap pre-fill, and RSVP seeding.
- Web UI consistency was improved across dialogs, headers, roster cards, tokens, and page-title typography.
- Quests can now be edited after creation, including title, reward, giver, and parent.
- AI Driver received live-play tools, turn-state control, and turn-change triggers.
🐛 Bug Fixes & Maintenance
- Fixed multiple a11y issues, including WCAG target-size coverage and smaller interactive controls.
- Improved server lifecycle handling, including death state, concentration breaks, and encounter-end reconciliation.
- Hardened AI Driver behavior with step caps, truncation handling, allowlists, and better turn-loop safety.
- Fixed inbox sweep reliability, including race recovery, background execution, and pagination title resolution.
- Improved export/scribe job limits to avoid unbounded scans and overly large logs.
- Tightened tests and coverage, including adapter parity, E2E stability, UI icon contracts, and server coverage baselines.
- Fixed additional rules and character logic, including rule-system adapter delegation and non-5e bestiary support.
Full Changelog
What's Changed
- fix(a11y): enable target-size rule, scan chrome contrast, enforce incomplete policy (#1778) by @AwsomeFox in #1804
- feat(ai-dm): surface tool confirmations in the encounter panel (#1494) by @AwsomeFox in #1802
- fix(server): derive character lifecycle status from deathState on create by @AwsomeFox in #1807
- feat(inventory): add From Compendium affordance to inventory add flows (#1782) by @AwsomeFox in #1805
- feat(ai-driver): cap cumulative AI Driver economy grants per aftermath window (#1781) by @AwsomeFox in #1810
- Fixes #1456 — encounter runner touch targets, single end-turn path, panel focus/announce by @AwsomeFox in #1800
- fix(ai-driver): convert guardDriverLivePlayArgs to allowlist (#1792) by @AwsomeFox in #1798
- fix(web): consolidate dialogs, page headers, roster cards, and tokens (#1783) by @AwsomeFox in #1809
- feat(web): improve character sheet accessibility (fixes #1488) by @AwsomeFox in #1799
- fix(ai-driver): honor finishReason truncation, enforce the step cap, and harden the eval harness (#1500) by @AwsomeFox in #1811
- fix(web): preserve session deep links in CatchUpPanel and SessionLog by @AwsomeFox in #1814
- fix(server): concentration breaks when caster drops, dies, removed, or recasts (#1452) by @AwsomeFox in #1801
- test(adapters): update Linux parity snapshot and assert exact adapter behavior (#1508) by @AwsomeFox in #1817
- fix(ai-driver): add live-play tools, turn state control, and turn change triggers (#1498) by @AwsomeFox in #1815
- fix(characters): delegate character sheet checks and rest logic to rule-system adapter by @AwsomeFox in #1816
- fix(rules): distinguish drifted 13th Age statblocks from prose headings (#1522) by @AwsomeFox in #1822
- fix(scribe): replace unbounded priorSucceeded scan with bounded deduplication queries (#1530) by @AwsomeFox in #1823
- fix(export): bound campaign export AI scribe job log to recent runs and proposal rows (#1529) by @AwsomeFox in #1821
- Consolidate web app formatting and add ESLint rule banning bare toLocaleString (Fixes #1531) by @AwsomeFox in #1824
- Defer seed() evaluation in browser e2e specs (Fixes #1753) by @AwsomeFox in #1825
- Inbox sweep: distinguish race-recovered proposals from fresh proposals (Fixes #1724) by @AwsomeFox in #1827
- Hide owner-only interactive controls during character print (Fixes #1761) by @AwsomeFox in #1826
- Preserve explicit non-active lifecycle status during encounter-end reconciliation (Fixes #1758) by @AwsomeFox in #1828
- test(ui-icons): assert canonical 4-value scale contract (Fixes #1715) by @AwsomeFox in #1830
- fix(web): resolve inbox sweep titles beyond first page (Fixes #1718) by @AwsomeFox in #1831
- Unify page-title typography across PageHeader and PageTitle (Fixes #1714) by @AwsomeFox in #1832
- Fix sub-24px WCAG interactive controls with density=xs (Fixes #1722) by @AwsomeFox in #1833
- test(e2e): guard and unroute proxy route.fetch handlers by @AwsomeFox in #1835
- fix(web): ensure .cf-target-24 and .cf-target-44 take precedence over control aliases (Fixes #1698) by @AwsomeFox in #1834
- fix(server): route death saves, proficiency, and crit/fumble through the rule-system adapter (#1503) by @AwsomeFox in #1812
- fix(server): support non-5e bestiary play (Starforged null HP, PF2e actions, OSR hit dice) (#1506) by @AwsomeFox in #1836
- fix(inbox-sweep): background the sweep so client can recover results after timeout (#1716) by @AwsomeFox in #1820
- fix(ai-driver): harden turn loop against pre-loop throws and add scene/history to prompts (#1497) by @AwsomeFox in #1819
- fix(web): thread ruleSystem adapter into optimistic HP lifecycle (Fixes #1829) by @AwsomeFox in #1838
- test(server): raise the all-source unit coverage baseline by @AwsomeFox in #1837
- fix(quests): allow editing title, reward, giver, and parent after creation by @AwsomeFox in #1842
- feat(web): session prep notes, scheduled session recap pre-fill, and RSVP seeding by @AwsomeFox in #1845
Full Changelog: v0.15.9...v0.15.10
Container image
docker pull ghcr.io/awsomefox/campfire:0.15.10
v0.15.9
Key Highlights
- This release focuses on stability, correctness, and workflow reliability across encounters, search, VTT, web UI, and imports.
- It also adds a meaningful inventory upgrade: players can now equip/unequip items and use equipped gear as actions.
- Several changes improve turn lifecycle, undo behavior, and combat/encounter consistency for smoother gameplay.
New Features & Improvements
- Inventory: equip/unequip items and expose equipped gear as usable actions.
- Encounters: added an Undo turn button in the Encounter runner UI.
- Search: improved mobile access, truncation reporting, accented-content normalization, and parity between FTS and fallback search.
- Web UI: confirmation dialogs now use the shared Dialog primitive; nav labels and page titles were cleaned up for localization.
- Rules/performance: identical rule-pack re-imports are now short-circuited to reduce unnecessary work.
- VTT: geometry handling was improved for ruler rounding, AoE footprint, and grid reveal behavior.
- AI driver / encounter runner: added refactoring and optimization work to improve long-term maintainability.
Bug Fixes & Maintenance
- Fixed imported rows disappearing by validating
scheduledAton import. - Improved encounter behavior: sync-blocked controls are now disabled instead of unmounted, double-submit on apply-action is prevented, hidden encounter start now emits SSE events, and undo-turn restores condition/effect ticks.
- Corrected combat and turn state issues, including combatant lifecycle, recoverable removal, death-save roll authority, and turn-lifecycle correctness.
- Fixed web HP rollback behavior and dialog routing issues.
- Resolved database boot issues by ensuring
deleted_atcolumns exist on startup. - Addressed access/privacy gaps, including retained account attribution privacy and tighter archive/viewer access rules.
- Cleaned up tests and CI, including flaky E2E shards, hardcoded date assertions, Playwright timeout isolation, and typecheck documentation gaps.
Full Changelog
What's Changed
- fix(import): validate schedule scheduledAt so imported rows never vanish (#1521) by @AwsomeFox in #1762
- fix(encounters): CombatantRow disables sync-blocked controls instead of unmounting them by @AwsomeFox in #1770
- Fix encounter aftermath XP guidance by @AwsomeFox in #1756
- fix(search): mobile-reachable entry, truncation reporting, FTS/fallback parity (#1481) by @AwsomeFox in #1764
- perf(rules): short-circuit identical rule-pack re-imports (#1518) by @AwsomeFox in #1763
- fix: use one authoritative death-save d20 by @AwsomeFox in #1759
- fix(tests): resolve test integrity flaws and hardcoded date assertions (#1484) by @AwsomeFox in #1765
- fix(web): compose optimistic HP rollbacks by @AwsomeFox in #1769
- test(e2e): triage the e2e-web shard-1/2 flake rotation and fix the last live one by @AwsomeFox in #1775
- ci: type hand-rolled service doubles and document the typecheck gap (#1527) by @AwsomeFox in #1773
- fix(web): define --cf-layer-modal and give reduced-motion.spec.ts real DOM by @AwsomeFox in #1777
- ci: isolate Playwright dependency setup timeout by @AwsomeFox in #1779
- fix(db): ensure deleted_at columns exist on openDatabase boot by @AwsomeFox in #1772
- fix(ai-driver): fix permanent-aftermath drift and add the missing add_inventory_item guard by @AwsomeFox in #1774
- VTT geometry bugs: ruler rounding, AoE footprint, grid reveal by @AwsomeFox in #1788
- fix(web): route ConfirmDialog/ConfirmDestructiveDialog through the shared Dialog primitive by @AwsomeFox in #1790
- fix(search): support accented content normalization and fix cursor pagination (#1493) by @AwsomeFox in #1766
- fix(encounter): prevent double-submit on apply-action (#1474) by @AwsomeFox in #1767
- Watch main's own check-runs and guard against duplicate imports by @AwsomeFox in #1786
- fix(encounter): emit SSE events when starting hidden encounter (#1475) by @AwsomeFox in #1768
- fix(vtt): ensure grid-default normalization retry fires on colliding patch (#1614) by @AwsomeFox in #1771
- Fix combatant lifecycle and recoverable removal by @AwsomeFox in #1760
- Fix retained account attribution privacy by @AwsomeFox in #1780
- Issue #870: preserve/reset dependent spatial state on map replace/remove by @AwsomeFox in #1787
- fix(encounters): restore condition and effect ticks on undoTurn by @AwsomeFox in #1789
- fix(access): rename misleading requireMember write gate, narrow viewers, close archive gaps (#1480) by @AwsomeFox in #1794
- feat(inventory): equip/unequip items and surface equipped gear as usable actions by @AwsomeFox in #1791
- Fix #1463: Add Undo turn button to Encounter runner UI by @AwsomeFox in #1797
- [persona-audit] Session-zero safety charter is prompt-only — no server-side enforcement or violation backstop by @AwsomeFox in #1796
- Optimization and refactoring of encounter runner by @AwsomeFox in #1793
- Fix #1459: Turn-lifecycle correctness by @AwsomeFox in #1795
- fix(web): i18n hardcoded nav labels and page titles by @AwsomeFox in #1803
Full Changelog: v0.15.8...v0.15.9
Container image
docker pull ghcr.io/awsomefox/campfire:0.15.9
v0.15.8
🚀 Key Highlights
- Major focus on AI Driver, campaign management, and gameplay reliability improvements.
- Added stronger safety, consent, moderation, and audit workflows across sessions and AI-assisted play.
- Expanded support for encounters, maps, character sheets, and print-friendly outputs.
✨ New Features & Improvements
- Introduced server-wide AI seat defaults, AI session lifecycle phases, and step-level retry/fallback for the AI Driver.
- Added collaborative handoff mode, DM-facing tool confirmation queue, and bounded conversation history for AI play.
- Improved campaign and session workflows with organized-play scheduling, admin campaign catalog controls, and guest DM handoff protections.
- Enhanced content and rules handling with campaign module lineage/rollback, linked compendium inventory acquisition, and structured condition/resource support.
- Added print-ready reference sheets, print-friendly character sheets and recaps, and encounter activity rail updates.
🐛 Bug Fixes & Maintenance
- Fixed issues in combat, conditions, damage resolution, concentration checks, and rest/recovery flows.
- Resolved AI state and security bugs, including transcript caching, consent controls, grant revocation, SSE frame leakage, and race conditions.
- Improved backups, exports, search, audits, diagnostics, and storage reliability.
- Addressed multiple test, CI, and e2e flakiness issues to improve release confidence and stability.
Full Changelog
What's Changed
- fix: One-shot campaign onboarding checklist for new DMs (#507) by @AwsomeFox in #1427
- fix: Audit retention — no silent history deletion (#502) by @AwsomeFox in #1429
- fix: Open Legend native character sheets and attribute preservation (#540) by @AwsomeFox in #1433
- fix: Open Legend exploding action dice in roller, log, MCP, AI (#541) by @AwsomeFox in #1435
- fix: Guest DM handoff with protected ownership and scoped grants (#545) by @AwsomeFox in #1439
- fix: FTS5-backed campaign search for scalable queries (#533) by @AwsomeFox in #1430
- fix: Backup scheduler retention, free-space protection, alerts (#505) by @AwsomeFox in #1425
- fix: Explain None/homebrew ruleset consequences before create (#508) by @AwsomeFox in #1428
- fix: Maps onboarding for world, handout, and encounter maps (#520) by @AwsomeFox in #1434
- fix: 13th Age level initiative and escalation die in combat (#542) by @AwsomeFox in #1436
- fix: Structured encounter conditions with duration and concentration (#423) by @AwsomeFox in #1440
- test(web): add missing Linux snapshot baseline for ui-icons unit spec by @AwsomeFox in #1467
- fix: Compendium facets from active ruleset with Rules/Reference (#544) by @AwsomeFox in #1437
- fix: Atomically reserve AI token budget before provider calls (#563) by @AwsomeFox in #1444
- fix: Explain Campfire jargon at first use (#518) by @AwsomeFox in #1431
- fix: Server-redacted cast sessions for Player Display (#547) by @AwsomeFox in #1438
- feat: Durable responsive map derivatives instead of decoding originals (#604) by @AwsomeFox in #1515
- test: nightly live rule-source smoke covering every importer (#568) by @AwsomeFox in #1517
- test(web): PWA install/offline e2e coverage and CI wiring (#569) by @AwsomeFox in #1519
- fix: AI readiness prerequisites before promoting AI actions (#519) by @AwsomeFox in #1432
- fix: Rule pack updates apply upstream corrections to existing slugs (#500) by @AwsomeFox in #1441
- fix: Cancel scheduled sessions without deleting RSVP history (#504) by @AwsomeFox in #1426
- fix: Idempotent combat mutations so a lost response cannot double-apply (#580) by @AwsomeFox in #1525
- fix: Persist AI Driver control state across restarts (#559) by @AwsomeFox in #1442
- feat: Preserve abuse evidence and add a protected incident workflow (#601) by @AwsomeFox in #1514
- feat: Authoritative multi-player AI Table transcript (#572) by @AwsomeFox in #1524
- fix: AI consent controls and durable generation provenance (#501) by @AwsomeFox in #1443
- feat: Separate backups from redacted adventure distribution packages (#586) by @AwsomeFox in #1536
- feat: Ground AI Driver rules and canon claims in authorized retrieval (#577) by @AwsomeFox in #1537
- feat: Campaign module identity, lineage, updates, overlays, and rollback (#585) by @AwsomeFox in #1523
- ci: type-check the server test tree and the web e2e tree in
lint(#1535) by @AwsomeFox in #1542 - test: assert documented success statuses match what routes actually return (#1538) by @AwsomeFox in #1540
- fix: Player damage on own character no longer 403s off-turn; fix two e2e flake root causes (#1478) by @AwsomeFox in #1544
- fix: Namespace AI transcript cache by user and purge it on identity changes (#573) by @AwsomeFox in #1543
- feat: Read-only Viewer, interactive-guest capability, block, mute, and direct silence (#597) by @AwsomeFox in #1549
- perf: replace count-by-loading with SQL aggregates in the campaign summary (#602) by @AwsomeFox in #1550
- fix: audit and revoke AI Driver grants that cannot survive a restart (#1042) by @AwsomeFox in #1551
- feat: give the AI Driver bounded conversation history (#1038) by @AwsomeFox in #1553
- fix: moderation-blocked AI map prompts no longer consume the rate-limit slot by @AwsomeFox in #1554
- test: stop the pseudonymizer test failing when its random tail contains the id by @AwsomeFox in #1564
- test: scope
getByRole('status')queries so they cannot match a loading skeleton by @AwsomeFox in #1565 - test: wait for the transcript mount tail-pin before scrolling away (#590) by @AwsomeFox in #1563
- test: scope the combatant Remove locator so it cannot match the map's remove control by @AwsomeFox in #1559
- feat: let the AI Driver reshape encounters, with visibility and ownership contained (#1022) by @AwsomeFox in #1557
- test: dismiss the AI-disclosure popover by viewport point, not by a page element by @AwsomeFox in #1569
- feat: server-wide AI seat defaults that campaigns inherit live (#1070) by @AwsomeFox in #1568
- fix: role-project every AI driver SSE frame so a new frame type cannot leak by default (#1552) by @AwsomeFox in #1572
- feat: DM-facing tool confirmation queue on the AI Table (#1558) by @AwsomeFox in #1573
- fix: make spell-slot overspend an error and give the AI Driver the tool to spend them (#1039) by @AwsomeFox in #1570
- fix: stop a cleared condition coming back on its own, via one owner of both condition columns by @AwsomeFox in #1575
- feat: declare inspiration and hero points as rule-system resources, and fix a lost-update race in resource spending (#1073) by @AwsomeFox in #1577
- feat: structured condition instances on the character sheet, with an explicit combat boundary (#1047) by @AwsomeFox in #1582
- fix: actually run the 157 web unit specs, and fix the 10 failures that had accumulated (#1574) by @AwsomeFox in #1583
- feat: collaborative handoff mode for the AI Driver — narrate freely, defer mechanics (#1051) by @AwsomeFox in #1567
- feat: atomic short rest and long rest, reconciling two divergent recovery paths (#1041) by @AwsomeFox in #1566
- feat: Participant X-Card — an immediate safety hold across encounters and AI play (#599) by @AwsomeFox in #1547
- feat: structured tone, pacing and play-style presets for the AI seat (#1049) by @AwsomeFox in #1560
- feat: Organized-play scheduling — rooms, series, assigned DMs, and cross-campaign conflicts (#588) by @AwsomeFox in #1539
- fix: Encounters: damage application ignores damage type, ...
v0.15.7
🚀 Key Highlights
- This release focuses heavily on encounters, VTT usability, AI safety, and accessibility.
- Major workflow upgrades include player turn actions, aftermath/recap handling, encounter search/sort, and catch-up views.
- Several important security and reliability fixes were shipped alongside new features.
✨ New Features & Improvements
- Encounters: added death saves as a logged turn action, combat log provenance, player end turn/ready-delay/reactions MVP, manual and compendium combatant actions, aftermath workflow for loot/XP/recap, list filtering/search/sorting, and SSE stale-state indicators with guarded actions.
- VTT: added token scaling from grid footprints, hex snapping distance/footprints, fog editor undo/erase and region editing, keyboard operability for map elements, and a battle map render on Player Display cast view.
- Web/Admin/Search: added a “since you were last here” catch-up view, paginated audit log UI, dry-run bulk roster import, full session recap indexing, and embedded inventory on character sheets.
- Comments/Members/Entities: added entity comments across supported surfaces, discoverable membership and player data rights, and portrait URL support for NPCs, factions, and locations.
- AI: added confirm-policy controls for destructive live-play tools and docked AI driver controls in the encounter page.
🐛 Bug Fixes & Maintenance
- Fixed AI driver behavior on provider failure and stop events, and blocked campaign-level provider SSRF.
- Improved web stability with bounded read timeouts, stale cache fallback, safer handling of invalid shared recap links, and prevention of the dashboard getting stuck on skeletons.
- Tightened accessibility with better contrast tokens, normalized heading hierarchy, accessible loading states, and improved tab/label handling.
- Fixed import/reference stability, notification history pagination, concurrent catch-up races, and atomic backup restore with rollback.
- Added maintenance and test updates, including e2e stability fixes, OIDC coverage reporting, and documentation cleanup.
Full Changelog
What's Changed
- fix(ai-driver): terminate turns on provider failure (#560) by @AwsomeFox in #1379
- fix(web): bound read timeouts and stale cache fallback (#581) by @AwsomeFox in #1378
- Make VTT map elements keyboard operable (closes #419) by @AwsomeFox in #1385
- feat(encounters): death saves as logged turn action in 5e encounters (#424) by @AwsomeFox in #1355
- fix(import): stable compendium pack references (#584) by @AwsomeFox in #1382
- fix(ai): prevent campaign-level provider SSRF (#570) by @AwsomeFox in #1384
- feat(web): since-you-were-last-here catch-up view (#549) by @AwsomeFox in #1381
- fix(ai-driver): cancel in-flight generation on stop (#558) by @AwsomeFox in #1380
- feat(admin): dry-run bulk roster import (#589) by @AwsomeFox in #1383
- fix(notifications): paginate history and scoped mark-read (#550) by @AwsomeFox in #1387
- fix(web): raise secondary-text contrast and contrast-safe tokens (#593) by @AwsomeFox in #1386
- feat(search): index full session recap text (#442) by @AwsomeFox in #1393
- feat(characters): embed inventory on character sheet (#454) by @AwsomeFox in #1394
- fix(a11y): normalize page heading hierarchy (#457) by @AwsomeFox in #1395
- fix(admin): update authentication settings copy for OIDC (#447) by @AwsomeFox in #1391
- fix(characters): accessible loading state on character detail (#460) by @AwsomeFox in #1392
- feat(audit): paginated campaign audit log UI (#443) by @AwsomeFox in #1398
- feat(encounters): combat log action provenance (#426) by @AwsomeFox in #1396
- fix(catch-up): upsert cursor row to avoid concurrent mark race (#549) by @AwsomeFox in #1390
- fix(encounters): hide AoE templates in unrevealed fog (#465) by @AwsomeFox in #1397
- feat(npcs): add portraitUrl support mirroring Character portraits by @AwsomeFox in #1401
- feat(comments): entity comments on all supported surfaces (#439) by @AwsomeFox in #1399
- feat(factions/locations): add portraitUrl support (#1324) by @AwsomeFox in #1404
- feat(encounters): immutability for ended encounter history (#470) by @AwsomeFox in #1412
- feat(vtt): scale tokens from grid footprints (#468) by @AwsomeFox in #1402
- feat(encounters): add list filter, search, and sort (#490) by @AwsomeFox in #1416
- feat(vtt): hex snapping distance and footprints (#467) by @AwsomeFox in #1409
- Docs: derive MCP tool-count from single source of truth by @AwsomeFox in #1415
- fix(e2e): stabilize discussion axe and character comment specs by @AwsomeFox in #1421
- feat(encounters): dock AI driver controls in encounter page (#427) by @AwsomeFox in #1408
- fix(backup): atomic restore with automatic rollback (#497) by @AwsomeFox in #1418
- fix(a11y): encounter map modes tabs and remove labels (#476) by @AwsomeFox in #1405
- fix(encounters): combat-log death events record actor attribution (#494) by @AwsomeFox in #1414
- fix(encounters): resolve link labels and add entity backlinks (#480) by @AwsomeFox in #1422
- feat(encounters): SSE stale-state indicator and guarded actions (#471) by @AwsomeFox in #1407
- feat(members): discoverable membership and data rights for players (#479) by @AwsomeFox in #1406
- fix(web): semantic error state for invalid shared recap links (#482) by @AwsomeFox in #1413
- feat(screen): render battle map on Player Display cast view by @AwsomeFox in #1420
- feat(ai): driver confirm-policy for destructive live-play tools (#474) by @AwsomeFox in #1423
- fix(test): include OIDC e2e in coverage report (#556) by @AwsomeFox in #1388
- fix(scribe): scope post-session automation to actual session (#499) by @AwsomeFox in #1419
- Encounters: player end turn, ready/delay, reactions MVP (#487) by @AwsomeFox in #1417
- feat(encounters): playable manual and compendium combatant actions (#425) by @AwsomeFox in #1400
- fix(vtt): hex ruler units and instructions (#477) by @AwsomeFox in #1403
- feat(vtt): fog editor undo erase and region editing (#472) by @AwsomeFox in #1411
- feat(encounters): aftermath workflow for loot XP and recap (#473) by @AwsomeFox in #1410
- fix(web): stop dashboard Home from staying on skeletons by @AwsomeFox in #1424
Full Changelog: v0.15.6...v0.15.7
Container image
docker pull ghcr.io/awsomefox/campfire:0.15.7
v0.15.6
🚀 Key Highlights
- This release focuses on AI-driven campaign management, with new individual player modeling for the AI DM, proactive AI suggestions, and persistent campaign narration language.
- It also expands encounter and combat tools with AoE damage application, condition tracking, resource handling, battle map controls, and better combat turn behavior.
- Several major workflow and UX upgrades landed across storylines, character creation, navigation, handouts, notes, and notifications.
✨ New Features & Improvements
- AI DM enhancements: individual player modeling, proactive suggestions, and saved narration language.
- Storylines: markdown authoring for arcs/beats, reordering in the UI, and editable branch labels/target beats after creation.
- Encounters: legendary/lair action tracking, inline spell slots and character resources, AoE damage to all tokens, and battle map zoom/pan/fit/reset controls.
- Characters: guided creation, draft incomplete sheets, and separate Play vs. Build/Profile tabs.
- Navigation & UI: reorganized campaign nav into task groups, standardized breadcrumbs/return links, improved icon picker UX, and updated visual identity.
- Content and collaboration: paginated comments, paginated session history, better notification history, and full-size handout preview/download/print/PDF support.
- Preferences & localization: 12h/24h time format preference plus RTL direction and bidi isolation support.
🐛 Bug Fixes & Maintenance
- Fixed several data integrity and import/export issues, including preserving schedules, attendance, note anchors, and completing campaign clone previews.
- Improved combat flow by skipping dead/downed combatants, scrolling active combatants into view, and fixing turn advancement behavior.
- Fixed storyline and quest issues, including AI draft beats creating the wrong content type and restoring AI quest drafting from the Quests list.
- Added visibility, audit, and approval safeguards for notes, maps, proposals, secret reveals, and timeline deletions.
- Addressed pagination, loading, and performance work across history paths, timeline, comments, sessions, and encounter polling.
- Included smaller maintenance updates such as localization completeness fixes, MCP tool parity/tests, request correlation IDs, and a PF1e importer default URL fix.
Full Changelog
What's Changed
- fix: move XP progression thresholds into rule-system adapters (#441) by @AwsomeFox in #1303
- fix: paginate notification history and confirm mark all read (#550) by @AwsomeFox in #1293
- fix: complete campaign clone with manifest preview (#435) by @AwsomeFox in #1305
- fix: audit maps DM write actions (import, generate, attach) (#546) by @AwsomeFox in #1290
- fix: preserve schedules, attendance, and note anchors in export/import (#436) by @AwsomeFox in #1304
- feat: add individual player modeling to AI DM (#1045) by @AwsomeFox in #1299
- feat(storylines): arc/beat markdown authoring (#856) by @AwsomeFox in #1295
- feat: add proactive AI DM suggestions (#1044) by @AwsomeFox in #1300
- feat(settings): add responsive campaign settings navigation (#866) by @AwsomeFox in #1328
- feat(encounters): apply damage to all tokens in AoE template (#626) by @AwsomeFox in #1327
- fix(mobile): add live encounter shortcut to tab bar (#637) by @AwsomeFox in #1329
- fix(encounters): scroll active combatant into view on turn change (#636) by @AwsomeFox in #1330
- feat(preferences): add 12h/24h time format preference (#634) by @AwsomeFox in #1331
- fix(storylines): AI draft beat creates story beat not quest (#1307) by @AwsomeFox in #1335
- feat(storylines): reorder arcs and beats in UI (#1312) by @AwsomeFox in #1336
- feat(quests): restore Draft a quest with AI on Quests list by @AwsomeFox in #1345
- feat(sessions): paginate history and query upcoming directly (#612) by @AwsomeFox in #1342
- feat(i18n): RTL document direction and bidi isolation (#628) by @AwsomeFox in #1337
- feat(forms): protect unsaved work with draft restore (#641) by @AwsomeFox in #1332
- feat(comments): paginate by root thread (#609) by @AwsomeFox in #1341
- fix(encounters): skip dead/downed combatants on turn advance (#610) by @AwsomeFox in #1339
- perf(db): composite indexes for hot history paths (#617) by @AwsomeFox in #1338
- feat(nav): reorganize campaign nav into task groups (#643) by @AwsomeFox in #1349
- feat(web): standardize detail-page breadcrumbs and return links by @AwsomeFox in #1348
- feat(encounters): legendary and lair action tracking (#618) by @AwsomeFox in #1343
- feat(lists): bounded pagination for timeline (#615) by @AwsomeFox in #1340
- feat(ai): persist and apply campaign narration language (#635) by @AwsomeFox in #1334
- feat(characters): separate Play and Build/Profile sheet tabs by @AwsomeFox in #1350
- test(notes): stabilize thousands-row pagination e2e (#608) by @AwsomeFox in #1344
- fix(i18n): localization completeness (#629) by @AwsomeFox in #1351
- feat(web): consolidate Nocturne and cf-* into canonical density system by @AwsomeFox in #1360
- Visual identity: carry fantasy/campfire art direction into signed-in app by @AwsomeFox in #1356
- Icon picker UX: pin current choice, clarify categories, and avoid duplicate SVG announcements by @AwsomeFox in #1347
- feat(encounters): model condition sources, durations, saves, concentration, and expiry (#423) by @AwsomeFox in #1353
- feat(dice): roll result toast, apply shortcut, and BG-style dice animation (#1315, #1352) by @AwsomeFox in #1333
- fix(web): standardize skeleton loading states (Fixes #677) by @AwsomeFox in #1357
- feat(web): keyboard command layer (Fixes #672) by @AwsomeFox in #1359
- fix(timeline): confirmable recoverable event deletion (#693) by @AwsomeFox in #1369
- feat(encounters): inline spell slots & character resources (issue #422) by @AwsomeFox in #1354
- feat(mcp): expand tool parity for invites, trash, spell slots (#683) by @AwsomeFox in #1367
- feat(encounters): battle map zoom pan fit reset (#712) by @AwsomeFox in #1368
- feat(characters): guided creation and draft incomplete sheets (#719) by @AwsomeFox in #1364
- fix(web): unify control icons and brand mark (#678) by @AwsomeFox in #1361
- fix(notes): explicit audience selection for visibility (#689) by @AwsomeFox in #1370
- feat(trash): soft-delete factions, storylines, encounters (#701) by @AwsomeFox in #1365
- feat(server): add request correlation IDs (#684) by @AwsomeFox in #1363
- Dice log: support honest manual/physical roll entries by @AwsomeFox in #1358
- fix(web): confirm and preview secret reveals (#710) by @AwsomeFox in #1366
- fix(proposals): reject stale snapshots and atomic approval (#681) by @AwsomeFox in #1362
- fix: Rules: PF1e importer ships with a .example placeholder default URL — install fails out of the box (#555) by @AwsomeFox in #1374
- feat(handouts): full-size preview, download, print and PDF support (#671) by @AwsomeFox in #1372
- perf(encounters): pause polling while SSE connected and add afterId event cursor (#607) by @AwsomeFox in #1373
- test(mcp): assert additionalProperties:false across all tools (#567) by @AwsomeFox in #1376
- feat(inventory): soft-delete items with restore and trash (#551) by @AwsomeFox in #1375
- Update OPENROUTER_MODEL in release workflow by @AwsomeFox in #1389
- feat(storylines): edit branch label and target beat after creation (#1313) by @AwsomeFox in #1377
Full Changelog: v0.15.5...v0.15.6
Container image
docker pull ghcr.io/awsomefox/campfire:0.1...