Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries. Use when working with .base files, creating database-like views of notes, or when the user mentions Bases, table views, card views, filters, or formulas in Obsidian.
This skill enables skills-compatible agents to create and edit valid Obsidian Bases (.base files) including views, filters, formulas, and all related configurations.
Overview
Obsidian Bases are YAML-based files that define dynamic views of notes in an Obsidian vault. A Base file can contain multiple views, global filters, formulas, property configurations, and custom summaries.
File Format
Base files use the .base extension and contain valid YAML. They can also be embedded in Markdown code blocks.
Complete Schema
# Global filters apply to ALL views in the base
filters:
# Can be a single filter string
# OR a recursive filter object with and/or/not
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: Average
Filter Syntax
Filters narrow down results. They can be applied globally or per-view.
Filter Structure
# 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 filters
filters:
or:
- file.hasTag("tag")
- and:
- file.hasTag("book")
- file.hasLink("Textbook")
- not:
- file.hasTag("book")
- file.inFolder("Required Reading")
Filter Operators
Operator
Description
==
equals
!=
not equal
>
greater than
<
less than
>=
greater than or equal
<=
less than or equal
&&
logical and
||
logical or
<code>!</code>
logical not
Properties
Three Types of Properties
Note properties - From frontmatter: note.author or just author
File properties - File metadata: file.name, file.mtime, etc.
Formula properties - Computed values: formula.my_formula
File 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 in main content
Formula Syntax
Formulas compute values from properties. Defined in the formulas section.
formulas:
# Simple arithmetic
total: "price * quantity"
# Conditional logic
status_icon: 'if(done, "✅", "⏳")'
# String formatting
formatted_price: 'if(price, price.toFixed(2) + " dollars")'
# Date formatting
created: 'file.ctime.format("YYYY-MM-DD")'
# Calculate days since created (use .days for Duration)
days_old: '(now() - file.ctime).days'
# Calculate days until due date
days_until_due: 'if(due_date, (date(due_date) - today()).days, "")'
When subtracting two dates, the result is a Duration type (not a number). Duration has its own properties and methods.
Duration Fields:
Field
Type
Description
duration.days
Number
Total days in duration
duration.hours
Number
Total hours in duration
duration.minutes
Number
Total minutes in duration
duration.seconds
Number
Total seconds in duration
duration.milliseconds
Number
Total milliseconds in duration
IMPORTANT: Duration does NOT support .round(), .floor(), .ceil() directly. You must access a numeric field first (like .days), then apply number functions.
# CORRECT: Calculate days between dates
"(date(due_date) - today()).days" # Returns number of days
"(now() - file.ctime).days" # Days since created
# CORRECT: Round the numeric result if needed
"(date(due_date) - today()).days.round(0)" # Rounded days
"(now() - file.ctime).hours.round(0)" # Rounded hours
# WRONG - will cause error:
# "((date(due) - today()) / 86400000).round(0)" # Duration doesn't support division then round
Date Arithmetic
# Duration units: y/year/years, M/month/months, d/day/days,
# w/week/weeks, h/hour/hours, m/minute/minutes, s/second/seconds
# Add/subtract durations
"date + \"1M\"" # Add 1 month
"date - \"2h\"" # Subtract 2 hours
"now() + \"1 day\"" # Tomorrow
"today() + \"7d\"" # A week from today
# Subtract dates returns Duration type
"now() - file.ctime" # Returns Duration
"(now() - file.ctime).days" # Get days as number
"(now() - file.ctime).hours" # Get hours as number
# Complex duration arithmetic
"now() + (duration('1d') * 2)"
String Functions
Field:string.length
Function
Signature
Description
contains()
string.contains(value): boolean
Check substring
containsAll()
string.containsAll(...values): boolean
All substrings present
containsAny()
string.containsAny(...values): boolean
Any substring present
startsWith()
string.startsWith(query): boolean
Starts with query
endsWith()
string.endsWith(query): boolean
Ends with query
isEmpty()
string.isEmpty(): boolean
Empty or not present
lower()
string.lower(): string
To lowercase
title()
string.title(): string
To Title Case
trim()
string.trim(): string
Remove whitespace
replace()
string.replace(pattern, replacement): string
Replace pattern
repeat()
string.repeat(count): string
Repeat string
reverse()
string.reverse(): string
Reverse string
slice()
string.slice(start, end?): string
Substring
split()
string.split(separator, n?): list
Split to list
Number Functions
Function
Signature
Description
abs()
number.abs(): number
Absolute value
ceil()
number.ceil(): number
Round up
floor()
number.floor(): number
Round down
round()
number.round(digits?): number
Round to digits
toFixed()
number.toFixed(precision): string
Fixed-point notation
isEmpty()
number.isEmpty(): boolean
Not present
List Functions
Field:list.length
Function
Signature
Description
contains()
list.contains(value): boolean
Element exists
containsAll()
list.containsAll(...values): boolean
All elements exist
containsAny()
list.containsAny(...values): boolean
Any element exists
filter()
list.filter(expression): list
Filter by condition (uses value, index)
map()
list.map(expression): list
Transform elements (uses value, index)
reduce()
list.reduce(expression, initial): any
Reduce to single value (uses value, index, acc)
flat()
list.flat(): list
Flatten nested lists
join()
list.join(separator): string
Join to string
reverse()
list.reverse(): list
Reverse order
slice()
list.slice(start, end?): list
Sublist
sort()
list.sort(): list
Sort ascending
unique()
list.unique(): list
Remove duplicates
isEmpty()
list.isEmpty(): boolean
No elements
File Functions
Function
Signature
Description
asLink()
file.asLink(display?): Link
Convert to link
hasLink()
file.hasLink(otherFile): boolean
Has link to file
hasTag()
file.hasTag(...tags): boolean
Has any of the tags
hasProperty()
file.hasProperty(name): boolean
Has property
inFolder()
file.inFolder(folder): boolean
In folder or subfolder
Link Functions
Function
Signature
Description
asFile()
link.asFile(): file
Get file object
linksTo()
link.linksTo(file): boolean
Links to file
Object Functions
Function
Signature
Description
isEmpty()
object.isEmpty(): boolean
No properties
keys()
object.keys(): list
List of keys
values()
object.values(): list
List of values
Regular Expression Functions
Function
Signature
Description
matches()
regexp.matches(string): boolean
Test if matches
View Types
Table View
views:
- type: table
name: "My Table"
order:
- file.name
- status
- due_date
summaries:
price: Sum
count: Average