obsidian-bases

Create database-like views of Obsidian notes using .base files with filters, formulas, and multiple display modes. Supports four view types: table, cards, list, and map, each configurable with custom property ordering and grouping Define computed properties using formulas with conditional logic, date arithmetic, string formatting, and 15+ built-in functions Apply global or view-specific filters using tag, folder, property, date, and link conditions with AND/OR/NOT logic Includes summaries for numeric, date, and boolean properties (Average, Sum, Min, Max, Median, Earliest, Latest, Checked, Unique, etc.) Embed bases in markdown files and validate YAML syntax; common issues include unquoted special characters, mismatched quotes in formulas, and missing null checks for optional properties

INSTALLATION
npx skills add https://github.com/kepano/obsidian-skills --skill obsidian-bases
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

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.

# 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

# 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

OperatorDescription
==equals
!=not equal
>greater than
=greater than or equal

| , =, !, %, @, must be quoted.

# WRONG - colon in unquoted string

displayName: Status: Active

# CORRECT

displayName: "Status: Active"

Mismatched quotes in formulas: When a formula contains double quotes, wrap the entire formula in single quotes.

# WRONG - double quotes inside double quotes

formulas:

  label: "if(done, "Yes", "No")"

# CORRECT - single quotes wrapping double quotes

formulas:

  label: 'if(done, "Yes", "No")'

Common Formula Errors

Duration math without field access: Subtracting dates returns a Duration, not a number. Always access .days, .hours, etc.

# WRONG - Duration is not a number

"(now() - file.ctime).round(0)"

# CORRECT - access .days first, then round

"(now() - file.ctime).days.round(0)"

Missing null checks: Properties may not exist on all notes. Use if() to guard.

# WRONG - crashes if due_date is empty

"(date(due_date) - today()).days"

# CORRECT - guard with if()

'if(due_date, (date(due_date) - today()).days, "")'

Referencing undefined formulas: Ensure every formula.X in order or properties has a matching entry in formulas.

# This will fail silently if 'total' is not defined in formulas

order:

  - formula.total

# Fix: define it

formulas:

  total: "price * quantity"

References

BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card