Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
agricidaniel avatar

Obsidian Bases

  • 374 installs
  • 10.4k repo stars
  • Updated August 1, 2026
  • agricidaniel/claude-obsidian

obsidian-bases is an agent skill that creates and edits Obsidian Bases .base files with dynamic table, card, and list views for developers who manage structured task, reference, and project inventories inside a vault.

About

obsidian-bases is an agricidaniel claude-obsidian skill for Obsidian's native Bases database layer launched in 2025—no plugin required. It authors valid YAML in .base files defining global filters (and/or/not), computed formulas like age_days with .days on Duration values, property displayName overrides, and views of type table, cards, or list with order and groupBy. The skill includes wiki vault templates for dashboards, entity indexes, and source ingests, plus YAML quoting rules and warnings to avoid Dataview from:/where: syntax. allowed-tools are Read and Write. Developers reach for obsidian-bases when creating task tracker bases, reading list bases, formula columns, or filter chains over vault notes; substrate v1.7+ defers to kepano/obsidian-skills when installed.

  • Bases view setup
  • Property schemas
  • Filtered tables
  • Vault queries
  • Structured note models

Obsidian Bases by the numbers

  • 374 all-time installs (skills.sh)
  • Ranked #421 of 1,879 Documentation skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/agricidaniel/claude-obsidian --skill obsidian-bases

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs374
repo stars10.4k
Last updatedAugust 1, 2026
Repositoryagricidaniel/claude-obsidian

How do you configure Obsidian Bases database views?

Configure Obsidian Bases views, properties, and filters to manage structured knowledge such as tasks, references, reading lists, or project inventories inside a vault.

Who is it for?

Obsidian developers who want native .base database views for tasks, reading lists, or project inventories without Dataview plugins.

Skip if: Non-Obsidian knowledge bases, teams needing server-side databases, or vaults on Obsidian versions without Bases support.

When should I use this skill?

User asks to create a base, add a .base file, configure Obsidian Bases filters, formulas, task tracker base, or dynamic table over notes.

What you get

.base YAML files with filters, formulas, table/card/list views, and embeddable ![[MyBase.base]] references.

  • .base YAML file
  • embedded base view in markdown notes

By the numbers

  • Three view types documented: table, cards, and list
  • Obsidian Bases launched 2025 as a core no-plugin feature
  • Three bundled wiki/meta templates: dashboard, entities, and sources bases

Files

SKILL.mdMarkdownGitHub ↗

obsidian-bases: Obsidian's Database Layer

Obsidian Bases (launched 2025) turns vault notes into queryable, dynamic views. Tables, cards, lists, maps. Defined in .base files. No plugin required; it is a core Obsidian feature.

Substrate preference (v1.7+): This skill is a self-contained fallback. Prefer `kepano/obsidian-skills` as the authoritative substrate — its obsidian-bases skill is the canonical reference for Bases YAML, formulas, and view definitions. If you see an obsidian-bases skill available without the claude-obsidian: namespace, that is kepano's version: use it. The reference below is provided so the plugin remains functional when kepano's marketplace is not installed. Install: claude plugin marketplace add kepano/obsidian-skills. Official Bases docs: https://help.obsidian.md/bases/syntax

---

File Format

.base files contain valid YAML. The root keys are filters, formulas, properties, summaries, and views.

# Global filters: apply to ALL views
filters:
  and:
    - file.hasTag("wiki")
    - 'status != "archived"'

# Computed properties
formulas:
  age_days: '(now() - file.ctime).days.round(0)'
  status_icon: 'if(status == "mature", "✅", "🔄")'

# Display name overrides for properties panel
properties:
  status:
    displayName: "Status"
  formula.age_days:
    displayName: "Age (days)"

# One or more views
views:
  - type: table
    name: "All Pages"
    order:
      - file.name
      - type
      - status
      - updated
      - formula.age_days

---

Filters

Filters select which notes appear. Applied globally or per-view.

# Single string filter
filters: 'status == "current"'

# AND: all must be true
filters:
  and:
    - 'status != "archived"'
    - file.hasTag("wiki")

# OR: any can be true
filters:
  or:
    - file.hasTag("concept")
    - file.hasTag("entity")

# NOT: exclude matches
filters:
  not:
    - file.inFolder("wiki/meta")

# Nested
filters:
  and:
    - file.inFolder("wiki/")
    - or:
        - 'type == "concept"'
        - 'type == "entity"'

Filter operators

== != > < >= <=

Useful filter functions

FunctionExample
file.hasTag("x")Notes with tag x
file.inFolder("path/")Notes in folder
file.hasLink("Note")Notes linking to Note

---

Properties

Three types:

  • Note properties: from frontmatter: status, type, updated
  • File properties: metadata: file.name, file.mtime, file.size, file.ctime, file.tags, file.folder
  • Formula properties: computed: formula.age_days

---

Formulas

Defined in formulas:. Referenced as formula.name in order: and properties:.

