gapmiss3k downloadsView Claude Code sessions. Browse, search, analyze, & export your sessions as interactive timelines with live watch & rich tool rendering — right alongside your notes.
An Obsidian plugin for reading your Claude Code sessions. Browse, search, and export them as interactive timelines, with live watch and proper rendering for each tool, right next to your notes.
Local and private. The plugin reads Claude Code's JSONL files straight from disk. Nothing is uploaded or synced, and your conversations stay on your machine. The one exception is the optional rate limit display, covered under Security notices.
[!IMPORTANT] v0.3.33. Desktop only.
[!NOTE] System identity access: the plugin reads the
HOMEenvironment variable andos.homedir()to find Claude Code's session files in~/.claude/projects/, and the OAuth credentials used by the rate limit display. These values only build local file paths. Nothing is sent anywhere.
Install from community.obsidian.md, or from inside Obsidian:
To install manually:
main.js, manifest.json, and styles.css from the latest release/path/to/vault/.obsidian/plugins/claude-sessionsCommon tools get their own layout instead of raw JSON:
server / tool_name rather than mcp__server__toolEvery tool shows a one-line preview in its collapsed header. Runs of consecutive tool calls longer than a set threshold (4 by default) collapse into a single group. A tool call with no result is marked "in progress" on the last turn and "interrupted" anywhere else. Images in tool results appear as thumbnails that open full size.
A collapsible panel at the top of each session:
A search panel in the right sidebar with two modes:
Before each export you can choose whether to include the summary dashboard and the system events panel. The plugin remembers your choice.
Turn a session into an Obsidian note with frontmatter you can query. This step doesn't call any LLM.
/distill skill with the plugin's exact numbers.base views of your distilled notes:Use distilled notes to track spending over time, find past sessions by project, date, or errors, or build up notes from your Claude work with Bases or Dataview.
/distill skill/distill runs inside Claude Code, not Obsidian. It writes the summary, decisions, and learnings from the conversation, but it can only estimate the numbers. The plugin has the exact ones. To combine them:
/distill at the end of a Claude Code sessionThe plugin fills in the real session_id, replaces the estimated token and cost figures with exact ones, keeps the skill's narrative sections, and merges the files_touched and tags lists from both sources.
Running Distill session to note again later refreshes the numbers in a merged note and leaves its text alone.
To install the skill for all your projects, copy it from this repository:
cp -r skills/distill ~/.claude/skills/
A collapsible panel for things that happened around the conversation rather than in it:
allowed-tools frontmatterSome events belong to a specific tool call, and those show as icons on the call itself: a zap for a PreToolUse hook, a shield for a permission decision (green if allowed, red if denied), scissors when a Read result was truncated, and a red or yellow warning when a hook failed.
--cs-*) for colors, spacing, type, and sizesOpen a session, optionally at a specific turn, with a link:
obsidian://claude-sessions?session=/path/to/session.jsonl&turn=7
Paths can start with ~, for example obsidian://claude-sessions?session=~/.claude/projects/.../session.jsonl.
Run Claude Sessions: Browse sessions from the command palette (Ctrl/Cmd+P) and pick a session.
To open a file from somewhere else, run Claude Sessions: Import session file, then drop a .jsonl file, choose one, or paste its path.
With a session open, run Export session to Markdown or Export session to HTML.
To add a written summary, see the /distill skill.
.base files it creates in your bases folder. This needs the Bases core plugin enabled| Command | What it does |
|---|---|
| Browse sessions | Pick a session from a searchable list |
| Search sessions | Open the search panel across all sessions |
| Search in session | Search the open session |
| Import session file | Open a session from a path or by drag-and-drop |
| Export session to Markdown | Export as Markdown with frontmatter |
| Export session to HTML | Export as a self-contained HTML file |
| Expand all turns | Expand every turn |
| Collapse all turns | Collapse every turn |
| Expand all blocks (tools, thinking, summary) | Expand every tool, thinking block, and the summary |
| Collapse all blocks (tools, thinking, summary) | Collapse them again |
| Refresh session | Re-read and redraw the session |
| Toggle live watch | Start or stop watching the file for changes |
| Copy resume to clipboard | Copy claude --resume <id> |
| Distill session to note | Create or update a note with the session's stats |
Merge /distill output from clipboard |
Combine the skill's summary with exact stats |
| Install bases dashboard templates | Add the Bases dashboards to your vault |
| Setting | Default | What it does |
|---|---|---|
| Session directories | ~/.claude/projects |
Where to look for JSONL files. ~ works |
| Export folder | Claude sessions |
Where exports are saved |
| Distill folder | Claude sessions/distilled |
Where distilled notes are saved |
| Bases folder | Claude sessions/bases |
Where the Bases dashboards are saved |
| Show thinking blocks | On | Show Claude's thinking |
| Show tool calls | On | Show tool calls |
| Show tool results | On | Show tool output |
| Content width | 960px | Maximum content width: 680, 800, 960, 1200px, or full |
| Tool group threshold | 4 | Longer runs of consecutive tool calls collapse into a group |
| Auto-scroll on update | On | Scroll to the bottom when live watch picks up changes |
| Notify on pending tool | Off | Send a notification when a tool call needs permission |
| Show rate limits (beta) | Off | Show your Claude 5-hour and 7-day usage on the dashboard |
| Debug level | Warnings and errors | How much the plugin logs to the developer console |
Claude Code writes each piece of an assistant message (text, thinking, a tool call) as its own JSONL record. The parser:
subagents/agent-<id>.jsonlWhen a newer Claude Code version writes a record type the plugin hasn't seen, the summary panel shows a warning so the gap gets noticed and fixed.
[!WARNING] By default, Claude Code deletes session files older than 30 days. If you use this plugin to track costs or keep notes on past work, raise that limit.
In ~/.claude/settings.json:
{
"cleanupPeriodDays": 365
}
Other plugins can read session data:
const api = app.plugins.plugins['claude-sessions']?.api as ClaudeSessionsAPI;
// The session in the active timeline
const session = api.getActiveSession();
// Parse any JSONL file (sub-agents are not resolved)
const parsed = await api.parseSessionFile('/path/to/session.jsonl');
// Run a callback whenever a session loads or live watch reloads it
const unsubscribe = api.onSessionParsed((session) => {
console.log('Session loaded:', session.metadata.project);
});
// Lightweight metadata for every indexed session
const entries = await api.getSessionIndex();
The API is stable. New methods may be added, and removing one would be a breaking change.
The Obsidian community scanner flags two patterns in this plugin. Both are in the rate limit feature (src/utils/rate-limits.ts), which is in beta and off by default, and both exist only to read the Claude Code OAuth credential you already have. Nothing is collected, sent to third parties, or used to identify you.
| Warning | Where | Why |
|---|---|---|
Shell execution (child_process) |
execSync runs the macOS security command (line 55) |
Reads your Claude OAuth token from the macOS Keychain so the plugin can ask Anthropic for your rate limit usage. Runs only on macOS, and only with "Show rate limits" on |
| System identity and environment variables | process.env.HOME (line 49) |
Finds ~/.claude/.credentials.json, where Claude Code keeps the token on Linux. Not used for identification or telemetry |
What it touches:
"Claude Code-credentials"api.anthropic.com/api/oauth/usage, through Obsidian's requestUrl()Leave "Show rate limits" off and this code never runs.
npm install
npm run dev # watch mode with source maps
npm run build # typecheck and production bundle
npm test # vitest
npm run test:watch # vitest in watch mode
npx eslint . # lint, including eslint-plugin-obsidianmd
Built with TypeScript 5.8 and esbuild, diff for Edit diffs, eslint-plugin-obsidianmd for linting, and Vitest for tests. It uses Node's fs, which is why it's desktop only.
See CONTRIBUTING.md to get involved.