agentsclimarketplace

Obsidian bases

Skill AgriciDaniel/claude-obsidian/skills/obsidian-bases

Self-organizing AI second brain for Obsidian + Claude Code. Drop any source and Claude reads, links, and files it into one connected knowledge graph of plain Markdown you own. AI note-taking, personal knowledge management (PKM), and an open-source Notion alternative. Based on Karpathy's LLM Wiki pattern.

Install
npx -y skills add AgriciDaniel/claude-obsidian --skill obsidian-bases

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

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

7.4 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.

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.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.