formulas:
  # Days since created
  age_days: '(now() - file.ctime).days.round(0)'

  # Days until a date property
  days_until: 'if(due_date, (date(due_date) - today()).days, "")'

  # Conditional label
  status_icon: 'if(status == "mature", "✅", if(status == "developing", "🔄", "🌱"))'

  # Word count estimate
  word_est: '(file.size / 5).round(0)'

Key rule: Subtracting two dates returns a Duration. Not a number. Always access .days first:

# CORRECT
age: '(now() - file.ctime).days'

# WRONG: crashes
age: '(now() - file.ctime).round(0)'

Always guard nullable properties with `if()`:

# CORRECT
days_left: 'if(due_date, (date(due_date) - today()).days, "")'

---

View Types

Table

views:
  - type: table
    name: "Wiki Index"
    limit: 100
    order:
      - file.name
      - type
      - status
      - updated
    groupBy:
      property: type
      direction: ASC

Cards

views:
  - type: cards
    name: "Gallery"
    order:
      - file.name
      - tags
      - status

List

views:
  - type: list
    name: "Quick List"
    order:
      - file.name
      - status

---

Wiki Vault Templates

Wiki content dashboard (all non-meta pages)

filters:
  and:
    - file.inFolder("wiki/")
    - not:
        - file.inFolder("wiki/meta")

formulas:
  age: '(now() - file.ctime).days.round(0)'

properties:
  formula.age:
    displayName: "Age (days)"

views:
  - type: table
    name: "All Wiki Pages"
    order:
      - file.name
      - type
      - status
      - updated
      - formula.age
    groupBy:
      property: type
      direction: ASC

Entity index (people, orgs, repos)

filters:
  and:
    - file.inFolder("wiki/entities/")
    - 'file.ext == "md"'

views:
  - type: table
    name: "Entities"
    order:
      - file.name
      - entity_type
      - status
      - updated
    groupBy:
      property: entity_type
      direction: ASC

Recent ingests

filters:
  and:
    - file.inFolder("wiki/sources/")

views:
  - type: table
    name: "Sources"
    order:
      - file.name
      - source_type
      - created
      - status
    groupBy:
      property: source_type
      direction: ASC

---

Embedding in Notes

![[MyBase.base]]

![[MyBase.base#View Name]]

---

Where to Save

Store .base files in wiki/meta/ for vault dashboards:

  • wiki/meta/dashboard.base: main content view
  • wiki/meta/entities.base: entity tracker
  • wiki/meta/sources.base: ingestion log

---

YAML Quoting Rules

  • Formulas with double quotes → wrap in single quotes: 'if(done, "Yes", "No")'
  • Strings with colons or special chars → wrap in double quotes: "Status: Active"
  • Unquoted strings with : break YAML parsing

---

What Not to Do

  • Do not use from: or where:: those are Dataview syntax, not Obsidian Bases
  • Do not use sort: at the root level: sorting is per-view via order: and groupBy:
  • Do not put .base files outside the vault: they only render inside Obsidian
  • Do not reference formula.X in order: without defining X in formulas:

---

How to think (10-principle mapping)

When working on this skill, apply the 10-principle loop. See `skills/think/SKILL.md` for the canonical framework.

#PrincipleApplication here
1OBSERVE (ext)The .base YAML the user is composing — read it carefully before suggesting changes.
2OBSERVE (int)Am I documenting yesterday's spec or today's? Bases evolves fast post-GA.
3LISTENThe user's specific Bases use-case (dashboard, filter chain, computed property).
4THINKWhich filter operators, formula syntax, view types apply? Validate against the current spec.
5CONNECT (lat)How do Bases relate to Dataview queries? Properties? Canvas overlays? Map the deltas.
6CONNECT (sys)Obsidian Bases is post-1.10 GA; substrate-defer to kepano/obsidian-skills when present.
7FEELExamples that actually parse and render. Pseudo-syntax wastes the user.
8ACCEPTBases spec evolves; some features in this doc may have changed. Keep the version note current.
9CREATESchema docs + worked examples that render in the user's actual Obsidian version.
10GROWAs Bases features ship, refresh the reference. Track upstream releases.

Related skills

How it compares

Pick obsidian-bases over Dataview query skills when you need native Obsidian Bases .base YAML with formulas and embedded vault views.

FAQ

What file format does obsidian-bases use?

obsidian-bases creates valid YAML in .base files at the vault root or wiki/meta/. Root keys include filters, formulas, properties, summaries, and views—Obsidian Bases is a core feature launched in 2025 requiring no plugin.

Which view types does obsidian-bases support?

obsidian-bases documents table, cards, and list view types, each with name, order columns, optional groupBy, and limit. Views embed in notes via ![[MyBase.base]] or ![[MyBase.base#View Name]] syntax.

How do obsidian-bases formulas handle date math?

obsidian-bases requires accessing .days on Duration values from date subtraction, for example (now() - file.ctime).days.round(0). Nullable properties must be guarded with if() to avoid crashes.

Documentationnotesworkflow

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.