name: obsidian-vault description: Manage Obsidian vaults using built-in filesystem tools. Understands vault structure, frontmatter, wikilinks, tags, tasks, daily notes, and templates. metadata: {"zeptoclaw":{"emoji":"๐"}}
Obsidian Vault Skill
Manage Obsidian vaults directly via filesystem tools. No external CLI required โ uses built-in read, write, list, and edit tools to work with vault files.
Vault Structure
An Obsidian vault is a directory containing markdown files and a .obsidian/ config folder:
MyVault/
โโโ .obsidian/ # Obsidian config (DO NOT modify unless asked)
โ โโโ app.json # App settings
โ โโโ appearance.json # Theme settings
โ โโโ community-plugins.json # Installed plugin IDs
โ โโโ plugins/ # Plugin configs
โโโ Daily Notes/ # Common daily notes folder
โโโ Templates/ # Common templates folder
โโโ Attachments/ # Images, PDFs, etc.
โโโ Notes/ # User's notes
โโโ *.md # Root-level notes
Identify a vault: A directory is a vault if it contains .obsidian/ subdirectory.
Frontmatter (Properties)
Notes use YAML frontmatter between --- delimiters at the top of the file:
---
title: Meeting Notes
date: 2026-02-26
tags:
- meeting
- project-alpha
status: draft
aliases:
- Alpha Meeting
---
# Meeting Notes
Content starts here...
Read frontmatter
Read the file and parse everything between the first --- pair.
Update frontmatter
Use the edit tool to replace frontmatter fields. Preserve existing fields โ only change what's requested.
Add frontmatter to a file without one
Prepend ---\n<fields>\n---\n\n before existing content.
Tags
Tags appear in two places:
- Frontmatter tags โ
tags: [meeting, project]in YAML - Inline tags โ
#tag-nameanywhere in the body text (NOT inside code blocks)
Nested tags use /: #project/alpha, #status/in-progress
Find all tags in vault
Search for #[\w/-]+ pattern across all .md files, plus parse tags: from frontmatter.
Find files with a specific tag
Search for both #tag-name in body text AND tag-name in frontmatter tags arrays.
Wikilinks
Obsidian links use double-bracket syntax:
| Syntax | Meaning |
|---|---|
[[Note Name]] |
Link to note (matches filename without .md) |
[[Note Name|Display Text]] |
Link with custom display text |
[[Note Name#Heading]] |
Link to specific heading |
[[Note Name#^block-id]] |
Link to specific block |
![[Note Name]] |
Embed (transclude) entire note |
![[image.png]] |
Embed image from vault |
Find backlinks
To find all files linking TO MyNote.md, search all .md files for [[MyNote]] or [[MyNote| or [[MyNote#.
Find broken links
Extract all [[target]] references, then check if target.md exists in the vault.
Tasks
Obsidian uses markdown checkboxes with optional metadata:
- [ ] Incomplete task
- [x] Completed task
- [ ] Task with due date [due:: 2026-03-01]
- [ ] Task with priority [priority:: high]
- [ ] #project/alpha Review the design doc
Find all tasks
Search for lines matching - \[[ x]\] across all .md files.
Find incomplete tasks
Search for - \[ \] (with space between brackets).
Complete a task
Edit the file, replacing - [ ] with - [x] on the target line.
Find overdue tasks
Search for \[due:: (\d{4}-\d{2}-\d{2})\] and compare dates.
Daily Notes
Daily notes follow a date-based naming convention. Common patterns:
| Pattern | Example Path |
|---|---|
Daily Notes/YYYY-MM-DD.md |
Daily Notes/2026-02-26.md |
Journal/YYYY/MM-DD.md |
Journal/2026/02-26.md |
YYYY-MM-DD.md (root) |
2026-02-26.md |
Detect daily notes folder
Check .obsidian/daily-notes.json for folder and format settings. If not configured, check for common folder names: Daily Notes, Journal, Dailies.
Create today's daily note
---
date: 2026-02-26
tags:
- daily
---
# 2026-02-26
## Tasks
- [ ]
## Notes
List recent daily notes
List files in the daily notes folder, sort by filename (date) descending.
Templates
Templates live in a configurable folder (check .obsidian/templates.json for folder). Common locations: Templates/, _templates/.
Apply a template
- Read the template file
- Replace template variables:
{{date}}or{{date:YYYY-MM-DD}}โ current date{{time}}or{{time:HH:mm}}โ current time{{title}}โ note filename without.md
- Write as the new note content
Search
Full-text search
Use the shell tool with grep/ripgrep to search vault content:
# Search all markdown files for a term
grep -rl "search term" /path/to/vault --include="*.md"
# Search with context
grep -rn "search term" /path/to/vault --include="*.md" -C 2
Or use the filesystem list tool to enumerate files, then read and filter.
Search by property
Parse frontmatter from each file and filter by property values.
Common Operations
Create a new note
Write a new .md file with frontmatter:
---
title: Note Title
date: 2026-02-26
tags: []
---
# Note Title
Content here.
Move/rename a note
- Read the old file
- Write to the new path
- Delete the old file
- Update backlinks: Search all
.mdfiles for[[OldName]]and replace with[[NewName]]
List all notes
List all *.md files in the vault, excluding .obsidian/ and .trash/.
Vault statistics
- Count
.mdfiles (total notes) - Extract and count unique tags
- Count
[[references (total links) - Count
- [ ]lines (open tasks) - Count
- [x]lines (completed tasks)
Obsidian Config Files
These live in .obsidian/ โ read but don't modify unless explicitly asked:
| File | Contains |
|---|---|
app.json |
Editor settings, vim mode, etc. |
appearance.json |
Theme, font, CSS snippet list |
community-plugins.json |
Array of installed plugin IDs |
daily-notes.json |
folder, format, template for daily notes |
templates.json |
folder for templates |
bookmarks.json |
Bookmarked files and searches |
graph.json |
Graph view settings |
hotkeys.json |
Custom keyboard shortcuts |
Tips
- Always preserve existing frontmatter fields when editing โ only change what's asked
- Wikilinks are case-insensitive for matching but preserve original case
- Files in
.trash/are soft-deleted โ check there before declaring something missing - Attachments (images, PDFs) are typically in
Attachments/or alongside the note - Obsidian ignores dotfiles and
node_modules/โ don't create notes there - When creating notes, match the vault's existing naming convention (kebab-case, Title Case, etc.)
- Canvas files (
.canvas) are JSON โ read with filesystem tools, parse as JSON