obsidian-second-brain

eugeniughelburMIT活跃维护

把 AI 代理的持久记忆存成 Obsidian 库里的纯 Markdown 笔记,让 Claude Code、Codex 等 8 个代理共享同一份日志、互相知道对方做过什么,还带语义搜索和定时任务。

Persistent memory for Claude Code, Codex and 6 other AI agents, stored as plain markdown in your Obsidian vault. New: Crew, one shared logbook so Claude Code, Codex, Cursor and Grok Bot know what each other did. 48 commands: semantic search, self-rewriting notes, key-less research, scheduled agents.

v0.20.0发布于 2026-10-25 17:36 UTC5,268star +57 / 7 天645fork同步于 2026-11-10 23:37 UTC

怎么上手

由 README 提炼,执行前请确认
/plugin marketplace add eugeniughelbur/obsidian-second-brain
/plugin install obsidian-second-brain@obsidian-second-brain
硬件要求按 README 说明

README 未说明显存或 GPU 要求;本地语义搜索可选装 Ollama,音频转写可选装 openai-whisper(会拉取 PyTorch)。

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

把 Obsidian 仓库变成多个 AI 编程代理共享的持久记忆,用纯 markdown 存储

把 AI 代理的持久记忆存成 Obsidian 库里的纯 Markdown 笔记,让 Claude Code、Codex 等 8 个代理共享同一份日志、互相知道对方做过什么,还带语义搜索和定时任务。

核心能力

  • 用纯 markdown 笔记作为跨会话持久记忆
  • Crew 让 Claude Code、Codex、Cursor、Grok Bot 共享同一份任务日志
  • 提供 48+ 条斜杠命令,含语义搜索与自改写笔记
  • 按 OKM 策略区分永久、带日期和指针型事实,避免过期知识堆积
  • 支持 8 种代理平台,同一代码库编译出多套构建

容易踩的坑

