Obsidian Bases
Reference for creating .base files — Obsidian's built-in database views that query vault files by frontmatter properties. Use for task dashboards, content indexes, and filtered views.
Requires: Bases core plugin enabled.
File Format
A .base file is YAML. Place anywhere in the vault. Five top-level keys:
filters: # Scope and filter which files appear
formulas: # Named computed properties
properties: # Display config for each column
summaries: # Aggregation formulas
views: # Array of view definitions
There is no source: key. Bases always queries the entire vault. Use filters to scope to folders.
Filters
Filters are YAML lists of string expressions. Logical grouping uses and:, or:, not: as keys.
Folder Scoping
filters:
and:
- 'file.inFolder("tasks")' # Includes subfolders
- 'file.folder == "tasks"' # Exact folder only (no subfolders)
Property Filters
filters:
and:
- 'file.inFolder("tasks")'
- 'status != "done"'
- 'status != "later"'
- 'priority == "critical"'
Date Filters
filters:
and:
- 'due < today()' # Overdue
- 'due <= now() + "7d"' # Due within 7 days
Compound Filters
filters:
or:
- and:
- 'due == today()'
- 'status != "done"'
- 'status == "in_progress"'
Other Filter Functions
file.hasTag("tag-name")— files with a specific tagfile.hasLink("Note Name")— files linking to a notefile.extension == "md"— by file extension
Operators: ==, !=, <, <=, >, >=, contains(), startsWith(), endsWith()
Date functions: today(), now(), dateModify(date, "7 days")
Date arithmetic: now() + "7d", today() - "30d"
Properties
Define which columns to display. Use named keys matching frontmatter fields.
properties:
file.name:
displayName: Task
status:
displayName: Status
priority:
displayName: Priority
due:
displayName: Due Date
assignee:
displayName: Owner
project:
displayName: Project
Built-in properties (always available):
file.name— filename without extensionfile.path— full pathfile.created— creation datefile.modified— last modified datefile.size— file sizefile.folder— parent folder
Formula properties use the formula. prefix:
formula.days_left:
displayName: Days Left
Formulas
Named computed columns defined at the top level.
formulas:
days_left: 'dateDiff(due, today(), "days")'
urgency: |
if(due == null, null,
if(due < now(), "OVERDUE",
if(due < now() + "7d", "THIS WEEK", "LATER")))
display: 'file.name + " (" + status + ")"'
Formula functions:
now()— current datetimetoday()— current date (no time)dateDiff(date1, date2, unit)— difference between dates ("days", "hours", etc.)dateModify(date, duration)— add duration to dateif(condition, then, else)— conditionalcontains(text, search)— text searchformat(value)— convert to stringrelative(date)— human-readable relative time ("in 3 days", "2 days ago")min(),max(),round()— math- Text:
+(concat),lower(),upper()
Reference properties directly by name (not prop("name")):
- Correct:
due < now() - Wrong:
prop("due") < now()
Views
Array of view definitions. Multiple views create tabs.
Table
views:
- type: table
name: All Tasks
order:
- priority
- due
- file.name
Cards (Kanban)
views:
- type: cards
name: Kanban Board
groupBy:
property: status
direction: ASC
order:
- priority
- due
Multiple Views
views:
- type: table
name: Table View
order:
- due
- type: cards
name: Kanban
groupBy:
property: status
Summaries
Aggregation for columns (shown at bottom).
summaries:
status: countBy
effort: sum
due: earliest
Types: count, countBy, countEmpty, countNotEmpty, sum, average, min, max, range, earliest, latest
Complete Example: Task Dashboard
filters:
and:
- 'file.inFolder("tasks")'
- 'status != "done"'
- 'status != "later"'
formulas:
urgency: |
if(due == null, 0,
if(due < now(), "OVERDUE",
if(due < now() + "7d", "THIS WEEK", "LATER")))
properties:
file.name:
displayName: Task
status:
displayName: Status
priority:
displayName: Priority
assignee:
displayName: Owner
due:
displayName: Due
project:
displayName: Project
formula.urgency:
displayName: Urgency
summaries:
status: countBy
due: earliest
views:
- type: table
name: Active Tasks
order:
- priority
- due
- type: cards
name: Kanban
groupBy:
property: status
Tips
- No
source:key exists — always usefilters:withfile.inFolder()to scope - Properties use named keys, not numbered ("0", "1") or arrays
- Formula references are bare names (
due,status), notprop("due") - Views is always plural (
views:notview:) and an array - Cards with
groupBy: statusreplicates a kanban board - Date arithmetic uses string durations:
now() + "7d",today() - "30d"