Files
dm-pal/docs/roadmap.md
T
itsamejms d41737e1c9
CI / frontend (push) Successful in 30s
CI / rust (push) Successful in 5m33s
docs: roadmap — Phase 1 complete
2026-09-07 10:28:57 +01:00

8.4 KiB
Raw Blame History

DM-Pal — Master Roadmap (every known gap)

Consolidates docs/repo-review.md (2026-09-06), the open items in plan.md §15–17, the unchecked P2/P3 items in ui-ux-improvements.md, and new feature proposals into one ordered plan. This is now the working list; plan.md remains design history. Every item is verified as not shipped as of 2026-09-06.

Source tags: [R] repo-review · [P] plan.md §17/§15 · [U] ui-ux-improvements P2/P3 · [N] new proposal.


Phase 0 — Fix & harden → tag v0.1.4 (~1.5 days) — ✅ DONE 2026-09-06

# Item Effort Notes
[x] 0.1 Scrub PII from scripts/apple-signing.env.example 5 m [R] real email + Team ID still present
[x] 0.2 Persist LlmConfig to prefs store; load on startup 1 h [R] P0 — restart currently wipes Settings. Add a configVersion field for future shape changes
[x] 0.3 RAG: UTF-8 boundary fix in chunk() + test with accented text 1 h [R] multibyte paragraphs silently drop chunks today
[x] 0.4 RAG: DELETE WHERE source = ? before re-insert in add_document 15 m [R] re-adding a file doubles its chunks
[x] 0.5 RAG: embed-model mismatch guard (store model per source; refuse/warn) + "Reindex all" 2 h [R] changing embed model currently poisons cosine scores
[x] 0.6 npm run check + .gitea/workflows/ci.yml (lint, tsc, checks, cargo test) 2 h [R][P]
[x] 0.7 Doc drift: README line 21 ("macOS, via Ollama"), Node ≥ 23.6 prerequisite, version sync (Cargo vs tauri.conf), banner on stale plan.md §4.4/§10, delete public/icons.svg 1 h [R]
[x] 0.8 Minimal CSP in tauri.conf.json (self + data: img; check dev HMR) 30 m [R]
[x] 0.9 Replace is_ollama() URL sniff with provider field in LlmConfig (wizard presets set it) 1.5 h [R] breaks on custom Ollama ports

Done when: settings survive restart; CI green on push; re-indexed lore returns sane results; no PII in the repo. — all shipped: config round-trips through the prefs store, CI workflow pushed (verify first run on Gitea), Reindex in the Lore panel, PII scrubbed (note: earlier values remain in git history).

Phase 1 — Core UX enablers → tag v0.2.0 (~1 week) — ✅ DONE 2026-09-06

# Item Effort Notes
[x] 1.1 Real token streaming: Ollama stream:true NDJSON + OpenAI SSE via reqwest::bytes_stream (dep already present) 3 h [R][N] unlocks visible generation everywhere; SessionLogger already renders progressive tokens
[x] 1.2 Model pull in first-run wizard: POST /api/pull NDJSON → Channel progress bar (same shape as image-gen poller) 3 h [N] wizard currently "hopes it exists"
[x] 1.3 ragQuery on Encounter, Quest, Session summary 30 m [N] NPC/Item/World already pass it
[x] 1.4 Auto-log session events: bus emits for dice rolls, initiative round/turn changes, encounter start → SessionLogger appends 3 h [N] makes the AI summary summarize the actual fight
[x] 1.5 NPC → Initiative push ("⚔ Add to tracker" on NPC card via AddCombatants bus event; stats already generated) 30 m [N]
[x] 1.6 Calendar "Next day" → session-log entry incl. rolled weather 1 h [N] ties calendar into the timeline
[x] 1.7 Dice macros: persisted named rolls (usePersistentState), button row + edit sheet 2 h [U P3]
[x] 1.8 Initiative condition durations (auto-decrement per round, expire) 2 h [U-adjacent] concentration/Hex is table-stakes

Done when: a brand-new user pulls a model in-wizard and watches it progress; a combat logs itself; the AI summary streams and is grounded. — all shipped; verify the wizard pull once on a real Ollama instance.

Phase 2 — Flagship features → tag v0.3.0 (~2 weeks)

