Obsidian bases
Claude + Obsidian knowledge companion. A persistent, compounding wiki vault based on Karpathy's LLM Wiki pattern β drop sources, ask questions, knowledge compounds.
npx -y skills add eliransu/digital-brain --skill obsidian-basesAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
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.
SKILL.md
5.8 KB, as published. Nobody here has run it
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.
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 |
|---|---|
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 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: