llm-sessions

Workspace-first explorer for local LLM coding-agent sessions.

11 coding agents, one view.

LLM toolingTerminal UIRustv0.5.0, MIT

$ cargo install llm-sessions
Terminal UI with three panes: workspaces on the left, sessions with a live subagent tree in the middle, the selected transcript on the right.

The problem

Every coding agent keeps its own history in its own format: JSONL files here, a SQLite database there, a session store somewhere else. When I want to know what happened in one project last week, the answer is spread across all of them. llm-sessions reads every store and answers that one question: what happened in this project?

$ llm-sessions workspaces
 102  ~/code/web-store         claude omp opencode
  43  ~/code/pricing-service   codex omp opencode
 101  ~/code/llm-usage-monitor codex opencode

Run with no arguments to browse workspaces, then sessions, then transcripts, with all agents merged into one list.

How it works

There is no index for browsing. A full scan of all stores takes about 80 ms, and the TUI rescans every two seconds. Workspaces roll up to their repository, so worktrees map to the main checkout. Subagents and forks nest as trees under their parent session.

Agent stores are treated as read-only. The only write is archiving, done natively where the agent supports it and otherwise in an overlay database. Credential files are never opened. Records the parser does not recognise survive as folded raw JSON, so a session always opens.

Liveness comes from /proc: a filled dot means a process holds the session file open, a hollow one means a matching agent is running with its cwd inside the workspace.

What it does

AreaDetails
SourcesOMP, Claude Code, Codex, OpenCode, Copilot CLI, Kilo, Goose, Cursor CLI, Gemini CLI, Hermes, OpenClaw
Viewsworkspace, agent, branch, fleet, host, timeline
Query languagesource:, agent:, ws:, branch:, model:, after:7d, live:yes, body: (needs index); the same grammar in the TUI, CLI and API
CLIlist, show, search, digest, top, usage, archive, doctor, with --json where it makes sense
Live sessionsfollow a transcript as it grows, jump tmux focus to it, or send one message with i
Remote hostspeers over SSH or HTTP, pinned by UUID, merged beside local sessions
Serveread-only HTTP/WebSocket API with bearer token; --dashboard for the web view

--read-only blocks every write, including archiving and sending messages.

Limitations

Linux only: liveness reads /proc. Cursor GUI, Antigravity and Devin are not supported. HTTP peers can list and show transcripts but cannot resume, insert or run top. Sending a message with i refuses subagents, remote rows and attached OMP or Hermes sessions. serve has no TLS; put a reverse proxy in front of it when it leaves loopback. The search index costs roughly 690 MB per 5 GB of transcript text, though it is safe to delete.

Install

Requires Rust 1.96+. The serve and http features are on by default; --no-default-features builds an SSH-only CLI and TUI. Copying to the clipboard needs wl-copy, xclip, xsel, pbcopy or clip.exe. An AUR package exists for Arch.