# Item Effort Notes
2.1 Ask the Oracle: chat over the world bible — question → rag_search → generate → answer with source chips. New view, no backend change 1 d [N] the flagship for the RAG pipeline
2.2 Quest branching graph (react-flow): conditional edges, step status colors 1 d [P][U]
2.3 World hierarchy tree: continent → region → city; drill into a region to generate sub-regions 1 d [P][U]
2.4 NPC roster view: grid of generated NPCs w/ portraits, filter by race/alignment, click to open 1 d [U] reads generations.db
2.5 Item inventory view (rarity-coded grid) 0.5 d [U]
2.6 Quest roster view (status badges) 0.5 d [U]
2.7 Campaign namespacing: <dataDir>/<campaign>/ + title-bar selector + migration of existing data; generalize the existing data-dir machinery 1 d [P] biggest data-model gap
2.8 Campaign backup/restore: export_campaign zip command (Rust zip crate) + import w/ confirm 0.5 d [N] no backup story today
2.9 Save portrait / right-click save image 1 h [U]

Done when: two campaigns coexist with separate lore/history; the cast and inventory are browsable surfaces, not just history rows.

Phase 3 — Media & atmosphere → tag v0.4.0 (~1.5 weeks)

# Item Effort Notes
3.1 Real ambience packs: 2–3 CC0 loops in public/sounds/ (synthesis stays as fallback) + custom sound import (drag MP3 onto tile) 1 d [P][U]
3.2 Image advanced params: negative prompt, seed, aspect ratio, steps, guidance → sd-server passthrough + cache key includes them 0.5 d [U]
3.3 Image-gen into World Builder (region map art per landmark) 0.5 d [P] §16.10
3.4 Image-gen into Encounter (battle map tile + loot item art) 0.5 d [P] §16.10
3.5 Handout renderer: Markdown → styled handout → export PNG/PDF 1 d [P][U] last §15 M6 item
3.6 Dice tumble animation (CSS 2.5D — no three.js) 0.5 d [N]

Done when: a full session can run without leaving the app: ambience, maps, item art, handouts.

Phase 4 — Distribution → tag v1.0.0 (~1 week)

# Item Effort Notes
4.1 Cross-platform build matrix in Gitea CI (macOS/Windows/Linux) 0.5 d [P]
4.2 Finish code signing + notarization (macOS cert exists in secrets/; add Windows) 1 d [P] scripts + env already scaffolded
4.3 Auto-updater: tauri-plugin-updater + update manifest hosted beside Gitea releases 1 d [P]
4.4 i18n scaffolding: extract strings to t() (EN-only content for v1) 1 d [U] structure now, translations later
4.5 Final polish pass: glassmorphism consistency, prefers-reduced-motion, focus rings 0.5 d [P] §15 M6
4.6 Tag v1.0.0, update README screenshots 30 m

Done when: a DM who downloads v1.0 gets a signed app that updates itself.

Phase 5 — Post-1.0 long tail (ordered by value)

# Item Effort Notes
5.1 Compendium: local SRD 5e JSON → stat-block popovers in Encounter + Initiative import 2 d [U]
5.2 Player view: LAN read-only web page (initiative, dice, HP) from the DM's screen 2–3 d [U][P]
5.3 Console mode dashboard: embed 2–3 chosen tools as live-session cards 1 d [U]
5.4 Draggable bento (react-grid-layout), persisted per campaign 1 d [U]
5.5 Voice-to-text session notes (whisper.cpp sidecar or audio-capable model) 2 d [P][U]
5.6 Session replay: record the bus event stream → timeline replay 2 d [U] builds on 1.4's event logging
5.7 AI auto-tagging of session entries (#combat/#loot/#roleplay) 0.5 d [N]
5.8 Lore embedding visualization (t-SNE scatter) 1 d [N]
5.9 True 3D dice (react-three-fiber) — only if 3.6's CSS tumble proves insufficient 2 d [N]
5.10 Plugin system: dynamically registered commands/content packs 3 d+ [P]
5.11 Prompt library + fine-tuning on campaign data research [P]

Ordering notes

  • 0.2 before 1.2 — the wizard can't save what it configures until config persists.
  • 1.1 before 2.1 — the Oracle wants streaming; both ride the same Channel plumbing.
  • 2.7 before 5.x — campaign namespacing changes the data layout; rosters, backup, and replay should key on campaign from day one.
  • 1.4 before 5.6 — replay is just a recording of the event stream 1.4 introduces.
  • Rust tests + self-checks grow with each phase; CI (0.6) runs them all from day one.

Totals to v1.0: ~22 working days of focused effort (1.5 + 5 + 6.5 + 5 + 4). Long tail adds ~15 days beyond that.