8bf69fd47d219de0e08dcfd4903a8b08980d2006
Temp HP absorbs damage before current HP, cannot be healed, and does not stack (higher value wins). Displayed as cyan +N after current HP with a Shield button in the HP adjustment popover. Column space is reserved across all rows only when any combatant has temp HP. Concentration pulse fires on any damage, including damage fully absorbed by temp HP. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Encounter Console
A local-first initiative tracker and encounter manager for tabletop RPGs (D&D 5e / 2024). Runs entirely in the browser — no server, no account, no data leaves your machine.
What it does
- Initiative tracking — add combatants (batch-add from bestiary, custom creatures with optional stats), roll initiative (manual or d20), cycle turns and rounds
- Encounter state — HP, AC, conditions, concentration tracking with visual status indicators
- Bestiary integration — import bestiary JSON sources, search creatures, and view full stat blocks
- Player characters — create reusable player character templates with name, AC, HP, color, and icon; search and add them to encounters with pre-filled stats; manage (edit/delete) from a dedicated panel
- Persistent — encounters survive page reloads via localStorage; bestiary data cached in IndexedDB; player characters stored independently
Prerequisites
- Node.js 22+
- pnpm 10.6+
Getting Started
pnpm install
pnpm --filter web dev
Open http://localhost:5173.
Scripts
| Command | Description |
|---|---|
pnpm --filter web dev |
Start the dev server |
pnpm --filter web build |
Production build |
pnpm test |
Run all tests (Vitest) |
pnpm check |
Full merge gate (knip, biome, typecheck, test, jscpd) |
Project Structure
apps/web/ React 19 + Vite — UI components, hooks, adapters
packages/domain/ Pure functions — state transitions, types, validation
packages/app/ Use cases — orchestrates domain via port interfaces
data/bestiary/ Bestiary index for creature search
scripts/ Build tooling (layer boundary checks, index generation)
specs/ Feature specifications (spec → plan → tasks)
Architecture
Strict layered architecture with enforced dependency direction:
apps/web (adapters) → packages/application (use cases) → packages/domain (pure logic)
Domain is pure — no I/O, no randomness, no framework imports. Layer boundaries are enforced by automated import checks that run as part of the test suite. See CLAUDE.md for full conventions.
Description
Languages
TypeScript
86.1%
Shell
9.4%
JavaScript
2.9%
CSS
1%
Python
0.4%
Other
0.1%