Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Find, navigate, read, and edit notes in the user's personal Obsidian vault (an iCloud-synced markdown collection on macOS). Use whenever the user mentions "the vault", "my notes", "Obsidian", a daily note, a meeting note, scratchpad, or asks to look up/jot down something that sounds personal-knowledge-base-like (e.g. "what did I write about X", "add a note about Y", "today's daily note") — even if they don't say the word "Obsidian".
.claude/skills/fredrikaverpil-obsidian/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 12 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 35% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 11% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 207% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 0% | 0% |
| case-20 | ✗→✓ | ▲ Improved | 105% | 0% |
The user keeps a personal Obsidian vault as plain markdown files synced via iCloud. The vault is just a directory tree, so all standard Unix tools work — no Obsidian app required to read or write notes.
/Users/fredrik/Library/Mobile Documents/iCloud~md~obsidian/Documents/personalBecause the path contains spaces and tildes, always quote it in shell commands. A useful shorthand is to assign it once per session:
bashVAULT="/Users/fredrik/Library/Mobile Documents/iCloud~md~obsidian/Documents/personal"
If $VAULT doesn't exist (e.g. on a non-mac host or before iCloud has synced), stop and tell the user — don't fabricate notes.
The user edits the vault from Neovim via the obsidian.nvim plugin. Configuration (workspace path, daily-notes folder, template settings, keymaps) lives in nvim-fredrik/plugin/obsidian.lua in this dotfiles repo — read it when you need the current setup, since it changes occasionally and this skill should not duplicate it.
When suggesting a workflow, prefer pointing the user at the relevant keymap or :Obsidian command (look them up in that file) over spawning a shell command, unless they're clearly outside Neovim.
$VAULT/
├── Daily/ # Daily notes, one file per day: YYYY-MM-DD.md
├── Meeting notes/ # Meeting notes (template: meeting_notes.md)
├── Resources/ # PARA-style references (Go/, Postgres/, Neovim/, ...)
├── Ideas/ # Half-baked ideas
├── Archive/ # Things no longer active
├── Clippings/ # Web clippings
├── _templates/ # Frontmatter templates (daily.md, meeting_notes.md)
├── _excalidraw/ # Excalidraw drawings
├── .trash/ # Obsidian's soft-delete bin (treat as deleted)
└── *.md # A handful of loose top-level notes
# (scratchpad.md, Running.md, LEARNING.md, blog drafts)Underscored folders (_templates, _excalidraw) sort to the top in the Obsidian UI — they're conventions, not hidden files. Skip .trash/ when searching unless the user explicitly asks about deleted notes.
Daily/YYYY-MM-DD.md (e.g. Daily/2026-05-08.md).YYYY-MM-DD-<title>.md. Match this pattern when creating notes programmatically.
API design.md) and emoji (🧚♀️ LEARNING.md).Every note has YAML frontmatter. Minimum shape:
yaml--- id: <usually filename without .md> aliases: [] tags: [] categories: [] ---
Daily notes also include date: YYYY-MM-DD and tags: [daily-notes]. Meeting notes include company: "[[Einride]]" and date. When creating a new note, copy the relevant template from _templates/ rather than hand-rolling frontmatter.
Notes use Obsidian wikilinks in _shortest_ form:
[[API design]] — link by note title (no path, no .md)[[API design|how we design APIs]] — with display text[[API design#Choose level of abstraction]] — link to a headingStandard markdown links ([text](path.md)) are not used — preserve wikilink style when editing.
Prefer rg and fd; fall back to grep/find if those aren't installed. Always exclude .obsidian/ and .trash/ to keep results signal-rich.
bash# Find notes by filename (case-insensitive, fuzzy on basename) fd -tf 'pattern' "$VAULT" -E .obsidian -E .trash # Full-text search across notes, with filename + line context rg --type md -n 'search term' "$VAULT" -g '!.obsidian' -g '!.trash' # Find all notes tagged X (frontmatter or inline #tag) rg --type md -n '(^|\s)#X\b|tags:.*\bX\b' "$VAULT" -g '!.obsidian' -g '!.trash' # Find backlinks to a note titled "API design" rg --type md -n '\[\[API design(\||#|\]\])' "$VAULT" -g '!.obsidian' -g '!.trash' # Today's daily note (create-if-missing pattern) TODAY="$VAULT/Daily/$(date +%Y-%m-%d).md"
For broader exploration (e.g. "what notes do I have about Postgres?"), look at both filenames and full-text — the user organizes by both folder and tag.
When the user asks you to add a note, follow these rules:
Daily/, meeting →Meeting notes/, work topic → Einride/<area>/, durable reference → Resources/<topic>/, half-formed thought → Ideas/ or append to scratchpad.md.
_templates/ as the starting point.Replace {{date}} with YYYY-MM-DD and {{title}} with the note's title.
id to the filename without .md (the Neovim plugin usesYYYY-MM-DD-<title> for non-daily notes — match that for consistency).
If unsure which folder fits, ask — folder choice is how the user finds things later.
id even if the filename suggests a different one (it may be adeliberate alias).
[[Foo]], don't "improve" it to[Foo](Foo.md).
The vault has two community plugins enabled (see .obsidian/community-plugins.json):
Obsidian app. Notes created from the shell won't go through it, so copy from _templates/ to get equivalent output.
_excalidraw/ as.excalidraw.md files. Treat them as opaque unless the user asks specifically.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 11,564 | 12,927 | +12% | 1 | 1 | 0% | 1,976 | 2,667 | +35% | 0 | 0 | — |
case-02 | fail→fail | 11,211 | 8,255 | -26% | 1 | 1 | 0% | 1,531 | 2,081 | +36% | 0 | 0 | — |
case-03 | fail→pass | 12,857 | 4,397 | -66% | 1 | 1 | 0% | 2,192 | 2,435 | +11% | 0 | 0 | — |
case-04 | pass→pass | 10,434 | 8,396 | -20% | 1 | 1 | 0% | 1,826 | 3,132 | +72% | 0 | 0 | — |
case-05 | pass→pass | 8,140 | 4,192 | -49% | 1 | 1 | 0% | 1,286 | 2,275 | +77% | 0 | 0 | — |
case-06 | pass→pass | 13,705 | 15,827 | +15% | 1 | 1 | 0% | 2,424 | 4,646 | +92% | 0 | 0 | — |
case-07 | pass→pass | 14,596 | 4,314 | -70% | 1 | 1 | 0% | 2,641 | 2,362 | -11% | 0 | 0 | — |
case-08 | fail→fail | 10,224 | 4,566 | -55% | 1 | 1 | 0% | 1,781 | 1,846 | +4% | 0 | 0 | — |
case-09 | fail→pass | 4,750 | 4,291 | -10% | 1 | 1 | 0% | 838 | 2,574 | +207% | 0 | 0 | — |
case-10 | fail→fail | 7,372 | 5,001 | -32% | 1 | 1 | 0% | 1,206 | 2,441 | +102% | 0 | 0 | — |
case-11 | fail→fail | 10,632 | 7,771 | -27% | 1 | 1 | 0% | 1,666 | 2,051 | +23% | 0 | 0 | — |
case-12 | pass→pass | 11,721 | 3,552 | -70% | 1 | 1 | 0% | 1,806 | 2,209 | +22% | 0 | 0 | — |
case-13 | pass→pass | 10,136 | 4,115 | -59% | 1 | 1 | 0% | 1,525 | 2,278 | +49% | 0 | 0 | — |
case-14 | fail→pass | 15,268 | 4,872 | -68% | 1 | 1 | 0% | 2,496 | 2,484 | -0% | 0 | 0 | — |
case-15 | pass→pass | 8,177 | 3,224 | -61% | 1 | 1 | 0% | 1,451 | 2,194 | +51% | 0 | 0 | — |
case-16 | pass→pass | 10,871 | 4,614 | -58% | 1 | 1 | 0% | 1,710 | 2,445 | +43% | 0 | 0 | — |
case-17 | pass→pass | 10,797 | 4,460 | -59% | 1 | 1 | 0% | 1,638 | 2,391 | +46% | 0 | 0 | — |
case-18 | pass→pass | 10,835 | 3,146 | -71% | 1 | 1 | 0% | 1,587 | 2,130 | +34% | 0 | 0 | — |
case-19 | pass→pass | 9,392 | 5,733 | -39% | 1 | 1 | 0% | 1,399 | 2,101 | +50% | 0 | 0 | — |
case-20 | fail→pass | 6,999 | 2,410 | -66% | 1 | 1 | 0% | 975 | 1,996 | +105% | 0 | 0 | — |
case-21 | fail→pass | 10,661 | 2,609 | -76% | 1 | 1 | 0% | 1,530 | 2,072 | +35% | 0 | 0 | — |
case-22 | pass→pass | 13,205 | 5,499 | -58% | 1 | 1 | 0% | 1,883 | 2,438 | +29% | 0 | 0 | — |
case-23 | fail→pass | 13,298 | 11,899 | -11% | 1 | 1 | 0% | 2,090 | 3,109 | +49% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 20 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +30 percentage points is the difference between those two pass rates over the 20 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.