obsidian-second-brain turns an Obsidian vault into persistent, searchable memory for Claude Code and other command-line coding agents, storing knowledge as linked Markdown notes. It is for developers, founders, writers, and researchers who want agents to retain project context across sessions. Its catalogue entries provide commands, hooks, a plugin, a skill, and instructions for capturing, finding, and maintaining that memory.
Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
git clone --depth 1 https://github.com/eugeniughelbur/obsidian-second-brainWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/commands/eugeniughelbur/obsidian-second-brain/obsidian-ingest)<a href="https://agentmods.dev/commands/eugeniughelbur/obsidian-second-brain/obsidian-ingest"><img src="https://agentmods.dev/badge/commands/eugeniughelbur/obsidian-second-brain/obsidian-ingest/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/commands/eugeniughelbur/obsidian-second-brain/obsidian-ingest"><img src="https://agentmods.dev/badge/commands/eugeniughelbur/obsidian-second-brain/obsidian-ingest.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00024 | $0.05877 |
| Opus 5.5 | $0.00010 | $0.02351 |
| Sonnet 5.5 | $0.00005 | $0.01175 |
| Haiku 4.5 | $0.00002 | $0.00588 |
Grade A, and why
obsidian-ingest scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 3d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 186 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Use the obsidian-second-brain skill. Execute /obsidian-ingest $ARGUMENTS:
The argument is a URL, file path, directory path, or pasted text. If no argument, ask what to ingest. A directory invokes the procedure below; a single source follows steps 1-9 as before.
Directory ingestion
Examples: /obsidian-ingest First-Brain/ --preview, /obsidian-ingest Sources/ --batch-size 10. Warm start is the First Brain use case of this general procedure; no specific vault layout is required.
- Read
_CLAUDE.md, resolve destinations throughreferences/folder-map.md, and treat the selected source collection as read-only for every worker. Preserve bytes and paths; never consolidate back into it. If a destination overlaps the source collection, stop and resolve routing with the user. Do not automatically switch layouts. Honor sensitive-content permissions; selecting a folder does not override its private subfolders. - Discover paths with the helper bundled at
SKILL_ROOT/scripts/ingest_batch.py:
Substitute the actual vault/source paths and repeatuv run --directory "SKILL_ROOT" scripts/ingest_batch.py --vault "VAULT" discover "SOURCE" --output "DESTINATION"--outputfor every resolved knowledge, raw, daily, board, research, log, and Bases destination. Discovery does not read source bodies. It covers Markdown/plain text (.md,.markdown,.txt), PDF (.pdf), audio (.m4a,.mp3,.wav,.ogg,.webm), and images (.png,.jpg,.jpeg,.webp), case-insensitively. Existing scan exclusions and.vault-config.jsondirectory/path exclusions apply;exclude-link-scanis not an ingestion exclusion. Generated output and linked paths are excluded. Excluded directory entries represent pruned directories, not a count of their unread descendants. Do not follow embedded URLs or add unsupported format readers. - Resolve read permissions before hashing. For
--preview, show discovered formats, exclusions, destinations, and known extraction requirements, then stop without writing logs or captures. Otherwise callplan, replacingdiscoverabove, and add--allow "PERMITTED_PATH"for approved scopes,--block "PRIVATE_PATH"for denied descendants, and--limit N(default 10, positive). No--allowgrants no reads. Add--raw-root "RAW_DESTINATION"immediately after--vault "VAULT"when the raw route is custom. Map command--batch-sizeto helper--limit. Plan hashes permitted files and reads capture headers and completion receipts; it does not extract content. - Process the returned
batchsequentially, finishing one source's full steps 1-9 before starting another. Reuse the plan's raw capture when present and continue consolidation from its body, skipping transcription/OCR/read extraction. Otherwise use the existing source handler below. Newly captured local files retain the plannedsource_pathand full bytesource_file_hash; existing canonicalcontent_hashdeduplication remains unchanged. Preserve earlier captures. Keep transcripts, PDF extracts, and image descriptions in their existing raw destinations with accuratecapture_scope; do not claim binary archival. Preserve the current rewrite policy and per-source catalog, daily-note, and normal operation-log updates. Include the completion append in the normal approval batch when confirmation is required. Only after all required work and approvals finish, call:
Supply JSON on stdin containing exactlyuv run --directory "SKILL_ROOT" scripts/ingest_batch.py --vault "VAULT" completesource_path, the plannedsource_file_hash, and the actualraw_path. Pass the same--raw-rootfor a custom route. Use JSON stdin, not shell-interpolated source text. The helper verifies unchanged source bytes and an existing published raw capture. It records the agent's completion attestation, not semantic extraction quality. On failure, missing capabilities, changed source bytes, or pending/declined required approvals, do not callcomplete; report the unfinished work and retain any published capture. Stop on unresolved approval. Never change an original to restore its hash. - Stop after the selected batch (or earlier for extraction/session limits) and report discovered, excluded, skipped unchanged, completed this run, failed, blocked, and pending sources, plus remaining work. Repeat the same folder command for the next batch or to retry unfinished work after an interrupted session has stopped. No resume or retry flag is needed. Unresolved proposals are regenerated against current pages. Sources blocked by read permissions are reconsidered only after permission is granted. A repeatedly failing source may need to be fixed, explicitly excluded, or handled separately to allow later batches to advance.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 3d ago Changed · +43 lines · -12 tokens per session 3e2b1d4a58a6
- 7d ago Changed · +4 lines 9c94641fce6a
- 1mo ago Changed · +1 lines f70dcd6a2084
- 1mo ago Changed · +4 lines 6474749b24a1
- 1mo ago Changed · +3 lines f9d7daf76334
- 1mo ago First seen · 131 lines · 36 tokens per session scan A 956e46bf53a1
obsidian-ingest is a command published in the GitHub repository eugeniughelbur/obsidian-second-brain (4,996 stars, last pushed today), licensed MIT. It adds 24 tokens to every session and 5,877 once invoked, about $0.0001 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other commands, from other repositories
patterns
Scan recent sessions for recurring patterns and turn them into captures (rules, concept notes, writing seeds).
curate
A command for maintaining a file-based knowledge wiki. It can review pages, shorten overlong material, manage page lifecycles, find possible contradictions, and rebuild weak connections between notes.
ingest
A command for adding information to a file-based knowledge wiki from web pages, files, or text notes. It classifies the material, updates or creates wiki pages, and adds links between related pages.
onboard
An interview-based setup command for an LLM Wiki, a notes system designed for use with language models. It asks about your wiki, files, working mode, and personal context, then fills in the setup details.
refresh-context
Re-snapshot Core Context.md from (optional) mothership system files + key personal essays. Run when mothership files change, when new essays signal philosophy shift, or when snapshot is older than 30 days.
wiki-req
Capture and decompose a concept into atomic, traceable wiki requirements. Clarifies ambiguous requirements, splits them into atomic pieces, and persists them as wiki/requirements/ pages with status tracking.