Skip to content

v0.16.0

Choose a tag to compare

@AwsomeFox AwsomeFox released this 09 Aug 16:58
· 54 commits to main since this release
5c04f3b

🚀 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 hasInitiativeRoll across 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