Skip to content

v0.37.0 — Book of the Exile

Choose a tag to compare

@github-actions github-actions released this 16 Jul 15:11

📖 Book of the Exile

Every character's story, written as it happens.

Your character now keeps a running journal. Level-ups, boss kills, deaths, and notable drops all land as dated entries in a per-character on-disk book — one file per character, appended in real time as you play. Open the dashboard and turn to any page in the book: today, yesterday, this week, any earlier chapter you want to revisit.

Added — 📓 Character Codex (per-character auto-written journal)

Every session, POE2GPS quietly writes four kinds of events to config/codex/<character>.jsonl:

  • 🌟 Level-ups — captured at the exact tick your character advances
  • 🐉 Boss kills — attributed via the boss encounter catalog, strict allowlist (unknown uniques never logged, so the codex stays clean)
  • 💀 Deaths — with zone, area level, and character level at the moment of death
  • 💎 Notable drops — unique-rarity items on their first sighting per character

Character-name stability gate (30 ticks of unchanged name at 30 Hz) prevents opening a codex file during the login flicker window, so events never get attributed to the wrong character. Switch characters and the codex swaps files cleanly after the new name settles.

Added — 📚 Dashboard Codex tab

A new tab in the dashboard renders your character's book:

  • Per-day chapter groupings (jump straight to Today / Yesterday / This Week)
  • Per-kind filter chips (level / boss / death / drop) — click to narrow the view
  • Icons per event kind, chronological within each day

Everything is served over the new /api/codex?character=<name> endpoint, loopback-gated so the character-name query param never leaks past your machine. /state continues to strip character identity per the existing privacy posture.

Under the hood

  • New POE2Radar.Core.Session.CodexEvent polymorphic type hierarchy with JSONL round-trip via System.Text.Json [JsonPolymorphic] (base + LevelUpEvent, BossKillEvent, DeathEvent, NotableDropEvent).
  • New SessionEventLog — mirrors DropTimeline's mature load-on-construct + append + flush-on-dispose pattern, adds character-name stability gating and stateless per-character reads (SnapshotForCharacter) for cross-character API queries without disturbing live tracking.
  • Observers wired into RadarApp's render-thread world tick: CodexBossObserver (unique alive→dead + catalog hit), CodexDropForwarder (subscribes to a new DropTimeline.Recorded event), SessionTracker.CodexEmit for level-ups and deaths.

Known limitation

The boss-attribution validation test (D1 in the plan — a playtest-derived xUnit theory that asserts zero false positives on ~30 non-boss uniques) will ship in v0.37.1 once we've captured the metadata paths from a live PoE2 session. The runtime attribution logic is already strict-allowlist (unknown uniques dropped silently), so the risk of a false-positive boss entry in your codex is low; the follow-up formalizes the guarantee.

Install / Upgrade

  • New install? Grab POE2GPS-v0.37.0-win-x64.zip below and unzip anywhere; portable, no installer.
  • Existing users: the auto-updater will prompt on next launch.
  • Fully additive — no config migration, nothing you have to change. The codex starts writing the moment your character name stabilizes; if you don't want it, ignore the new dashboard tab and never look in config/codex/.

Full Changelog: v0.36.1...v0.37.0