Agent skill

Obsidian Bases

by Atmosphere in Atmosphere/atmosphere

Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries.

Apache-2.0Auto-check passedBackend & APIs

Install Obsidian Bases

skills CLI
$ npx skills add Atmosphere/atmosphere --skill obsidian-bases -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Atmosphere/atmosphere obsidian-bases --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Atmosphere/atmosphere.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/obsidian-bases .claude/skills/obsidian-bases && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
obsidian-bases
GitHub stars
3.8k
Used in
22 other repos
Token cost
~3.2k tokens
SKILL.md length
679 words
Files
2 (incl. references)
Skills in repo
20
Repo updated
First seen
Licence
Apache-2.0

At a glance

Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries.

  • Works in 6 steps: Create the file: Create a .base file in… → Define scope: Add filters to select… → Add formulas (optional): Define computed… → …
  • Working with .base files
  • SKILL.md covers Workflow, Schema, Filter Syntax and Properties, plus 9 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Obsidian Bases is an agent skill from Atmosphere/atmosphere. Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries. Use when working with .base files, creating database-like views of notes, or when the user mentions Bases, table views, card views, filters, or formulas in Obsidian.

Its SKILL.md is about 3.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/FUNCTIONS_REFERENCE.md`).

It sits in Backend & APIs. It works with Obsidian. The repository describes itself as: Portable AI agent runtime for the JVM. One @Agent class runs on Spring AI, LangChain4j, Anthropic, or 9 more behind one SPI. Token streaming, tool calls, human approvals, and… The licence is Apache-2.0.

When your agent uses it

  • Working with .base files
  • Creating database-like views of notes
  • The user mentions Bases
  • Formulas in Obsidian

Example prompts

  • “/obsidian-bases”

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. Create the file: Create a .base file in the vault with valid YAML content
  2. Define scope: Add filters to select which notes appear (by tag, folder, property, or date)
  3. Add formulas (optional): Define computed properties in the formulas section
  4. Configure views: Add one or more views (table, cards, list, or map) with order specifying which properties to display
  5. Validate: Verify the file is valid YAML with no syntax errors. Check that all referenced properties and formulas exist. Common issues…
  6. Test in Obsidian: Open the .base file in Obsidian to confirm the view renders correctly. If it shows a YAML error, check quoting rules below

What it can do on your machine

Read from SKILL.md and the folder at commit 13671cf. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are yaml and markdown).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • help.obsidian.md

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Obsidian Bases loads about 3.2k tokens when it runs, and up to ~5.1k if it reads all its reference files. Until then it costs about 68 tokens; SKILL.md has 679 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~68
When it runs · the whole SKILL.md, loaded when a task matches
~3.2k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~5.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from Atmosphere/atmosphere at commit 13671cf, republished under its Apache-2.0 licence (© Atmosphere). 679 words, ~3,222 tokens.

Download SKILL.mdSave it as .claude/skills/obsidian-bases/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
obsidian-bases
description
Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries. Use when working with .base files, creating database-like views of notes, or when the user mentions Bases, table views, card views, filters, or formulas in Obsidian.

Obsidian Bases Skill

Workflow

  1. Create the file: Create a .base file in the vault with valid YAML content
  2. Define scope: Add filters to select which notes appear (by tag, folder, property, or date)
  3. Add formulas (optional): Define computed properties in the formulas section
  4. Configure views: Add one or more views (table, cards, list, or map) with order specifying which properties to display
  5. Validate: Verify the file is valid YAML with no syntax errors. Check that all referenced properties and formulas exist. Common issues: unquoted strings containing special YAML characters, mismatched quotes in formula expressions, referencing formula.X without defining X in formulas
  6. Test in Obsidian: Open the .base file in Obsidian to confirm the view renders correctly. If it shows a YAML error, check quoting rules below

Schema

Base files use the .base extension and contain valid YAML.

yaml
# Global filters apply to ALL views in the base
filters:
  # Can be a single filter string
  # OR a recursive filter object with and/or/not
  and: []
  or: []
  not: []

# Define formula properties that can be used across all views
formulas:
  formula_name: 'expression'

# Configure display names and settings for properties
properties:
  property_name:
    displayName: "Display Name"
  formula.formula_name:
    displayName: "Formula Display Name"
  file.ext:
    displayName: "Extension"

# Define custom summary formulas
summaries:
  custom_summary_name: 'values.mean().round(3)'

# Define one or more views
views:
  - type: table | cards | list | map
    name: "View Name"
    limit: 10                    # Optional: limit results
    groupBy:                     # Optional: group results
      property: property_name
      direction: ASC | DESC
    filters:                     # View-specific filters
      and: []
    order:                       # Properties to display in order
      - file.name
      - property_name
      - formula.formula_name
    summaries:                   # Map properties to summary formulas
      property_name: Average

Filter Syntax

Filters narrow down results. They can be applied globally or per-view.

Filter Structure
yaml
# Single filter
filters: 'status == "done"'

# AND - all conditions must be true
filters:
  and:
    - 'status == "done"'
    - 'priority > 3'

# OR - any condition can be true
filters:
  or:
    - 'file.hasTag("book")'
    - 'file.hasTag("article")'

# NOT - exclude matching items
filters:
  not:
    - 'file.hasTag("archived")'

# Nested filters
filters:
  or:
    - file.hasTag("tag")
    - and:
        - file.hasTag("book")
        - file.hasLink("Textbook")
    - not:
        - file.hasTag("book")
        - file.inFolder("Required Reading")
Filter Operators
OperatorDescription
==equals
!=not equal
>greater than
<less than
>=greater than or equal
<=less than or equal
&&logical and
||logical or
<code>!</code>logical not

Properties

Three Types of Properties
  1. Note properties - From frontmatter: note.author or just author
  2. File properties - File metadata: file.name, file.mtime, etc.
  3. Formula properties - Computed values: formula.my_formula
File Properties Reference
PropertyTypeDescription
file.nameStringFile name
file.basenameStringFile name without extension
file.pathStringFull path to file
file.folderStringParent folder path
file.extStringFile extension
file.sizeNumberFile size in bytes
file.ctimeDateCreated time
file.mtimeDateModified time
file.tagsListAll tags in file
file.linksListInternal links in file
file.backlinksListFiles linking to this file
file.embedsListEmbeds in the note
file.propertiesObjectAll frontmatter properties
The this Keyword
  • In main content area: refers to the base file itself
  • When embedded: refers to the embedding file
  • In sidebar: refers to the active file in main content

Formula Syntax

Formulas compute values from properties. Defined in the formulas section.

yaml
formulas:
  # Simple arithmetic
  total: "price * quantity"

  # Conditional logic
  status_icon: 'if(done, "✅", "❌")'

  # String formatting
  formatted_price: 'if(price, price.toFixed(2) + " dollars")'

  # Date formatting
  created: 'file.ctime.format("YYYY-MM-DD")'

  # Calculate days since created (use .days for Duration)
  days_old: '(now() - file.ctime).days'

  # Calculate days until due date
  days_until_due: 'if(due_date, (date(due_date) - today()).days, "")'

Key Functions

Most commonly used functions. For the complete reference of all types (Date, String, Number, List, File, Link, Object, RegExp), see FUNCTIONS_REFERENCE.md.

FunctionSignatureDescription
date()date(string): dateParse string to date (YYYY-MM-DD HH:mm:ss)
now()now(): dateCurrent date and time
today()today(): dateCurrent date (time = 00:00:00)
if()if(condition, trueResult, falseResult?)Conditional
duration()duration(string): durationParse duration string
file()file(path): fileGet file object
link()link(path, display?): LinkCreate a link
Show full SKILL.md (277 more words)Show less
Duration Type

When subtracting two dates, the result is a Duration type (not a number).

Duration Fields: duration.days, duration.hours, duration.minutes, duration.seconds, duration.milliseconds

IMPORTANT: Duration does NOT support .round(), .floor(), .ceil() directly. Access a numeric field first (like .days), then apply number functions.

yaml
# CORRECT: Calculate days between dates
"(date(due_date) - today()).days"                    # Returns number of days
"(now() - file.ctime).days"                          # Days since created
"(date(due_date) - today()).days.round(0)"           # Rounded days

# WRONG - will cause error:
# "((date(due) - today()) / 86400000).round(0)"      # Duration doesn't support division then round
Date Arithmetic
yaml
# Duration units: y/year/years, M/month/months, d/day/days,
#                 w/week/weeks, h/hour/hours, m/minute/minutes, s/second/seconds
"now() + \"1 day\""       # Tomorrow
"today() + \"7d\""        # A week from today
"now() - file.ctime"      # Returns Duration
"(now() - file.ctime).days"  # Get days as number

View Types

Table View
yaml
views:
  - type: table
    name: "My Table"
    order:
      - file.name
      - status
      - due_date
    summaries:
      price: Sum
      count: Average
Cards View
yaml
views:
  - type: cards
    name: "Gallery"
    order:
      - file.name
      - cover_image
      - description
List View
yaml
views:
  - type: list
    name: "Simple List"
    order:
      - file.name
      - status
Map View

Requires latitude/longitude properties and the Maps community plugin.

yaml
views:
  - type: map
    name: "Locations"
    # Map-specific settings for lat/lng properties

Default Summary Formulas

NameInput TypeDescription
AverageNumberMathematical mean
MinNumberSmallest number
MaxNumberLargest number
SumNumberSum of all numbers
RangeNumberMax - Min
MedianNumberMathematical median
StddevNumberStandard deviation
EarliestDateEarliest date
LatestDateLatest date
RangeDateLatest - Earliest
CheckedBooleanCount of true values
UncheckedBooleanCount of false values
EmptyAnyCount of empty values
FilledAnyCount of non-empty values
UniqueAnyCount of unique values

Complete Examples

Task Tracker Base
yaml
filters:
  and:
    - file.hasTag("task")
    - 'file.ext == "md"'

formulas:
  days_until_due: 'if(due, (date(due) - today()).days, "")'
  is_overdue: 'if(due, date(due) < today() && status != "done", false)'
  priority_label: 'if(priority == 1, "🔴 High", if(priority == 2, "🟡 Medium", "🟢 Low"))'

properties:
  status:
    displayName: Status
  formula.days_until_due:
    displayName: "Days Until Due"
  formula.priority_label:
    displayName: Priority

views:
  - type: table
    name: "Active Tasks"
    filters:
      and:
        - 'status != "done"'
    order:
      - file.name
      - status
      - formula.priority_label
      - due
      - formula.days_until_due
    groupBy:
      property: status
      direction: ASC
    summaries:
      formula.days_until_due: Average

  - type: table
    name: "Completed"
    filters:
      and:
        - 'status == "done"'
    order:
      - file.name
      - completed_date
Reading List Base
yaml
filters:
  or:
    - file.hasTag("book")
    - file.hasTag("article")

formulas:
  reading_time: 'if(pages, (pages * 2).toString() + " min", "")'
  status_icon: 'if(status == "reading", "📖", if(status == "done", "✅", "📚"))'
  year_read: 'if(finished_date, date(finished_date).year, "")'

properties:
  author:
    displayName: Author
  formula.status_icon:
    displayName: ""
  formula.reading_time:
    displayName: "Est. Time"

views:
  - type: cards
    name: "Library"
    order:
      - cover
      - file.name
      - author
      - formula.status_icon
    filters:
      not:
        - 'status == "dropped"'

  - type: table
    name: "Reading List"
    filters:
      and:
        - 'status == "to-read"'
    order:
      - file.name
      - author
      - pages
      - formula.reading_time
Daily Notes Index
yaml
filters:
  and:
    - file.inFolder("Daily Notes")
    - '/^\d{4}-\d{2}-\d{2}$/.matches(file.basename)'

formulas:
  word_estimate: '(file.size / 5).round(0)'
  day_of_week: 'date(file.basename).format("dddd")'

properties:
  formula.day_of_week:
    displayName: "Day"
  formula.word_estimate:
    displayName: "~Words"

views:
  - type: table
    name: "Recent Notes"
    limit: 30
    order:
      - file.name
      - formula.day_of_week
      - formula.word_estimate
      - file.mtime

Embedding Bases

Embed in Markdown files:

markdown
![[MyBase.base]]

<!-- Specific view -->
![[MyBase.base#View Name]]

YAML Quoting Rules

  • Use single quotes for formulas containing double quotes: 'if(done, "Yes", "No")'
  • Use double quotes for simple strings: "My View Name"
  • Escape nested quotes properly in complex expressions

Troubleshooting

YAML Syntax Errors

Unquoted special characters: Strings containing :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, ` must be quoted.

