Claude-obsidian obsidian-bases
Create and edit Obsidian Bases (.base files): Obsidian's native database layer for dynamic tables, card views, list views, filters, formulas, and summaries over vault notes. Triggers on: create a base, add a base file, obsidian bases, base view, filter notes, formula, database view, dynamic table, task tracker base, reading list base.
git clone https://github.com/AgriciDaniel/claude-obsidian
T=$(mktemp -d) && git clone --depth=1 https://github.com/AgriciDaniel/claude-obsidian "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/obsidian-bases" ~/.claude/skills/agricidaniel-claude-obsidian-obsidian-bases && rm -rf "$T"
skills/obsidian-bases/SKILL.mdobsidian-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.
Authoritative reference: If the kepano/obsidian-skills plugin is installed, prefer its canonical obsidian-bases skill. Otherwise, use the reference below. Official 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 |
|---|---|
| Notes with tag |
| Notes in folder |
| Notes linking to Note |
Properties
Three types:
- Note properties: from frontmatter:
,status
,typeupdated - File properties: metadata:
,file.name
,file.mtime
,file.size
,file.ctime
,file.tagsfile.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:
: main content viewwiki/meta/dashboard.base
: entity trackerwiki/meta/entities.base
: ingestion logwiki/meta/sources.base
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
orfrom:
: those are Dataview syntax, not Obsidian Baseswhere: - Do not use
at the root level: sorting is per-view viasort:
andorder:groupBy: - Do not put
files outside the vault: they only render inside Obsidian.base - Do not reference
informula.X
without definingorder:
inXformulas: