Full remote control of a running Obsidian desktop app via the built-in obsidian CLI. Use INSTEAD of the older obsidian-cli skill packaged with OpenClaw — thi...
--- name: obsidian-remote description: "Full remote control of a running Obsidian desktop app via the built-in obsidian CLI. Use INSTEAD of the older obsidian-cli skill packaged with OpenClaw — this skill covers the real, feature-complete CLI that ships with Obsidian itself. Handles reading/writing/searching notes, daily notes, tasks, properties/frontmatter, tags, backlinks, templates, plugins, sync, publish, bookmarks, bases, themes, CSS snippets, file history, and dev tools (CDP, DOM, eval JS, screenshots). Triggers on obsidian, vault, daily note, obsidian tasks, obsidian search, obsidian properties, obsidian plugins, obsidian sync, obsidian publish, obsidian bookmarks, obsidian bases, obsidian templates, obsidian tags. Requires Obsidian desktop app running. NOT the same as obsidian-cli (URI-based tool)." --- # Obsidian Remote > **This skill replaces the older `obsidian-cli`-based skill.** The `obsidian` binary is > Obsidian's own built-in CLI with full app control. Prefer it for everything. ## Prerequisites - Obsidian desktop app **running** (the CLI talks to the live app process) - `obsidian` binary on PATH (installed with the desktop app; on macOS it's a shell wrapper at `/opt/homebrew/bin/obsidian` → `Obsidian.app`) Quick check: `obsidian version` ## Core Concepts - **file=\<name\>** — resolves like wikilinks (fuzzy, by note name) - **path=\<path\>** — exact path relative to vault root (e.g. `Folder/Note.md`) - Most commands default to the **active file** when file/path is omitted - **vault=\<name\>** — target a specific vault (omit for default/only vault) - Quote values with spaces: `name="My Note"` - Use `\n` for newline, `\t` for tab in content values - Output formats available on many commands: `format=json|tsv|csv|text|md` ## Vault & File Discovery ```bash obsidian vaults # list known vaults obsidian vaults verbose # include vault paths obsidian vault # active vault info (name, path, files, folders, size) obsidian vault info=path # just the vault path obsidian files # list all files obsidian files folder="Projects" # filter by folder obsidian files ext=canvas # filter by extension obsidian files total # file count obsidian folders # list folders obsidian folder path="Projects" info=files # folder info obsidian recents # recently opened files ``` ## Reading & Writing Notes ```bash obsidian read file="Meeting Notes" # read by name obsidian read path="Projects/spec.md" # read by exact path obsidian create name="New Note" content="# Hello" open # create + open obsidian create path="Journal/idea.md" template="Default" overwrite obsidian append file="Log" content="- entry" # append obsidian append file="Log" content=" suffix" inline # append without newline obsidian prepend file="Log" content="# Header" # prepend obsidian delete file="Old Note" # trash obsidian delete path="tmp/scratch.md" permanent # permanent delete obsidian move file="Draft" to="Archive/Draft.md" # move/rename obsidian rename file="Draft" name="Final" # rename in place obsidian open file="Todo" newtab # open in new tab obsidian random # open random note obsidian random:read folder="Journal" # read random note from folder ``` ## Search ```bash obsidian search query="project plan" # file-name search obsidian search query="plan" path="Work" limit=5 # scoped, limited obsidian search:context query="API key" case # full-text with line context obsidian search:context query="bug" format=json # JSON output ``` ## Daily Notes ```bash obsidian daily # open today's daily note obsidian daily:path # get daily note path obsidian daily:read # read daily note contents obsidian daily:append content="- 3pm standup" # append to daily obsidian daily:prepend content="## Morning" # prepend to daily ``` ## Tasks ```bash obsidian tasks # all tasks obsidian tasks todo # incomplete only obsidian tasks done # completed only obsidian tasks todo verbose # grouped by file with line numbers obsidian tasks file="Project" todo # tasks in specific file obsidian tasks daily todo # tasks from daily note obsidian tasks status="/" format=json # custom status filter obsidian task file="Todo" line=5 toggle # toggle done/todo obsidian task file="Todo" line=5 done # mark done obsidian task file="Todo" line=5 todo # mark todo obsidian task daily line=3 toggle # toggle task in daily note ``` ## Properties / Frontmatter ```bash obsidian properties # all properties across vault obsidian properties file="Note" format=yaml # properties for a file obsidian properties counts sort=count # property usage stats obsidian property:read name="status" file="Task" # read property obsidian property:set name="status" value="done" file="Task" obsidian property:set name="tags" value="work,urgent" type=list file="Task" obsidian property:remove name="draft" file="Task" ``` ## Tags ```bash obsidian tags # all tags obsidian tags counts sort=count # tag usage sorted by count obsidian tags file="Note" # tags in specific file obsidian tag name="project" verbose # tag info with file list ``` ## Links & Graph ```bash obsidian links file="Hub" # outgoing links obsidian backlinks file="API" # incoming links obsidian backlinks file="API" counts # with link counts obsidian orphans # files with no incoming links obsidian deadends # files with no outgoing links obsidian unresolved # broken links obsidian aliases # all aliases ``` ## Bookmarks ```bash obsidian bookmarks # list bookmarks obsidian bookmark file="Important.md" # bookmark a file obsidian bookmark file="Note.md" subpath="## Section" # bookmark heading obsidian bookmark search="todo" title="My Search" # bookmark a search obsidian bookmark url="https://example.com" title="Ref" # bookmark URL ``` ## Templates ```bash obsidian templates # list available templates obsidian template:read name="Meeting" # read template content obsidian template:read name="Meeting" resolve title="Q1 Review" # resolve vars obsidian template:insert name="Meeting" # insert into active file ``` ## Plugins ```bash obsidian plugins # installed plugins obsidian plugins filter=community versions # community with versions obsidian plugins:enabled # enabled plugins obsidian plugin id="dataview" # plugin info obsidian plugin:install id="dataview" enable # install + enable obsidian plugin:enable id="dataview" # enable obsidian plugin:disable id="dataview" # disable obsidian plugin:uninstall id="dataview" # uninstall obsidian plugins:restrict on # toggle restricted mode ``` ## Themes & Snippets ```bash obsidian theme # active theme obsidian themes versions # installed themes obsidian theme:install name="Minimal" enable # install + activate obsidian theme:set name="Minimal" # switch theme obsidian theme:uninstall name="Minimal" # remove obsidian snippets # CSS snippets obsidian snippets:enabled # enabled snippets obsidian snippet:enable name="custom" # enable obsidian snippet:disable name="custom" # disable ``` ## Sync ```bash obsidian sync:status # sync status obsidian sync on # resume sync obsidian sync off # pause sync obsidian sync:history file="Note" # version history obsidian sync:read file="Note" version=2 # read specific version obsidian sync:restore file="Note" version=2 # restore version obsidian sync:deleted # deleted files in sync ``` ## Publish ```bash obsidian publish:site # site info obsidian publish:list # published files obsidian publish:status # pending changes obsidian publish:add file="Guide" # publish file obsidian publish:add changed # publish all changed obsidian publish:remove file="Draft" # unpublish obsidian publish:open file="Guide" # open on published site ``` ## File History (Local) ```bash obsidian history:list # files with history obsidian history file="Note" # version list obsidian history:read file="Note" version=1 # read old version obsidian history:restore file="Note" version=1 # restore obsidian diff file="Note" from=1 to=3 # diff versions ``` ## Bases (Obsidian Databases) ```bash obsidian bases # list base files obsidian base:views # views in current base obsidian base:query file="Tracker" format=json # query base obsidian base:query file="Tracker" view="Active" format=md obsidian base:create file="Tracker" name="New Item" content="..." open ``` ## Outline & Word Count ```bash obsidian outline file="Report" # heading tree obsidian outline file="Report" format=md # markdown format obsidian wordcount file="Essay" # word + char count obsidian wordcount file="Essay" words # words only ``` ## Commands & Hotkeys ```bash obsidian commands # all available commands obsidian commands filter="editor" # filter by prefix obsidian command id="editor:toggle-bold" # execute command obsidian hotkeys # all hotkeys obsidian hotkey id="editor:toggle-bold" # hotkey for command ``` ## Tabs & Workspace ```bash obsidian tabs # open tabs obsidian tabs ids # with tab IDs obsidian tab:open file="Note.md" # open in new tab obsidian workspace # workspace tree obsidian workspace ids # with item IDs ``` ## Dev Tools For automation, debugging, or extending Obsidian: ```bash obsidian eval code="app.vault.getName()" # run JS obsidian dev:screenshot path="screenshot.png" # take screenshot obsidian dev:dom selector=".workspace" text # query DOM obsidian dev:dom selector="h1" all # all h1 elements obsidian dev:css selector=".nav-header" prop="color" # CSS inspection obsidian dev:console # console messages obsidian dev:console level=error # errors only obsidian dev:errors # captured errors obsidian dev:cdp method="Page.reload" # CDP command obsidian dev:debug on # attach debugger ``` ## Tips - Prefer `file=` for interactive lookups (fuzzy, like wikilinks). Use `path=` when you know the exact location. - Pipe to `jq` or `grep` for filtering JSON output. - For bulk operations, prefer `format=json` and parse programmatically. - `obsidian reload` reloads the vault; `obsidian restart` restarts the app. - The CLI may hang or timeout if Obsidian is not running — always verify with `obsidian version` first.
don't have the plugin yet? install it then click "run inline in claude" again.
This skill replaces the older
obsidian-cli-based skill. Theobsidianbinary is Obsidian's own built-in CLI with full app control. Prefer it for everything.
Remote control a running Obsidian desktop application through its native CLI. Use this skill to automate vault operations: read/write/search notes, manage daily notes and tasks, manipulate properties and frontmatter, manage tags and links, handle templates and plugins, control sync and publish workflows, bookmark content, query databases, inspect file history, theme management, and access dev tools for automation and debugging. trigger on: obsidian, vault, daily note, obsidian tasks, obsidian search, obsidian properties, obsidian plugins, obsidian sync, obsidian publish, obsidian bookmarks, obsidian bases, obsidian templates, obsidian tags.
required
obsidian binary on PATH (installed with the desktop app; macOS: /opt/homebrew/bin/obsidian → Obsidian.app)optional
vault=<name> , target a specific vault by name; omit to use default/active vaultfile=<name> , resolve notes by fuzzy name (like wikilinks); resolves against active file if omittedpath=<path> , exact file path relative to vault root (e.g. Folder/Note.md); takes precedence over file=folder=<path> , filter operations by folder pathformat=json|tsv|csv|text|md , output format (available on most commands)limit=<N> , cap result count (used in search, file listing, etc.)environment setup
obsidian version should return a version numberinput: none output: version string or timeout error
run obsidian version. if no output or timeout after 5 seconds, obsidian is not running or not on PATH.
input: optional vault=<name> (if multiple vaults exist)
output: vault name, path, file count, folder count, total size
run obsidian vaults to list all known vaults. run obsidian vaults verbose to include vault paths. run obsidian vault to inspect the active vault (includes file/folder counts and disk size). run obsidian vault info=path to get only the vault root path.
input: optional folder=<path>, ext=<extension>, format=<format>
output: file list with names, paths, sizes, modified times (format varies by output type)
run obsidian files to list all vault files. run obsidian files folder="Projects" to filter by folder. run obsidian files ext=canvas to filter by file extension. run obsidian files total to get file count only. run obsidian folders to list all folders. run obsidian folder path="Projects" info=files to inspect a specific folder.
input: file=<name> OR path=<path>, optional format=<format>
output: note content (raw markdown by default; optionally JSON, YAML frontmatter, etc.)
run obsidian read file="Meeting Notes" to read by fuzzy name. run obsidian read path="Projects/spec.md" to read by exact path. output defaults to raw markdown; use format=json to get structured data with frontmatter separated.
input: name=<name> OR path=<path>, optional content=<content>, template=<template>, open, overwrite
output: confirmation message, new note path
run obsidian create name="New Note" content="# Hello" to create a note. add open flag to open it in the editor immediately after creation. run obsidian create path="Journal/idea.md" template="Default" to use a template. add overwrite to replace an existing note.
input: file=<name> OR path=<path>, content=<text>, optional inline flag
output: success/failure message
run obsidian append file="Log" content="- entry" to append with newline. run obsidian append file="Log" content=" suffix" inline to append without newline. run obsidian prepend file="Log" content="# Header" to insert at the top. use \n for explicit newlines and \t for tabs in content values.
input: file=<name> OR path=<path>, optional to=<new-path> (for move), name=<new-name> (for rename), permanent flag
output: success/failure message, new path (on move)
run obsidian delete file="Old Note" to move to trash. run obsidian delete path="tmp/scratch.md" permanent to permanently delete. run obsidian move file="Draft" to="Archive/Draft.md" to move and optionally rename. run obsidian rename file="Draft" name="Final" to rename in place.
input: file=<name> OR path=<path>, optional newtab flag
output: success message; note opens in Obsidian UI
run obsidian open file="Todo" to open in active tab. run obsidian open file="Todo" newtab to open in a new tab. run obsidian random to open a random note. run obsidian random:read folder="Journal" to read a random note from a specific folder without opening.
input: query=<search-term>, optional path=<folder>, limit=<N>, format=<format>, case flag
output: file list (names, paths, match locations)
run obsidian search query="project plan" for filename search. run obsidian search:context query="API key" case for full-text search with line context and case-sensitivity. use limit=5 to cap results. use format=json to parse results programmatically.
input: optional content=<text> for append/prepend operations
output: daily note path, content, or success message
run obsidian daily to open today's daily note. run obsidian daily:path to get the path without opening. run obsidian daily:read to read content. run obsidian daily:append content="- 3pm standup" to add to the end. run obsidian daily:prepend content="## Morning" to add to the beginning.
input: file=<name> OR path=<path> OR daily flag, optional line=<N>, status=<custom-status>, format=<format>
output: task list or status change confirmation
run obsidian tasks to list all tasks. run obsidian tasks todo for incomplete tasks only. run obsidian tasks done for completed tasks. run obsidian tasks verbose to group by file with line numbers. run obsidian tasks file="Project" todo to filter to a specific file. run obsidian task file="Todo" line=5 toggle to toggle a task's done/todo state. run obsidian task file="Todo" line=5 done to mark as done. run obsidian task daily line=3 toggle to update a task in the daily note.
input: file=<name> OR path=<path>, name=<property-name>, optional value=<value>, type=<type> (list, text, etc.), format=<format>
output: property value, all properties, or success message
run obsidian properties to list all properties across the vault. run obsidian properties file="Note" format=yaml to get properties for a specific file in YAML. run obsidian property:read name="status" file="Task" to read a single property. run obsidian property:set name="status" value="done" file="Task" to set a property. run obsidian property:set name="tags" value="work,urgent" type=list file="Task" to set a list-type property. run obsidian property:remove name="draft" file="Task" to delete a property.
input: name=<tag-name>, file=<name> OR path=<path>, optional verbose flag, sort=<field>
output: tag list, file occurrences, usage counts
run obsidian tags to list all tags in the vault. run obsidian tags counts sort=count to sort by usage. run obsidian tags file="Note" to list tags in a specific file. run obsidian tag name="project" verbose to show files that use a tag.
input: file=<name> OR path=<path>, optional counts flag
output: link list with target paths, reference counts
run obsidian links file="Hub" to list outgoing links. run obsidian backlinks file="API" to list incoming links (what links to this file). run obsidian backlinks file="API" counts to include reference counts. run obsidian orphans to find files with no backlinks. run obsidian deadends to find files with no outgoing links. run obsidian unresolved to find broken links. run obsidian aliases to list all aliases in the vault.
input: file=<name> OR path=<path>, optional subpath=<heading>, search=<query>, url=<url>, title=<title>
output: bookmark list or confirmation message
run obsidian bookmarks to list all bookmarks. run obsidian bookmark file="Important.md" to bookmark a file. run obsidian bookmark file="Note.md" subpath="## Section" to bookmark a specific heading. run obsidian bookmark search="todo" title="My Search" to bookmark a search. run obsidian bookmark url="https://example.com" title="Ref" to bookmark an external URL.
input: name=<template-name>, optional resolve flag, title=<title> (for variable substitution)
output: template list, template content, or insertion confirmation
run obsidian templates to list available templates. run obsidian template:read name="Meeting" to read template content. run obsidian template:read name="Meeting" resolve title="Q1 Review" to resolve template variables before reading. run obsidian template:insert name="Meeting" to insert a template into the active file.
input: id=<plugin-id>, optional filter=<type>, versions, enable, disable, install, uninstall flags
output: plugin list, plugin info, or operation confirmation
run obsidian plugins to list installed plugins. run obsidian plugins filter=community versions to list community plugins with version numbers. run obsidian plugins:enabled to list only enabled plugins. run obsidian plugin id="dataview" to inspect a specific plugin. run obsidian plugin:install id="dataview" enable to install and immediately enable. run obsidian plugin:enable id="dataview" to enable. run obsidian plugin:disable id="dataview" to disable. run obsidian plugin:uninstall id="dataview" to remove. run obsidian plugins:restrict on to toggle restricted mode.
input: name=<theme-name>, optional versions, enable, install, set flags
output: theme list, active theme, or operation confirmation
run obsidian theme to show the active theme. run obsidian themes versions to list installed themes with versions. run obsidian theme:install name="Minimal" enable to install and activate. run obsidian theme:set name="Minimal" to switch themes. run obsidian theme:uninstall name="Minimal" to remove. run obsidian snippets to list all CSS snippets. run obsidian snippets:enabled to list enabled snippets only. run obsidian snippet:enable name="custom" to enable. run obsidian snippet:disable name="custom" to disable.
input: file=<name> OR path=<path>, optional version=<N> for history operations, on/off flags
output: sync status, version history, file contents, or operation confirmation
run obsidian sync:status to get current sync status and pending changes. run obsidian sync on to resume syncing. run obsidian sync off to pause sync. run obsidian sync:history file="Note" to list versions of a file. run obsidian sync:read file="Note" version=2 to read a specific synced version. run obsidian sync:restore file="Note" version=2 to restore a previous version. run obsidian sync:deleted to list files in sync's deleted state.
input: file=<name> OR path=<path>, optional changed flag, add/remove/open operations
output: site info, published file list, pending changes, or operation confirmation
run obsidian publish:site to get site info. run obsidian publish:list to list published files. run obsidian publish:status to show pending changes. run obsidian publish:add file="Guide" to publish a file. run obsidian publish:add changed to publish all changed files. run obsidian publish:remove file="Draft" to unpublish. run obsidian publish:open file="Guide" to open the published file in a browser.
input: file=<name> OR path=<path>, optional version=<N>, from=<N>, to=<N> for diff
output: version list, old version content, diff output, or restore confirmation
run obsidian history:list to see which files have local history. run obsidian history file="Note" to list versions. run obsidian history:read file="Note" version=1 to read an old version. run obsidian history:restore file="Note" version=1 to restore. run obsidian diff file="Note" from=1 to=3 to show differences between versions.
input: file=<base-file>, optional view=<view-name>, format=<format>
output: base list, view list, or query result (as markdown, JSON, etc.)
run obsidian bases to list all database files. run obsidian base:views to list views in the active base. run obsidian base:query file="Tracker" format=json to query a base and get JSON. run obsidian base:query file="Tracker" view="Active" format=md to query a specific view. run obsidian base:create file="Tracker" name="New Item" content="..." open to create a record and open it.
input: file=<name> OR path=<path>, optional format=<format>, words flag
output: heading tree (outline) or word/character counts
run obsidian outline file="Report" to get the heading structure. run obsidian outline file="Report" format=md to get markdown format. run obsidian wordcount file="Essay" for word and character counts. run obsidian wordcount file="Essay" words for words only.
input: optional id=<command-id>, filter=<prefix>
output: command list or hotkey mapping
run obsidian commands to list all available commands. run obsidian commands filter="editor" to filter by prefix. run obsidian command id="editor:toggle-bold" to execute a command. run obsidian hotkeys to list all hotkey bindings. run obsidian hotkey id="editor:toggle-bold" to get the hotkey for a specific command.
input: optional file=<name> OR path=<path>, ids flag
output: tab list with files, workspace tree structure, or operation confirmation
run obsidian tabs to list open tabs. run obsidian tabs ids to include tab IDs. run obsidian tab:open file="Note.md" to open a file in a new tab. run obsidian workspace to get the workspace tree (panes, groups, sidebar state). run obsidian workspace ids to include item IDs for automation.
input: code=<javascript> (arbitrary JS that runs in app context)
output: JS execution result (return value or console output)
run obsidian eval code="app.vault.getName()" to run JavaScript against the Obsidian app object. use this for advanced automation, inspecting app state, or calling undocumented