obsidian-ingest

obsidian-ingest is a command for Claude Code from eugeniughelbur/obsidian-second-brain. It costs 24 tokens per session (5,877 once invoked), scanned A, original, MIT.

A command for adding articles, documents, transcripts, videos, audio, images, or pasted text to an Obsidian vault, a folder of linked notes. It extracts information and reorganizes related notes around the new source.

In plain words
What is it for?
Use it to ingest research, meeting or podcast transcripts, YouTube videos, audio recordings, screenshots, PDFs, and other reference material.
Why use it?
It removes the need to manually summarize sources, update old claims, connect related ideas, and resolve contradictions in the vault.

Command for Claude Code

Written for Claude Code: $ARGUMENTS substitution. Also seen: mentions subagents; mentions Claude Code.

Part of the obsidian-second-brain plugin — 1 skill, 49 commands, 3 hooks shipped together

Good fit Use it to ingest research, meeting or podcast transcripts, YouTube videos, audio recordings, screenshots, PDFs, and other reference material.

Compare 6 commands from other repositories ↓
Install with agentmods
npx agentmods add commands/eugeniughelbur/obsidian-second-brain/obsidian-ingest
About the project

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.

eugeniughelbur/obsidian-second-brain · 4,996 stars · on GitHub · theaioperator.io

Install

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.

Clone the repo
git clone --depth 1 https://github.com/eugeniughelbur/obsidian-second-brain

Made for: Claude Code.

Or install obsidian-second-brain, the plugin that ships this one along with the rest of its 1 skill, 49 commands, 3 hooks.

Wrote 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.

agentmods badge for obsidian-ingest

README.md
[![agentmods](https://agentmods.dev/badge/commands/eugeniughelbur/obsidian-second-brain/obsidian-ingest/github.svg)](https://agentmods.dev/commands/eugeniughelbur/obsidian-second-brain/obsidian-ingest)
Your own site
<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.

agentmods 80×15 button for obsidian-ingest

Your own site · 80×15
<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>
Per session 24 Only the description is in the session, so the agent can decide to use it. The body loads when it is invoked.
When invoked 5,877 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

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.

ModelPer sessionOnce 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

Measured 3d ago against content hash 3e2b1d4a58a6, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

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.

commands/obsidian-ingest.md · 186 lines

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.

  1. Read _CLAUDE.md, resolve destinations through references/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.
  2. Discover paths with the helper bundled at SKILL_ROOT/scripts/ingest_batch.py:
    uv run --directory "SKILL_ROOT" scripts/ingest_batch.py --vault "VAULT" discover "SOURCE" --output "DESTINATION"
    
    Substitute the actual vault/source paths and repeat --output for 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.json directory/path exclusions apply; exclude-link-scan is 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.
  3. Resolve read permissions before hashing. For --preview, show discovered formats, exclusions, destinations, and known extraction requirements, then stop without writing logs or captures. Otherwise call plan, replacing discover above, and add --allow "PERMITTED_PATH" for approved scopes, --block "PRIVATE_PATH" for denied descendants, and --limit N (default 10, positive). No --allow grants no reads. Add --raw-root "RAW_DESTINATION" immediately after --vault "VAULT" when the raw route is custom. Map command --batch-size to helper --limit. Plan hashes permitted files and reads capture headers and completion receipts; it does not extract content.
  4. Process the returned batch sequentially, 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 planned source_path and full byte source_file_hash; existing canonical content_hash deduplication remains unchanged. Preserve earlier captures. Keep transcripts, PDF extracts, and image descriptions in their existing raw destinations with accurate capture_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:
    uv run --directory "SKILL_ROOT" scripts/ingest_batch.py --vault "VAULT" complete
    
    Supply JSON on stdin containing exactly source_path, the planned source_file_hash, and the actual raw_path. Pass the same --raw-root for 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 call complete; report the unfinished work and retain any published capture. Stop on unresolved approval. Never change an original to restore its hash.
  5. 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.

Read the full file on GitHub · 186 lines

Changes

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.

  1. 3d ago Changed · +43 lines · -12 tokens per session 3e2b1d4a58a6
  2. 7d ago Changed · +4 lines 9c94641fce6a
  3. 1mo ago Changed · +1 lines f70dcd6a2084
  4. 1mo ago Changed · +4 lines 6474749b24a1
  5. 1mo ago Changed · +3 lines f9d7daf76334
  6. 1mo ago First seen · 131 lines · 36 tokens per session scan A 956e46bf53a1

Subscribe to this mod's changes

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.