obsidian-bases – Writing & Content skill for AI agents
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.
Install the obsidian-bases skill with one command
Pick the tool you use, copy the command and paste it in your terminal. The skill lands in that tool's skills folder and is ready in your next session.
Claude Code
mkdir -p ~/.claude/skills && curl -fsSL https://skill.dn1nguoi.com/z/obsidian-bases-feb1f.tgz | tar xz -C ~/.claude/skills
Call it in Claude Code: /obsidian-bases – then describe the task you want done.
Codex
mkdir -p ~/.codex/skills && curl -fsSL https://skill.dn1nguoi.com/z/obsidian-bases-feb1f.tgz | tar xz -C ~/.codex/skills
Call it in Codex: $obsidian-bases – then describe the task you want done.
Hermes Agent
mkdir -p ~/.hermes/skills && curl -fsSL https://skill.dn1nguoi.com/z/obsidian-bases-feb1f.tgz | tar xz -C ~/.hermes/skills
Call it in Hermes Agent: /obsidian-bases – then describe the task you want done.
DeepSeek
mkdir -p ~/.deepcode/skills && curl -fsSL https://skill.dn1nguoi.com/z/obsidian-bases-feb1f.tgz | tar xz -C ~/.deepcode/skills
Call it in DeepSeek: /obsidian-bases – then describe the task you want done.
SKILL.md content
Obsidian Bases Skill
Detailed Guide
Read [the detailed guide](references/detailed-guide.md) before executing this skill. It retains the complete procedure and reference material. Treat its safety, prerequisites, and validation requirements as mandatory. For focused work, load the relevant sections; for end-to-end work, read the guide completely.
When to Use
- Use when creating or editing
.basefiles in Obsidian. - Use for database-like note views with filters, formulas, summaries, or cards/tables.
- Use when the user asks about Obsidian Bases specifically.
Complete Examples
Task Tracker Base
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_dateReading List Base
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_timeDaily Notes Index
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.mtimeLimitations
- Use this skill only when the task clearly matches the scope described above.
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.
Scope and data limitations
Use a copy or preview before replacing an existing Base. Global filters select data for a view; they are not access controls, and a view limit is not a retention or privacy boundary. YAML parsing alone does not validate the Obsidian expression language or plugin availability. Match view types/functions to the installed version and verify representative missing, zero, malformed and timezone-sensitive dates in Obsidian. The reading-time and byte-based word estimates are rough display heuristics, not measured counts. Escape untrusted strings before rendering HTML and avoid remote images/URLs for private notes without approval. A Base configures presentation and formulas; it does not enforce required fields or database constraints.
Related skills
- obsidian-clipper-template-creator – Guide for creating templates for the Obsidian Web Clipper. Use when you want to create a…
- odoo-orm-expert – Master Odoo ORM patterns: search, browse, create, write, domain filters, computed…
- odoo-performance-tuner – Expert guide for diagnosing and fixing Odoo performance issues: slow queries, worker…
- odoo-upgrade-advisor – Step-by-step Odoo version upgrade advisor: pre-upgrade checklist, community vs…
- onboarding – When the user wants to optimize post-signup onboarding, user activation, first-run…
- php-pro – Write idiomatic PHP code with generators, iterators, SPL data structures, and modern OOP…
- plan-writing – Structured task planning with clear breakdowns, dependencies, and verification criteria…
- podcast-generation – Generate real audio narratives from text content using Azure OpenAI's Realtime API.