Cross-CLI skill for Obsidian. Turns your vault into a living AI-first second brain across Claude Code, Codex CLI, Gemini CLI, and OpenCode. 32 commands, vault-first research, scheduled agents, write-time AI-first validator.
# Add to your Claude Code skills
git clone https://github.com/eugeniughelbur/obsidian-second-brainGuides for using ai agents skills like obsidian-second-brain.
Last scanned: 5/7/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-05-07T06:34:52.318Z",
"semgrepRan": false,
"npmAuditRan": true,
"pipAuditRan": true
}No comments yet. Be the first to share your thoughts!
Claude operates your Obsidian vault as a self-rewriting knowledge base. An evolution of Karpathy's LLM Wiki pattern: sources rewrite existing pages instead of just appending, contradictions reconcile automatically, and scheduled agents maintain the vault while you sleep. Everything worth remembering gets saved. Every update propagates everywhere it belongs.
Try these methods in order. Use the first one available:
Method 0 — SessionStart hook (if configured):
If hooks/load_vault_context.py is wired as a SessionStart hook in ~/.claude/settings.json, _CLAUDE.md is injected into context automatically at session start. Skip step 1 below.
To wire it: bash scripts/setup.sh "/path/to/vault" or run /obsidian-setup.
Method A — MCP server (mcp-obsidian):
If the MCP tools (get_file_contents, list_files_in_vault, search, append_content, write_file) are available, use them.
Method B — Direct filesystem (fallback, always works): Use standard file tools (Read, Write, Edit, Glob) against the vault path. The vault is plain markdown — all operations work without MCP, just more verbosely.
If MCP is not installed, silently use filesystem access. Tell the user ONCE (first time only):
"For faster vault access on large vaults, consider installing mcp-obsidian:
claude mcp add obsidian-vault -s user -- npx -y mcp-obsidian \"/path/to/your/vault\". Everything works without it."
_CLAUDE.mdBefore doing anything in a vault, check if _CLAUDE.md exists at the vault root:
get_file_contents("_CLAUDE.md")
If it exists: follow its rules exactly — they override the defaults in this skill. Where _CLAUDE.md is silent, fall back to the defaults below.
If it doesn't exist: use the defaults in this skill, then offer to create one.
If the SessionStart hook is active, _CLAUDE.md is already in context — skip this step.
list_files_in_vault()
Scan the structure to understand: folder names, template locations, naming conventions, frontmatter patterns. Then read 2–3 existing notes with get_file_contents(path) to calibrate writing style before creating anything new.
If the user has no vault yet, run:
# One-line install + bootstrap (asks 3 questions: vault path, your name, preset)
curl -sL https://raw.githubusercontent.com/eugeniughelbur/obsidian-second-brain/main/scripts/quick-install.sh | bash
# Or manual:
python scripts/bootstrap_vault.py --path ~/path/to/vault --name "Your Name"
# With a preset:
python scripts/bootstrap_vault.py --path ~/my-vault --name "Your Name" --preset executive
python scripts/bootstrap_vault.py --path ~/my-vault --name "Your Name" --preset builder
python scripts/bootstrap_vault.py --path ~/my-vault --name "Your Name" --preset creator
python scripts/bootstrap_vault.py --path ~/my-vault --name "Your Name" --preset researcher
# With style override:
python scripts/bootstrap_vault.py --path ~/my-vault --name "Your Name" --style obsidian
# With assistant mode (maintaining vault for someone else):
python scripts/bootstrap_vault.py --path ~/my-vault --name "Your Name" --mode assistant --subject "Boss Name"
Then configure mcp-obsidian to point at the new vault path and restart Claude.
Presets customize the vault for different use cases:
executive — Decisions, people, meetings, strategic planning. Kanban: OKRs, Quarterly, Weekly.builder — Projects, dev logs, architecture decisions, debugging. Kanban: Backlog, Sprint, Done.creator — Content calendar, ideas pipeline, audience notes, publishing. Kanban: Ideas, Drafts, Published.researcher — Sources, literature notes, hypotheses, methodology. Kanban: Reading, Processing, Synthesized.Default (no preset) gives a general-purpose vault. All presets use wiki-style by default.
Assistant mode creates a _CLAUDE.md configured for operating a vault on behalf of someone else. See references/claude-md-assistant-template.md.
See references/vault-schema.md for full structural details.
The vault is designed for future-Claude to read and reason over, not for human review. Every note Claude writes — across all 32 commands — must follow references/ai-first-rules.md:
type, date, tags, ai-first: true, plus type-specific fields (see ai-first-rules.md for schemas per note type)[[wikilinks]]stated | high | medium | speculation where applicableThis rule lives in _CLAUDE.md Section 0 of every vault using this skill, and in references/ai-first-rules.md (the canonical specification with frontmatter schemas + preamble templates per note type).
Every write operation must ask: where else does this belong?
| You create/update... | Also update... |
|---|---|
| A new project note | Kanban board (add to Backlog), today's daily note (link it) |
| A task completed | Kanban board (move to Done), project note (log it), daily note |
| A person note | Daily note (mention interaction), People index if it exists |
| A dev log | Daily note (link it), project note (Recent Activity) |
| A deal update | Side Biz / Deals kanban, Dashboard totals |
| A decision made | Project note (Key Decisions), daily note |
| A mention/shoutout | Mentions Log, person's note, daily note |
| A hook, contrarian angle, or content idea | social-media/ideas.md (if folder exists) |
| A specific reusable number or stat | social-media/data-points.md (if folder exists) |
| An external post that performed well + why | social-media/swipe-file.md (if folder exists) |
| Research findings worth keeping | social-media/research/YYYY-MM-DD — topic.md (if folder exists) |
| Any vault write | operation log (Logs/YYYY-MM-DD.md if Logs/ exists, else log.md), index.md (update if new note created) |
Always propagate. Never create a single orphaned note.
When a fact changes (role, company, status, location, tool), NEVER delete the old value. Add a new entry to the timeline: frontmatter array with both event time AND transaction time:
timeline:
- fact: "CTO at Single Grain"
from: 2024-01-01 # event time: when it was true
until: 2026-04-07
learned: 2026-02-23 # transaction time: when the vault learned it
source: "[[2026-02-23]]" # where from
- fact: "Architect at Single Grain"
from: 2026-04-07
until: present
learned: 2026-04-07
source: "[[2026-04-07]]"
Top-level fields (role:, status:, company:) always reflect the CURRENT state. The timeline: preserves the full history with provenance.
This enables:
A tiny file (~120 tokens) loaded alongside SOUL.md at L0 in every session. Contains facts needed in every conversation:
Update this file whenever a critical fact changes. Keep it under 150 tokens.
In wiki-style vaults, the raw/ folder contains original sources (articles, transcripts, PDFs). Claude reads these but NEVER modifies them. They are the source of truth. If a wiki page gets corrupted, re-derive it from the raw source. When ingesting, always save the original to raw/ and the derived pages to wiki/.
index.md and log.mdTwo structural files that keep the vault navigable and auditable:
index.md — A catalog of all vault pages organized by category. Claude reads this FIRST when navigating the vault instead of searching — faster and cheaper on tokens. Update it whenever a new note is created or deleted. Format: - [[Note Name]] — brief description grouped under folder headings.
log.md — An append-only chronological log of every vault operation. Every save, ingest, health check, and structural change gets a timestamped entry. Never delete or rewrite entries — only append. Format: ## [YYYY-MM-DD] action | Description
Vaults initialized with /obsidian-init (v0.9+) use a split log structure instead of a monolithic log.md:
Logs/YYYY-MM-DD.md — one file per day, append-only. Format: **HH:MM** - action | descriptionlog.md at vault root — pointer file only. Never write entries here; it explains the per-day structure and ships the entry template.To migrate an existing monolithic log.md: run python scripts/migrate_log.py --vault <path>.
To refresh the stats block in index.md after bulk writes: run python scripts/vault_stats.py --vault <path>.
When writing operation log entries, check whether the vault uses the old (log.md) or new (Logs/YYYY-MM-DD.md) structure and write to the correct location.
The vault is not a filing cabinet. It is a living knowledge base that rewrites itself with every input. When new information enters:
The vault after an ingest should be DIFFERENT — not just bigger. If pages that existed before aren't smarter, more connected, and more current, the ingest wasn't deep enough.
Every interaction that produces insight must generate two outputs:
This applies to all thinking tools and any query where Claude synthesizes information from the vault.
When Claude notices a pattern during any operation (ingest, query, challenge, emerge), it should automatically create a synthesis page in wiki/concepts/. Patterns include:
Synthesis pages are the vault thinking for itself — connecting dots the user hasn't connected yet.
The vault should never contain two pages that disagree without knowing they disagree. When contradictions are found (during ingest, health checks, or queries), either:
Use /obsidian-reconcile for vault-wide truth maintenance.
Unsaved conversations are lost knowledge. Claude should proactively remind the user to save:
Before creating any new note, search for an existing one:
search(query="keyword from title")
Duplicate notes are vault rot. Merge or update instead of creating new.
Read existing notes in the same folder before writing new ones. Match: frontmatter schema, heading style, list formatting, tone, emoji usage (or lack of it). Never introduce new conventions — extend what's already there.
Every note gets frontmatter. At minimum:
---
date: 2026-03-24
tags:
- <note-type>
---
See references/vault-schema.md for full frontmatter specs by note type.
See references/write-rules.md for the complete guide. Summary:
[[Note Name]] for internal links. Always link to people, projects, and jobs mentioned in a note.YYYY-MM-DD) in frontmatter. Human format (March 24) in body text.YYYY-MM-DD — Title.md for dated notes. Title.md for evergreen notes. No special characters except — (em dash).active / planning / completed / archived / on-hold for projects. in-progress / done / waiting for tasks.- [ ] 🔴 **Title** · @{YYYY-MM-DD}\n\tDescription [[Link]]_CLAUDE.md FileThis is the most important concept in this skill.
_CLAUDE.md lives at the vault root and persists Claude's operating rules across every session and every surface (Claude Desktop, Claude Code, VS Code, terminal). Without it, Claude has to re-learn your vault conventions every conversation.
Precedence rule: _CLAUDE.md wins on all vault-specific rules (folder names, naming conventions, frontmatter fields, auto-save behavior, private folders). The defaults in this skill file apply only where _CLAUDE.md is silent. Never let skill defaults override an explicit _CLAUDE.md rule.
What it contains:
To generate a _CLAUDE.md for an existing vault, run vault discovery then use the template in references/claude-md-template.md.
To install it: write the file to the vault root. Every Claude session that starts in that vault should read it first.
When a conversation produces something vault-worthy:
date = today in YYYY-MM-DD format
path = Daily/{date}.md
Read Templates/Daily Note.md, fill in the date fields, create the file.
Then scan recent conversation for anything worth logging in today's sections.
Read Templates/Dev Log.md. Fill: date, project name, what was worked on, problems solved, decisions made, next steps.
Save to Dev Logs/YYYY-MM-DD — Project Name.md.
Link from project note's Recent Activity section and today's daily note.
Boards use the kanban-plugin: board frontmatter.
Columns are ## Column Name headers.
Items are - [ ] **Title** · @{due-date}\n\tDescription [[Links]]
Completed items move to the ## ✅ Done column with a strikethrough: - [x] ~~**Title**~~ ✅ Date
python scripts/vault_health.py --path ~/path/to/vault
Reports: duplicate notes, orphaned files (no incoming links), stale tasks (overdue), empty folders, broken links, notes missing frontmatter.
Proactively suggest running this when the user says the vault feels messy, notes are hard to find, they mention duplicates, or they haven't mentioned a health check in a long time. Offer: "Want me to run a vault health check?"
These slash commands can be used in any Claude surface. Each one is smart — it reads context, searches before writing, and propagates everywhere changes belong.
Name matching: If a name argument has a typo or is approximate, search the vault for the closest match, show what was found, and confirm with the user before proceeding. Never silently create a note with a misspelled name.
/obsidian-saveThe master save command. Reads the entire conversation and extracts everything worth preserving.
Steps:
Do not ask for guidance on where to save things — infer it. Only ask if something is genuinely ambiguous (e.g. a person mentioned with no context on who they are).
/obsidian-dailyCreates or updates today's daily note.
Steps:
Daily/YYYY-MM-DD.md exists for todayTemplates/Daily Note.md, fill in date fields, create the fileReturn the path of the daily note when done.
/obsidian-logLogs a work or dev session to the vault.
Steps:
Templates/Dev Log.md (or Templates/Work Log.md if it exists)Dev Logs/YYYY-MM-DD — Project Name.md/obsidian-task [description]Adds a task to the vault and the right kanban board.
Steps:
_CLAUDE.md board list or search Boards/📋 This Week or 📥 Backlog depending on due date)Tasks/ if the task is substantial (more than a one-liner)/obsidian-person [name]Creates or updates a person note.
Steps:
People/Full Name.md with full frontmatter schema/obsidian-decide [optional: topic]Extracts and logs decisions from the conversation.
Steps:
## Key Decisions section with date/obsidian-capture [optional: idea text]Quick idea capture with zero friction.
Steps:
Ideas/ for a related existing note — if found, append to itIdeas/Title.md with minimal frontmatter (date, tags: [idea])/obsidian-find [query]Smart vault search.
Steps:
search(query="...") with the provided queryDo not just return filenames — return enough context for the user to act.
/obsidian-recap [today|week|month]Summarizes a time period from the vault.
Steps:
week if not specified)list_files_in_dir("Daily/")/obsidian-reviewGenerates a structured weekly or monthly review note.
Steps:
Templates/Review.md if it exists, otherwise use a standard structure:
Reviews/YYYY-MM-DD — Weekly Review.md (or Monthly)/obsidian-board [optional: board name]Shows or updates a kanban board.
Steps:
Boards/ for it (fuzzy match)@{date})/obsidian-project [name]Creates or updates a project note.
Steps:
Projects/Project Name.md with full frontmatter schema (date, tags: [project], status: active, job)📥 Backlog or 🔨 In Progress column/obsidian-healthRuns a vault health check and summarizes findings.
Steps:
python scripts/vault_health.py --path ~/path/to/vault --jsonlog.md with severity counts/obsidian-reconcileFinds and resolves contradictions across the vault.
Steps:
index.md to understand the full vault landscapewiki/concepts/ and wiki/projects/ for conflicting factual claimswiki/entities/ for outdated roles, companies, or descriptionswiki/decisions/ for reversed or superseded decisions never updatedraw/ dates against wiki/ pages for stale referenceswiki/decisions/Conflict — Topic.md with both sides, mark status: openindex.md sections, append to log.md, update daily note/obsidian-synthesizeAutomatic synthesis — the vault thinks for itself.
Can run manually or as a scheduled agent. Scans the vault for patterns nobody asked about.
Steps:
index.md and log.md (last 20 entries) for recent activitywiki/concepts/Synthesis — Title.md with evidence, interpretation, and suggested actionindex.md, log.md, and today's daily note/obsidian-exportExport a clean snapshot any agent or tool can consume.
Steps:
wiki/ and extract: path, title, type, date, status, summary, links, tags, frontmatter_export/vault-snapshot.json or markdown to _export/vault-snapshot.mdlog.md/obsidian-initBootstraps _CLAUDE.md for the vault — the operating manual.
Steps:
list_files_in_vault() to map the full structureHome.md or equivalent dashboardTemplates/Boards/_CLAUDE.md using the template in references/claude-md-template.md, filled with real values from the vault_CLAUDE.md at the vault root via append_content("_CLAUDE.md", content)If _CLAUDE.md already exists: show a diff of what would change and ask before overwriting.
/obsidian-ingestIngests a source into the vault — one source touches many pages.
Steps:
Knowledge/YYYY-MM-DD — Source Title.md with full summary and source linkindex.md with all newly created noteslog.md: ## [YYYY-MM-DD] ingest | Source Title (type) — X created, Y updatedA single ingest should touch 5-15 files. Compile knowledge once, distribute everywhere.
These commands use the vault as a thinking partner — not just storage. They surface insights, challenge assumptions, and generate connections that the user cannot see on their own.
/obsidian-challengeRed-teams your current idea against your own vault history.
Steps:
Do not be agreeable. The entire point is to pressure-test. Cite specific vault files.
/obsidian-emergeSurfaces unnamed patterns from recent notes — recurring themes and conclusions you haven't explicitly stated.
Steps:
Ideas/ or a relevant project noteThe goal is insight the user cannot see themselves. Surface what they haven't named yet.
/obsidian-connect [topic A] [topic B]Bridges two unrelated domains using the vault's link graph to spark new ideas.
Steps:
/obsidian-connect "distributed systems" "cooking")Ideas/ with links to both source domainsThe value is in unexpected links. If the connection is obvious, dig deeper.
/obsidian-graduatePromotes an idea fragment into a full project spec with tasks, board entries, and structure.
Steps:
Ideas/, daily notes, and captures for a matching idea (fuzzy)Projects/ with complete frontmatter (status: planning, linked idea)status: graduated and link to the new projectThe idea doesn't die — it evolves. The original note stays as the origin story.
/obsidian-worldLoads your identity, values, priorities, and current state in one shot — with progressive context levels.
Uses token budgets to avoid loading the entire vault. Start light, go deeper only as needed.
Steps:
SOUL.md/About Me.md and CORE_VALUES.md/Values.mdindex.md (vault catalog) and log.md (last 10 entries)Home.md/Dashboard.md, today's daily note, last 3 daily notes, active kanban boards, previous session digestsPresent a brief status after L0-L2 (do NOT load L3 unless needed):
Keep output concise — this is a boot-up sequence, not a report.
If identity files don't exist, offer to create them by asking 5-7 quick questions about the user's role, values, and preferences.
If index.md doesn't exist, offer to run /obsidian-init to generate it.
/obsidian-adrGenerates a decision record when the vault structure changes.
Steps:
Knowledge/ADR-YYYY-MM-DD — Title.md with:
index.md and append to log.mdThe vault knows why it's structured the way it is. When a future session asks "why?" — the ADR has the answer.
Can also be triggered automatically by /obsidian-graduate, /obsidian-health structural fixes, or folder reorganizations. In those cases, offer to create an ADR — don't force it.
Five commands that pull external knowledge into the vault — X posts, X discourse, web research with citations, and YouTube videos. All output AI-first notes per the vault's Section 0 rule (preamble, rich frontmatter, recency markers, mandatory wikilinks, sources verbatim).
Setup: API keys live at ~/.config/obsidian-second-brain/.env. Run install.sh and answer "y" to the research toolkit prompt, or copy .env.example manually. xAI Grok and Perplexity keys are required; YouTube key is optional (transcripts work without it).
Stack: Python 3.10+ with uv. Install deps via uv sync from the repo root.
/x-read [url]Deep-read an X post via Grok + Live Search. Verbatim post + thread + TL;DR + key claims + reply sentiment + voices to watch.
Steps:
x.com/ or twitter.com/uv run -m scripts.research.x_read "<url>" from the repo rootResearch/X-reads/Plain English triggers: "read this tweet", "analyze this X post", "what's in this tweet".
/x-pulse [topic]Scan X for what's trending in a topic. Themes (with rep posts + voices), gaps, hooks working, voice/tone, post ideas.
Steps:
uv run -m scripts.research.x_pulse "<topic>"Research/X-pulse/YYYY-MM-DD — <slug>.md (AI-first format)log.mdPlain English: "what's hot on X about AI", "X pulse on vibe coding", "what should I post today on AI automation".
/research [topic]Web research with citations via Perplexity Sonar Pro. Deep dossier: summary, key facts (with recency markers), timeline, key players, contrarian views, further reading, open questions.
Steps:
uv run -m scripts.research.research "<topic>"Research/Web/YYYY-MM-DD — <slug>.mdPlain English: "research X", "look up X", "find me info on X". Note: "do deep research" routes to /research-deep instead.
/research-deep [topic]Vault-first deep research with cross-vault propagation. The chain-everything command.
Steps (4 phases):
Then:
Research/Deep/YYYY-MM-DD — <slug>.md<<<RESEARCH_DEEP_PROPAGATION_PAYLOAD>>> markers/obsidian-save-style propagation: spawns parallel subagents to update People/Projects/Ideas/Decisions per the synthesis's "Recommended Vault Updates" bulletsCost: typically $0.20-$0.80 per run depending on topic depth.
Plain English: "do deep research on X", "research properly", "vault-aware research on X", "research and update the vault".
Graceful degradation: if any phase fails partially (e.g. Grok unavailable), continues with available sources and flags the gap.
/notebooklm [topic]Vault-first source-grounded research. The parallel to /research-deep — but grounded in your own sources instead of the open web.
Steps (4 phases + manual NotebookLM step):
/research-deep Phase 1, finds top 12 most relevant notesResearch/NotebookLM/YYYY-MM-DD — <slug> — bundle.md (well under NotebookLM's 500K-char/source limit)uv run -m scripts.research.notebooklm --save-response --topic "<topic>" --slug "<slug>" and pastes response via stdin/obsidian-save flow as /research-deepWhen to use /notebooklm over /research-deep:
/research-deep (Perplexity + Grok): open-web + X-discourse coverage. Cost: $0.20-0.80/notebooklm: GROUNDED IN your own sources (vault + any PDFs/URLs you add). Cost: ~$0 (uses your free NotebookLM access)Why a manual step: NotebookLM's API is workspace-gated beta as of 2026-01. The pasted-source workflow works for every user with a free Google account.
Plain English: "notebooklm this", "ask my notebook about X", "ground a research on X using my vault", "source-grounded research on X".
/youtube [url]Extract and summarize a YouTube video. Transcript (free, no API key) + metadata + top comments (Data API v3, optional) → summarized via Grok.
Steps:
uv run -m scripts.research.youtube_extract "<url>"youtube-transcript-apiYOUTUBE_API_KEY set: also fetches title, channel, view counts, top commentsResearch/YouTube/YYYY-MM-DD — <video-title-slug>.mdPlain English: "summarize this YouTube video", "extract this video", or just paste a YouTube URL with a question.
If the video has no captions and no API key set, the script fails with a clear message.
/x-read, /x-pulse, and /youtube (Grok summarize step) log usage to ~/.research-toolkit/usage.log. View monthly totals via:
uv run python -c "from scripts.research.lib.usage import month_total; t,c = month_total(); print(f'\${t:.2f} across {c} calls')"
No usage tracking on Perplexity calls (intentional — user opted out).
No hard caps. No blocking. No per-call confirmation prompts. Trust the user to monitor.
Four autonomous agents designed to run on a schedule with no user intervention. Each runs a focused vault operation at a set time, then stops. They are conservative by default — they never delete or archive anything autonomously, and they never ask the user questions mid-run.
Set these up once using the /schedule skill in Claude Code.
obsidian-morning — Daily at 8:00 AMCreates today's daily note and surfaces what needs attention.
Prompt to schedule:
Read _CLAUDE.md. Create today's daily note in Daily/ using the Daily Note template.
Pull in any tasks from kanban boards that are due today or overdue.
List any projects with status active that have no recent activity in the last 7 days.
Do not ask questions — infer everything from the vault. Save and stop.
Setup:
/schedule obsidian-morning — daily 8:00 AM
obsidian-nightly — Daily at 10:00 PMSleeptime consolidation — the vault gets smarter overnight.
This agent does more than close the day. It actively consolidates and improves the vault while you sleep.
Prompt to schedule:
Read _CLAUDE.md. This is a sleeptime consolidation pass — the vault should be smarter when the user wakes up.
Phase 1 — Close the day:
- Read today's daily note. Append a ## End of Day section with a 3-5 bullet summary.
- Move any completed kanban tasks to Done.
Phase 2 — Reconcile:
- Scan wiki/entities/ for outdated roles, companies, or descriptions that conflict with newer daily notes.
- Scan wiki/concepts/ for claims contradicted by recently ingested sources.
- Auto-resolve clear winners. Flag ambiguous ones in wiki/decisions/.
Phase 3 — Synthesize:
- Scan sources ingested today and yesterday. Find concepts that appear in 2+ unrelated sources.
- If patterns found: create wiki/concepts/Synthesis — Title.md with evidence and interpretation.
Phase 4 — Heal:
- Find notes created today with no incoming links. Add links from relevant existing pages.
- Check if any entity pages reference old timeline entries without an "until" date that should be closed.
- Rebuild index.md to reflect today's changes.
Phase 5 — Log:
- Append to log.md: ## [YYYY-MM-DD] nightly | End of day + X reconciled, Y synthesized, Z orphans linked
Do not ask questions. Do not fix anything destructive — only add, update, link. Save and stop.
Setup:
/schedule obsidian-nightly — daily 10:00 PM
obsidian-weekly — Every Friday at 6:00 PMGenerates a weekly review note from the vault.
Prompt to schedule:
Read _CLAUDE.md. Run /obsidian-recap week to gather this week's activity.
Generate a weekly review note using the Review template (or standard structure if none exists).
Save to Reviews/YYYY-MM-DD — Weekly Review.md.
Link it from this week's last daily note.
Do not ask questions. Save and stop.
Setup:
/schedule obsidian-weekly — every Friday 6:00 PM
obsidian-health-check — Every Sunday at 9:00 PMRuns the vault health check and logs a report.
Prompt to schedule:
Read _CLAUDE.md. Run: python scripts/vault_health.py --path ~/path/to/vault --json
Parse the output. Write a health report to Knowledge/Vault Health YYYY-MM-DD.md
summarizing findings by severity (critical, warning, info).
Do not fix anything autonomously — only report.
Do not ask questions. Save and stop.
Setup:
/schedule obsidian-health-check — every Sunday 9:00 PM
All four can be configured at once:
/schedule
Then tell Claude which agents you want and at what times. Claude Code's scheduling system will handle the rest — agents run autonomously in the background on the defined cron schedule.
To list or remove scheduled agents:
/schedule list
/schedule remove obsidian-morning
A background agent that fires automatically whenever Claude compacts the conversation context. It reads the session summary and propagates everything worth preserving to the vault — no user action required.
What it does: After each compaction, a headless claude -p subprocess wakes up, reads _CLAUDE.md, scans the summary for vault-worthy items (people, projects, decisions, tasks, dev work, ideas), and writes updates everywhere they belong — people notes, project notes, dev logs, kanban boards, and today's daily note.
How it works:
PostCompact hook fires in Claude Code after context compactionclaude --dangerously-skip-permissions -p subprocess in the vault directorySetup:
Make the hook script executable (one-time):
chmod +x ~/.claude/skills/obsidian-second-brain/hooks/obsidian-bg-agent.sh
Set OBSIDIAN_VAULT_PATH in ~/.claude/settings.json:
{
"env": {
"OBSIDIAN_VAULT_PATH": "/path/to/your/vault"
}
}
Add the PostCompact hook to ~/.claude/settings.json:
{
"hooks": {
"PostCompact": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "/Users/you/.claude/skills/obsidian-second-brain/hooks/obsidian-bg-agent.sh",
"timeout": 10,
"async": true
}
]
}
]
}
}
Debugging: The agent logs to /tmp/obsidian-bg-agent.log. Check there if updates aren't appearing.
Safety: The agent never deletes, archives, or merges anything. It only adds or updates. If the summary has nothing vault-worthy, it exits without touching the vault.
A non-blocking validator that fires after every Write or Edit on a markdown file inside the configured vault. It warns when the file fails the AI-first rule (missing required frontmatter, missing ## For future Claude preamble, broken YAML) and surfaces the warning back to Claude on stderr so the agent can repair the note in the same turn.
What it checks:
--- ... ---)date:, type:, tags:, ai-first: true## For future Claude preamble (rule #2 of references/ai-first-rules.md)What it skips:
OBSIDIAN_VAULT_PATHraw/, templates/, _export/, .obsidian/, .git/, .trash/Setup:
Make the script executable (one-time):
chmod +x ~/.claude/skills/obsidian-second-brain/hooks/validate-ai-first.sh
OBSIDIAN_VAULT_PATH must already be set in ~/.claude/settings.json (the background agent setup above covers this).
Add the PostToolUse hook to ~/.claude/settings.json:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "bash ~/.claude/skills/obsidian-second-brain/hooks/validate-ai-first.sh"
}
]
}
]
}
}
Behavior: Non-blocking. If a write fails the AI-first rule, Claude sees the warning text on stderr (with one line per missing requirement) and can re-write the file in the same conversation turn to fix it. The original write is NOT reverted.
Other platforms (Codex CLI / Gemini CLI / OpenCode): The hook script ships in dist/<platform>/hooks/ for all four platform builds, but each platform's hook system differs. Wiring it up beyond Claude Code is left to the platform's own configuration. See hooks/validate-ai-first.hook.yaml for the platform-neutral spec.
references/vault-schema.md — Complete folder structure + frontmatter specs for all note typesreferences/write-rules.md — Detailed writing, linking, and formatting rulesreferences/claude-md-template.md — Template for generating a vault's _CLAUDE.mdscripts/setup.sh — One-command installer (wires hook + env var + MCP)scripts/bootstrap_vault.py — Bootstrap a complete vault from scratchscripts/vault_health.py — Audit a vault for structural issuesWeekly posts on AI second-brain systems, vault patterns, and what actually works.
You use Claude every day. Every session starts from scratch. You re-explain everything. The conversation ends. Everything disappears.
You take notes in Obsidian. Hundreds of files. They just sit there. You make the same decision twice because you forgot you made it six months ago. Ideas rot in daily notes. Nobody connects the dots.
Two powerful tools. Completely disconnected.
Karpathy's pattern is brilliant. Drop sources, LLM creates wiki pages, ask questions. This skill takes it further:
| | Karpathy's LLM Wiki | obsidian-second-brain |
|---|---|---|
| New sources | Append new pages, cross-reference | Rewrite existing pages. People get updated, claims revised, stale facts replaced. |
| Contradictions | Flagged, you resolve manually | /obsidian-reconcile resolves them automatically |
| Patterns | Surface when you ask | /obsidian-synthesize finds unnamed patterns and writes synthesis pages on its own |
| When it runs | On demand, when you prompt | 4 scheduled agents: nightly close, weekly review, contradiction sweep, vault-health check |
| Note format | Human-readable wiki pages | AI-first: ## For future Claude preamble + frontmatter for LLM retrieval, not human review |
If Karpathy's wiki is a knowledge base you maintain with an LLM, this is a knowledge base that maintains itself.
After a meeting: /obsidian-save
Claude pulls out every decision, person, task, and idea and saves each one to the right note. You do nothing.
You recorded a voice memo: /obsidian-ingest meeting.m4a
Claude transcribes it with Whisper, identifies speakers, extracts every promise and action item, and distributes across entity pages, task boards, and the daily note.
You screenshot a whiteboard: /obsidian-ingest photo.png
Claude reads the image, extracts text and structure, creates concept notes, links to related projects. A photo becomes knowledge.
You find a great video: /obsidian-ingest https://youtube.com/...
Claude doesn't summarize into one note. It REWRITES your existing pages. People get updated. Contradictions get resolved. Patterns trigger new synthesis pages. One URL in. The vault is smarter.
Before a big decision: /obsidian-challenge
Claude searches your vault for past failures and reversed decisions on the same topic. Pushes back with your own words. Your vault holds you accountable.
You want to see the big picture: /obsidian-visualize
Claude generates a visual canvas of your entire vault. Hub nodes centered, color-coded by type, orphans highlighted. Open it in Obsidian and see the shape of your knowledge.
You go to sleep: The nightly agent runs 5 phases — closes the day, reconciles contradictions, synthesizes cr