yaml
# WRONG - colon in unquoted string
displayName: Status: Active

# CORRECT
displayName: "Status: Active"

Mismatched quotes in formulas: When a formula contains double quotes, wrap the entire formula in single quotes.

yaml
# WRONG - double quotes inside double quotes
formulas:
  label: "if(done, "Yes", "No")"

# CORRECT - single quotes wrapping double quotes
formulas:
  label: 'if(done, "Yes", "No")'
Common Formula Errors

Duration math without field access: Subtracting dates returns a Duration, not a number. Always access .days, .hours, etc.

yaml
# WRONG - Duration is not a number
"(now() - file.ctime).round(0)"

# CORRECT - access .days first, then round
"(now() - file.ctime).days.round(0)"

Missing null checks: Properties may not exist on all notes. Use if() to guard.

yaml
# WRONG - crashes if due_date is empty
"(date(due_date) - today()).days"

# CORRECT - guard with if()
'if(due_date, (date(due_date) - today()).days, "")'

Referencing undefined formulas: Ensure every formula.X in order or properties has a matching entry in formulas.

yaml
# This will fail silently if 'total' is not defined in formulas
order:
  - formula.total

# Fix: define it
formulas:
  total: "price * quantity"

References

© Atmosphere, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file (references) in .claude/skills/obsidian-bases of Atmosphere/atmosphere.

  • SKILL.md
  • references/FUNCTIONS_REFERENCE.md

