Campaign overview
A long-running 5e 2024 campaign DMed by Nick in the homebrew world of Eldurae. Strict-RAW table, optimiser roster, deadly encounters. Sessions are roughly fortnightly. This dashboard aggregates every spoken line and every combat event surfaced from the 15 recorded session transcripts.
Words spoken per session
Combat events per session
Talkativeness over time (% of words spoken)
Cumulative damage dealt per PC
Deaths
Most-referenced callbacks & quotes
Players
Aggregate across the whole campaign. Combat numbers come from the LLM-extracted per-session event log (~700 events) and are necessarily a floor — many attacks resolve narratively without an explicit damage number in the transcript. Dialogue numbers are deterministic and complete.
Damage dealt vs taken (whole campaign)
Downs per character per session
Spell casts and consumables per player
Sessions
Click a session for the encounter list and any flagged extraction caveats. Session 1 was never recorded.
Bestiary
Every named enemy that appears in any encounter, with first/last appearance and how often the party put them down. Some entries are recurring NPCs (Maelis Dern, The Titan) who appear in combat — the wiki page itself lives in the People section.
| Enemy | Encounters | First seen | Last seen | Damage taken from party | Times killed by PC |
|---|
Wiki graph — 3D force-directed
188 entities, 2 411 directed wikilinks. Nodes sized by either backlink count (how often the rest of the wiki references them) or content length. Coloured by section. Click and drag to orbit, scroll to zoom, hover any node for details. Use the search to highlight one node and its neighbours.
Force-directed: edges pull connected nodes together, all nodes mutually repel. Layout converges over a few seconds. Drag = orbit, scroll = zoom.
About this dashboard
Data sources
| File | What it is | How it was built |
|---|---|---|
_dashboard/data/dialogue_stats.json | Lines / words / talkativeness per speaker per session, plus callback & entity-mention counts. | extract_dialogue_stats.py — deterministic regex over 01_transcripts/normalised/. |
_dashboard/data/combat_stats.json | Encounters, damage, downs, deaths, kills, consumables, criticals, fumbles, spell casts. Per-session and aggregated. | 15 parallel LLM agents, one per session pair, each reading the transcript and emitting combat_session_N.json; merged by aggregate_combat.py. |
_dashboard/data/wiki_graph.json | Node/edge list for the 3D graph. 188 entities, 2 411 directed wikilinks, backlink & outlink counts. | build_wiki_graph.py — re-derived from rendered _wiki/content/ by scanning emitted <a href> anchors. |
Known limitations
- Combat numbers are a floor. Many attacks resolve narratively (“that’s a hit”) without an explicit damage number in the transcript. The extraction was instructed to drop events it couldn't verify rather than guess.
- Vasquez and Althea look quieter in combat than they were. Voice-attribution gaps and roleplay-heavy turns make those two harder to score. The deterministic dialogue stats don’t have this issue.
- Earthwing the owl familiar has a death event tied to Chris's character bucket; the timeline lists only PC deaths (Cholmondeley s3, Harvo s9, Ruin s15).
- The graph is rendered from current
_wiki/content/, so node count & edge count will drift if you rebuild after editing the corpus. Re-runbuild_wiki_graph.py.
Refreshing the dashboard
# from the D&D folder python3 _dashboard/scripts/extract_dialogue_stats.py python3 _dashboard/scripts/build_wiki_graph.py # combat takes longer — re-spawn the per-session agents python3 _dashboard/scripts/aggregate_combat.py python3 _dashboard/scripts/build_dashboard.py # open _dashboard/index.html in a browser
Where this goes next
This is a prototype destined for integration into the Nickipedia site. The companion _dashboard/INTEGRATION_SPEC.md file is the handoff doc for Claude Code — it covers Hugo section layout, build-pipeline changes (new step in the 8-step per-session pipeline), JSON schema contracts, and performance considerations for the 188-node graph.