Use this skill whenever the user wants to work with Obsidian in any capacity. This is the ONLY skill for Obsidian vaults, .base files, Obsidian Markdown, Obsidian plugins, and Obsidian Web Clipper. Trigger for: creating or editing notes with wikilinks, callouts, embeds, or frontmatter; building or debugging .base files (formulas, filters, views, YAML quoting); Obsidian plugin development or hot-reload; Web Clipper JSON templates or AI Interpreter prompts; vault structure, daily notes, or the obsidian CLI. Also trigger when the user describes Obsidian-specific problems without naming Obsidian — like .base YAML errors, foldable callout syntax, base formula for tasks due this week, or clipper template for arxiv. Do NOT trigger for Logseq, Notion, Dataview plugin queries, generic markdown processing scripts, or general-purpose Chrome extensions.
75
92%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Advisory
Suggest reviewing before use
Comprehensive skill for working with Obsidian vaults. Covers four domains:
| Domain | When to use | Key references |
|---|---|---|
| Markdown | Creating/editing .md notes with wikilinks, callouts, embeds, properties, tags | callouts, embeds, properties |
| Bases | Creating/editing .base files with views, filters, formulas | functions |
| CLI | Interacting with vaults via obsidian command, plugin dev | (inline below) |
| Web Clipper | Creating importable JSON templates for the Obsidian Web Clipper | variables, filters, json-schema, logic, analysis, bases-workflow |
Official docs: For edge cases or details beyond this skill, consult the Official Documentation Index — curated from help.obsidian.md covering Bases, Editing, Web Clipper, CLI, and Linking.
Create and edit valid Obsidian Flavored Markdown. Obsidian extends CommonMark and GFM with wikilinks, embeds, callouts, properties, comments, and other syntax. Standard Markdown (headings, bold, italic, lists, quotes, code blocks, tables) is assumed knowledge.
[[Note]]) for internal vault connections, or standard Markdown links for external URLs.![[embed]] syntax. See references/markdown-embeds.md for all embed types.> [!type] syntax. See references/markdown-callouts.md for all callout types.When choosing between wikilinks and Markdown links: use
[[wikilinks]]for notes within the vault (Obsidian tracks renames automatically) and[text](url)for external URLs only.
[[Note Name]] Link to note
[[Note Name|Display Text]] Custom display text
[[Note Name#Heading]] Link to heading
[[Note Name#^block-id]] Link to block
[[#Heading in same note]] Same-note heading linkDefine a block ID by appending ^block-id to any paragraph. For lists and quotes, place the block ID on a separate line after the block.
Prefix any wikilink with ! to embed its content inline:
![[Note Name]] Embed full note
![[Note Name#Heading]] Embed section
![[image.png]] Embed image
![[image.png|300]] Embed image with width
![[document.pdf#page=3]] Embed PDF pageSee references/markdown-embeds.md for audio, video, search embeds, and external images.
> [!note]
> Basic callout.
> [!warning] Custom Title
> Callout with a custom title.
> [!faq]- Collapsed by default
> Foldable callout (- collapsed, + expanded).Common types: note, tip, warning, info, example, quote, bug, danger, success, failure, question, abstract, todo.
See references/markdown-callouts.md for the full list with aliases, nesting, and custom CSS callouts.
---
title: My Note
date: 2024-01-15
tags:
- project
- active
aliases:
- Alternative Name
cssclasses:
- custom-class
---Default properties: tags (searchable labels), aliases (alternative note names for link suggestions), cssclasses (CSS classes for styling).
See references/markdown-properties.md for all property types, tag syntax rules, and advanced usage.
#tag Inline tag
#nested/tag Nested tag with hierarchyTags can contain letters, numbers (not first character), underscores, hyphens, and forward slashes. Tags can also be defined in frontmatter under the tags property.
%%hidden text%% (inline) or %%\nblock\n%% (block, hidden in reading view)==highlighted text==$e^{i\pi} + 1 = 0$, block $$\frac{a}{b} = c$$```mermaid code blocks. Link nodes to notes with class NodeName internal-link;Text[^1] with [^1]: Content. or inline ^[This is inline.]---
title: Project Alpha
date: 2024-01-15
tags: [project, active]
status: in-progress
---
# Project Alpha
This project aims to [[improve workflow]] using modern techniques.
> [!important] Key Deadline
> The first milestone is due on ==January 30th==.
- [x] Initial planning
- [ ] Development phase
The algorithm uses $O(n \log n)$ sorting. See [[Algorithm Notes#Sorting]] for details.
![[Architecture Diagram.png|600]]Official docs: Obsidian Flavored Markdown, Links, Embeds, Callouts, Properties
.base file in the vault with valid YAML contentfilters to select which notes appear (by tag, folder, property, or date)formulas sectiontable, cards, list, or map) with order specifying which properties to displayformula.X without defining X in formulas.base file in Obsidian to confirm the view renders correctly. If it shows a YAML error, check quoting rules belowBase files use the .base extension and contain valid YAML.
# Global filters apply to ALL views in the base
filters:
and: []
or: []
not: []
# Define formula properties that can be used across all views
formulas:
formula_name: 'expression'
# Configure display names and settings for properties
properties:
property_name:
displayName: "Display Name"
formula.formula_name:
displayName: "Formula Display Name"
file.ext:
displayName: "Extension"
# Define custom summary formulas
summaries:
custom_summary_name: 'values.mean().round(3)'
# Define one or more views
views:
- type: table | cards | list | map
name: "View Name"
limit: 10 # Optional: limit results
groupBy: # Optional: group results
property: property_name
direction: ASC | DESC
filters: # View-specific filters
and: []
order: # Properties to display in order
- file.name
- property_name
- formula.formula_name
summaries: # Map properties to summary formulas
property_name: AverageFilters narrow down results. They can be applied globally or per-view.
# Single filter
filters: 'status == "done"'
# AND - all conditions must be true
filters:
and:
- 'status == "done"'
- 'priority > 3'
# OR - any condition can be true
filters:
or:
- 'file.hasTag("book")'
- 'file.hasTag("article")'
# NOT - exclude matching items
filters:
not:
- 'file.hasTag("archived")'
# Nested: combine and/or/not
filters:
or:
- file.hasTag("tag")
- and:
- file.hasTag("book")
- file.hasLink("Textbook")Filter Operators: == (equals), != (not equal), >, <, >=, <=, && (logical and), || (logical or), ! (logical not)
Three types:
note.author or just authorfile.name, file.mtime, etc.formula.my_formulaFile Properties Reference:
| Property | Type | Description |
|---|---|---|
file.name | String | File name |
file.basename | String | File name without extension |
file.path | String | Full path to file |
file.folder | String | Parent folder path |
file.ext | String | File extension |
file.size | Number | File size in bytes |
file.ctime | Date | Created time |
file.mtime | Date | Modified time |
file.tags | List | All tags in file |
file.links | List | Internal links in file |
file.backlinks | List | Files linking to this file |
file.embeds | List | Embeds in the note |
file.properties | Object | All frontmatter properties |
The this Keyword: In main content area refers to the base file itself. When embedded, refers to the embedding file. In sidebar, refers to the active file.
Formulas compute values from properties. Defined in the formulas section.
formulas:
total: "price * quantity"
status_icon: 'if(done, "✅", "⏳")'
formatted_price: 'if(price, price.toFixed(2) + " dollars")'
created: 'file.ctime.format("YYYY-MM-DD")'
days_old: '(now() - file.ctime).days'
days_until_due: 'if(due_date, (date(due_date) - today()).days, "")'Most commonly used functions. For the complete reference of all types (Date, String, Number, List, File, Link, Object, RegExp), see references/bases-functions.md.
| Function | Signature | Description |
|---|---|---|
date() | date(string): date | Parse string to date (YYYY-MM-DD HH:mm:ss) |
now() | now(): date | Current date and time |
today() | today(): date | Current date (time = 00:00:00) |
if() | if(condition, trueResult, falseResult?) | Conditional |
duration() | duration(string): duration | Parse duration string |
file() | file(path): file | Get file object |
link() | link(path, display?): Link | Create a link |
Duration Type: When subtracting two dates, the result is a Duration type (not a number). Fields: .days, .hours, .minutes, .seconds, .milliseconds. Duration does NOT support .round(), .floor(), .ceil() directly — access a numeric field first, then apply number functions.
# CORRECT
"(date(due_date) - today()).days" # Returns number of days
"(now() - file.ctime).days.round(0)" # Rounded days
# WRONG - will cause error:
# "((date(due) - today()) / 86400000).round(0)" # Duration doesn't support divisionDate Arithmetic: Duration units: y/year/years, M/month/months, d/day/days, w/week/weeks, h/hour/hours, m/minute/minutes, s/second/seconds.
Table is the most common view type:
views:
- type: table
name: "My Table"
order:
- file.name
- status
- due_date
summaries:
price: Sum
count: AverageOther view types: Cards (gallery/card layout), List (simple list), Map (requires lat/lng properties and Maps community plugin). All use the same order, filters, groupBy, and summaries options.
| Name | Input Type | Description |
|---|---|---|
Average | Number | Mathematical mean |
Min / Max / Sum / Range / Median / Stddev | Number | Standard aggregations |
Earliest / Latest | Date | Date range |
Checked / Unchecked | Boolean | Count of true/false values |
Empty / Filled / Unique | Any | Count of empty, non-empty, or unique values |
For complete examples (Task Tracker, Reading List, Daily Notes Index), see references/bases-examples.md.
![[MyBase.base]]
![[MyBase.base#View Name]]'if(done, "Yes", "No")'"My View Name":, {, }, [, ], etc. must be quoted. E.g. displayName: "Status: Active".days, .hours, etc. firstif() to guard: 'if(due_date, (date(due_date) - today()).days, "")'formula.X in order/properties needs a matching formulas entryOfficial docs: Bases Syntax, Functions, Views. Full function reference: references/bases-functions.md.
Use the obsidian CLI to interact with a running Obsidian instance. Requires Obsidian to be open.
Run obsidian help to see all available commands. This is always up to date. Full docs: https://help.obsidian.md/cli
Parameters use =: obsidian create name="My Note" content="Hello world". Quote values with spaces.
Flags are boolean switches: obsidian create name="My Note" silent overwrite. Use \n for newlines, \t for tabs.
file=<name> (resolves like wikilink) or path=<path> (exact vault-root path). Without either, targets the active file.vault=<name> as first parameter targets a specific vault (defaults to most recently focused).obsidian read file="My Note"
obsidian create name="New Note" content="# Hello" template="Template" silent
obsidian append file="My Note" content="New line"
obsidian search query="search term" limit=10
obsidian daily:read
obsidian daily:append content="- [ ] New task"
obsidian property:set name="status" value="done" file="My Note"
obsidian tasks daily todo
obsidian tags sort=count counts
obsidian backlinks file="My Note"Use --copy on any command to copy output to clipboard. Use silent to prevent files from opening. Use total on list commands to get a count.
After making code changes to a plugin or theme:
obsidian plugin:reload id=my-plugin # 1. Reload plugin
obsidian dev:errors # 2. Check for errors
obsidian dev:screenshot path=screenshot.png # 3. Verify visually
obsidian dev:dom selector=".workspace-leaf" text
obsidian dev:console level=error # 4. Check console outputAdditional developer commands:
obsidian eval code="app.vault.getFiles().length" # Run JavaScript
obsidian dev:css selector=".workspace-leaf" prop=background-color # Inspect CSS
obsidian dev:mobile on # Toggle mobile emulationRun obsidian help for additional developer commands including CDP and debugger controls.
This section helps you create importable JSON templates for the Obsidian Web Clipper.
Bases/*.base to find a matching category and use its properties to structure the template. See references/clipper-bases-workflow.md.ALWAYS output the final result as a JSON code block that the user can copy and import.
The Clipper template editor validates template syntax. If you use template logic (conditionals, loops, variable assignment), ensure it follows the syntax in references/clipper-logic.md and the official Logic docs so the template passes validation.
{
"schemaVersion": "0.1.0",
"name": "My Template",
...
}References: variables, filters, json-schema, logic, bases-workflow, analysis-workflow. Example templates: assets/.
dd10cc1
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.