← Back to list
⚡

obsidian-bases Checked

Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries. Use wh…
⚡ Productivity skills By kepano Version v1.0.0 Added 2026-09-07 Updated 2026-09-07 Source ↗ Part of Knowledge Management →
9.1Overall rating
2Views
5Downloads
48.0kStars

Installation

🤖 Install via AI

Copy the prompt below and send it to your AI assistant (e.g. Claude Code) — it will follow the instructions and install automatically.

Install the "obsidian-bases" skill by following the instructions at https://skill123.me/install/obsidian-bases.
⌨️ Command line install

Run in your terminal — downloads and installs to ~/.claude/skills/.

curl -fsSL https://skill123.me/install/obsidian-bases.sh | bash
📦 Download ZIP

Download the zip and extract it into your skills directory (e.g. ~/.claude/skills/), then restart your session.

⬇ Download v1.0.0 · 7 KB
📊 Static rating
9.1/10
Trigger
7.0
Structure
10.0
Workflow
8.8
Content
10.0
Engineering
10.0
Security
10.0

Six-dimension rubric with reviewer rationale.

View scorecard ↓
🛡 Dynamic test
—

Not live-tested yet — this skill is rated on static analysis only.

About this skill

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.

Obsidian Bases Skill

Documentation

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.

Obsidian Bases Skill

Workflow

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

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

3. **Add formulas** (optional): Define computed properties in the formulas section

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

5. **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

6. **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")'
View full documentation

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

1. **Note properties** - From frontmatter: `note.author` or just `author`
2. **File properties** - File metadata: `file.name`, `file.mtime`, etc.
3. **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, "")'



## 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](references/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.

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

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

views:

  • type: table

name: "My Table"

order:

  • file.name
  • status
  • due_date

summaries:

price: Sum

count: Average



### Cards View

views:

  • type: cards

name: "Gallery"

order:

  • file.name
  • cover_image
  • description


### List View

views:

  • type: list

name: "Simple List"

order:

  • file.name
  • status


### Map View

Requires latitude/longitude properties and the Maps community plugin.

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` |

Score breakdown

Trigger
7.0
Strong What/When with rich keywords (.base, views, filters, formulas); no When-Not exclusion so 1.4 is zero.
Structure
10.0
499-line SKILL.md at the limit with functions properly offloaded to references/FUNCTIONS_REFERENCE.md; no redundant files.
Workflow
8.8
Six-step create workflow with explicit validate and test-in-Obsidian steps, plus thorough troubleshooting and null-guard guidance.
Content
10.0
Dense but crisp reference tables, correct/wrong code contrasts, consistent formatting throughout.
Engineering
10.0
Valid frontmatter, referenced FUNCTIONS_REFERENCE.md exists, no scripts to maintain.
Security
10.0
Pure documentation, no scripts or network calls, only official help.obsidian.md URLs.
Excellent generator skill for Obsidian Bases: clear 6-step workflow with validation, schema plus worked examples, and a well-scoped functions reference; only gap is missing When-Not boundary.