soul_view: TUI for Agentic Memory
What it does
soul_view, live walkthrough across Projects, Sessions, Memory, Decisions
Five tabs over a single source of truth: the filesystem.
- Projects: 31 projects from
PROJECTS.json, color-coded by pillar, session and task counts visible. Click to switch the active context. - Sessions: Per-project session detail covering intent, summary, next step, rationale, decisions, fixed-list, metrics.
- Tasks: Status-grouped with glyphs and done-criteria.
- Memory: Frontmatter parser pulling from each project’s
~/.claude/projects/*/memory/directory. - Decisions: Flat log of
/decisionevents with target as a cyan arrow and intent as a why-line.
A 2-second poll detects new files in the active project, fires a Textual toast, and auto-highlights the new row. Press o on any row to open the underlying file in the default app.
Why a TUI over a web UI
The registry is local. The agents writing to it are local. A TUI removes the round-trip. Launch it inline with the agent session, see the same files the agent sees, no auth, no server, no cold start.
Architecture
The registry is the contract; the TUI is one view of it. Other tools (the soul CLI’s pulse and finalize commands, the kernel hooks) consume the same files.
- State: local session registry directory
~/soul_registry/(sessions, tasks, decisions, memory, telemetry, signals) - Authority:
~/dotfiles/soul/config/PROJECTS.json - Viewer:
~/dotfiles/soul/kernel/soul_view.pyon Textual + rich, dedicated venv at~/dotfiles/soul/.venv - Live watcher: 2s
set_intervalpolling, diffs against snapshot, Textual toast notifications, auto-refresh of affected tabs
What broke during testing
Three things came up that are worth naming:
- Markup escapes. Rich’s bracket-bearing content (e.g.
[/Option+]in a user prompt, or[Image: source: ...]auto-attachments) blows up Textual’s content-markup parser. Wrapped every dynamic interpolation inrich.markup.escape(). - Shape drift. Some task JSONs had top-level lists where I expected dicts; some
done_criteriawere strings, not arrays. Added_as_list/_as_dicthelpers and defensiveisinstancechecks at every read point. - Focus loops. Project-tab
Selectedevents fed back into the focus handler. Fixed withevent.stop()plus a focus-aware tab activation.
What it’s part of
soul_view is the user-facing surface of Soul OS, the broader system I run on top of the local agentic stack. Soul OS treats the filesystem as the source of truth for agent memory: no vector store, no SaaS, every session a grep-able JSON file you can read three months later and see exactly what was planned, what happened, and why.