by S40911120
Self-hosted web viewer for Claude Code session transcripts — read, search, replay, and audit every session you have ever run
# Add to your Claude Code skills
git clone https://github.com/S40911120/recensaLast scanned: 7/16/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-07-16T06:19:09.482Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}recensa is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by S40911120. Self-hosted web viewer for Claude Code session transcripts — read, search, replay, and audit every session you have ever run. It has 68 GitHub stars.
Yes. recensa passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/S40911120/recensa" and add it to your Claude Code skills directory (see the Installation section above).
recensa is primarily written in TypeScript. It is open-source under S40911120 on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh recensa against similar tools.
No comments yet. Be the first to share your thoughts!
Every Claude Code session you run is written to disk as raw JSONL under
~/.claude/projects/ — the full conversation, every tool call, the model's thinking,
every subagent it spawned. Then it just sits there, unreadable. Want to know how you
fixed that bug last month? What that 40-minute agent run actually changed? Which of
your prompts sent it down a dead end? Good luck grepping.
Recensa indexes those transcripts into a local SQLite database and serves a
three-pane reader at http://localhost:7788. Reading never modifies your
transcripts, and the index is a disposable cache you can rebuild at any time.
You need Docker (Docker Desktop on Windows/macOS; Docker Engine with Compose v2 on
Linux) and a ~/.claude directory with some sessions in it. Rootless Docker and
Podman work too — uid alignment is automatic. Give the container ~1 GB of memory
headroom for the first big index.
Try it — run the prebuilt image straight from Docker Hub:
# macOS / Linux (also WSL2 with Docker Engine inside WSL)
docker run -d --name recensa -p 127.0.0.1:7788:7788 \
-v "$HOME/.claude:/data/claude:z" \
-v recensa-data:/app/backend/data \
s40911120/recensa
On Linux, ~/.claude/projects is created owner-only (700/600) by the host CLI, so the
container needs a matching uid/gid to read it — it detects this on its own from the
mount, no flags required (override with -e PUID=... -e PGID=... if the mount's owner
isn't the account you want). The trailing :z relabels the mount for SELinux-enforcing
hosts (RHEL/Fedora/CentOS, Podman); it's a no-op everywhere else, so it's safe to
always include.
# Windows — use PowerShell, not Git Bash (MSYS rewrites the /data/... paths).
# In cmd.exe, replace $env:USERPROFILE with %USERPROFILE% and the backticks with ^.
docker run -d --name recensa -p 127.0.0.1:7788:7788 `
-v "$env:USERPROFILE\.claude:/data/claude" `
-v recensa-data:/app/backend/data `
s40911120/recensa
Or with Compose, using the prebuilt image:
# compose.yaml
services:
recensa:
image: s40911120/recensa
container_name: recensa
ports:
- "127.0.0.1:7788:7788"
volumes:
- type: bind
source: /home/you/.claude # your absolute .claude path
target: /data/claude
bind:
selinux: z
- recensa-data:/app/backend/data
restart: unless-stopped
volumes:
recensa-data:
Or from source:
git clone https://github.com/S40911120/recensa.git && cd recensa
cp .env.example .env # set CLAUDE_HOME to your .claude path
docker compose up -d --build
Then open http://localhost:7788. The first index runs in a background worker and
can take minutes to tens of minutes depending on how many sessions you have — the UI
is usable while it runs, and progress shows in a floating pill in the corner. An empty
list while that pill is moving is normal; an empty list with no pill means the
mount points at the wrong place — check docker logs recensa (the container calls out
mount problems explicitly) and see Troubleshooting.
Search all of it, not the last five. Claude Code's resume picker shows a handful of recent sessions. Recensa's full-text search (SQLite FTS5, CJK-aware) covers every session you have ever run — "how did I fix that S3 retry bug?" is one query away.
Follow the conversation, not the noise. One session can hold thousands of tool
calls. God-view folds tools, thinking, and system noise into landmark rows you can
expand on demand. Async tool results are paired back to their call with a shared
colored rail, so a tool_result landing twelve messages later still reads as one
step.
Or cut the noise down two ways. The Main toggle (top right) folds every tool
call and thinking block away, leaving only your prompts and the model's replies.
Focus mode (the tab at the bottom) hides the app chrome itself — panels, header,
breadcrumb — for full-width, distraction-free reading. Esc exits.
See exactly what changed. Every Edit in a session renders as a real diff —
before in red, after in green, per-file, with timestamps. Audit an agent's changes
without leaving the reader.
Know what a session cost. Per-session statistics break down tool usage, files created / edited / deleted, model mix, token flow, and an estimated dollar cost.
Audit multi-agent runs. When a session spawns subagents or teammates, Recensa rebuilds the roster from the transcripts: every agent with its type, message count, and model in the info panel, a crosshair that jumps to the exact call site where it was spawned, and an "Open subagent transcript" deep-link into the agent's own conversation — and back.
Navigate compaction like it never happened. When Claude Code compacts a long session, the pre-compaction text is gone from the working context — but not from the transcript chain. Recensa marks every compaction point in the stream, lists them in a Compaction History panel so you can jump straight to any boundary, tracks your read position within the current compaction segment, and can reconstruct the full pre-compaction conversation, merged across the fork/resume chain, as a read-only view.
Keep your reading state. Pin, tag, rename, and annotate sessions. Your curation
lives in its own database (flags.db) that index rebuilds never touch. Live
sessions update in real time over WebSocket while Claude Code is still writing them.
Reads fine on a phone. The layout is responsive: on narrow screens the session list and the info panel become swipe-in drawers around the conversation, so checking what an agent did from the couch actually works.
The smaller things you notice after a day of use: