Lukas ef76b9c90b
All checks were successful
CI / check (push) Successful in 1m13s
CI / build-image (push) Successful in 16s
Add encounter difficulty indicator (5.5e XP budget)
Live 3-bar difficulty indicator in the top bar showing encounter
difficulty (Trivial/Low/Moderate/High) based on the 2024 5.5e XP
budget system. Automatically derived from PC levels and bestiary
creature CRs.

- Add optional level field (1-20) to PlayerCharacter
- Add CR-to-XP and XP Budget per Character lookup tables in domain
- Add calculateEncounterDifficulty pure function
- Add DifficultyIndicator component with color-coded bars and tooltip
- Add useDifficulty hook composing encounter, PC, and bestiary contexts
- Indicator hidden when no PCs with levels or no bestiary-linked monsters
- Level field in PC create/edit forms, persisted in storage

Closes #18

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 22:55:48 +01:00
2026-03-26 23:36:52 +01:00

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, level, color, and icon; search and add them to encounters with pre-filled stats; manage (edit/delete) from a dedicated panel
  • Encounter difficulty — live 3-bar indicator in the top bar showing encounter difficulty (Trivial/Low/Moderate/High) based on the 2024 5.5e XP budget system; automatically derived from PC levels and bestiary creature CRs
  • Undo/redo — reverse any encounter action with Undo/Redo buttons or keyboard shortcuts (Ctrl+Z / Ctrl+Shift+Z, Cmd on Mac); history persists across page reloads
  • Import/export — export the full encounter state (combatants, undo/redo history, player characters) as a JSON file or copy to clipboard; import from file upload or pasted JSON with validation and confirmation
  • 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
Initiative Tracker
Readme 3.3 MiB
Languages
TypeScript 87.2%
Shell 8%
JavaScript 2.5%
Python 1.2%
CSS 0.9%
Other 0.1%