skills/obsidian/SKILL.md
Edit and manage Obsidian vaults — create, read, update, and delete notes, manage properties/frontmatter, handle links and backlinks, work with tags, tasks, daily notes, templates, bases, and more. Uses the Obsidian CLI for safe vault operations when available, with direct file editing as fallback. Use this skill whenever the user mentions Obsidian, vault, knowledge base notes with wikilinks, frontmatter/properties on markdown files, daily notes, or any task involving an Obsidian vault — even if they just say "my notes" or reference a folder that looks like a vault (has .obsidian/ directory).
npx skillsauth add alahmadiq8/skills obsidianInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are an expert at working with Obsidian vaults. Obsidian stores notes as plain-text Markdown files in a folder (the "vault"). There is no proprietary database — everything is files on disk, which makes them accessible to you via CLI or direct file operations.
This skill covers the full spectrum: creating and editing notes, managing frontmatter properties, handling internal links and backlinks, working with tags, tasks, daily notes, templates, bases, search, and vault-level operations.
Always prefer the Obsidian CLI when Obsidian is running. The CLI communicates with the live Obsidian instance, keeping the metadata cache in sync and auto-updating links on rename/move. Direct file edits bypass the cache and can cause stale state.
command -v obsidian && obsidian version
If the obsidian command exists and returns a version, use CLI commands. If not, fall back to direct file operations (with extra care around links and frontmatter).
The CLI requires Obsidian to be running. If it's not, the first CLI command will launch it.
obsidian vault="My Vault" <command>obsidian vaults verbose to list all vaults with paths.Obsidian supports two link formats — Wikilinks ([[Note]]) and standard Markdown links ([Note](Note.md)). Always use standard Markdown links. LLMs produce and parse standard Markdown far more reliably than the Obsidian-specific Wikilink syntax, and Markdown links are portable across tools.
Recommend the user enable this in their vault:
File: VAULT_ROOT/.obsidian/app.json
{
"useMarkdownLinks": true
}
Or: Settings → Files and Links → disable "Use [[Wikilinks]]"
Even with Markdown links enabled, Obsidian still resolves any wikilinks it encounters — existing notes aren't broken.
When generating links in note content, always use:
[Display Text](Note%20Name.md)
[Display Text](folder/Note%20Name.md)
[Display Text](Note%20Name.md#Heading)
[Display Text](Note%20Name.md#^block-id)
Spaces in paths must be percent-encoded (%20).
CLI:
# Simple note
obsidian create name="Meeting Notes" content="# Meeting Notes\n\nAttendees:\n- "
# With template
obsidian create name="Trip to Paris" template=Travel open
# At specific path
obsidian create path="Projects/2026/kickoff.md" content="# Project Kickoff"
# Overwrite existing
obsidian create path="README.md" content="# Updated readme" overwrite
Direct (fallback): Create the .md file at the desired vault-relative path. If the note needs frontmatter, include it at the very top of the file.
CLI:
obsidian read file=Recipe
obsidian read path="Templates/Recipe.md"
Direct: Read the file from disk.
CLI — Append (adds to end):
obsidian append path="journal/2026-02-27.md" content="\n## Evening\nReflections..."
obsidian append file=Recipe content="\n- 1 tsp salt" inline # no extra newline
CLI — Prepend (inserts after frontmatter, which is important — it won't corrupt YAML):
obsidian prepend file=Recipe content=">[!tip] Updated recipe\n"
Direct: When editing files directly, be very careful:
--- fences at line 1).--- of frontmatter.replace_string_in_file with enough context to be unambiguous.CLI (preferred — auto-updates all links across the vault):
obsidian move file=Recipe to="Archive/Recipe.md"
obsidian rename file=Recipe name="Grandma's Recipe"
Direct: Rename the file on disk, then manually search-and-replace all links pointing to the old name across the vault. This is error-prone — strongly prefer CLI.
CLI (sends to trash by default):
obsidian delete file=Recipe # to trash
obsidian delete file=Recipe permanent # permanent delete
Direct: Move file to vault's .trash/ folder, or delete from disk.
Properties are structured metadata stored as YAML at the top of each note. They power search, Bases, Publish, and community plugins.
---
title: My Note
tags:
- project
- active
aliases:
- My Alias
date: 2026-02-27
cssclasses:
- wide-page
custom_property: some value
---
The --- fences must be on the very first line of the file. Property names are case-sensitive. Each name must be unique within a note.
| Type | Example | Notes |
|---|---|---|
| Text | title: "Hello" | Single line. Wikilinks must be quoted: link: "[Note](Note.md)" |
| List | tags:\n - a\n - b | Each item on own line with - |
| Number | year: 2026 | Integer or decimal |
| Checkbox | draft: true | true or false |
| Date | date: 2026-02-27 | YYYY-MM-DD |
| Date & time | time: 2026-02-27T10:30:00 | ISO 8601 |
Property types are vault-wide — once a property name gets a type, all notes use that type for it.
tags: Tag list (the Tags type — special, only for this property)aliases: Alternative names for the note (used in link resolution)cssclasses: CSS classes applied to the note's rendering# Read a property
obsidian property:read name=status file=Recipe
# Set a property (creates frontmatter if missing)
obsidian property:set name=status value=draft file=Recipe
obsidian property:set name=due value=2026-03-01 type=date file=Recipe
# Remove a property
obsidian property:remove name=status file=Recipe
# List all properties in vault (with counts)
obsidian properties counts sort=count
# List properties for a specific file
obsidian properties file=Recipe
When editing YAML directly:
---\n...\n---\n at line 1.- item syntax, indented under the key.:, #, [, ], etc.).link: "[[Note]]" (but prefer standard Markdown links).Tags categorize notes. They can appear inline in body text or in frontmatter.
This is about #project-alpha and #status/active work.
---
tags:
- project-alpha
- status/active
---
_, -, / (for nesting)#2026 is invalid, #y2026 is valid)#Tag = #tag)#parent/child — searching #parent matches all descendantsobsidian tags counts # All tags with counts
obsidian tags file=Recipe # Tags for a specific file
obsidian tag name=project-alpha verbose # Files tagged with this tag
[Note Title](Note%20Title.md) # Link to note
[Section](Note%20Title.md#Heading) # Link to heading
[Block](Note%20Title.md#^block-id) # Link to block
[Custom Text](folder/Note.md) # Custom display text
 # Embed image
 # Embed note (prefix with !)
Obsidian resolves links by shortest unique filename. [Recipe](Recipe.md) matches Cooking/Recipe.md if there's only one file named Recipe.md. If ambiguous, use the full vault-relative path.
A block ID lets you link to a specific paragraph, list item, or block quote. Place ^block-id at the end of a paragraph (with a space before the caret) or on a separate line after structured blocks:
This is a key insight about productivity. ^key-insight
> A profound quote about life.
^quote-1
Block IDs: alphanumeric + hyphens only.
Prefix any internal link with ! to embed its content inline:
 # Embed entire note
 # Embed a section
 # Embed a block
 # Embed image
 # Embed with width
 # Embed PDF page
obsidian backlinks file=Recipe # What links TO this note
obsidian backlinks file=Recipe counts # With link counts
obsidian links file=Recipe # What this note links TO
obsidian unresolved # Broken links across vault
obsidian unresolved verbose # Include source files
obsidian orphans # Notes with no incoming links
obsidian deadends # Notes with no outgoing links
A backlink is a reference FROM another note TO the current note. If Note A links to Note B, then Note A is a backlink of Note B.
Obsidian tracks two types:
[Note B](Note%20B.md) or [[Note B]])Understanding backlinks is essential for vault maintenance — they reveal the connective structure of the knowledge base. Use obsidian backlinks and obsidian orphans to audit link health.
Obsidian recognizes Markdown task lists as actionable items:
- [ ] Incomplete task
- [x] Completed task
- [-] Cancelled task
- [?] Question task
obsidian tasks # All tasks in vault
obsidian tasks todo # Only incomplete tasks
obsidian tasks done # Only completed tasks
obsidian tasks file=Recipe # Tasks in specific file
obsidian tasks daily # Tasks from today's daily note
obsidian tasks verbose # With file paths and line numbers
# Toggle/update a task
obsidian task ref="Recipe.md:8" toggle # Toggle completion
obsidian task daily line=3 done # Mark daily note task done
obsidian task file=Recipe line=8 status=- # Set custom status
Daily notes are date-stamped notes (typically YYYY-MM-DD.md) created automatically.
obsidian daily # Open today's daily note
obsidian daily:path # Get daily note path (even if not yet created)
obsidian daily:read # Read today's daily note
obsidian daily:append content="- [ ] Buy groceries"
obsidian daily:prepend content="## Morning\nStarted at 7am"
Templates are note scaffolds stored in a configured templates folder.
obsidian templates # List available templates
obsidian template:read name=Meeting # Read template content
obsidian template:read name=Meeting resolve # Resolve {{date}}, {{time}}, {{title}}
obsidian template:insert name=Meeting # Insert into active file
# Create a note from a template
obsidian create name="Team Standup" template=Meeting open
Template variables: {{date}}, {{time}}, {{title}} — resolved on insertion.
obsidian search query="meeting notes" # Find matching files
obsidian search query="TODO" path=Projects # Search within folder
obsidian search query="meeting" total # Just the count
obsidian search:context query="meeting notes" # With line context (grep-style)
obsidian search query="meeting" format=json # JSON output
file:recipe — match filenamepath:folder/ — match pathtag:#project — match tag[property:value] — match propertyline:(word1 word2) — words on same linesection:(under heading) — within a section"exact phrase" — literal matchBases are Obsidian's structured data views (.base files) — like databases built on top of your notes. They display note properties in table/list/cards/map views with filters, formulas, sorting, and grouping. All data lives in your .md files — bases just provide views.
For full Bases syntax, formulas, functions, and examples, read references/bases-reference.md.
A .base file is YAML with filters, formulas, properties, and views sections. You can also embed bases inline in notes using a ```base ``` code block.
base:views only works on the active file — use obsidian open path="X.base" firstbase:query accepts file=/path= targeting without needing the base activefile= for bases requires the .base extension: file="Tasks.base", not file="Tasks"base:create + frontmatter in content= doesn't parse correctly — create the note, then use property:setobsidian bases # List all .base files
obsidian base:query file="Projects.base" format=json # Query as JSON
obsidian base:query path="Projects.base" view="Active" format=csv
obsidian base:create path="Projects.base" name="New Item" # Create in base
For the full command reference with all parameters, read references/cli-reference.md.
obsidian vault # Vault name, path, file/folder counts, size
obsidian vaults verbose # All known vaults with paths
obsidian files # List all files
obsidian files folder=Projects ext=md # Filter by folder and extension
obsidian folders # List all folders
obsidian file file=Recipe # File info (name, path, size, dates)
obsidian outline file=Recipe format=json # Heading structure
obsidian wordcount file=Recipe # Word and character count
obsidian aliases # All aliases in vault
obsidian aliases file=Recipe # Aliases for specific note
Aliases are defined in frontmatter as aliases: [AI, Machine Intelligence] and provide alternative names for link resolution.
obsidian bookmarks # List bookmarks
obsidian bookmark file=Recipe # Bookmark a file
obsidian workspace # Current layout
obsidian tabs # Open tabs
obsidian recents # Recently opened files
obsidian plugins # List installed plugins
obsidian plugin:enable id=dataview # Enable/disable/install/reload plugins
obsidian commands # List all command IDs
obsidian command id="editor:toggle-bold" # Execute any command
obsidian eval code="app.vault.getFiles().length" # Run JS in Obsidian
obsidian dev:screenshot path=screenshot.png
obsidian dev:errors # JS errors
obsidian diff file=Recipe # List versions
obsidian diff file=Recipe from=1 # Compare latest version to current
obsidian history:restore file=Recipe version=2
obsidian sync:status # Sync status
A typical vault looks like:
MyVault/
├── .obsidian/ # Config: app.json, plugins/, themes/, snippets/
│ ├── app.json # Core settings (useMarkdownLinks, etc.)
│ ├── appearance.json
│ ├── plugins/ # Community plugin data
│ └── workspace.json # Current layout (changes frequently)
├── .trash/ # Obsidian trash (if configured)
├── Attachments/ # Images, PDFs, etc. (configurable location)
├── Templates/ # Note templates
├── Daily Notes/ # Daily notes (configurable)
├── Projects/
│ ├── Project Alpha.md
│ └── Project Beta.md
├── Archive/
└── README.md
The .obsidian/ folder should generally not be edited directly except for app.json settings like useMarkdownLinks. The workspace.json file changes constantly and is a good .gitignore candidate.
obsidian create name="Project Alpha" content="---\ntags:\n - project\n - active\ndate: 2026-02-27\n---\n\n# Project Alpha\n\n## Overview\n\n## Tasks\n\n- [ ] Define scope\n- [ ] Set timeline\n\n## Related\n\n- [Project Beta](Project%20Beta.md)\n" open
obsidian unresolved verbose # Find broken links
obsidian orphans # Find disconnected notes
obsidian deadends # Find notes that link nowhere
obsidian tasks todo verbose format=json # All incomplete tasks with locations
obsidian daily:append content="- [ ] $(date +%H:%M) Review PR #42"
overwrite flag — obsidian create won't overwrite by default.obsidian delete defaults to trash).useMarkdownLinks setting — recommend enabling it if not already set..obsidian/workspace.json — it changes constantly and conflicts with manual edits.property:set after base:create — frontmatter in base:create's content= parameter may not be parsed correctly. Create the note first, then set properties separately via property:set.development
Generate reveal.js HTML slide presentations from topics, outlines, or content. Use when the user asks to create slides, presentations, decks, or talks. Triggers on: "create a presentation", "make slides about", "build a deck", "generate a talk", "slide deck for", or any request involving presentation creation. Supports code highlighting, fragments, speaker notes, math, markdown, and Mermaid.js diagrams (flowcharts, sequence, class, ER, mindmap, timeline, etc.).
testing
Write Obsidian Dataview queries (DQL, inline DQL, and DataviewJS) from natural language descriptions. Use this skill whenever the user wants to query, filter, list, table, or summarize their Obsidian notes using Dataview — even if they just describe what data they want to see without mentioning "dataview" explicitly. Trigger on phrases like "show me all notes tagged...", "list my tasks due...", "table of books by rating", "query my vault for...", "create a dataview query", "dataview", "DQL", or any request to dynamically display, filter, sort, or aggregate note metadata in Obsidian.
development
Creates and runs Grafana k6 load testing scripts for traffic simulation, performance testing, and stress testing. Use this skill whenever the user wants to load test an API, simulate traffic against a service, write a k6 script, do performance testing, stress testing, spike testing, soak testing, smoke testing, breakpoint testing, or any kind of traffic simulation. Also use when the user mentions k6, VUs (virtual users), ramping load, arrival rate, or wants to benchmark an endpoint's response time under load. Even if the user just says "test my API under load" or "how many requests can my server handle" — this skill is the right choice.
development
Build, configure, and develop Hugo static sites and themes. Use when the user wants to create a new Hugo site, develop or customize a Hugo theme, write Hugo templates (layouts, partials, shortcodes), configure hugo.toml/yaml/json, work with Hugo's asset pipeline (images, CSS/Sass, JS bundling), manage content (pages, sections, taxonomies, menus), or deploy a Hugo site. Triggers on mentions of "Hugo", "hugo.toml", "static site generator", Hugo-related template syntax (Go templates, baseof, partials), or Hugo content workflows.