经典脚本安装需要 jq,缺失时 setup.sh 会直接退出;插件安装后需在 ~/.claude/settings.json 的 env 中设置 OBSIDIAN_VAULT_PATH 并重启;插件命令带命名空间,需用 /obsidian-second-brain: 形式调用;Codex 用户需先运行一次 /hooks 信任 Crew 的钩子。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v0.20.0
  1. v0.20.0v0.20.0 - The Batch最新正式版2026-10-25 · 2026-10-25 17:36 UTC

    Added

    • Resumable directory ingestion (#329, by @2Obe). /obsidian-ingest accepts mixed collections of text, PDFs, audio, and images in bounded sequential batches. It reuses existing extraction, raw deduplication, routing, and approval rules. A small helper appends one hidden completion comment per processed source version to the existing operation log. Repeating the command skips completed unchanged sources and retries unfinished work using existing captures. No start records, attempt IDs, persistent error/approval states, or locking are introduced. First Brain warm start is a directory-ingestion use case; no new command or progress file is introduced.

    • Word/OpenDocument text ingestion through PDF conversion (#353, by @2Obe). /obsidian-ingest accepts .docx, .doc, and .odt through the stdlib-only scripts/document_to_pdf.py helper, following the existing local-source and PDF ingestion rules. LibreOffice 26.2+ is required separately. Conversion uses a private copy and profile, excludes comments and revision markup, and prints a temporary PDF path. Original documents stay unchanged and use the existing provenance schema; no Office-specific path checks, metadata fields, or extraction pipeline are added. A conversion that stalls gives up after 300 seconds instead of hanging the session.

    • scripts/vault_search.py searches the vault from a shell, with no agent (#351, by @dbdefault). It wraps the existing vault_ops.search() and prints the results as a JSON array, so a cron job, a shell script or an app that does not speak MCP can query the vault without an agent loop. --limit sets the result count and --lexical turns semantic fusion off; without it the search follows OBSIDIAN_SEARCH_SEMANTIC, as the MCP server does. No configured vault exits 2 with a stderr line; no match prints []. Output is ASCII-escaped JSON, so a Windows console in a legacy code page cannot crash it on a CJK title. Build tests run the script from inside every platform tree.

    Fixed

    • The Hermes session hook no longer starts a consolidation per turn, and no longer starts one from inside another (#345). hooks/hermes-hooks.config.example.yaml registered the hook on on_session_end, which Hermes fires after every turn, and the hermes -z run the hook starts fires it again. It is now registered on on_session_finalize. The script also refuses to re-enter: the consolidation child gets OBSIDIAN_HERMES_CONSOLIDATING=1 and a hook that sees it exits, and a per-user mode-0600 lock file (PID inside, stale locks replaced) allows one consolidation at a time. A consolidation also does not start within OBSIDIAN_HERMES_MIN_INTERVAL seconds (default 21600, 6 hours; 0 turns it off) of the last one's start, kept in a per-user mode-0600 stamp file next to the lock, which holds even when the marker does not reach a hook run inside the gateway and the child's finalize event lands after its lock is released. The background run no longer inherits the hook's stdout, so the hook returns {} at once instead of when the consolidation ends. If you pasted the old block into ~/.hermes/config.yaml, rename on_session_end to on_session_finalize there.

    • The SessionStart precedence note reported another plugin as active when it was installed for a different project (#355, reported by @gstrazds). scripts/vault_plugin_scan.py read the hooks manifest of every entry in installed_plugins.json and ignored each install's scope and projectPath, so a claude-obsidian installed with --scope project in a sibling vault was named in every session of this one, and the model told the user to disable a plugin that never ran there. A project or local install now counts only in its projectPath or a folder under it, and a plugin set to false in enabledPlugins (user, project or local settings, the narrower file winning) is skipped. Ten tests cover sibling, same-folder and enclosing installs for both scopes and the enable/disable

  2. v0.19.0v0.19.0 - The Check-In2026-10-24 · 2026-10-24 18:03 UTC
    查看更新说明

    Added

    • /obsidian-checkin asks you whether old notes still hold. A fact check compares notes with notes, so news that never reached the vault (a bill settled, a move, a new job) left a note stale and no lint could see it. Check-in asks the owner: up to 3 people or project notes a day whose facts are older than 14 days, family and active projects first. Each card shows the note's name, the date of its facts, and 1 to 3 facts from the note. "Same" stamps a new last-checked field; news rewrites the stale claim and propagates; "skip" asks again after 14 days. The open questions live in <vault>/.checkin.json, not in the chat, so a host that drops an unanswered question after an hour re-sends the full cards on its next run until they are answered. scripts/checkin.py does the picking, the queue and the rendering, so every host sends the same short message. Opt a note out with checkin: never, or move it up with checkin: priority.
    • scripts/check_notes.py gives hook-less agents the write-time check. Claude Code checks every vault write through hooks/validate-ai-first.sh; Grok Bot, cron agents and scripts that patch files directly were never checked. The new script runs that same hook over a list of notes or over every git-dirty note (--changed), with --fix for the banned characters (left alone in code fences, wikilink targets and CJK lines), and exits 1 on anything left so an agent can gate its commit on it.
    • Optional First-Brain wiki-style variant (#330, by @2Obe). /obsidian-init configures a human-maintained source layer and wiki destinations through its existing agent-driven workflow. A source folder spelled differently (First_Brain/, first brain/) is protected by the exact name init found. Individual ingestion preserves originals, records local provenance, and keeps source conflicts in the derived layer. Protection is instruction-based; no bulk ingestion or background synchronization is introduced.

    Changed

    • /obsidian-reconcile acts only on contradictions it can prove. Subagents now return each side of a contradiction as a note path, a line and a one-line quote copied from that note. The new scripts/verify_quotes.py checks both quotes are really there, word for word, before any rewrite or conflict note. A contradiction that fails the check is dropped and listed as unproven, and the log line counts reported, proven and dropped findings. Before this, a contradiction a model misread could rewrite a correct note, and as #258 showed, a wrong claim copied into several notes keeps misleading later sessions. The checker is standard-library only; 12 tests cover real, invented and one-word-changed quotes, wrong line numbers, short and multi-line quotes, paths outside the vault, and Windows/macOS text encodings.
  3. v0.18.12026-10-20 · 2026-10-20 21:56 UTC
    查看更新说明

    Fixed

    • move_note could swap the contents of two notes in a cloud-synced vault (#324, reported by @jeonpapa, by @tonydzi). The MCP move_note created the destination with os.link(src, dst) and then unlinked the source, so for a moment both paths were one file. OneDrive, Dropbox and iCloud track files by identity, and on OneDrive a sync pass in that window left the moved note and an existing note with a similar name in the destination folder holding each other's contents, while the move reported success. The destination is now a new file created with os.open(dst, O_CREAT | O_EXCL | O_WRONLY), so "never overwrite an existing destination" stays one atomic syscall with no TOCTOU window. The bytes are written, fsynced and read back through the same descriptor, and the source is removed only if it still holds what was copied, so an edit saved mid-move fails the move instead of being lost. The source's mode and timestamps are copied over. A failed write removes the half-made destination only if it is still the file the move created, and an unreadable source now returns an error instead of raising. A test in tests/test_mcp_codex_parity.py checks the two inodes at the moment the source is removed and fails on the previous main, two more pin the mid-move edit and the unreadable source; the destination-race test now races the O_EXCL create instead of the hard link.

    • /crew setup wrote the Codex hooks and rules to ~/.codex even when CODEX_HOME points elsewhere (#171, reported by @tonydzi). Codex reads hooks.json and AGENTS.md from $CODEX_HOME when it is set. Setup reported success, but /hooks had nothing to review and Codex never saw the team rules, so Crew looked installed and did nothing. Setup, the rules path and the agent autodetect now resolve the Codex folder from CODEX_HOME first. The test sandbox clears CODEX_HOME, so a developer's own setting can no longer send a test run into their real Codex config. Two tests fail on the previous main.

    • The research toolkit wrote its log line into the log.md pointer, not into Logs/ (#348, reported by @ayaoray). Since 0.9.0, /obsidian-init creates per-day Logs/YYYY-MM-DD.md files and turns log.md into a pointer that says entries never go there. append_to_log() in scripts/research/lib/vault.py still always appended to the root log.md, so every /research, /research-deep, /youtube, /podcast and /x-pulse run wrote into the pointer and left the day's log without it. It now follows the MCP server's convention: the per-day file when Logs/ exists, created with the same header when missing, else log.md as before. The UTF-8 guard covers both files. Three tests fail on the previous main.

    • A freshly bootstrapped vault now reads clean in the MCP obsidian_vault_health too (#344, reported by @fbacchin, by @drakeo338). On a new vault the tool reported 10 wanted notes and 2 orphans that the CLI check did not. Home.md wrote \| (the table-cell escape) on plain lines, where the backslash stayed in the link target and broke the link in Obsidian as well; it now writes | outside tables. The server drops a trailing backslash from a target, as the CLI already did, so a correctly escaped link inside a table resolves. The folder links ([[Daily/|...]]), which never resolve in Obsidian, are now plain text, and a link whose target normalises to nothing is reported as wanted instead of skipped. The orphan check skips Home.md and _CLAUDE.md, as the CLI does.

    • Check 5 preserves punctuation in wikilink targets (#333, by @evans-jz, PR by @sean0407). The write-time hook no longer flags an em-dash in a closed link target as prose, while it continues checking aliases, surrounding text, and non-breaking spaces.

  4. v0.18.0v0.18.0 - Crew2026-10-17 · 2026-10-17 00:16 UTC
    查看更新说明

    v0.18.0 adds Crew: 1 shared logbook for 4 agents (Claude Code, Codex, Cursor, and Grok Bot). Codex finishes a job, you open Claude Code, and it already knows what changed.

    The problem

    Each AI agent you use starts blind to what the others did. So you paste the same context into every chat, again and again. The agents don't share a memory, and they can't learn from each other's mistakes.

    What Crew does

    • One line per job. After every job, an agent writes one line to a plain markdown file: 18:40 | codex | brand | Astra pass, 0 errors.
    • Instant reads. Before an agent answers, its own hooks hand it the lines the others added since it last looked. You don't paste anything.
    • Lessons you approve. When one agent checks another's work, it can leave a lesson or name a gap. A lesson becomes a rule in that agent's rules file only when you run keep.

    It works in any plain folder, such as ~/crew. If you use Obsidian, you can put it in wiki/team/ inside your vault instead. Obsidian isn't required.

    Get it

    1. Install obsidian-second-brain:

      curl -fsSL https://raw.githubusercontent.com/eugeniughelbur/obsidian-second-brain/main/scripts/quick-install.sh | bash
      
    2. Restart Claude Code and type /crew setup.

    3. Pick ~/crew or your Obsidian vault.

    Then finish each agent:

    • Codex: run /hooks once and trust the Crew hooks. Until then, Codex reads nothing.
    • Cursor: quit and reopen Cursor.
    • Grok Bot: paste the profile block that setup prints.

    Already on Claude Code with the plugin? Update with /plugin update obsidian-second-brain, then run /crew setup.

    How each agent reads the log

    AgentWhen it readsHow
    Claude CodeSession start, every messageSessionStart and UserPromptSubmit hooks
    CodexSession start, every messageSessionStart and UserPromptSubmit hooks, after /hooks trust
    CursorSession start, after each tool callsessionStart and postToolUse hooks with additional_context
    Grok BotBefore every jobProfile instructions; its runner needs access to the same folder

    A new session gets the newest 50 unread lines and a count of the older ones. digest --date 2026-10-17 reads a full day.

    Lessons, kept by you

    python3 ~/.config/crew/crew.py lesson --from claude --for grokbot --kind gap \
      --text "Check every claim at the source" --evidence "research/2026-10-16.md"
    python3 ~/.config/crew/crew.py keep L3
    

    An open lesson is only a suggestion. keep writes a marked section into the agent's rules file: CLAUDE.md for Claude Code, AGENTS.md for Codex, a crew.mdc rule for Cursor, or a profile draft for Grok Bot. drop keeps the record and marks it dropped.

    Safety

    • Records, not orders. Every read starts with a header saying the lines are records, not instructions. In a live test, Claude Code quoted a planted "reply PWNED" line and refused it. Framing helps a model separate data from orders; it can't guarantee it.
    • Clean inputs. Each field is cleaned to one line, | is replaced, and < and > are escaped, so a record can't forge a rules marker.
    • UTF-8 everywhere. Hook input and output are UTF-8 on every platform, including Windows.
    • Safe writes. Every write takes a lock and replaces the file atomically, so two agents writing at once can't corrupt the log.
    • No background loop. Crew starts no scheduler, daemon, or message sender. Nothing acts on a line by itself.
    • Careful setup. Setup merges hooks, never replaces them. It touches only the hook commands it recorded and its own marked sections, so a rerun changes nothing.

    What's new here, honestly

    Shared memory for coding agents isn't new. Crew adds three parts:

    1. Grok Bot, an always-on cloud agen
  5. v0.17.0v0.17.0 - The Neighbors2026-09-26 · 2026-09-26 20:02 UTC
    查看更新说明

    Added

    • A session running beside another Obsidian plugin is now told which schema governs its writes (#300). Claude Code merges hook entries instead of replacing them: "Hook entries merge across settings levels", "All matching hooks run in parallel", and "A plugin's or skill's copy of the same handler stays separate" (docs). SessionStart adds every hook's stdout to context, so a second vault plugin's rules arrive alongside ours and the session holds two folder maps and two frontmatter schemas for one vault. Nothing errored and nothing said so: the validator still passed our writes, and the vault drifted into mixed conventions one note at a time. scripts/vault_plugin_scan.py reads the SessionStart entries in ~/.claude/settings.json, a project's .claude/settings.json and .claude/settings.local.json, and every installed plugin's hooks/hooks.json (found through installed_plugins.json), and reports the vault-related ones that are not ours. It reads the command plus args form as well as a bare command string, because a plugin that registers "command": "python3" with the script in args carries its only evidence in the half a simpler scan would skip. load_vault_context.sh then opens its context with a precedence note naming what was found and stating that the vault's own _CLAUDE.md governs every write, placed ahead of the manual and inside the 10,000-character budget, so the note the cap drops is never the one saying a second ruleset is present. The installer runs the same scan at install time, while the user can still choose. Detection only: no other hook is edited, disabled or unregistered, and a scan that raises costs the session nothing. A bare vault was considered as a detection marker and dropped, since it matches HashiCorp Vault tooling and a wrong precedence note is worse than a missed one. Twenty tests in tests/test_vault_plugin_scan.py.

    • Company and tool entity notes have schemas, and the fence that should have caught their absence now does (#274). /obsidian-ingest creates a page for each person, company and tool a source mentions, but references/ai-first-rules.md only defined type: person, so company and tool pages were written with whatever frontmatter the run improvised. tests/test_schema_coverage.py could not see the gap: it matches types spelled `type: x`, and the ingest command names its entity kinds in prose. type: company and type: tool are now defined in the shape of the person schema, and the Entity Note in references/vault-schema.md tells the three apart by type, like every other note kind, instead of by tag (its Dataview example filters on type too). The person schema's company: link is now a bare [[Acme Corp]], which resolves wherever the company note sits; the old [[Companies/...]] pointed at a folder nothing creates, and both person notes in the sample vault reported it as a wanted note. The sample vault gains a type: company example at wiki/entities/Currentscale Labs.md. In Obsidian-style vaults companies and tools now have their own Companies/ and Tools/ folders in references/folder-map.md (wiki-style keeps every entity in wiki/entities/), and /obsidian-ingest and /obsidian-reconcile resolve the entities folder per kind, so a company or tool is no longer filed in a folder named People/. A new test reads the entity kinds from the folder map's entity rows and from any command that lists them in prose, and requires a schema for each; it fails on the previous main for company and tool. scripts/bootstrap_vault.py creates both folders in every preset, so the map never resolves a company or a tool to a folder no bootstrapped vault has - the #205 shape, and the reason the map and the script move together here. Every preset carries People/ since #287, and the two new folders follow it rather than a list that goes stale the next time a preset is edited; under --style wiki the

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Crew: one logbook for all your agents

    Crew works without Obsidian. Claude Code, Codex, Cursor, and Grok Bot share job records in any plain folder. Each agent sees what the others finished and can leave a lesson for review.

    • Grok Bot joins the same team through its existing runner.
    • A lesson becomes a rule only when a human runs keep.
    • Crew runs no background loop.
    curl -fsSL https://raw.githubusercontent.com/eugeniughelbur/obsidian-second-brain/main/scripts/quick-install.sh | bash
    

    Restart Claude Code, then type /crew setup. Pick ~/crew or wiki/team/ inside your Obsidian vault. Codex users run /hooks once to trust Crew's hooks. Setup prints a Grok Bot profile block to paste.

    18:40 | codex | brand | Astra pass, 0 errors
    

    Setup, exact commands, and limits. Python 3.10 or later; no extra packages for Crew. Shared agent memory isn't new. What Crew adds is the three parts above.


    The Problem

    You use Claude every day. Every session starts from scratch. You re-explain everything. The conversation ends. Everything disappears. Claude Code has no persistent memory across sessions - and neither does Grok Bot, Codex, Gemini, or any of the others.

    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. You already have the long-term memory. The thing doing the thinking cannot reach it.


    Who builds this

    I'm Eugeniu Ghelbur, an AI automation engineer. I built this for my own vault, and I still run my work on it every day. I review and merge every change myself, and close to 50 people have shipped fixes so far (see who).

    I write up what I learn twice a week on The AI Operator, and post shorter notes on X and LinkedIn.


    How this extends Karpathy's LLM Wiki

    Karpathy's pattern is brilliant. Drop sources, LLM creates wiki pages, ask questions. This skill takes it further:

    Karpathy's LLM Wikiobsidian-second-brain
    New sourcesAppend new pages, cross-referenceRewrite existing pages. People get updated, claims revised, stale facts replaced.
    ContradictionsFlagged, you resolve manually/obsidian-reconcile resolves them automatically
    PatternsSurface when you ask/obsidian-synthesize finds unnamed patterns and writes synthesis pages on its own
    When it runsOn demand, when you prompt4 scheduled agents: morning brief, nightly consolidation, weekly review, vault-health check
    Note formatHuman-readable wiki pagesAI-first: ## For future agent 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.


    What Happens When You Install This

    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 a local Whisper install, attributes speakers where the transcript makes them identifiable, 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 have a finished text document: /obsidian-ingest report.docx Word (.docx, .doc) and OpenDocument (.odt) files uploaded or copied into the vault follow the same local-source rules as PDFs and Markdown. The helper converts a private copy to a temporary PDF, then ingestion uses the existing PDF path. Text and figures use that path; comments and revision markup are excluded. The original stays unchanged and remains the source under the existing provenance rules. Requires Python 3.10+ and LibreOffice 26.2+, installed separately. Run python scripts/document_to_pdf.py "path/to/report.docx"; it prints the PDF path. Put soffice on PATH or add --soffice with its executable path (Windows: C:/Program Files/LibreOffice/program/soffice.com; macOS: /Applications/LibreOffice.app/Contents/MacOS/soffice). Remove the generated PDF and its temporary parent folder after capture. No additional Python packages are needed. See the ingest command. Presentation and spreadsheet formats remain outside scope.

    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 cross-source patterns, heals orphan notes, and rebuilds the index. You wake up to a smarter vault.

    You start a new day: /obsidian-daily Claude pulls your calendar events, overdue tasks, and overnight changes into today's note. Your morning starts informed.

    Someone shares an X post: /x-read https://x.com/... Grok with live X access fetches the post, the thread, and the replies. Returns verbatim text + TL;DR + key claims + reply sentiment + voices to watch. No more screenshots.

    You're planning today's content: /x-pulse "AI automation" Grok scans X for what's trending in your topic right now. Returns 3-5 emerging themes (with rep posts + key voices), gaps nobody is filling, hook formats that are working, and 3 specific post ideas you could write today.

    You need real research: /research "AI memory tools" Perplexity Sonar Pro pulls a deep dossier with citations: summary, key facts (every claim with a recency marker and source domain), timeline, key players, contrarian views, recommended further reading, open questions. Saved to your vault, auto-opens in Obsidian.

    You want vault-first deep research: /research-deep "AI memory tools" Scans your vault for what you already know. Identifies gaps. Spawns 3-5 targeted searches via Perplexity (web) and Grok (X discourse). Synthesizes a delta report: what's new, what's confirmed, contradictions to resolve, recommended vault updates. Vault baseline doesn't get re-researched. Only gaps get filled.

    You hit a great YouTube video: /youtube https://youtu.be/... Free transcript via youtube-transcript-api. Optional metadata + top comments via YouTube Data API v3. Gemini (free tier, Grok fallback) summarizes into TL;DR, Key Points, Notable Quotes (verbatim), Themes, Comment Sentiment, and Worth Following Up On. Saved as an AI-first note in your vault. Add --visual to also watch it: scene-change frame extraction (ffmpeg) that Claude reads with its own vision to capture on-screen text, code, diagrams, and demos the transcript misses.

    You never open Obsidian. Everything happens through Claude.


    Before & After

    Without this skillWith this skill
    Saving decisionsCopy-paste or lose themAuto-saved to the right project note
    Daily notesWrite it yourself, forget half the timeCreated automatically
    Finding patternsRe-read dozens of notes/obsidian-emerge finds them for you
    Challenging yourselfNobody pushes back/obsidian-challenge uses your own history against you
    Session continuityRe-explain every time/obsidian-world loads full context in 10 seconds
    Ingesting contentRead it, forget it/obsidian-ingest rewrites 5-15 vault pages from 1 source (URLs, PDFs, Word/OpenDocument text files, audio, screenshots)
    ContradictionsYou don't know they exist/obsidian-reconcile resolves them automatically
    SynthesisYou connect dots manually/obsidian-synthesize finds patterns across sources on its own
    Sharing vault dataOnly Claude can read it/obsidian-export gives any AI tool a clean snapshot
    Facts change over timeOld info gets overwrittenBi-temporal facts track when it was true AND when the vault learned it
    Starting a new sessionRe-explain who you areCRITICAL_FACTS.md loads your identity in ~120 tokens
    Reading an X threadOpen X, scroll, screenshot, paste/x-read [url] returns post + thread + sentiment + voices
    Knowing what to postGuess what's trending/x-pulse scans X and returns hot themes + gaps + hooks + post ideas
    Web researchOpen 12 tabs, copy quotes manually/research [topic] returns a sourced dossier with recency markers
    Researching what you already knowRe-research from scratch/research-deep scans vault first, fills only the gaps, flags contradictions
    YouTube videosWatch passively, forget/youtube [url] transcript + summary + quotes saved to vault
    Vault notes for future agentNotes for human readingAI-first rule: every note has "For future agent" preamble + recency markers + citations

    More from the author

    The product is above. This is where it came from and where it goes next.

    Follow along

    Two posts a week on AI second-brain systems, vault patterns, and what works in practice.



    How It Works

      +------------------------------------------+
      |                                          |
      |   LAYER 1: Operations (32 commands)      |
      |   Claude remembers everything            |
      |                                          |
      +------------------------------------------+
      |                                          |
      |   LAYER 2: Thinking Tools (9 commands)   |
      |   Claude thinks with you                 |
      |                                          |
      +------------------------------------------+
      |                                          |
      |   LAYER 3: Context Engine (1 command)    |
      |   Claude knows who you are               |
      |                                          |
      +------------------------------------------+
      |                                          |
      |   LAYER 4: Research Toolkit (7 commands) |
      |   Claude pulls knowledge in              |
      |                                          |
      +------------------------------------------+
      |                                          |
      |   ALWAYS ON                              |
      |   Background agent + 4 scheduled agents  |
      |   Auto-synthesis + save reminders        |
      |                                          |
      +------------------------------------------+
    

    49 commands total. The calendar command (/obsidian-calendar) is Claude Code only (needs the Google Calendar MCP), so the Codex / Gemini / OpenCode / Hermes / Pi / Agent Skills builds ship 48.

    Layer 1 saves, organizes, ingests, reconciles, exports, schedules your calendar, and maintains your vault. Layer 2 challenges your ideas, surfaces hidden patterns, bridges unrelated domains, and graduates ideas into projects. Layer 3 loads your identity and current state so every session picks up where the last one ended. Layer 4 pulls live external knowledge into the vault: X posts, X trends, web research with citations (key-less by default), YouTube and podcast transcripts. Vault-first synthesis knows what you already know. Always On keeps the vault alive without you lifting a finger.


    49 Commands

    Operations -- Claude remembers

    CommandWhat it does
    /obsidian-saveSaves everything from the conversation -- decisions, tasks, people, ideas
    /obsidian-ingestIngest a URL, file, or resumable folder batch (text, PDFs, .docx/.doc/.odt via LibreOffice, audio, images). The vault REWRITES itself. 5-15 pages touched per source.
    /obsidian-synthesizeAuto-finds patterns across sources and writes synthesis pages
    /obsidian-reconcileFinds contradictions and resolves them. The vault maintains its own truth.
    /obsidian-checkinAsks you whether old people and project notes still hold. Shows what each says, re-asks until you answer, saves the news.
    /obsidian-exportClean JSON/markdown snapshot any AI tool can read
    /obsidian-dailyCreates or updates today's daily note
    /obsidian-calendar <mode>One calendar command, four modes: agenda (read a snapshot), reconcile (flag commitments not yet scheduled), meeting (event to note), schedule (create/move an event from a task or standalone)
    /obsidian-recurringTracks a recurring obligation with a cadence and a computed next-due date
    /obsidian-logLogs a work session, links it everywhere
    /obsidian-taskAdds task to the right board with priority and due date
    /obsidian-personCreates or updates a person note
    /obsidian-captureZero-friction idea capture
    /obsidian-catchupProcess captures dumped from the Telegram bot (voice/text/image/PDF/link) into the vault
    /obsidian-findSmart search with context
    /obsidian-recapSummary of a day, week, or month
    /obsidian-reviewStructured weekly or monthly review
    /obsidian-boardKanban board view and updates
    /obsidian-board-hygieneBulk-triage a board -- surface stale/overdue items, then archive / reschedule / mark-Done in one pass
    /obsidian-projectProject note with board and daily links
    /obsidian-projectsLive project status from git + local docs -- infers all context from vault notes, no config required
    /obsidian-healthVault audit -- contradictions, gaps, stale claims, orphans, freshness violations (the freshness policy: every fact timeless, dated, or a pointer), typed-edge lint (unknown types, dangling targets, contradiction cycles in the relations: graph), and a tag taxonomy audit (opt-in via _meta/taxonomy.md)
    /obsidian-mergeMerge two near-duplicate notes from /obsidian-health into one -- dry run by default, frontmatter union, retired note becomes a redirect (never deleted)
    /obsidian-reindexRefreshes the incremental semantic index and reports coverage before and after, with clear embedding-backend failures
    /obsidian-retrieval-evalMeasures vault search quality -- recall@k + MRR on natural-language questions, with the concrete failures and ranked fixes
    /obsidian-decide [--formal]Logs decisions to the right project notes; --formal writes a full ADR record (the vault knows why it's structured this way)
    /obsidian-visualizeGenerates a visual canvas map of your second brain
    /obsidian-learnReviews vault learnings, prunes stale ones, surfaces patterns to promote into rules
    /obsidian-initGenerates _CLAUDE.md, index.md, log.md
    /obsidian-architectScans a codebase and writes maintained architecture notes (overview, modules, decisions) into the vault; re-run to refresh
    /crew setupShared job log and lessons with a human keep decision; works without Obsidian
    /create-commandInterview flow that scaffolds a new command into commands/<name>.md, no markdown editing

    Thinking -- Claude thinks with you

    CommandWhat it does
    /obsidian-brainstorm [topic]Multi-turn Socratic interview - one question per turn until the idea converges, then a design note with named alternatives
    /obsidian-challengeYour vault argues against your idea using your own history
    /obsidian-panelConvenes a panel of distinct perspectives on a decision, one verdict each + synthesis
    /obsidian-emergeSurfaces patterns from 30 days of notes you never named
    /obsidian-connect [A] [B]Bridges two unrelated domains to spark new ideas
    /vault-deep-synthesis [topic]Cross-references every note on a topic: agreements, contradictions, stale claims, gaps
    /obsidian-distill [note or source]Condenses a long note/source into key claims, each tagged with provenance back to the exact source block
    /idea-discoveryRanks 3-5 next-direction candidates from ideas, open questions, and orphan research
    /obsidian-graduateTurns an idea fragment into a full project with tasks

    Context -- Claude knows you

    CommandWhat it does
    /obsidian-worldLoads identity + state with progressive token budgets (L0-L3)

    Research -- Claude pulls knowledge in

    Powered by xAI Grok (live X access) + Perplexity Sonar (web research) + YouTube. Findings save to Research/ as AI-first notes (preamble, frontmatter, recency markers, sources verbatim).

    CommandWhat it does
    /x-read [url]Deep-read an X post: verbatim post + thread + TL;DR + claims + reply sentiment + voices
    /x-pulse [topic]Scan X for what's trending: themes, voices, hooks, post ideas
    /research [topic]Web research with citations: full dossier with recency markers and open questions. Uses Perplexity when keyed, free key-less sources (Wikipedia, HackerNews, arXiv, Reddit, and more) otherwise
    /research-deep [topic]Vault-first synthesis (open web): scans your vault, finds gaps, fills them via Perplexity + Grok (or free key-less sources when unkeyed), propagates updates across people/projects/ideas
    /notebooklm [topic]Vault-grounded synthesis via Gemini File Search. Uploads top 12 vault notes, returns a grounded answer with citations. No browser, one HTTP call. Pairs with /research-deep for dual-track research.
    /youtube [url] [--visual]Extract transcript + metadata + top comments → AI-first summary. --visual adds scene-change frame extraction Claude reads with its own vision
    /podcast [url]Apple Podcasts or RSS → transcript (RSS tag / Whisper / show-notes) + AI-first summary

    Setup: copy .env.example to ~/.config/obsidian-second-brain/.env, add your keys (xAI, Perplexity, YouTube optional, OpenAI optional for podcast Whisper). Run install.sh and answer "y" to the research prompt to do this automatically.

    No keys? /research and /research-deep still work. With no PERPLEXITY_API_KEY set they automatically fall back to free, key-less sources (Wikipedia, HackerNews, arXiv, Reddit, Lobsters, dev.to, OpenAlex, Semantic Scholar, CrossRef, DuckDuckGo - plus Tavily/Brave when keyed and Keenable when RESEARCH_KEENABLE=1) and Claude synthesizes the dossier. Pass --free to force it even when keyed, or --academic to restrict to scholarly sources. The other research commands (/x-read, /x-pulse, /notebooklm, /youtube) still need their respective keys.

    Optional Keenable source, off by default. Set RESEARCH_KEENABLE=1 to add Keenable web search to the free pool; unset, it never runs, and KEENABLE_API_KEY alone does not switch it on. Keenable runs this source, and your query text is sent to Keenable (api.keenable.ai). The anonymous limit is 1,000 requests an hour and 10 a second per IP; an optional KEENABLE_API_KEY lifts it.

    /obsidian-challenge

    You: "I want to rewrite the API in Rust."

    Claude finds your 2025 post-mortem where the Rust rewrite failed. Finds your decision log committing to TypeScript for 2 years. Says: "Your own notes say this failed. Still want to proceed?"


    /obsidian-emerge

    Claude scans 30 daily notes. You mentioned "onboarding friction" in 4 unrelated projects.

    "Onboarding is your bottleneck across projects. You never named it."


    /obsidian-connect "distributed systems" "cooking"

    Traces both clusters in your link graph. Finds shared concepts: preparation and load distribution. Generates 3 actionable ideas at the intersection.


    /obsidian-graduate

    An idea from 3 weeks ago. Claude reads it, finds related projects and people, generates a full spec with goals, phases, tasks, and board entries. The idea gets tagged graduated.

    /obsidian-ingest https://youtube.com/watch?v=example
    
    1. Saves original to raw/videos/ (immutable)
    2. REWRITES entity pages with new context
    3. REWRITES concept pages if the source adds depth or contradicts them
    4. Creates synthesis pages when patterns emerge
    5. Resolves contradictions and documents why
    6. Updates index.md, log.md, daily note

    One URL in. The vault rewrites itself.

    /x-read https://x.com/garrytan/status/2048121438914154664

    Grok with live X access fetches the post and replies. You get verbatim text, TL;DR, key claims, reply sentiment (~70% positive, 20% skeptical, 10% off-topic), notable counter-arguments with the @ handles of who said them, and "voices to watch" (the replies that added real signal). ~$0.05/call.


    /x-pulse "AI automation"

    WHAT'S HOT (last 24-72h)
      1. Agentic AI vs Basic Automation — voices: @NVIDIAAP, @woisau1
      2. Self-Improving Sovereign Agents — voices: @tom_doerr, @AIDailyGems
      3. Control Layers & Execution Gaps — voices: @ZIQING_JP
    
    WHAT'S UNDEREXPLORED
      - ROI numbers for non-developer small business users
      - Integration of digital agents with physical robotics
    
    HOOKS THAT ARE WORKING
      - "Automation executes. Autonomy reasons." — @NVIDIAAP
    
    POST IDEAS FOR YOU TODAY
      1. Thread: "I gave an open-source agent its own GitHub repo and watched it self-improve"
      2. Single: "Automation executes. Autonomy reasons. Here's the control layer..."
    

    What you'd spend 2 hours scrolling X to find. Returned in 30 seconds for ~$0.13.


    /research "AI memory tools"

    Returns a structured dossier: Summary, Key Facts (each with (as of YYYY-MM, source.com)), Timeline, Key Players, Contrarian Views, Recommended Further Reading, Open Questions, full citations. Saved to Research/Web/ as an AI-first note. ~$0.05/call.


    /research-deep "AI memory tools"

    Phase 1: Vault scan
      Found 8 relevant notes (e.g. Knowledge/2026-02-15 - Mem0 vs Letta.md)
    
    Phase 2: Gap analysis (Perplexity sonar-pro)
      Identified 5 targeted queries to fill what vault is silent or stale on
    
    Phase 3: Targeted research
      [web] Anthropic Claude memory tool 2026 features
      [web] Mem0 Series A reactions and concerns
      [x]   developer reactions to Letta vs Mem0
      ...
    
    Phase 4: Synthesis (sonar-reasoning-pro)
      → What's New Since Vault Baseline
      → What's Confirmed
      → Contradictions / Updates Needed (with [[wikilinks]] to specific vault files)
      → Synthesis bullets
      → Recommended Vault Updates (instructions for /obsidian-save)
      → Open Questions
    

    Vault-first means it doesn't waste tokens re-researching what you already knew. ~$0.40/call.


    /notebooklm "AI-first vault rule" - vault-grounded, no browser

    Scans the vault, uploads the top 12 most relevant notes to a Gemini File Search store, asks Gemini 2.5 Flash to synthesize against THOSE sources only with citations, writes the synthesis to Research/NotebookLM/ as an AI-first note, deletes the store.

    Vault baseline: 12 notes
    Model: gemini-2.5-flash
    Uploading 12 notes... done
    Asking Gemini, grounded against the uploaded sources...
    
    === SAVED ===
    Research/NotebookLM/2026-05-15 - ai-first-vault-rule.md
    

    Pair with /research-deep on the same topic. Open-web view + vault-grounded view rarely contradict. Where they do, that's where you have a take worth posting. ~$0.004/call on free-tier Flash, ~$0.06 on paid Pro.


    /youtube https://youtu.be/... (add --visual to watch, not just read)

    Free transcript via youtube-transcript-api + optional metadata + comments via YouTube Data API v3 (free tier). Gemini (gemini-2.5-flash, free tier) summarizes into TL;DR, Key Points, Notable Quotes (verbatim), Themes, Comment Sentiment, and Worth Following Up On - Grok is the automatic fallback (~$0.04) when no Gemini key is set. Frontmatter includes view count, channel, published date, like count for Dataview queries.

    --visual 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. Claude reads the frames with its own vision (no extra API call) and writes a timestamp-keyed ## Visual notes section; hero frames are embedded in the note. Requires yt-dlp + ffmpeg on PATH; skips gracefully if missing. --max-frames N caps frames read (default 24). Pipeline ported from claude-watch / claude-video (MIT).


    /podcast https://podcasts.apple.com/... (or paste an RSS feed URL)

    Resolves Apple Podcasts URLs to RSS via the free iTunes Lookup API. Picks the best transcript source available: <podcast:transcript> tag in the RSS feed (free, high fidelity) → Whisper API if OPENAI_API_KEY is set (~$0.006/min) → show-notes fallback. Grok summarizes into TL;DR, Key Points, Notable Quotes, Themes, Guests & People Mentioned, and Worth Following Up On. ~$0.04 for the Grok call (plus Whisper if used). Spotify URLs aren't supported (DRM).


    Auto-open after every save. Obsidian pops open at the new note. Disable with RESEARCH_AUTOOPEN=0 if you're running batch saves.


    The Vault is Alive

    Traditional vaults are filing cabinets. You put things in. They sit there.

    This vault rewrites itself with every input:

    • Ingest a source -- existing pages get rewritten, contradictions resolved, patterns synthesized
    • Save a conversation -- entities, concepts, and decisions distribute across the vault
    • Ask a question -- the Two-Output Rule means every answer also updates pages
    • A fact changes -- bi-temporal facts track when it was true AND when the vault learned it. "You believed X on Tuesday. After ingesting Y on Wednesday, you shifted to Z." Full audit trail.
    • Do nothing -- background agent and scheduled agents maintain it while you sleep
    • Wait a week -- auto-synthesis finds cross-source patterns and writes connection pages

    The vault after a week is fundamentally different from the vault you started with.

    The maintenance layer has a name: OKM (Open Knowledge Metabolism). Storage is the easy half; keeping stored knowledge true is the hard half, and it is where this project spends its effort. OKM is the open spec behind that: every stored fact must be timeless, dated, or a pointer. Slow-changing knowledge (how things work, decisions, ownership) is stored; fast-changing facts (counts, statuses, balances) are linked to where they live with an as of stamp, never copied in to rot. The rule is a one-page spec (references/freshness-policy.md), enforced by a linter (scripts/freshness_lint.py) that /obsidian-health runs. It is the companion to OKF (Google's Open Knowledge Format), and the division is sharper than format-versus-freshness: OKF v0.2 added fields for recording that something went stale (status, stale_after, verified), but a field cannot stop a note claiming "the pipeline has 13 deals" with no stamp on it. OKM is the rule about what may be stored bare at all, and a linter that fails the build when it is not. One spec, one reference linter, no second implementation yet. It is storage-agnostic: any folder of markdown an AI maintains, not just Obsidian vaults.


    Choose Your Preset

    Pick your role at bootstrap. Each preset creates tailored folder structures, templates, and kanban boards.

    PresetWho it's forKanban style
    executiveFounders, operators, managersOKRs / Quarterly / Weekly
    builderDevelopers, engineers, architectsBacklog / Sprint / Done
    creatorWriters, YouTubers, marketersIdeas / Drafts / Published
    researcherAcademics, analysts, deep-diversReading / Processing / Synthesized
    uv run python scripts/bootstrap_vault.py --path ~/my-vault --name "Your Name" --preset builder
    

    No preset? You get a general-purpose vault that works for everyone.

    Every preset builds the Obsidian-style layout (Daily/, People/, Projects/, ...). Add --style wiki for the wiki-style layout described under Vault Architecture:

    uv run python scripts/bootstrap_vault.py --path ~/my-vault --name "Your Name" --preset builder --style wiki
    

    Background Agent & Scheduled Agents

    Background: fires after every context compaction. You keep working. The vault updates itself.

    PostCompact -> obsidian-bg-agent.sh -> claude -p (headless) -> vault updated
    

    What arming it costs. The headless run uses --dangerously-skip-permissions, because nobody is there to approve each write. That is why the agent ships inert and stays opt-in. Its tool surface is restricted with --tools "Read,Write,Edit,Glob,Grep" (the flag that removes every other built-in tool, not just pre-approves these) and no MCP servers are loaded, so it cannot run shell commands or reach the network, and it only adds and updates - it never deletes or merges. If that trade is not one you want, leave it off; every other command works without it.

    Scheduled:

    AgentWhenWhat
    morning8 AMDaily note + overdue tasks
    nightly10 PMSleeptime consolidation: close day + reconcile + synthesize + heal orphans
    weeklyFridays 6 PMWeekly review
    healthSundays 9 PMVault health audit

    Save reminders: Claude nudges you to /obsidian-save after 10+ exchanges or when you say "done" or "thanks". No lost conversations.

    Bounded recall (opt-in): on every prompt, a UserPromptSubmit hook injects a small brief of the most relevant vault notes - max 4 notes, ~900 chars - or nothing at all when confidence is low (abstention beats noise). Read-only, fail-closed, and every inject/abstain decision is logged to <vault>/.claude-runs/ for audit. Ships inert; arm it with OBSIDIAN_RECALL_ENABLED=1 per hooks/recall.hook.example.json.


    Vault Architecture

    Starting with personal notes? /obsidian-init offers an optional First-Brain wiki-style variant for an existing, evolving collection of human notes. Human notes live in the First-Brain/ folder, immutable ingestion captures in raw/, and AI-maintained knowledge in wiki/. Initialization ensures the First-Brain/ source folder exists and configures ownership and routing; it does not move or ingest notes. Then use /obsidian-ingest on an individual First Brain file or the collection. Original notes stay in place under instruction-based protection, not a filesystem sandbox. See the initialization command for the full procedure.

    Importing a collection? /obsidian-ingest Sources/ --preview discovers eligible text files, PDFs, audio, and images without reading source bodies or writing progress. /obsidian-ingest Sources/ --batch-size 10 processes up to ten sources sequentially through the existing ingestion workflow. Repeat the same command for the next batch or after an interrupted session has stopped; completed unchanged sources are skipped, and unfinished sources reuse their raw captures. Sensitive-content rules and rewrite approvals still apply. Required pending or declined approvals never count as completion.

    Progress uses one hidden completion comment per processed source version in existing Logs/YYYY-MM-DD.md files, or legacy log.md; there is no separate state file or additional readable status line. The comment contains the source path, byte hash, raw reference, and timestamp. Each source finishes its catalog, daily-note, and normal log updates before the comment is written. Unfinished work has no completion comment and is retried on the next run; errors and pending approvals appear in the normal report. Removing completion history requires reprocessing, with raw deduplication retained. Run only one folder ingestion per vault at a time; this minimal helper does not track active sessions, enforce locking, or validate semantic extraction quality. See the ingestion procedure for supported extensions, provenance hashes, custom routing, and recovery. First Brain warm start is simply /obsidian-ingest First-Brain/; other layouts and source collections use the same workflow. Binary originals remain untouched; captures retain existing transcripts, PDF extracts, or image descriptions rather than archive binaries.

    Two layouts are supported. scripts/bootstrap_vault.py builds the Obsidian-style layout by default: Daily/, People/, Projects/ and the preset's topic folders such as Goals/ and Mentions/, as laid out in references/vault-schema.md. Pass --style wiki for the wiki-style layout below. A preset folder the wiki layout renames moves to that name (People/ to wiki/entities/, Ideas/ and Knowledge/ to wiki/concepts/); one it does not rename keeps its own name under wiki/ (Goals/ to wiki/goals/, Sources/ to wiki/sources/), so a preset builds the same vault in either layout.

    Wiki-style -- LLM-first

    Claude is the reader and writer. The vault is a database.

    vault/
    +-- _CLAUDE.md          # Operating manual
    +-- index.md            # Page catalog (Claude reads FIRST)
    +-- log.md              # Activity timeline
    +-- SOUL.md             # Your identity
    +-- CRITICAL_FACTS.md   # ~120 tokens, always loaded (timezone, manager, location)
    +-- raw/                # IMMUTABLE source material
    +-- wiki/               # Claude's workspace
    |   +-- entities/       # People, companies, tools
    |   +-- concepts/       # Ideas, frameworks, synthesis
    |   +-- projects/       # Project notes
    |   +-- daily/          # Daily notes
    |   +-- logs/           # Work session logs
    |   +-- reviews/        # Weekly/monthly reviews
    |   +-- tasks/          # Task notes
    |   +-- decisions/      # ADRs
    +-- boards/             # Kanban boards
    +-- templates/          # Note templates
    

    Install

    One codebase, eight builds. Pick yours below. The vault behavior is identical across all of them; only the install path and the dispatcher file (CLAUDE.md / AGENTS.md / GEMINI.md / .agents/skills/ / .pi/ / workflow SKILL.md) differ.

    Rather than ask you to take that on faith, here is what each build currently passes:

    BuildEmits a real treeScript paths resolvedDocs reachableToolkit runnable
    Agent Skillspasspasspasspass
    Claude Codepasspasspasspass
    Codex CLIpasspasspasspass
    Gemini CLIpasspasspasspass
    Grok Botpasspasspasspass
    Hermespasspasspasspass
    OpenCodepasspasspasspass
    Pipasspasspasspass

    Generated by scripts/conformance_report.py, verified in CI on every push. Each build is compiled from the same source tree, then checked for a non-empty output, a resolved script root, reference paths that actually exist in that build, and a Python project shipped beside the scripts. A red cell here is a real red cell, not a missing test.

    Prerequisites: Claude Code (or one of the other six platforms below), git, and uv for the Python helpers (health check, research toolkit, bootstrap). jq is required for the classic script install - scripts/setup.sh uses it to edit ~/.claude/settings.json safely and exits if it is missing. Not needed on the plugin path. Optional: Ollama for local semantic search, openai-whisper (installed on first audio ingest, pulls in PyTorch). No API keys needed for the core vault commands.

    Crew only (no vault)

    Want the shared logbook without Obsidian? Run the quick install above, restart Claude Code, and type /crew setup. Pick a plain folder such as ~/crew. Or run the helper directly:

    python3 ~/.claude/skills/obsidian-second-brain/scripts/crew.py --dir ~/crew setup
    

    Codex users then run /hooks once to trust the hooks. Restart Cursor after setup. Full guide: references/crew.md.

    Claude Code (default)

    Native plugin install (recommended). Inside any Claude Code session:

    /plugin marketplace add eugeniughelbur/obsidian-second-brain
    /plugin install obsidian-second-brain@obsidian-second-brain
    

    That ships all 49 commands, the skill manual, the session-context hook, the opt-in background agent (inert until you arm it - see hooks/postcompact.hook.example.json), and the vault MCP server. Then tell Claude where your vault lives by adding to the env section of ~/.claude/settings.json:

    "env": { "OBSIDIAN_VAULT_PATH": "/path/to/your/vault" }
    

    Restart Claude Code, then run /obsidian-second-brain:obsidian-init inside your vault. Plugin commands are namespaced, so every command is /obsidian-second-brain:<name> (type /obsidian-second-brain: to see all 49). Update later with /plugin update obsidian-second-brain.

    Classic install (script). Use this if you want the commands as bare names (/obsidian-init, /research, ...) or you are developing the skill and want live edits. One line (clones the skill, installs the slash commands, registers the session-context hook, and offers the research env):

    curl -fsSL https://raw.githubusercontent.com/eugeniughelbur/obsidian-second-brain/main/scripts/quick-install.sh | bash
    

    Or step by step:

    git clone https://github.com/eugeniughelbur/obsidian-second-brain ~/.claude/skills/obsidian-second-brain
    bash ~/.claude/skills/obsidian-second-brain/install.sh
    bash ~/.claude/skills/obsidian-second-brain/scripts/setup.sh "/path/to/your/vault"
    

    Cloning it? A star costs you nothing and is how the next person finds this.

    No vault yet? Create a ready-to-use one first (folders, templates, boards, dashboards - passes its own health check out of the box):

    cd ~/.claude/skills/obsidian-second-brain
    uv run python scripts/bootstrap_vault.py --path ~/Documents/MyVault --name "Your Name"
    bash scripts/setup.sh ~/Documents/MyVault
    

    Then open Claude Code and run /obsidian-init inside your vault.

    Codex CLI / Gemini CLI / OpenCode

    Codex and OpenCode users: prefer the Agent Skills build below. The standalone codex-cli and opencode builds are deprecated and superseded by it; both print that notice in their own INSTALL.md. They still work, and will until they are removed. Gemini CLI has no replacement build, so this is the right path there.

    git clone https://github.com/eugeniughelbur/obsidian-second-brain
    cd obsidian-second-brain
    bash scripts/build.sh --platform codex-cli   # or gemini-cli, or opencode
    cp -R dist/codex-cli/. /path/to/your/vault/   # or dist/gemini-cli/. or dist/opencode/.
    

    Then start your CLI from the vault root.

    The Codex build emits native Codex Agent Skills: one skill per command under .agents/skills/<name>/SKILL.md. Codex discovers them automatically with progressive disclosure (only each skill's name + description load until it's selected), and they run in your current session - invoke one with $<name>, pick it from /skills, or just describe the task and let Codex match it implicitly. AGENTS.md stays as a thin always-on manual (vault conventions + the AI-first rule); there is no routing table to maintain because the skill list is the router. The Gemini / OpenCode builds still emit a GEMINI.md / AGENTS.md dispatcher with an auto-generated routing table to command files under .gemini/ / .opencode/.

    Run bash scripts/build.sh with no arguments to build every platform at once. See dist/<platform>/INSTALL.md after building for platform-specific notes.

    Google Antigravity (and any .agents/skills/ harness)

    Antigravity, Codex CLI, OpenCode, and GitHub Copilot CLI have all converged on the open Agent Skills standard: workspace skills at .agents/skills/<name>/SKILL.md. The agent-skills build emits one spec-compliant tree they all read - and any future harness on the same standard works with zero repo changes.

    git clone https://github.com/eugeniughelbur/obsidian-second-brain
    cd obsidian-second-brain
    bash scripts/build.sh --platform agent-skills
    
    # install with skills.sh (writes one shared .agents/skills/ tree), from your vault root:
    npx skills add /path/to/obsidian-second-brain/dist/agent-skills -a antigravity -a codex -a opencode
    # or copy manually, no skills.sh required:
    cp -R dist/agent-skills/skills/. /path/to/your/vault/.agents/skills/
    

    Each command becomes a skill under .agents/skills/; a shared obsidian-core skill carries the Python toolkit and the AI-first write spec the others call into. The skills are self-sufficient (they resolve the vault root from $OBSIDIAN_VAULT_PATH or the working directory and embed the write spec), so they need no session-start hook. This is the recommended path for Google Antigravity, whose skill discovery differs from classic Gemini CLI: Antigravity still reads the gemini-cli build's GEMINI.md as passive context, but only detects active skills under .agents/skills/, so install this build (not gemini-cli) if you want Antigravity to surface the commands as skills. See dist/agent-skills/INSTALL.md for the full story (skills.sh, manual copy, per-harness notes, and the optional always-on vault-routing rule).

    Pi Coding Agent

    git clone https://github.com/eugeniughelbur/obsidian-second-brain
    cd obsidian-second-brain
    bash scripts/build.sh --platform pi
    pi install ./dist/pi          # or: cp -R dist/pi/.pi/ /path/to/your/vault/
    

    The Pi build emits a native Pi package: prompt templates under .pi/prompts/ (invoke as /obsidian-save, /obsidian-daily, etc.) plus a discovery skill under .pi/skills/obsidian-second-brain/ (load with /skill:obsidian-second-brain). Pi reads the same ~/.config/obsidian-second-brain/.env keys as the other platforms. It has no background-agent equivalent, and the scheduled agents (obsidian-nightly and the others) are prompts, not commands, so Pi has no /obsidian-nightly to type. To run one, copy its prompt from the scheduled agents section of SKILL.md into a Pi session, by hand or from your own scheduler. (Contributed by @Gepetdo.)

    Use it in Grok Bot

    Obsidian Second Brain turns what's on your mind into linked notes in your Obsidian vault, keeps your daily notes, and answers your questions from your own notes with links back to the source.

    Start from the official Obsidian Second Brain bot template: https://x.ai/bot/Oj_doyprowDl817Yk5Rbh

    Grok Bot / Sand

    git clone https://github.com/eugeniughelbur/obsidian-second-brain
    cd obsidian-second-brain
    bash scripts/build.sh --platform grok-bot
    # Review dist/grok-bot/INSTALL.md for platform-specific instructions
    

    What you need: a plan that includes Grok Bot. Premium, Super and Ultra on The X Subscription include it, with one weekly usage pool shared with Grok and Cursor. Older paid Cursor plans and linked SuperGrok or X Premium+ accounts work too (https://cursor.com/help/grok-bot/plans).

    The Grok Bot build emits workflow SKILL.md files that Grok Bot and Sand agents invoke with / or @. Each skill is a self-contained playbook (name, description, operating instructions). The user-obsidian-second-brain MCP server (already connected in Grok Bot) provides the vault I/O layer via obsidian_* tools (obsidian_search, obsidian_read_note, obsidian_save_note, obsidian_update_note, obsidian_validate_note, etc.). Skills tell the agent which MCP tool to call and how to structure the data. Set $OBSIDIAN_VAULT_PATH to your vault root. No hooks, no scheduled agents - Grok Bot has no hook runtime.

    Grok Bot can write a live Page, such as a report, a dashboard, or a plan. The Page opens from a card in the chat, stays in the bot's Library, and you can share it with only you, your team, or anyone with the link. A weekly review or a project dashboard from your vault fits this.

    On an iPhone 15 Pro or later, pressing and holding the Action Button starts a voice chat with Grok Bot. You need Grok Bot 1.16 or later, and you set it in iPhone Settings > Action Button > Shortcut. Use it to speak a thought and save it into the vault.

    Run on Hermes / open models

    The skill is model-agnostic. The OpenCode build (and the Codex / Gemini builds) are plain instruction files, so they run on whatever model the host CLI is pointed at - including open models like Nous Research Hermes. No separate build, no code changes. You set the model on OpenCode's side.

    There is also a dedicated Hermes Agent build that emits the commands as native Hermes skills (skills/<category>/<name>/SKILL.md, agentskills.io-compatible), so Hermes discovers and runs them through its own Skills System rather than via a host CLI:

    bash scripts/build.sh --platform hermes
    # then follow dist/hermes/INSTALL.md (copy into ~/.hermes/skills/ or add as a tap)
    

    Do not run hermes plugins install on this repo's URL. The repo root is not a Hermes plugin (it has no plugin.yaml), and Hermes reports success anyway while registering nothing (#298). Use the skills build above.

    This is the skill/playbook half of the Hermes work; the bounded vault-data half is the MCP connector. Native cron and lifecycle-hook integration are tracked in Issue #79.

    Point OpenCode at Hermes via OpenRouter. Authenticate once (/connect, search OpenRouter, paste your key - or export OPENROUTER_API_KEY=...), then in opencode.json:

    {
      "$schema": "https://opencode.ai/config.json",
      "model": "openrouter/nousresearch/hermes-4-70b",
      "provider": {
        "openrouter": {
          "models": {
            "nousresearch/hermes-4-70b": {}
          }
        }
      }
    }
    

    Hermes models on OpenRouter (as of 2026-06, openrouter.ai):

    Model idBest forCost (in / out per 1M tokens)
    nousresearch/hermes-4-70bDefault. Cheap, capable, 131k context.$0.13 / $0.40
    nousresearch/hermes-4-405bStrongest instruction-following for the synthesis-heavy commands.$1.00 / $3.00
    nousresearch/hermes-3-llama-3.1-405b:freeZero-cost trial (needs any OpenRouter key to authenticate).free

    For the privacy story, run a smaller Hermes locally through Ollama or LM Studio and point OpenCode at the local endpoint - no data leaves your machine.

    What to expect (open models follow instructions less reliably than Claude, so this is honest, not a promise of parity): the core commands - /obsidian-save, /obsidian-daily, /obsidian-capture, /obsidian-find, /obsidian-task, and /research in free mode - hold up well. The sub-agent-heavy commands and the deep synthesis ones (/obsidian-architect, /obsidian-reconcile, /research-deep) lean hard on instruction-following, so prefer hermes-4-405b (or Claude) for those. The AI-first vault rule still applies on every write regardless of model.

    Research toolkit (optional)

    The 7 research commands use API keys (2 of them fall back to free sources without any).

    Installed the plugin? You have no repo checkout, so install.sh, .env.example, and uv sync are not on your disk. Create the env file by hand instead - the research scripts read this path regardless of how you installed, and the plugin's MCP server already runs under uv run --no-project --with 'mcp<2', so there is nothing to uv sync:

    mkdir -p ~/.config/obsidian-second-brain
    touch ~/.config/obsidian-second-brain/.env
    chmod 600 ~/.config/obsidian-second-brain/.env
    # then paste the keys from the table below into that file
    

    On Windows (Git Bash / MSYS2) the file lives under your Windows profile, %USERPROFILE%\.config\obsidian-second-brain\.env: that is where Python (Path.home()), Claude Code, and the bash scripts resolve the home, even when a corporate HOME points at another drive. Bash's own ~ still follows HOME, so on such a machine create the file from USERPROFILE instead of with the commands above:

    CONFIG="$(cygpath -u "$USERPROFILE")/.config/obsidian-second-brain"
    mkdir -p "$CONFIG" && touch "$CONFIG/.env" && chmod 600 "$CONFIG/.env"
    

    To keep the file anywhere else, set OBSIDIAN_ENV_FILE to its full path; every reader an