
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-basesAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 374 |
|---|---|
| repo stars | ★ 10.4k |
| Last updated | August 1, 2026 |
| Repository | agricidaniel/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
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
| Function | Example |
|---|---|
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: ASCCards
views:
- type: cards
name: "Gallery"
order:
- file.name
- tags
- statusList
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: ASCEntity 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: ASCRecent 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 viewwiki/meta/entities.base: entity trackerwiki/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:orwhere:: those are Dataview syntax, not Obsidian Bases - Do not use
sort:at the root level: sorting is per-view viaorder:andgroupBy: - Do not put
.basefiles outside the vault: they only render inside Obsidian - Do not reference
formula.Xinorder:without definingXinformulas:
---
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.
| # | Principle | Application here |
|---|---|---|
| 1 | OBSERVE (ext) | The .base YAML the user is composing — read it carefully before suggesting changes. |
| 2 | OBSERVE (int) | Am I documenting yesterday's spec or today's? Bases evolves fast post-GA. |
| 3 | LISTEN | The user's specific Bases use-case (dashboard, filter chain, computed property). |
| 4 | THINK | Which filter operators, formula syntax, view types apply? Validate against the current spec. |
| 5 | CONNECT (lat) | How do Bases relate to Dataview queries? Properties? Canvas overlays? Map the deltas. |
| 6 | CONNECT (sys) | Obsidian Bases is post-1.10 GA; substrate-defer to kepano/obsidian-skills when present. |
| 7 | FEEL | Examples that actually parse and render. Pseudo-syntax wastes the user. |
| 8 | ACCEPT | Bases spec evolves; some features in this doc may have changed. Keep the version note current. |
| 9 | CREATE | Schema docs + worked examples that render in the user's actual Obsidian version. |
| 10 | GROW | As 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.