Loading...
Loading...
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.
npx skill4agent add davila7/claude-code-templates obsidian-bases.base.base# 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# 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")| Operator | Description |
|---|---|
| equals |
| not equal |
| greater than |
| less than |
| greater than or equal |
| less than or equal |
| logical and |
| logical or |
| logical not |
note.authorauthorfile.namefile.mtimeformula.my_formula| Property | Type | Description |
|---|---|---|
| String | File name |
| String | File name without extension |
| String | Full path to file |
| String | Parent folder path |
| String | File extension |
| Number | File size in bytes |
| Date | Created time |
| Date | Modified time |
| List | All tags in file |
| List | Internal links in file |
| List | Files linking to this file |
| List | Embeds in the note |
| Object | All frontmatter properties |
thisformulasformulas:
# 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")'
# Complex expressions
days_old: '((now() - file.ctime) / 86400000).round(0)'| Function | Signature | Description |
|---|---|---|
| | Parse string to date. Format: |
| | Parse duration string |
| | Current date and time |
| | Current date (time = 00:00:00) |
| | Conditional |
| | Smallest number |
| | Largest number |
| | Convert to number |
| | Create a link |
| | Wrap in list if not already |
| | Get file object |
| | Create image for rendering |
| | Lucide icon by name |
| | Render as HTML |
| | Escape HTML characters |
| Function | Signature | Description |
|---|---|---|
| | Coerce to boolean |
| | Check type |
| | Convert to string |
date.yeardate.monthdate.daydate.hourdate.minutedate.seconddate.millisecond| Function | Signature | Description |
|---|---|---|
| | Remove time portion |
| | Format with Moment.js pattern |
| | Get time as string |
| | Human-readable relative time |
| | Always false for dates |
# 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 for millisecond difference
"now() - file.ctime"
# Complex duration arithmetic
"now() + (duration('1d') * 2)"string.length| Function | Signature | Description |
|---|---|---|
| | Check substring |
| | All substrings present |
| | Any substring present |
| | Starts with query |
| | Ends with query |
| | Empty or not present |
| | To lowercase |
| | To Title Case |
| | Remove whitespace |
| | Replace pattern |
| | Repeat string |
| | Reverse string |
| | Substring |
| | Split to list |
| Function | Signature | Description |
|---|---|---|
| | Absolute value |
| | Round up |
| | Round down |
| | Round to digits |
| | Fixed-point notation |
| | Not present |
list.length| Function | Signature | Description |
|---|---|---|
| | Element exists |
| | All elements exist |
| | Any element exists |
| | Filter by condition (uses |
| | Transform elements (uses |
| | Reduce to single value (uses |
| | Flatten nested lists |
| | Join to string |
| | Reverse order |
| | Sublist |
| | Sort ascending |
| | Remove duplicates |
| | No elements |
| Function | Signature | Description |
|---|---|---|
| | Convert to link |
| | Has link to file |
| | Has any of the tags |
| | Has property |
| | In folder or subfolder |
| Function | Signature | Description |
|---|---|---|
| | Get file object |
| | Links to file |
| Function | Signature | Description |
|---|---|---|
| | No properties |
| | List of keys |
| | List of values |
| Function | Signature | Description |
|---|---|---|
| | Test if matches |
views:
- type: table
name: "My Table"
order:
- file.name
- status
- due_date
summaries:
price: Sum
count: Averageviews:
- type: cards
name: "Gallery"
order:
- file.name
- cover_image
- descriptionviews:
- type: list
name: "Simple List"
order:
- file.name
- statusviews:
- type: map
name: "Locations"
# Map-specific settings for lat/lng properties| Name | Input Type | Description |
|---|---|---|
| Number | Mathematical mean |
| Number | Smallest number |
| Number | Largest number |
| Number | Sum of all numbers |
| Number | Max - Min |
| Number | Mathematical median |
| Number | Standard deviation |
| Date | Earliest date |
| Date | Latest date |
| Date | Latest - Earliest |
| Boolean | Count of true values |
| Boolean | Count of false values |
| Any | Count of empty values |
| Any | Count of non-empty values |
| Any | Count of unique values |
filters:
and:
- file.hasTag("task")
- 'file.ext == "md"'
formulas:
days_until_due: 'if(due, ((date(due) - today()) / 86400000).round(0), "")'
is_overdue: 'if(due, date(due) < today() && status != "done", false)'
priority_label: 'if(priority == 1, "🔴 High", if(priority == 2, "🟡 Medium", "🟢 Low"))'
properties:
status:
displayName: Status
formula.days_until_due:
displayName: "Days Until Due"
formula.priority_label:
displayName: Priority
views:
- type: table
name: "Active Tasks"
filters:
and:
- 'status != "done"'
order:
- file.name
- status
- formula.priority_label
- due
- formula.days_until_due
groupBy:
property: status
direction: ASC
summaries:
formula.days_until_due: Average
- type: table
name: "Completed"
filters:
and:
- 'status == "done"'
order:
- file.name
- completed_datefilters:
or:
- file.hasTag("book")
- file.hasTag("article")
formulas:
reading_time: 'if(pages, (pages * 2).toString() + " min", "")'
status_icon: 'if(status == "reading", "📖", if(status == "done", "✅", "📚"))'
year_read: 'if(finished_date, date(finished_date).year, "")'
properties:
author:
displayName: Author
formula.status_icon:
displayName: ""
formula.reading_time:
displayName: "Est. Time"
views:
- type: cards
name: "Library"
order:
- cover
- file.name
- author
- formula.status_icon
filters:
not:
- 'status == "dropped"'
- type: table
name: "Reading List"
filters:
and:
- 'status == "to-read"'
order:
- file.name
- author
- pages
- formula.reading_timefilters:
and:
- file.inFolder("Projects")
- 'file.ext == "md"'
formulas:
last_updated: 'file.mtime.relative()'
link_count: 'file.links.length'
summaries:
avgLinks: 'values.filter(value.isType("number")).mean().round(1)'
properties:
formula.last_updated:
displayName: "Updated"
formula.link_count:
displayName: "Links"
views:
- type: table
name: "All Projects"
order:
- file.name
- status
- formula.last_updated
- formula.link_count
summaries:
formula.link_count: avgLinks
groupBy:
property: status
direction: ASC
- type: list
name: "Quick List"
order:
- file.name
- statusfilters:
and:
- file.inFolder("Daily Notes")
- '/^\d{4}-\d{2}-\d{2}$/.matches(file.basename)'
formulas:
word_estimate: '(file.size / 5).round(0)'
day_of_week: 'date(file.basename).format("dddd")'
properties:
formula.day_of_week:
displayName: "Day"
formula.word_estimate:
displayName: "~Words"
views:
- type: table
name: "Recent Notes"
limit: 30
order:
- file.name
- formula.day_of_week
- formula.word_estimate
- file.mtime![[MyBase.base]]
<!-- Specific view -->
![[MyBase.base#View Name]]'if(done, "Yes", "No")'"My View Name"filters:
and:
- file.hasTag("project")filters:
and:
- file.inFolder("Notes")filters:
and:
- 'file.mtime > now() - "7d"'filters:
and:
- 'status == "active"'
- 'priority >= 3'filters:
or:
- and:
- file.hasTag("important")
- 'status != "done"'
- and:
- 'priority == 1'
- 'due != ""'