| name | obsidian |
| description | Read, search, and write Johannes's Obsidian vault (the PARA second brain at ~/SourceRoot/brain) via the Obsidian CLI (metadata-aware โ backlinks, tags, Dataview) with a filesystem fallback. Capture notes to the inbox, create resource/inspiration notes with the right frontmatter, search by text/tag/backlink. |
| version | 1.0.0 |
| metadata | {"hermes":{"tags":["obsidian","vault","notes","note","second-brain","pkm","knowledge","inbox","search","backlinks","dataview","wikilink","markdown","capture","resource","inspiration"],"related_skills":["capture","karakeep","argo-api"]}} |
Obsidian
Johannes's personal knowledge vault โ plain-markdown, PARA-organised, the source of truth of the second brain. Capture lands here; durable knowledge lives here. The vault is a git repo at ~/SourceRoot/brain, shared with Claude Code (its /brain skill); a LaunchAgent pulls and pushes it every 5 minutes between the mini and the MacBook โ on this Mac Mini it never auto-commits, so a write isn't durable until it's committed. Git is the deliberate git diff review + history gate. The shared machine-facing contract both agents follow is ~/SourceRoot/brain/AGENTS.md โ read it for anything this skill doesn't cover.
Vault root: ~/SourceRoot/brain/
Access: Obsidian.app runs on this Mac Mini, so prefer the Obsidian CLI โ it goes through Obsidian's live API (metadata cache, backlinks, Dataview). Fall back to the filesystem only when the CLI is unavailable.
Use the terminal. Don't say you lack access to the vault โ reading and writing it is this skill.
Access model โ CLI first, filesystem fallback
Primary โ Obsidian CLI (/usr/local/bin/obsidian, command form obsidian <command> key=value):
file=<name> resolves by note name like a wikilink; path=<folder/note.md> is an exact path relative to the vault root.
- Quote values with spaces:
name="My Note". Use \n for newlines in content=.
- Confirm it's live with
obsidian version. If that errors (Obsidian not running), use the filesystem fallback.
Fallback โ filesystem (~/SourceRoot/brain/**/*.md): raw markdown read/write. Works always, but no metadata cache, no backlink/Dataview resolution, and the running Obsidian only notices on its next file-watch tick. Use only when the CLI is down.
Vault structure (actual on disk โ trust this, not older docs)
| Folder | Holds | Naming |
|---|
Inbox/ | Unprocessed captures โ the default dump for anything unclassified | free |
Projects/ | Active projects (basalt-ui, iu as folders; free-planning-poker, rollhook as single notes, no folder yet) โ folder-note {name}.md + optional notes/, specs/ | โ |
Areas/ | Ongoing areas (Engineering, Health, Photography, Reading) | โ |
wiki/ | Agentic knowledge โ atomic English concept notes agents grow by traversal, domain-organized (wiki/health/peptides/) + per-level index.md MOC | โ |
There is no PARA Resources tier โ reference material (articles, videos, books) is a wiki/ concept note or a page under an Area; raw captures land in Inbox/ and are promoted from there. Tasks live in TickTick, not the vault. For the authoritative traversal + write contract shared with Claude Code, see ~/SourceRoot/brain/AGENTS.md.
Conventions (real, in active use)
- Frontmatter on every note. Universal keys:
title, date (YYYY-MM-DD), tags (YAML list). These are the three most-used properties in the vault.
- Tags are hierarchical
#topic/subtopic (e.g. resource/article, area/engineering). In frontmatter list them without the #.
- Links are
[[wikilinks]]; add them to relate a note to projects/areas/other notes.
- Dates are
YYYY-MM-DD everywhere. Resolve "today" before writing โ nothing expands date tokens for you.
- Never write to the vault root. Unclassified content โ
Inbox/.
- The vault has no templates or daily notes. The
09_Templates/ and 02_Daily/ folders were removed 2026-08-02, and the backing templates/daily-notes core plugins are disabled โ never pass template=/templates, and never call any daily:* CLI verb (daily, daily:append, daily:path, daily:prepend, daily:read); they're dead. Build the full frontmatter + body yourself from the schemas below and pass it via content=.
- New subfolder โ new folder note. When adding a subfolder under
Projects/<project>/ or Areas/<area>/ that will hold more than one note, create its folder note ({foldername}.md) in the same write rather than leaving it for the linter to flag โ see AGENTS.md โ Reserved filenames. A pure attachment/spec bucket already covered by the parent's folder note doesn't need one.
Durable knowledge โ two layers, shared discipline with Claude Code
Durable knowledge splits into two physical trees, shared with Claude Code's /brain skill against the same repo. Full contract: ~/SourceRoot/brain/AGENTS.md. Inbox/ keeps the loose capture schema above (title/date/tags) โ no type/description/MOC discipline.
- Agentic knowledge โ
wiki/. The terse, structured, English, cross-linked concept notes agents grow by traversal, domain-organized (e.g. wiki/health/peptides/). Strict: required frontmatter beyond the universal keys is type (free string, e.g. Reference, Playbook, Concept) + description (one sentence); [[wikilinks]] must resolve; each domain level has an index.md MOC.
- Curated human surface โ
Projects/, Areas/. The pages Johannes reads and writes โ Area/Project folder notes ({name}.md, Folder Notes plugin) as overviews, plus human pages. Any language, light discipline: no forced type/description, status is his free field, and they link down into wiki/ for depth rather than duplicating it. A page may be distilled from wiki/ via Claude Code's /distill skill; the voice pass and publish decision are always human, never automated. Any prose you write for either layer follows the vault's root voice.md (writing-voice guide โ verdict first, terse, no AI filler).
- Link notes with
[[wikilinks]] โ the knowledge graph, not decoration.
- Before a write to
wiki/ or the curated surface counts as done, a human reviews the git diff and node .scripts/vault-lint.mjs passes (0 errors) โ necessary, not sufficient; judgment stays human.
Frontmatter schemas by note type
Build these literally (example values shown โ substitute real title/date):
---
title: "<title>"
date: 2026-06-17
tags: [inbox]
---
---
title: "<title>"
date: 2026-06-17
tags: [resource/article]
url: "https://โฆ"
author: "<author>"
---
---
title: "<title>"
date: 2026-06-17
tags: [resource/youtube]
url: "https://โฆ"
channel: "<channel>"
---
---
title: "<title>"
type: inspiration
category: ""
relevance: ""
date: 2026-06-17
tags: [inspiration]
url: ""
author: ""
project: "[[<project>]]"
---
---
title: "<name>"
type: project
status: personal
lifecycle: active
tags: [project]
dateCreated: 2026-06-17
repo: ""
---
Read / query (CLI)
obsidian version
obsidian search query="deep modules" format=json
obsidian search:context query="ACWR" limit=10
obsidian read path="Areas/Engineering/north-star-stack.md"
obsidian files folder="Inbox"
obsidian backlinks file="basalt-ui" format=tsv
obsidian links file="basalt-ui"
obsidian tags
obsidian properties counts format=tsv
obsidian outline path="โฆ"
Dataview escape hatch โ for queries beyond search/backlinks, run JS in Obsidian's context via eval (Dataview API is loaded):
obsidian eval code="app.plugins.plugins.dataview.api.pages('\"Projects\"').where(p => p.status=='active').length"
Write (CLI)
TODAY=$(date +%F)
obsidian create path="Inbox/<slug>.md" content="---
title: \"<title>\"
date: $TODAY
tags: [inbox]
---
# <title>
<body>"
obsidian create path="Inbox/<title>.md" content="---
title: \"<title>\"
date: $TODAY
tags: [resource/article]
url: \"<url>\"
author: \"<author>\"
---
# <title>
## Summary
<summary>"
obsidian append path="<path>" content="\n## New section\nโฆ"
obsidian property:set name=status value=completed type=text path="Projects/<name>.md"
obsidian move file="<name>" to="Areas/Engineering"
obsidian delete path="<path>"
Workflows
- "note this / remember this / add to my notes" โ create in
Inbox/ (generic frontmatter). Inbox is the trusted dump; processing into Projects/Areas or wiki/ happens later.
- "save this article / video" โ capture note in
Inbox/ with url + author/channel (promoted to wiki/ or an Area later).
- "inspiration / competitor / tool for project X" โ
Projects/X/notes/inspiration-<slug>.md.
- "what do I have on X" / "find my note about X" โ
search / search:context, then read the hit.
- "what links to / relates to Y" โ
backlinks + links.
Routing โ where a capture goes
The capture skill routes; this is the shared model:
- Obsidian (this skill) โ a durable thought, idea, or piece of knowledge to develop; a reference note you'll edit/link.
- KaraKeep (
karakeep skill) โ a link/article to read or keep later (let it crawl + AI-tag). Reference you consume, not author.
- TickTick (via
capture) โ something a human must do.
- GitHub (
capture) โ a concrete code change.
Guardrails