
Obsidian Bases
Look up Obsidian Bases formula and function syntax while building database-style views over your vault notes.
Overview
obsidian-bases is an agent skill most often used in Build (also Operate, Grow) that supplies Obsidian Bases function and type reference so agents write correct view formulas and filters.
Install
npx skills add https://github.com/kepano/obsidian-skills --skill obsidian-basesWhat is this skill?
- Global functions reference: date(), duration(), now(), today(), if(), min/max, link(), file(), list(), icon(), html()
- Any-type helpers: isTruthy(), isType(), toString() for Bases expressions
- Date fields and date functions for filtering and computed columns in Bases
- Formula-oriented reference aligned with Obsidian Bases (not general Markdown editing)
- Pairs with other Obsidian skills in kepano/obsidian-skills for vault automation workflows
Adoption & trust: 35.3k installs on skills.sh; 34.9k GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
You want database-style views in Obsidian but keep hitting invalid Bases functions or date syntax when your agent drafts formulas.
Who is it for?
Solo builders who already use Obsidian as a system of record and are configuring Bases views with computed columns or filters.
Skip if: Teams not using Obsidian, or users who only need plain Markdown notes with no Bases views.
When should I use this skill?
You are editing or generating Obsidian Bases formulas, filters, or function expressions.
What do I get? / Deliverables
Your agent outputs Bases-ready expressions using documented signatures and date fields instead of improvised pseudo-code.
- Valid Bases function snippets
- Filter and formula expressions for Base views
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Knowledge-base and Bases views are authored during product and documentation build, when solo builders structure notes as queryable tables. Bases function reference is documentation for note systems—canonical shelf is build → docs, not a shipping or growth tool.
Where it fits
Define a Base over project notes with rolling due-date columns using date() and if().
Adjust filter formulas when your task schema adds new frontmatter keys.
Build a content calendar Base with month/day fields for published posts.
How it compares
Reference skill for Bases formulas—not a full PKM methodology skill and not an MCP server for the vault.
Common Questions / FAQ
Who is obsidian-bases for?
Indie builders and knowledge workers who use Obsidian Bases and want Claude/Cursor agents to draft valid function calls and filters from a compact reference.
When should I use obsidian-bases?
During Build when structuring docs and dashboards in the vault, during Operate when tuning living indexes, and during Grow when extending content databases—whenever you edit Bases formulas.
Is obsidian-bases safe to install?
Review the Security Audits panel on this Prism page and the upstream kepano/obsidian-skills repo; the skill is reference text without mandated shell or network calls in the excerpt provided.
SKILL.md
READMESKILL.md - Obsidian Bases
# Functions Reference ## Global Functions | Function | Signature | Description | |----------|-----------|-------------| | `date()` | `date(string): date` | Parse string to date. Format: `YYYY-MM-DD HH:mm:ss` | | `duration()` | `duration(string): duration` | Parse duration string | | `now()` | `now(): date` | Current date and time | | `today()` | `today(): date` | Current date (time = 00:00:00) | | `if()` | `if(condition, trueResult, falseResult?)` | Conditional | | `min()` | `min(n1, n2, ...): number` | Smallest number | | `max()` | `max(n1, n2, ...): number` | Largest number | | `number()` | `number(any): number` | Convert to number | | `link()` | `link(path, display?): Link` | Create a link | | `list()` | `list(element): List` | Wrap in list if not already | | `file()` | `file(path): file` | Get file object | | `image()` | `image(path): image` | Create image for rendering | | `icon()` | `icon(name): icon` | Lucide icon by name | | `html()` | `html(string): html` | Render as HTML | | `escapeHTML()` | `escapeHTML(string): string` | Escape HTML characters | ## Any Type Functions | Function | Signature | Description | |----------|-----------|-------------| | `isTruthy()` | `any.isTruthy(): boolean` | Coerce to boolean | | `isType()` | `any.isType(type): boolean` | Check type | | `toString()` | `any.toString(): string` | Convert to string | ## Date Functions & Fields **Fields:** `date.year`, `date.month`, `date.day`, `date.hour`, `date.minute`, `date.second`, `date.millisecond` | Function | Signature | Description | |----------|-----------|-------------| | `date()` | `date.date(): date` | Remove time portion | | `format()` | `date.format(string): string` | Format with Moment.js pattern | | `time()` | `date.time(): string` | Get time as string | | `relative()` | `date.relative(): string` | Human-readable relative time | | `isEmpty()` | `date.isEmpty(): boolean` | Always false for dates | ## Duration Type When subtracting two dates, the result is a **Duration** type (not a number). Duration has its own properties and methods. **Duration Fields:** | Field | Type | Description | |-------|------|-------------| | `duration.days` | Number | Total days in duration | | `duration.hours` | Number | Total hours in duration | | `duration.minutes` | Number | Total minutes in duration | | `duration.seconds` | Number | Total seconds in duration | | `duration.milliseconds` | Number | Total milliseconds in duration | **IMPORTANT:** Duration does NOT support `.round()`, `.floor()`, `.ceil()` directly. You must 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 # CORRECT: Round the numeric result if needed "(date(due_date) - today()).days.round(0)" # Rounded days "(now() - file.ctime).hours.round(0)" # Rounded hours # 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 # Add/subtract durations "date + \"1M\"" # Add 1 month "date - \"2h\"" # Subtract 2 hours "now() + \"1 day\"" # Tomorrow "today() + \"7d\"" # A week from today # Subtract dates returns Duration type "now() - file.ctime" # Returns Duration "(now() - file.ctime).days" # Get days as number "(now() - file.ctime).hours" # Get hours as number # Complex duration arithmetic "now() + (duration('1d') * 2)" ``` ## String Functions **Field:** `string.length` | Function | Signature | Description | |----------|-----------|-------------| | `contains()` | `string.contains(value): boolean` | Check substring | | `containsA