Open the folder on GitHubat commit 13671cf

Used in 22 other repositories

We found 38 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 22 other GitHub owners. This page covers the copy in Atmosphere/atmosphere, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Obsidian Bases next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Obsidian Bases compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Obsidian Bases this skillAtmosphere/atmosphere3.8k22 repos~3.2kAutomated safety check: PassApache-2.0
Researchthoreinstein/gemini-obsidian102—~352Automated safety check: PassISC
Obsidian REST APIdavepoon/buildwithclaude3.6k—~1kAutomated safety check: PassMIT
Obsidian Enterprise Rbacjeremylongshore/tons-of-skills-marketplace2.8k—~2.4kAutomated safety check: PassMIT
Obsidian Rate Limitsjeremylongshore/tons-of-skills-marketplace2.8k—~2.4kAutomated safety check: PassMIT
Obsidian Webhooks Eventsjeremylongshore/tons-of-skills-marketplace2.8k—~3kAutomated safety check: PassMIT

Similar skills

  • Research

    thoreinstein/gemini-obsidian

    A skill your agent uses when the user asks a question about their vault, wants to explore a topic across notes, or says "research", "find out", "what do I know about", or "summarize my notes on".

    102 GitHub stars~352 tokensUpdated 2 mo ago
    Backend & APIsAuto-check passed
  • Obsidian REST API

    davepoon/buildwithclaude

    Call the Obsidian Local REST API directly (over HTTP) for vault operations the mcpobsidian tools do NOT expose — move/rename a note, overwrite a whole file atomically (PUT), act on the…

    3.6k GitHub stars~1k tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Obsidian Enterprise Rbac

    jeremylongshore/tons-of-skills-marketplace

    Implement team vault access patterns and role-based controls.

    2.8k GitHub stars~2.4k tokensUpdated today
    Backend & APIsAuto-check passed
  • Obsidian Rate Limits

    jeremylongshore/tons-of-skills-marketplace

    Handle Obsidian file system operations and throttling patterns.

    2.8k GitHub stars~2.4k tokensUpdated today
    Backend & APIsAuto-check passed
  • Obsidian Webhooks Events

    jeremylongshore/tons-of-skills-marketplace

    Handle Obsidian events and workspace callbacks for plugin development.

    2.8k GitHub stars~3k tokensUpdated today
    Backend & APIsAuto-check passed
  • Obsidian Cost Tuning

    jeremylongshore/tons-of-skills-marketplace

    Optimize Obsidian resource usage, sync storage, Publish hosting, and third-party plugin API costs.

    2.8k GitHub stars~3k tokensUpdated today
    Backend & APIsAuto-check passed

