Cross-CLI skill for Obsidian: turn your vault into a living AI-first second brain across Claude Code, Codex, Gemini, OpenCode, Hermes, and Pi. 44 commands - self-rewriting notes, local+hybrid semantic search, key-less web research, /obsidian-architect codebase docs, and scheduled agents that maintain the vault while you sleep.
# 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
}obsidian-second-brain is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by eugeniughelbur. Cross-CLI skill for Obsidian: turn your vault into a living AI-first second brain across Claude Code, Codex, Gemini, OpenCode, Hermes, and Pi. 44 commands - self-rewriting notes, local+hybrid semantic search, key-less web research, /obsidian-architect codebase docs, and scheduled agents that maintain the vault while you sleep. It has 3,111 GitHub stars.
Yes. obsidian-second-brain passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/eugeniughelbur/obsidian-second-brain" and add it to your Claude Code skills directory (see the Installation section above). obsidian-second-brain ships a SKILL.md manifest, so compatible agents can discover and load it automatically.
obsidian-second-brain is primarily written in Python. It is open-source under eugeniughelbur on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh obsidian-second-brain against similar tools.
No comments yet. Be the first to share your thoughts!
Based on votes and bookmarks from developers who liked this skill
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 - Direct filesystem (default, always works): Use standard file tools (Read, Write, Edit, Glob) against the vault path. The vault is plain markdown, so every operation in this skill works this way with no setup. This is the normal path in Claude Code - the commands below use these tools directly.
Method B - MCP server (optional, mainly for non-Claude-Code clients):
This repo ships its own MCP server at integrations/obsidian-mcp-server/ that exposes the vault as tools (obsidian_search, obsidian_read_note, obsidian_save_note, obsidian_capture, plus curator tools). It exists so other MCP clients - Hermes Agent, Claude Desktop, Cursor - can use the vault as a knowledge layer; in Claude Code itself, Method A is simpler and preferred. If those obsidian_* tools happen to be available in your client, you may use them instead of raw file tools. Setup lives in integrations/obsidian-mcp-server/README.md (it is uv run --with mcp python .../server.py with OBSIDIAN_VAULT_PATH set, not an npx package).
_CLAUDE.mdBefore doing anything in a vault, check if _CLAUDE.md exists at the vault root and read it:
Read <vault>/_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.
Glob <vault>/**/*.md
Scan the structure to understand: folder names, template locations, naming conventions, frontmatter patterns. Then read 2-3 existing notes 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 assistant mode (maintaining vault for someone else):
python scripts/bootstrap_vault.py --path ~/my-vault --name "Your Name" --mode assistant --subject "Boss Name"
Then just point the skill at the new vault path (Method A above). If you use the optional bundled MCP server, set OBSIDIAN_VAULT_PATH to the new path and restart the client.
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 44 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.
Two failure modes corrupt the vault silently:
TBD; an empty section is correct when nothing was said. External claims carry a source URL + recency marker; inferences carry a confidence level.See the anti-fabrication and search-completeness hard rules in references/ai-first-rules.md.
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-calendar <mode>One calendar command with four modes. Claude Code only (needs the Google Calendar MCP). The first word selects the mode; a bare range word defaults to agenda; no argument at all defaults to agenda today.
agenda [range] - reads the calendar and writes a re-derivable AI-first snapshot to wiki/agenda/ (type: agenda-snapshot). Range: today, tomorrow, week, next-week, a date, or a range. Cross-links attendees to [[Person]] notes; flags conflicts, 3+ back-to-back stretches, working-hours focus blocks, and externally-organized events. Read-only on the calendar; Google Calendar stays the source of truth.reconcile [window] - flags commitments the vault implies (project next_actions, due tasks, dated commitments in daily notes, fixed dates in CRITICAL_FACTS.md) that are NOT on the calendar, plus events with no vault context. Flag only - never adds or changes events.meeting [selector] - turns an event (last, next, today, event-id:<id>, or fuzzy title) into a type: meeting note in wiki/meetings/ with metadata pre-filled and empty Notes / Decisions / Action items sections (never fabricate meeting content). Cross-links attendees, backlinks any task whose calendar-event-id matches.schedule <args> - the only mode that writes to the calendar. Standalone ("<title>" <when> <duration>), from a task (task:<path>), or suggest-a-time (task:<...> suggest:<window>). Resolves attendee emails from person notes (never guesses), conflict-checks before writing, requests a Meet link when participants span domains, and writes calendar-event-id back into the task so a re-run reschedules rather than duplicating.(Consolidated from the former /obsidian-agenda, /obsidian-reconcile-style calendar check, /obsidian-meeting, and /obsidian-schedule - same behaviors, one entry point. The natural-language triggers for all four still route here.)
/obsidian-recurringTracks a recurring obligation (payment, filing, ops) with a cadence and a computed next-due date.
State the obligation and cadence (e.g. "pay social benefits, monthly day 20"). Searches for an existing note first, then builds a type: recurring-task note with What / Cadence / Blockers / History sections and frontmatter (cadence, owner, blocker, next-due, optional amount). Adds a board card for the next occurrence; on each completion, appends a History row and advances next-due. Fills the gap that /obsidian-task (one-shot) leaves.
/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-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-catchup [today|week|all]Process what the Telegram journal bot captured on the go. The laptop-side companion to the integrations/telegram-journal/ bot, which captures voice/text/image/PDF/link from your phone and appends each to a catchup.md queue in the vault.
Steps:
catchup.md in the vault root - each unchecked - [ ] line is an unprocessed capture (date time | kind | summary | -> where).today / week / all, default all). If none, say so and stop.- [x] + processed date); never delete queue history.Pull, not push: nothing is processed until you run this, so nothing surprises you. The phone is for fast dumb capture; this is where it becomes integrated knowledge.
/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-board-hygiene [optional: board name]Bulk-triages a kanban board whose columns have gone stale. Where /obsidian-board only flags overdue items, this clears them.
Steps:
_CLAUDE.md for the boards folder and kanban convention (columns, @{date} format)@{date} past), stale (older than N days, default 14), and undated; show counts per column so the bloat is visible/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-projects [optional: project name]Live status overview across all tracked projects.
Reads _CLAUDE.md for the projects folder, then scans it for notes with type: project or a repo: field. For each project, spawns a parallel subagent that runs three checks: reads the vault note (status, last activity, next action, blockers), runs git log and git status if a repo: path is set, and looks for NOTES.md / TODO.md in the repo root. Merges the three into one status block (active / stalled / idle / blocked / archived inferred from activity recency), prints the full overview to the conversation ordered active-first, then injects a ## Last overview section into each project note.
If a project name argument is given, shows deep context for that one project only.
/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-retrieval-eval [optional: N to generate | report]Measures how well vault search actually finds the right note - so improving retrieval is a number, not a hunch.
Hybrid command backed by scripts/eval/retrieval_eval.py, which reuses the REAL search engine (integrations/obsidian-mcp-server/vault_ops.py, the term-frequency, title-weighted ranking behind /obsidian-find and the MCP connector). It bootstraps its own eval set from the vault (an LLM writes a question per sampled note, avoiding the note's title words so it tests retrieval not string-match; the note is the gold answer), then scores recall@1/3/5/10 and MRR and lists the failures - misses and notes buried below #3, naming which note wrongly ranked #1. Claude interprets the numbers, turns failures into ranked retrieval fixes (each a hypothesis to re-measure on the same cases), and optionally writes an AI-first baseline note. Generated cases hold private note paths and are gitignored. The first run on a 1,000+ note vault scored 0% recall@10 on paraphrased questions (long raw/ transcripts and log.md dominate term-frequency ranking) - proving the cheap structural fixes (exclude raw/, weight by type:) should be measured before reaching for a vector index.
/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:
<vault>/**/*.md) 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 (Write tool, or obsidian_save_note if using the bundled MCP server)If _CLAUDE.md already exists: show a diff of what would change and ask before overwriting.
/obsidian-architectScans a codebase and writes a maintained set of architecture notes into the vault - overview, per-module notes, key decisions. Re-runnable.
Hybrid command: scripts/architect_scan.py does a deterministic scan (stack, modules, dependencies, entry points, git commit) and emits JSON; Claude synthesizes the prose, rationale, a Mermaid diagram, and likely personas, then writes AI-first notes under Projects/<name>/Architecture/ (type: architecture-overview + type: architecture-module). Pulls decision candidates from scripts/mine_commit_decisions.py. Refresh is the same command re-run: it uses sentinel markers (<!-- @generated --> / <!-- @user -->, see references/write-rules.md) so re-running updates only the generated blocks and never clobbers your hand-edits. For builders who want their code projects documented in the same brain as their ideas and decisions.
/obsidian-visualize [scope]Generates a JSON Canvas map of the vault's knowledge graph, openable in Obsidian's native canvas viewer.
Backed by scripts/link_graph.py (deterministic link extraction - no whole-vault read). Optional scope: a project, entity, topic, or full (default). Builds nodes and edges from [[wikilinks]], clusters by type (entities, projects, concepts, daily, sources) with color and size keyed to centrality, flags orphans with a red border, and writes atlas.canvas (or atlas-<topic>.canvas) to the vault root. Also emits a text summary: hub nodes by degree centrality, bridge nodes, stale orphans, clusters, and any centrality skew (a single navigation point of failure). Appends a one-line entry to the operation log.
/create-command [seed]Scaffolds a new obsidian-second-brain command through a short interview - no markdown or frontmatter editing.
A guided conversation (intent, name, category, trigger phrases, behavior steps, AI-first compliance, external APIs) writes a fully-formed commands/<name>.md that the build pipeline picks up on the next bash scripts/build.sh, flowing into all six platform builds. The optional seed pre-fills suggestions. Every command created this way lands AI-first-compliant by construction. (This is the command that creates commands; it does not run on itself.)
/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-panelConvenes a panel of distinct perspectives on a decision - one independent verdict per lens, then a synthesis.
A multi-persona complement to /obsidian-challenge (which red-teams from one stance). Uses the vault's Advisors/ persona notes as panelists if they exist, otherwise four generic lenses (skeptic, user, operator, long-game). Each panelist argues independently before the synthesis; the disagreement is the point and is never hidden. Saves a type: synthesis note to wiki/concepts/.
/vault-deep-synthesis [topic]Cross-references everything the vault knows about one topic: agreements, contradictions, stale claims, coverage gaps.
Topic-driven (unlike /obsidian-synthesize, which scans the whole vault unprompted). Pure vault, no network. Greps and reads every note touching the topic, then consolidates into what the vault agrees on, where notes contradict (surfaced, not resolved - that is /obsidian-reconcile), what looks stale, and what is missing. Saves a type: synthesis note; never modifies the sources.
/obsidian-distill [note or source]Condenses one source into key claims, each tagged with provenance back to the exact block it came from. A distillation, not a summary: condensed enough to read fast, anchored enough to audit.
Segments the source into numbered, citable blocks (B1, B2, ...), extracts the key claims, and tags each claim with the block(s) it came from ((src: B3)). A claim with no traceable source does not make the cut - and gets reported as dropped, never silently cut. Inferences the source implies but never states go in a separate labelled section so distilled fact and reasoning never blur. Saves a type: distillation note (with the verbatim source and the numbered source blocks at the bottom), links it from the original. This is the trust primitive for a vault more than one person reads - the differentiator behind the team-vault direction. Pairs with /obsidian-ingest (brings the source in) and /vault-deep-synthesis (cross-references many notes).
/idea-discoveryRanks 3-5 next-direction candidates from ungraduated ideas, open project questions, and orphan research.
Answers "what is worth doing next" from vault material. Distinct from /obsidian-emerge (names unstated patterns) and /obsidian-graduate (promotes one chosen idea). Ranks candidates by a stated heuristic (recency, pull, momentum) and gives the smallest next step for each. Does not auto-graduate.
/obsidian-learn [recent|all|topic]Reviews the lessons scattered across the vault and turns them into a living rulebook.
Scans daily notes, dev logs, ADRs, and auto-generated pattern reports for lessons, mistakes, and wins, then classifies each as active, stale, superseded, or a promotion candidate (appeared 3+ times - worth becoming a permanent rule in _CLAUDE.md). Default scope is the last 30 days (all for the whole vault, or a named topic). Writes a Learnings Review to wiki/concepts/YYYY-MM-DD — Learnings Review.md and offers to promote candidates or archive stale lessons with confirmation. Lessons that are not reviewed do not compound.
/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-decide [topic] [--formal]Records decisions at two depths. Default mode captures the decisions made in a conversation as dated one-liners appended to the relevant project notes' ## Key Decisions sections (and the daily note) - for the steady stream of choices made while working. --formal (or leading with adr) instead writes one full Architecture Decision Record - Decision / Context / Options Considered / Rationale / Consequences / Related - to the decisions folder (resolved per references/folder-map.md: wiki-style wiki/decisions/, Obsidian-style Knowledge/), links it from the project's Key Decisions and index.md, and logs it. Use the formal mode for a structural or directional decision worth a real writeup; python scripts/mine_commit_decisions.py surfaces decision-shaped commits as ADR candidates.
The vault knows why it's structured the way it is - when a future session asks "why?", the formal record answers. /obsidian-graduate, /obsidian-health structural fixes, and folder reorganizations may offer to write a formal record; they offer, they don't force.
(Consolidated: the former standalone /obsidian-adr is now /obsidian-decide --formal; its triggers still route here.)
Seven commands that pull external knowledge into the vault - X posts, X discourse, web research with citations, vault-grounded synthesis, YouTube videos, and podcast episodes (plus /obsidian-ingest above for arbitrary URLs, PDFs, audio, and screenshots). 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] [--visual]Extract and summarize a YouTube video. Transcript (free, no API key) + metadata + top comments (Data API v3, optional) → summarized via Grok. Add --visual to also watch the video: scene-change frame extraction Claude reads with its own vision.
Steps:
uv run -m scripts.research.youtube_extract "<url>" (add --visual for the frame layer, --max-frames N to cap frames read, default 24)youtube-transcript-apiYOUTUBE_API_KEY set: also fetches title, channel, view counts, top commentsResearch/YouTube/YYYY-MM-DD - <video-title-slug>.md--visual layer: downloads the video (yt-dlp, <=720p) and extracts one frame per scene change (ffmpeg scene detection, not a fixed timer), so on-screen text, code, diagrams, slides, UI, and b-roll are captured. Hero frames are copied into Research/YouTube/attachments/<slug>/ and embedded in the note; the full keyframe set is left on disk. The script prints a FRAMES-FOR-CLAUDE block - Claude then reads those frames (its own vision, no extra API call) and fills the note's ## Visual notes section keyed by timestamp. Requires yt-dlp + ffmpeg on PATH; if missing or download fails, the visual layer is skipped and the transcript summary still saves. The pipeline is ported from claude-watch/claude-video (MIT).
Plain English: "summarize this YouTube video", "extract this video", "watch this video", "what's on screen", or just paste a YouTube URL with a question. Use --visual when the ask is about what is shown, not just said.
If the video has no captions and no API key set, the transcript path fails with a clear message; --visual can still read the video.
/podcast [url]Extract and summarize a podcast episode. Apple Podcasts URL or RSS feed → transcript (RSS <podcast:transcript> tag, Whisper API if OPENAI_API_KEY set, or show-notes fallback) → summarized via Grok.
Steps:
uv run -m scripts.research.podcast_extract "<url>"<podcast:transcript> tag → Whisper API (if OPENAI_API_KEY) → show-notes-onlyResearch/Podcasts/YYYY-MM-DD — <episode-title-slug>.mdPlain English: "summarize this podcast", "what's in this episode", or just paste an Apple Podcasts URL.
Spotify URLs are not supported (DRM blocks audio + transcript access). If no transcript path works and show notes are empty, the script fails with a clear message.
/x-read, /x-pulse, /youtube, and /podcast (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
claude -p) - important gotchaCustom slash commands do NOT expand in non-interactive mode. A cron job or launchd
job that runs claude -p "/obsidian-daily" will send the literal text /obsidian-daily
as a prompt - Claude never loads the command file, so nothing happens.
The reliable pattern for any headless run (cron, launchd, a wrapper script) is to point Claude at the command file and tell it to carry out the instructions:
# Wrong - the slash command is not expanded in -p mode:
claude -p "/obsidian-daily"
# Right - read the command file and execute its steps:
cd "$VAULT" && claude --dangerously-skip-permissions \
-p "Read ~/.claude/commands/obsidian-daily.md and carry out its instructions exactly."
Because ~/.claude/commands/obsidian-daily.md is symlinked from this repo (see Testing
locally in the README), a scheduled run always uses the current command logic. Export an
explicit PATH in launchd jobs - launchd strips the environment, so claude and python3
may not be found otherwise.
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 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.
The default install path (scripts/setup.sh) writes OBSIDIAN_VAULT_PATH into ~/.claude/settings.json (global). That assumes one machine = one vault. If you work across multiple repos and want each to have its own dedicated vault - or want to keep work and personal vaults separate without manually swapping config - use Claude Code's per-project settings to override the global setting on a per-directory basis.
How it works: every hook in this skill (hooks/load_vault_context.py, hooks/validate-ai-first.sh, hooks/obsidian-bg-agent.sh) reads OBSIDIAN_VAULT_PATH from process env at fire-time. Claude Code merges .claude/settings.json from the current project directory on top of ~/.claude/settings.json, so a project-scoped env block overrides the global one for any session launched from that directory.
Setup per repo:
Bootstrap each vault once: bash scripts/setup.sh for the first vault (writes the global default), then python scripts/bootstrap_vault.py --path ~/vaults/repo-b --name "Your Name" for any additional vaults (skips the global config step).
In each repo where you want a non-default vault, create .claude/settings.json:
{
"env": {
"OBSIDIAN_VAULT_PATH": "/Users/you/vaults/repo-a-vault"
}
}
Restart Claude Code (or open a new session in that directory). All slash commands, hooks, and scripts will now operate on the project-specific vault.
What this does NOT give you: isolation within a single vault. The skill has no --scope concept - /obsidian-find, /obsidian-recap, and /obsidian-emerge scan the entire configured vault. If you want multiple projects sharing one vault, you can organize them by top-level folders for visual grouping, but commands will still see across folders. A real --scope refactor is tracked in discussion threads - open a discussion if this is your use case.
Slash commands and hooks are still globally installed. Only the OBSIDIAN_VAULT_PATH env var is per-project. You do not need to re-symlink commands or re-register hooks per repo.
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 sle