Repository navigation
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