Labsco
kepano logo

obsidian-bases

โ˜… 39,700

by kepano ยท part of kepano/obsidian-skills

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.

๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅโœ“ VerifiedFreeQuick setup
๐Ÿงฉ One of 6 skills in the kepano/obsidian-skills package โ€” works on its own, and pairs well with its siblings.

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.

Inspect the full instructions your agent will receiveExpand

This is the exact playbook injected into your agent when the skill activates โ€” shown here so you can audit it before installing. You don't need to read it to use the skill.

by kepano

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 skills add https://github.com/kepano/obsidian-skills --skill obsidian-bases Download ZIPGitHub39.7k

Obsidian Bases Skill

Workflow

  • Create the file: Create a .base file in the vault with valid YAML content

  • Define scope: Add filters to select which notes appear (by tag, folder, property, or date)

  • Add formulas (optional): Define computed properties in the formulas section

  • Configure views: Add one or more views (table, cards, list, or map) with order specifying which properties to display

  • Validate: Verify the file is valid YAML with no syntax errors. Check that all referenced properties and formulas exist. Common issues: unquoted strings containing special YAML characters, mismatched quotes in formula expressions, referencing formula.X without defining X in formulas

  • Test in Obsidian: Open the .base file in Obsidian to confirm the view renders correctly. If it shows a YAML error, check quoting rules below

Schema

Base files use the .base extension and contain valid YAML.

Copy & paste โ€” that's it
# Global filters apply to ALL views in the base
filters:
 # Can be a single filter string
 # OR a recursive filter object with exactly ONE key: and, or, or not
 and:
 - 'status == "active"'
 - not:
 - 'file.hasTag("archived")'

# 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 follow the same rules
 and:
 - 'status == "active"'
 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

Copy & paste โ€” that's it
# 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 ! 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.

Copy & paste โ€” that's it
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, "")'

Key Functions

Most commonly used functions. For the complete reference of all types (Date, String, Number, List, File, Link, Object, RegExp), see FUNCTIONS_REFERENCE.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).

Duration Fields: duration.days, duration.hours, duration.minutes, duration.seconds, duration.milliseconds

IMPORTANT: Duration does NOT support .round(), .floor(), .ceil() directly. Access a numeric field first (like .days), then apply number functions.

Copy & paste โ€” that's it
# CORRECT: Calculate days between dates
"(date(due_date) - today()).days" # Returns number of days
"(now() - file.ctime).days" # Days since created
"(date(due_date) - today()).days.round(0)" # Rounded days

# WRONG - will cause error:
# "((date(due) - today()) / 86400000).round(0)" # Duration doesn't support division then round

Date Arithmetic

Copy & paste โ€” that's it
# Duration units: y/year/years, M/month/months, d/day/days,
# w/week/weeks, h/hour/hours, m/minute/minutes, s/second/seconds
"now() + \"1 day\"" # Tomorrow
"today() + \"7d\"" # A week from today
"now() - file.ctime" # Returns Duration
"(now() - file.ctime).days" # Get days as number

View Types

Table View

Copy & paste โ€” that's it
views:
 - type: table
 name: "My Table"
 order:
 - file.name
 - status
 - due_date
 summaries:
 price: Sum
 count: Average

Cards View

Copy & paste โ€” that's it
views:
 - type: cards
 name: "Gallery"
 order:
 - file.name
 - cover_image
 - description

List View

Copy & paste โ€” that's it
views:
 - type: list
 name: "Simple List"
 order:
 - file.name
 - status

Map View

Requires latitude/longitude properties and the Maps community plugin.

Copy & paste โ€” that's it
views:
 - type: map
 name: "Locations"
 # Map-specific settings for lat/lng properties

Default Summary Formulas

Name Input Type Description Average Number Mathematical mean Min Number Smallest number Max Number Largest number Sum Number Sum of all numbers Range Number Max - Min Median Number Mathematical median Stddev Number Standard deviation Earliest Date Earliest date Latest Date Latest date Range Date Latest - Earliest Checked Boolean Count of true values Unchecked Boolean Count of false values Empty Any Count of empty values Filled Any Count of non-empty values Unique Any Count of unique values

Complete Examples

Task Tracker Base

Copy & paste โ€” that's it
filters:
 and:
 - file.hasTag("task")
 - 'file.ext == "md"'

formulas:
 days_until_due: 'if(due, (date(due) - today()).days, "")'
 is_overdue: 'if(due, date(due) Embed in Markdown files:

![[MyBase.base]]

![[MyBase.base#View Name]]

Copy & paste โ€” that's it

## YAML Quoting Rules

- Use single quotes for formulas containing double quotes: `'if(done, "Yes", "No")'` 

- Use double quotes for simple strings: `"My View Name"` 

- Escape nested quotes properly in complex expressions

## References

- [Bases Syntax](https://help.obsidian.md/bases/syntax) 

- [Functions](https://help.obsidian.md/bases/functions) 

- [Views](https://help.obsidian.md/bases/views) 

- [Formulas](https://help.obsidian.md/formulas) 

- [Complete Functions Reference](https://github.com/kepano/obsidian-skills/blob/main/skills/obsidian-bases/references/FUNCTIONS_REFERENCE.md)