More from Atmosphere/atmosphere

All 20 skills in this repo
  • Obsidian Markdown

    Atmosphere/atmosphere

    Create and edit Obsidian Flavored Markdown with wikilinks, embeds, callouts, properties, and other Obsidian-specific syntax.

    3.8k GitHub starsUsed in 20 repos~1.3k tokens
    Auto-check passed
  • Obsidian CLI

    Atmosphere/atmosphere

    Interact with Obsidian vaults using the Obsidian CLI to read, create, search, and manage notes, tasks, properties, and more.

    3.8k GitHub starsUsed in 13 repos~795 tokens
    Auto-check passed
  • Release Sample Sweep

    Atmosphere/atmosphere

    Run the pre-release end-to-end sweep of every user-facing surface — the 33 samples under samples/ (booted from their packaged artifacts and driven in a real browser via chrome-devtools MCP), the…

    3.8k GitHub stars~4.2k tokensUpdated yesterday
    Auto-check passed
  • Obsidian Writer

    Atmosphere/atmosphere

    Write well-formatted notes to the atmosphere-vault Obsidian knowledge base.

    3.8k GitHub stars~2.6k tokensUpdated yesterday
    Auto-check passed
  • Carnet

    Atmosphere/atmosphere

    Work the private register (Atmosphere/atmosphere-carnet) from a session — claim an issue before touching it so peers see who holds it and which session, release or close it when done, file new…

    3.8k GitHub stars~4k tokensUpdated yesterday
    Auto-check passed
  • Obsidian Vault Setup

    Atmosphere/atmosphere

    A skill your agent uses when setting up the shared atmosphere-vault Obsidian vault on a new machine or for a new team member.

    3.8k GitHub stars~1.2k tokensUpdated yesterday
    Auto-check passed

