Expert in managing Obsidian vaults using obsidian-cli workflows for reading, writing, searching, moving, and organizing notes while preserving wiki-link integrity and vault structure...
Before performing vault operations:
Verify obsidian CLI is installed:
obsidian --version
The CLI is the native obsidian binary that ships with the Obsidian desktop app — not a separate npm package.
List available vaults:
obsidian vaults
Get vault path:
obsidian vault "<name>" info=path
Use obsidian for vault operations that touch links or structure. For creating notes with substantial content (multi-line, frontmatter, etc.), use the Write tool directly after locating the vault path — the CLI's create command strips multi-line content when \n escapes are used.
| Task | Command | Notes |
|---|---|---|
| List vaults | obsidian vaults |
Always run first |
| Vault info | obsidian vault "<name>" |
Name, path, file count |
| Vault path | obsidian vault "<name>" info=path |
Path only, good for scripting |
| List folders | obsidian "vault=<name>" folders |
Quote vault name if it has spaces |
| Read note | obsidian "vault=<name>" read "<note name>" |
Reads by name (fuzzy) |
| Create note | obsidian "vault=<name>" create path="folder/name.md" content="$CONTENT" |
Use printf to build $CONTENT for multi-line |
| Overwrite note | obsidian "vault=<name>" create path="..." content="$CONTENT" overwrite |
|
| Append to note | obsidian "vault=<name>" append path="<path>" content="<text>" |
|
| Move note | obsidian "vault=<name>" move path="old.md" newpath="new.md" |
Auto-updates all links |
| Search content | obsidian "vault=<name>" search query="<term>" [path=<folder>] [format=json] |
|
| Daily note | obsidian "vault=<name>" daily |
Create/open today's note |
See also:
# List vaults to confirm the name
obsidian vaults
# Get full info (name, path, file count)
obsidian vault "<name>"
# Get just the path (useful for scripting)
VAULT_PATH=$(obsidian vault "<name>" info=path)
# List folders
obsidian "vault=<name>" folders
# Search for existing notes
obsidian "vault=<name>" search query="<topic>" path=<folder> format=json
Use printf to build the content variable — this correctly handles newlines and multi-line content including frontmatter:
CONTENT=$(printf '---\ntags:\n - til\nindex: "[[Today I learned]]"\n---\n## Heading\n\nContent here.')
obsidian "vault=<name>" create path="til/2026-04-27 My Note.md" content="$CONTENT"
Look at an existing note first to match local formatting conventions (tag names, frontmatter fields, index backlinks, etc.):
obsidian "vault=<name>" read "<existing note name>"
# ✅ CORRECT: Auto-updates all links
obsidian "vault=<name>" move path="Random Notes/Design.md" newpath="Projects/Design.md"
# ❌ WRONG: Breaks all links to this note
mv "vault/Random Notes/Design.md" "vault/Projects/Design.md"
| Mistake | Why Wrong | Fix |
|---|---|---|
Using obsidian-cli |
That's a different npm package — the tool is obsidian |
Use obsidian |
Using --flags syntax |
The CLI uses key=value positional args, not --flags |
Use key=value format |
create with \n in double-quoted string |
Escapes get stripped, content truncated | Use printf to build a $CONTENT variable |
Using mv to move notes |
Breaks all [[wiki-links]] to that note |
Use obsidian move |
| Not checking existing note format | Each vault has different tagging/frontmatter conventions | Read an existing note first |
| Using absolute paths in wiki-links | Breaks when vault moves | Use vault-relative paths |
Edit after reading with obsidian readGrep directly on the vault path (use obsidian vault "<name>" info=path to get it)Always preserve:
---)[[Note]]#tag-nameVault operations succeed when:
[[wiki-links]] remain valid after moves