8.4 KiB
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.