# Darkwatch Roadmap Last updated: 2026-04-11 A living document tracking planned features, improvements, and ideas. Items move to a spec/plan when work begins. --- ## In Progress / Next Up ### Leveling & Progression - [ ] **Talent roll UI on level up** — 2d6 on class table, with stacking support; currently talents are added manually ### Gameplay Tools - [x] **Initiative tracker** — team-based (party rolls, take highest vs DM enemy roll), round tracking, enemy HP tracking (DM-only), real-time sync, DB-persisted *(done)* - [ ] **Death timer** — dying state: 1d4 + CON rounds, d20 each turn to rise at 1 HP - [ ] **Conditions / status effects** — poisoned, stunned, dying, etc. shown on character cards (DB tables exist from spellcasting work) --- ## Planned ### Gameplay Tools - [ ] **Per-enemy dice rolls in initiative tracker** — DM can trigger attack/damage rolls directly from each enemy entry in the tracker sidebar; useful when enemies act individually rather than as a named group - [ ] **Party loot / shared inventory** — campaign-level shared pool, DM-managed - [ ] **Creature gallery / NPC system** — DM-managed library of enemy stat blocks (name, HP, AC, etc.); quick-add to initiative tracker; reusable across sessions ### Metrics & Analytics *(Prometheus + Grafana)* Track feature usage and player behavior to understand what's actually being used. Useful once the app has multiple users/campaigns. Event ideas to instrument: - Atmosphere effects toggled (fog, fire, rain, embers) — are DMs using them? - Character color changes — how often, is it a one-time setup or ongoing? - Dice rolls — frequency per session, types rolled, nat 20 rate - Spell cast attempts / failures / mishaps - Luck token usage - Torch timer activations - Feature flags (e.g., "physical dice" toggle if added) — adoption rate - Campaign creation, invite acceptance, session length proxies Stack: Prometheus (metrics collection) + Grafana (dashboards). Server emits metrics via a `/metrics` endpoint; Prometheus scrapes it. Grafana visualizes. --- ## Atmosphere & Effects - [x] Fog overlay — CSS gradient, synced via socket *(done)* - [x] Fire effect — Three.js particle fire *(done)* - [x] Rain / embers — tsParticles *(done)* - [ ] Snow — tsParticles, not yet implemented; evaluate if worth adding after DM feedback - [ ] Ambient audio — optional, low priority --- ## Longer Term / Ideas - [ ] **Formal DB migration tool** — replace homegrown `migrate.ts` with something like `umzug` or `db-migrate`; adds rollback support, checksums, and safer SQL parsing. Current tool works fine but has rough edges (naive semicolon splitting, no down migrations). - [ ] **API documentation** — OpenAPI/Swagger spec for all REST endpoints; auto-generate from route definitions if possible. Useful for future integrations, mobile clients, or third-party tooling. - [ ] **Feature documentation / changelog** — living doc (or generated site) tracking everything the app does: features, rules implemented, known limitations. Audience: DMs onboarding to the tool, not developers. - [ ] **Marketing / product site** — interactive public-facing site showcasing what Darkwatch does; could include live demos, feature highlights, screenshots. Separate from the app itself. Evaluate after the app has real users. - [ ] **Profile image upgrades** — beyond DiceBear (custom uploads, etc.) - [ ] **Multi-system support** — select game system on campaign create (Cairn, Knave, Pathfinder 2e, Cyberpunk RED, etc.); stats/rules/theme adapt per system. OSR games are easiest wins (same basic schema, just different data). - [ ] **Containerize server** — Dockerfile for Node server; useful when moving toward hosting. Client stays static build + CDN. - [ ] **Kubernetes / autoscaling** — Socket.IO needs sticky sessions or Redis pub/sub adapter for multi-instance. DB moves to managed service (RDS, PlanetScale). Revisit when public. - [ ] **Monetization model** — if pursued: charge for hosting infrastructure (not game IP). Fan content policies vary by publisher; OSR/CC games are safest. Consult legal before adding paid tiers. --- ## Completed - [x] Initiative tracker — team-based Shadowdark initiative, rolling phase, active phase, enemy HP (DM-only), add/remove enemies mid-combat, real-time sync, DB-persisted - [x] Dice overlay fix — canvas no longer blocks pointer events during animation - [x] Fog intensity slider — wired to CSS opacity - [x] Title auto-update — derived from class + alignment + level on every change - [x] Spellcasting system — 34 Tier 1-2 spells, 1d20 cast checks, exhaustion, Wizard mishap table (d12 auto-apply with undo), Priest penance, rest to recover, focus indicator on DM cards - [x] Character creation wizard — 4-step modal: name/class/ancestry → 3d6 stat rolling → background/alignment/deity → review (HP, gold, gear slots, title all derived) ## Completed (older) - [x] Campaign CRUD with real-time sync (Socket.IO) - [x] Character CRUD — stats, gear, talents, HP, XP, currency - [x] Auto-calculated AC and derived attacks - [x] Talent effects — stat bonuses, AC, attack/damage, gear slots, HP scaling - [x] View/edit mode split, click-to-edit InlineNumber - [x] Medieval visual theme — Cinzel + Alegreya, parchment, gold filigree, color schemes - [x] 3D dice rolling with predetermined outcomes, character-colored dice, delayed roll log - [x] Torch timer — 60 min countdown, synced across clients - [x] Luck token toggle - [x] DiceBear avatars with style picker - [x] Color picker per character - [x] Mobile layout — full-screen sheet, long-press adv/dis, roll log drawer - [x] Custom SelectDropdown — cross-platform consistent - [x] Compact DM character cards — 3-up grid, HP/AC/luck/torch/modifiers - [x] Atmosphere panel — fog, fire, rain, embers; DM-only, synced via socket - [x] MariaDB migration — replaced SQLite with MariaDB 11 in Docker - [x] Auth — email/password, JWT httpOnly cookies, register/login/logout - [x] Campaign membership — DM and player roles, invite links - [x] Per-campaign role enforcement — API middleware, socket auth, frontend gating