Works with

Categories

Questions about Obsidian Bases

What does Obsidian Bases do?

Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries. Obsidian Bases is an agent skill from Atmosphere/atmosphere.base files) with views, filters, formulas, and summaries.

When should I use Obsidian Bases?

Obsidian Bases fits situations like: working with .base files; creating database-like views of notes; the user mentions Bases; formulas in Obsidian.

How do I install Obsidian Bases in Claude Code?

Run `npx skills add Atmosphere/atmosphere --skill obsidian-bases -a claude-code`. Or copy the skill folder (.claude/skills/obsidian-bases in Atmosphere/atmosphere) into .claude/skills/obsidian-bases in your project. Claude Code loads it when a task matches its description.

How do I install Obsidian Bases in Codex?

Run `npx skills add Atmosphere/atmosphere --skill obsidian-bases -a codex`. Or copy the skill folder (.claude/skills/obsidian-bases in Atmosphere/atmosphere) into .agents/skills/obsidian-bases in your project. Codex loads it when a task matches its description.

Can I use Obsidian Bases in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Atmosphere/atmosphere --skill obsidian-bases -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/obsidian-bases, .gemini/skills/obsidian-bases, .github/skills/obsidian-bases and .opencode/skills/obsidian-bases in your project.

What does Obsidian Bases need to run?

SKILL.md names no scripts, command-line tools or credentials: Obsidian Bases is instructions for the agent only.

Does Obsidian Bases access the network?

SKILL.md names 1 domain. As links in the text: help.obsidian.md. This is read from the text; nothing was executed.

Is Obsidian Bases safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Obsidian Bases use?

Obsidian Bases is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Obsidian Bases use?

About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.9k tokens, read only when the agent opens those files.

What are the alternatives to Obsidian Bases?

Skills that share tags, products or a category with Obsidian Bases: Research (thoreinstein/gemini-obsidian, 102 stars), Obsidian REST API (davepoon/buildwithclaude, 3.6k stars), Obsidian Enterprise Rbac (jeremylongshore/tons-of-skills-marketplace, 2.8k stars) and Obsidian Rate Limits (jeremylongshore/tons-of-skills-marketplace, 2.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Obsidian Bases?

Atmosphere (a GitHub organization) maintains it in Atmosphere/atmosphere, which has 3,819 GitHub stars. The repository holds 20 skills in this directory. The repository was last updated on October 9, 2026.

Source: Atmosphere/atmosphere on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.