Install the "claude-history-ingest" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/claude-history-ingest into .claude/skills/claude-history-ingest/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "claude-history-ingest", then confirm the skill loads.
Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Type this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
skills CLI
$ npx skills add Ar9av/obsidian-wiki --skill claude-history-ingest -a codex
Project install goes to .agents/skills/; add -g for ~/.codex/skills/.
Install the "claude-history-ingest" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/claude-history-ingest into .agents/skills/claude-history-ingest/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "claude-history-ingest", then confirm the skill loads.
Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add Ar9av/obsidian-wiki --skill claude-history-ingest -a cursor
Project install goes to .agents/skills/; add -g for ~/.cursor/skills/.
Install the "claude-history-ingest" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/claude-history-ingest into .cursor/skills/claude-history-ingest/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "claude-history-ingest", then confirm the skill loads.
Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
skills CLI
$ npx skills add Ar9av/obsidian-wiki --skill claude-history-ingest -a gemini-cli
Project install goes to .agents/skills/; add -g for ~/.gemini/skills/.
Install the "claude-history-ingest" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/claude-history-ingest into .gemini/skills/claude-history-ingest/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "claude-history-ingest", then confirm the skill loads.
Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Installs for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
skills CLI
$ npx skills add Ar9av/obsidian-wiki --skill claude-history-ingest -a github-copilot
Project install goes to .agents/skills/; add -g for ~/.copilot/skills/.
Install the "claude-history-ingest" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/claude-history-ingest into .github/skills/claude-history-ingest/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "claude-history-ingest", then confirm the skill loads.
GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add Ar9av/obsidian-wiki --skill claude-history-ingest -a opencode
OpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
Install the "claude-history-ingest" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/claude-history-ingest into .opencode/skills/claude-history-ingest/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "claude-history-ingest", then confirm the skill loads.
OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Facts
Skill name
claude-history-ingest
GitHub stars
3.5k
Token cost
~5.6k tokens
SKILL.md length
2,190 words
Files
2 (incl. references)
Skills in repo
39
Repo updated
First seen
Licence
MIT
At a glance
Ingest Claude Code conversation/session history into Obsidian as distilled knowledge.
Works in 6 steps: Survey and Compute Delta → Ingest Memory Files First → Parse Conversation JSONL → …
Mining past Claude sessions
SKILL.md covers Before You Start, Ingest Modes, Claude Code Data Layout and Step 1: Survey and Compute Delta, plus 9 more sections
Calls python3
What it does
Claude History Ingest is an agent skill from Ar9av/obsidian-wiki. Ingest Claude Code conversation/session history into Obsidian as distilled knowledge. Use for importing or mining past Claude sessions, .claude data, project/session history, or audit logs.
Its SKILL.md is about 5.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/claude-data-format.md`).
It sits in Knowledge Management. It works with Obsidian. The repository describes itself as: Framework for AI agents to build and maintain a digital brain through Obsidian wiki | Memory System for Agents. The licence is MIT.
When your agent uses it
Mining past Claude sessions
Project/session history
Example prompts
“/claude-history-ingest”
Requirements
Python 3
Workflow steps
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit df54595. It shows what the files ask for, not the result of running them.
Tool permissions
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Runs code
Shell commands in SKILL.md call:
python3
From the folder's file list and the shell code blocks in SKILL.md.
Network
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Credentials
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Context cost
Claude History Ingest loads about 5.6k tokens when it runs, and up to ~6.6k if it reads all its reference files. Until then it costs about 53 tokens; SKILL.md has 2,190 words of instructions outside code blocks.
Always· name and description, kept in context so the agent knows when to use it
~53
When it runs· the whole SKILL.md, loaded when a task matches
~5.6k
With references· SKILL.md plus every file in references/, read only if the agent opens them
~6.6k
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
Safety
Auto-check: notes
The automated check noted patterns worth knowing about, such as sudo or a known installer.
NoteMentions a .env fileSKILL.md:18
line `@name` override → walk up CWD for `.env` → global config → prompt setup). This gives `OBSIDIAN_VAULT_PATH` and `CL
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
Download SKILL.mdSave it as .claude/skills/claude-history-ingest/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
claude-history-ingest
description
Ingest Claude Code conversation/session history into Obsidian as distilled knowledge. Use for importing or mining past Claude sessions, .claude data, project/session history, or audit logs.
Claude History Ingest — Conversation Mining
You are extracting knowledge from the user's past Claude Code conversations and distilling it into the Obsidian wiki. Conversations are rich but messy — your job is to find the signal and compile it.
This skill can be invoked directly or via the wiki-history-ingest router (/wiki-history-ingest claude).
Before You Start
Writing profile: Before drafting or rewriting natural-language Markdown, read and apply the Writing Profile Resolution section in llm-wiki/SKILL.md. Framework schema, provenance, safety, and operation-specific requirements take precedence.
WRITING.md preferences apply only to newly drafted or rewritten natural-language Markdown; preserve source content and structured records.
Resolve config — follow the Config Resolution Protocol in llm-wiki/SKILL.md (inline @name override → walk up CWD for .env → global config → prompt setup). This gives OBSIDIAN_VAULT_PATH and CLAUDE_HISTORY_PATH (defaults to ~/.claude)
Read .manifest.json at the vault root to check what's already been ingested
Read index.md at the vault root to know what the wiki already contains
Project Scoping — read WIKI_SKIP_PROJECTS from config (comma-separated substrings). Exclude any project directory whose name contains one of them from every step below (scan, delta, sampling, manifest writes). If the user names extra projects to skip this run, add them. Apply the exclusion once, uniformly — don't hand-write grep -v filters into individual commands, which drifts between the scan and manifest steps.
Ingest Modes
Append Mode (default)
Check .manifest.json for each source file (conversation JSONL, memory file). Only process:
Files not in the manifest (new conversations, new memory files, new projects)
Files whose modification time is newer than their ingested_at in the manifest
This is usually what you want — the user ran a few new sessions and wants to capture the delta.
Portable keys when comparing. Manifest keys follow the source key contract (v2) in llm-wiki/SKILL.md → .manifest.json. A session under $HOME is keyed ~-relative (~/.claude/projects/.../abc.jsonl), never by the expanded machine path; vault-relative and pseudo-keys are the other two forms. Before deciding a file is "new", resolve the stored key the same way the tool does (expand ~/env vars, resolve vault-relative against the vault root) — otherwise an already-tracked file looks new and gets re-ingested. The scripts/manifest.py helper does this for you:
bash
# New/modified sources, honoring WIKI_SKIP_PROJECTS + --skip:
python3 "$OBSIDIAN_WIKI_REPO/scripts/manifest.py" delta "$OBSIDIAN_VAULT_PATH" \
--scan "$CLAUDE_HISTORY_PATH/projects/*/memory/*.md"
# One-time repair if the manifest still holds legacy absolute keys:
python3 "$OBSIDIAN_WIKI_REPO/scripts/manifest.py" migrate "$OBSIDIAN_VAULT_PATH" --dry-run
The helper is optional — if it's unavailable, apply the same resolution inline before every manifest lookup and write.
Pre-extraction (recommended — run before ingest)
Raw JSONL files are 80-90% noise: tool_use blocks, thinking blocks, progress events, and
file-history-snapshot entries dominate by byte count. The scripts/extract-jsonl.py helper
strips all of that and writes compact signal-only JSON to ~/.claude/extracted/, achieving
50–200× file-size reduction (e.g. 12 MB JSONL → 64 KB extracted). This lets the skill read
5–10× more conversations per run within the same token budget.
Run it as a pre-step before invoking this skill:
bash
# First run — extract everything (skip excluded projects)
python3 "$OBSIDIAN_WIKI_REPO/scripts/extract-jsonl.py" --skip tsg,autom8
# Incremental — only sessions modified in the last day
python3 "$OBSIDIAN_WIKI_REPO/scripts/extract-jsonl.py" \
--since "$(date -v-1d +%Y-%m-%d)" --skip tsg,autom8
Extracted files live at ~/.claude/extracted/<project-dir>/<session-id>.json and contain:
When Step 3 reads conversations, always prefer the extracted file over the raw JSONL. (See Step 3.)
If extract-jsonl.py was not run first, fall back to raw JSONL — but note the coverage will be
shallower because each raw file costs far more tokens to read.
Conversation Sampling Heuristic
A history path can hold hundreds of conversation JSONLs — do not try to read them all. Per project:
If the project already has memory files (memory/*.md), ingest those first (they are
pre-distilled signal), then also process conversations not yet in the manifest — new
conversations should still be captured even for memory-rich projects.
If the project has no memory files, read only the 3 most recent conversations (by mtime)
to characterize it. Prefer pre-extracted files (see above) — they are cheap enough that you can
read 5–10 in the same token budget as 1 raw JSONL.
Always report what you sampled vs skipped (e.g. "agenttower: 7 memory files + 4 new conversations
ingested, 14 unchanged conversations skipped"), so the coverage gap is visible rather than silent.
Full Mode
Process everything regardless of manifest. Use after a wiki-rebuild or if the user explicitly asks.
Claude Code Data Layout
Claude Code stores data in two locations. Scan both.
Session metadata (local_<uuid>.json) — JSON file with fields like sessionId, cwd, startedAt, model, title. Read this first to understand the session context before opening the transcript.
Audit log (audit.jsonl) — Each line is a JSON record of one agent action: tool calls (Read, Write, Bash, Edit), file accesses, shell commands executed, MCP calls. Useful for understanding what the agent actually did — often richer signal than the conversation text alone. Fields: type, toolName, input, output, timestamp, sessionId.
Conversation transcript (.claude/projects/.../<uuid>.jsonl) — Identical format to CLI conversation JSONL. Parse the same way as ~/.claude/projects/*/*.jsonl.
Key data sources ranked by value (both locations combined):
Conversation JSONL (both ~/.claude/projects/*/*.jsonl and desktop app transcripts) — Full conversation transcripts. Rich but noisy.
Audit logs (audit.jsonl in desktop sessions) — Tool-call level record of what was done. Useful for extracting concrete actions, file patterns, and command patterns even when the conversation is sparse.
Session metadata (sessions/*.json and local_*.json) — Tells you which project, when, and what CWD.
Step 1: Survey and Compute Delta
Scan both data locations and compare against .manifest.json:
user type → feeds into an entity page about the user, or concept pages about their domain
feedback type → feeds into skills pages (workflow patterns, what works, what doesn't)
project type → feeds into entity pages for the project
reference type → feeds into reference pages pointing to external resources
The MEMORY.md index file in each project is a quick summary — read it first to decide which individual memory files are worth reading in full.
Step 3: Parse Conversation JSONL
Always check for a pre-extracted file first (see Pre-extraction section above). For each
conversation ~/.claude/projects/<proj>/<uuid>.jsonl, look for its counterpart at
~/.claude/extracted/<proj>/<uuid>.json. If found, read that instead — it is already filtered to
user + assistant text turns and costs 50–200× fewer tokens than the raw JSONL.
# Resolution order for each session:
1. ~/.claude/extracted/<project>/<session-id>.json ← prefer (compact, signal-only)
2. ~/.claude/projects/<project>/<session-id>.jsonl ← fallback (raw, noisy)
Reading a pre-extracted file: it already contains only the turns you need. Iterate
turns[].{role, text} directly. The top-level fields (cwd, start_ts, n_user_words, etc.)
give you project context without any further parsing.
Reading raw JSONL (fallback): Each line is a JSON object:
File access patterns — which files does the agent repeatedly Read or Edit? These are the high-value files in the project. Note them as project references.
Shell commands — recurring Bash commands reveal the project's build/test/deploy workflow. Distill these into a skills/ page (e.g. "how this project is built and tested").
Tool call sequences — if the agent always does Read → Edit → Bash in a particular order, that's a workflow pattern worth capturing.
Error patterns — failed tool calls (non-zero exit codes, error outputs) reveal pain points, known rough edges, or recurring bugs.
MCP tool calls — calls to MCP tools reveal which external services and APIs the project integrates with.
Skip from audit logs:
Routine file reads with no pattern (e.g. reading config files once)
Tool outputs that are just noise (long stack traces, verbose logs) — summarize the error class, not the full output
Anything that looks like secrets, tokens, or credentials in command arguments or outputs
Cross-reference with the conversation transcript: The audit log tells you what happened; the conversation tells you why. When both are available for the same session, use them together — the audit log grounds the conversation in concrete actions.
Read the paired local_<uuid>.json session metadata before processing the audit log — it gives you cwd, startedAt, and title to contextualize the actions.
Step 4: Cluster by Topic
Don't create one wiki page per conversation. Instead:
Group extracted knowledge by topic across conversations
A single conversation about "debugging auth + setting up CI" → two separate topics
Three conversations across different days about "React performance" → one merged topic
The project directory name gives you a natural first-level grouping
Step 5: Distill into Wiki Pages
Each Claude project maps to a project directory in the vault. The project directory name from ~/.claude/projects/ encodes the original path — decode it to get a clean project name:
For each project with content, create or update the project overview page at projects/<name>/<name>.md — named after the project, not _project.md. Obsidian's graph view uses the filename as the node label, so _project.md makes every project show up as _project in the graph. Naming it <name>.md gives each project a distinct, readable node name.
Important: Distill the knowledge, not the conversation. Don't write "In a conversation on March 15, the user asked about X." Write the knowledge itself, with the conversation as a source attribution.
Write a summary: frontmatter field on every new/updated page — 1–2 sentences, ≤200 chars, answering "what is this page about?" for a reader who hasn't opened it. wiki-query's cheap retrieval path reads this field to avoid opening page bodies.
Add confidence and lifecycle fields to every new page's frontmatter:
yaml
base_confidence: 0.42
lifecycle: draft
lifecycle_changed: <ISO date today>
On update, leave lifecycle and lifecycle_changed unchanged — only a human editor transitions lifecycle state.
Mark provenance per the convention in llm-wiki (Provenance Markers section):
Memory files are mostly extracted — the user wrote them by hand and they're already distilled. Treat memory-derived claims as extracted unless you're stitching together claims from multiple memory files.
Conversation distillation is mostly inferred. You're synthesizing a coherent claim from many turns of dialogue, often filling in implicit reasoning. Apply ^[inferred] liberally to synthesized patterns, generalizations across sessions, and "what the user really meant" interpretations.
Use ^[ambiguous] when the user changed their mind across sessions or when assistant and user contradicted each other and the resolution is unclear.
Write a provenance: frontmatter block on every new/updated page summarizing the rough mix.
Step 6: Update Manifest, Journal, and Special Files
Update .manifest.json
For each source file processed, add/update its entry with:
ingested_at, size_bytes, modified_at
source_type: one of "claude_conversation", "claude_memory", "claude_audit_log", "claude_desktop_session"
Update index.md, log.md, and hot.md with one locked call:
bash
obsidian-wiki memory sync CLAUDE_HISTORY_INGEST \
projects=<projects> conversations=<conversations> \
desktop_sessions=<desktop_sessions> audit_logs=<audit_logs> \
pages_updated=<pages_updated> pages_created=<pages_created> \
mode=<mode> \
--takeaways "Ingested 5 Claude conversations across 2 projects; surfaced patterns in API design and testing strategy."
Never hand-edit index.md, log.md, or hot.md — the command takes the lock that keeps a parallel writer from dropping your update. --takeaways is the one-line conceptual summary that used to go in Recent Activity;
omit it to leave the previous takeaways untouched.
If an ongoing project is now better understood, record the thread so the next
session picks it up: obsidian-wiki memory todo add "<thread>" --origin projects/<name>.md.
See .skills/llm-wiki/references/MEMORY.md for the full procedure.
Privacy
Distill and synthesize — don't copy raw conversation text verbatim
Skip anything that looks like secrets, API keys, passwords, tokens
If you encounter personal/sensitive content, ask the user before including it
The user's conversations may reference other people — be thoughtful about what goes in the wiki
Reference
See references/claude-data-format.md for more details on the data structures.
QMD Refresh After Vault Writes
QMD is a search index, not the source of truth. If $QMD_WIKI_COLLECTION is empty or unset, skip this step. Run it only after this skill has written or rewritten vault markdown. If QMD refresh fails, do not roll back the vault changes; report the QMD status separately.
Use $QMD_CLI if set; otherwise use qmd.
bash
${QMD_CLI:-qmd} update
If the output says vectors are needed or embeddings may be stale, run:
bash
${QMD_CLI:-qmd} embed
Verify the collection with either:
bash
${QMD_CLI:-qmd} ls "$QMD_WIKI_COLLECTION"
or, when a specific page path is known:
bash
${QMD_CLI:-qmd} get "qmd://$QMD_WIKI_COLLECTION/<page>.md" -l 5
Claude History Ingest next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
Claude History Ingest compared with similar skills
Skill
Stars
Used in
Tokens
Auto-check
Licence
Repo updated
Claude History Ingest this skillAr9av/obsidian-wiki
Build and maintain a Karpathy-style LLM knowledge base — a self-compiling Obsidian markdown wiki where an Agent ingests raw sources, compiles cross-linked concept/entity/summary pages, answers…
Ingest Claude Code conversation/session history into Obsidian as distilled knowledge. Claude History Ingest is an agent skill from Ar9av/obsidian-wiki. Ingest Claude Code conversation/session history into Obsidian as distilled knowledge.
When should I use Claude History Ingest?
Claude History Ingest fits situations like: mining past Claude sessions; project/session history.
How do I install Claude History Ingest in Claude Code?
Run `npx skills add Ar9av/obsidian-wiki --skill claude-history-ingest -a claude-code`. Or copy the skill folder (.skills/claude-history-ingest in Ar9av/obsidian-wiki) into .claude/skills/claude-history-ingest in your project. Claude Code loads it when a task matches its description.
How do I install Claude History Ingest in Codex?
Run `npx skills add Ar9av/obsidian-wiki --skill claude-history-ingest -a codex`. Or copy the skill folder (.skills/claude-history-ingest in Ar9av/obsidian-wiki) into .agents/skills/claude-history-ingest in your project. Codex loads it when a task matches its description.
Can I use Claude History Ingest in Cursor, Gemini CLI or GitHub Copilot?
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Ar9av/obsidian-wiki --skill claude-history-ingest -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/claude-history-ingest, .gemini/skills/claude-history-ingest, .github/skills/claude-history-ingest and .opencode/skills/claude-history-ingest in your project.
What does Claude History Ingest need to run?
Going by SKILL.md and its folder, Claude History Ingest needs the command-line tools its instructions call (python3). Our summary lists: Python 3.
Does Claude History Ingest access the network?
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Is Claude History Ingest safe to install?
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
What licence does Claude History Ingest use?
Claude History Ingest is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
How many tokens does Claude History Ingest use?
About 5.6k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.1k tokens, read only when the agent opens those files.
What are the alternatives to Claude History Ingest?
Skills that share tags, products or a category with Claude History Ingest: Obsidian CLI (Atmosphere/atmosphere, 3.8k stars), Obsidian Canvas Boards (AgriciDaniel/claude-obsidian, 15k stars), LLM Wiki (lewislulu/llm-wiki-skill, 655 stars) and Second Brain (NicholasSpisak/second-brain, 737 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Who maintains Claude History Ingest?
Ar9av (a GitHub user) maintains it in Ar9av/obsidian-wiki, which has 3,547 GitHub stars. The repository holds 39 skills in this directory. The repository was last updated on October 10, 2026.
Source: Ar9av/obsidian-wiki on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.