Obsidian Bases database feature for YAML-based interactive note views. Use when creating .base files, writing filter queries, building formulas, configuring table/card views, or working with Obsidian properties and frontmatter databases.
/plugin marketplace add laurigates/claude-plugins/plugin install dotfiles-plugin@lgates-claude-pluginsThis skill is limited to using the following tools:
Expert knowledge for creating and managing Obsidian Bases - the interactive database feature introduced in Obsidian v1.9.10 that transforms notes into filterable, sortable views using YAML frontmatter properties.
What is Bases?
.base file extension (plain-text YAML format)Key Distinction from Dataview:
# example.base
filters:
# Global filters (apply to all views)
and:
- 'status != "done"'
- taggedWith(file.file, "project")
formulas:
# Computed properties
days_left: '(dueDate - today()).days()'
status_icon: 'if(done, "✅", "⬜")'
views:
- type: table
name: "Active Tasks"
filters:
'dueDate > now()' # View-specific filter
properties:
- name: title
displayName: "Task"
- name: status
- name: dueDate
sort:
- property: dueDate
direction: asc
- type: card
name: "Visual View"
properties:
- name: cover
- name: title
# Shorthand access
price
status
tags
# Explicit prefix
note.price
note.status
# Bracket notation (for spaces)
note["property name"]
file.path # Full file path
file.name # File name only
file.folder # Parent folder
file.size # File size in bytes
file.ctime # Creation time
file.mtime # Modification time
file.ext # Extension
file.file # File object (for filter functions)
file.links # Outgoing links
file.inlinks # Incoming backlinks
formula.my_formula
formula["formula name"]
# Comparison (must have spaces around operators)
price > 10
status == "done"
age >= 18
# Logical operators
and:
- condition1
- condition2
or:
- condition1
- condition2
not:
- condition
# Tag filtering
taggedWith(file.file, "project")
taggedWith(file.file, "project/web") # Nested tags
# Link filtering
linksTo(file.file, "Note Name")
file.hasLink(this.file) # Backlinks to current note
# Folder filtering
inFolder(file.file, "Projects")
inFolder(file.file, "Projects/Web") # Nested folders
# Date filtering
file.mtime > now() - "1 week" # Modified recently
dueDate < today() # Overdue
createdDate >= "2025-01-01" # This year
# Regex matching
/\d{4}-\d{2}-\d{2}/.matches(file.name) # Daily note format
this VariableContext-aware reference to the active note:
# In sidebar: references active note in main pane
file.hasLink(this.file) # Find backlinks
# In embedded base: references containing note
file.folder == this.file.folder # Same folder
# Exclude current note
file.path != this.file.path
formulas:
# Arithmetic
total: "price * quantity"
discounted: "total * 0.9"
# String manipulation
full_name: 'firstName + " " + lastName'
# Conditional logic
status_emoji: 'if(status == "done", "✅", if(status == "in-progress", "🔄", "⬜"))'
# Date calculations
days_until: '(dueDate - today()).days()'
overdue: 'dueDate < today()'
# Link analysis
backlink_count: 'file.inlinks.length'
has_backlinks: 'file.inlinks.length > 0'
Global:
today() - Current datenow() - Current date and timelink(target, displayText?) - Create linkimage(url) - Create image objectlist(value) - Ensure value is a listif(condition, trueResult, falseResult?) - ConditionalString methods:
.toUpperCase(), .toLowerCase().trim(), .split(separator).startsWith(prefix), .endsWith(suffix).replace(search, replacement)Number methods:
.toFixed(decimals) - Format decimal places.round(), .floor(), .ceil()Date methods:
.date() - Convert to date.startOf(unit), .endOf(unit).format(pattern).days(), .months(), .years() - Duration extractionList methods:
.length - Count elements[index] - Access element (0-based).filter(condition) - Filter elements.map(transformation) - Transform elements.join(separator) - Concatenate to stringnow() + "1 week"
now() - "30 days"
file.mtime > now() - "1 month"
# Available units
y, year, years
M, month, months
w, week, weeks
d, day, days
h, hour, hours
m, minute, minutes
s, second, seconds
views:
- type: table
name: "Tasks"
properties:
- name: title
displayName: "Task Name" # Column header
width: 200 # Optional width
- name: status
- name: dueDate
sort:
- property: dueDate
direction: asc # or desc
views:
- type: card
name: "Projects"
properties:
- name: cover # Cover image
- name: title
- name: status
filters:
taggedWith(file.file, "task")
formulas:
overdue: 'dueDate < today()'
priority_icon: 'if(priority == "high", "🔴", if(priority == "medium", "🟡", "🟢"))'
views:
- type: table
name: "Active"
filters:
'status != "done"'
sort:
- property: dueDate
direction: asc
# Drag to sidebar for context-aware backlinks
filters:
file.hasLink(this.file)
views:
- type: table
name: "Backlinks"
properties:
- name: file.name
displayName: "Note"
- name: file.mtime
displayName: "Modified"
filters:
taggedWith(file.file, "book")
formulas:
year_read: 'dateFinished.date().year()'
views:
- type: card
name: "Library"
properties:
- name: cover
- name: title
- name: author
- type: table
name: "Reading List"
filters:
'status == "to-read"'
filters:
file.mtime > now() - "1 week"
formulas:
days_ago: '(today() - file.mtime.date()).days()'
views:
- type: table
name: "Recent Activity"
sort:
- property: file.mtime
direction: desc
![[MyBase.base]] # Embed entire base
![[MyBase.base#ViewName]] # Embed specific view
Filter Organization:
Formula Reusability:
formula.name in viewsRobust List Handling:
# Always wrap in list() for mixed single/array values
list(tags).length
list(tags).filter(value.startsWith("project"))
Date Validation:
valid_date: 'if(dueDate, dueDate, "No date")'
1. Arithmetic operator spacing:
# ✅ Correct
price * 2
# ❌ Wrong (parser error)
price*2
2. Quote nesting in YAML:
# ✅ Correct - single outer, double inner
formulas:
message: 'Hello "world"'
# ❌ Wrong
formulas:
message: "Hello "world""
3. Link properties in frontmatter:
# ✅ Correct - must quote
related: "[[Other Note]]"
# ❌ Wrong
related: [[Other Note]]
4. File extension required:
<!-- ✅ Correct -->
![[MyBase.base]]
<!-- ❌ Wrong (looks for .md) -->
![[MyBase]]
5. Global vs view filter scope:
| Type | Example |
|---|---|
| Text | "Project Alpha" |
| List | ["tag1", "tag2"] |
| Number | 42, 3.14 |
| Checkbox | true, false |
| Date | 2025-11-26 |
| Date & Time | 2025-11-26T14:30:00 |
Note: Property types are vault-wide. If priority is Number in one note, it must be Number everywhere.
This skill should be used when the user asks to "create a hookify rule", "write a hook rule", "configure hookify", "add a hookify rule", or needs guidance on hookify rule syntax and patterns.
Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.