obsidian-bases
Create and configure Obsidian Bases — database-like views of notes. Activate this skill when users want to create bases, write filters, formulas, or set up table/cards/list/map views.
Best use case
obsidian-bases is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Create and configure Obsidian Bases — database-like views of notes. Activate this skill when users want to create bases, write filters, formulas, or set up table/cards/list/map views.
Teams using obsidian-bases should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/obsidian-bases/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How obsidian-bases Compares
| Feature / Agent | obsidian-bases | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Create and configure Obsidian Bases — database-like views of notes. Activate this skill when users want to create bases, write filters, formulas, or set up table/cards/list/map views.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Obsidian Bases
Bases is a core Obsidian plugin that creates database-like views of notes. A base can display, edit, sort, and filter files and their properties using table, cards, list, or map views.
All data lives in local Markdown files and their properties. Views are described by Bases syntax (YAML), saved as `.base` files or embedded in code blocks.
## Creating a Base
**As a file:** Command palette → `Bases: Create new base`, or right-click a folder → `New base`.
**Embedded in a note:** Use a `base` code block:
````
```base
filters:
and:
- file.hasTag("example")
views:
- type: table
name: Table
```
````
**Embed an existing base:** `![[File.base]]` or `![[File.base#ViewName]]`.
**Important:** Embedded base code blocks only render in Reading view or Live Preview mode. They appear as raw YAML in Source mode. After creating an embedded base, let the user know they may need to switch to Reading view to see it rendered.
## Bases Syntax (YAML)
A base file has these top-level sections, all optional:
```yaml
filters: # Global filters applied to all views
formulas: # Calculated properties
properties: # Display configuration (e.g., column headers)
summaries: # Custom summary formulas
views: # One or more view definitions
```
### Filters
By default a base includes every file in the vault. Filters narrow the dataset.
Filters can be applied globally (all views) or per-view. Both use the same syntax and are combined with AND when both are present.
```yaml
filters:
and:
- file.hasTag("project")
- 'status != "done"'
or:
- file.inFolder("Work")
- file.inFolder("Personal")
not:
- file.hasTag("archived")
```
Filter statements are strings that evaluate to true/false using comparison operators or functions.
### Formulas
Calculated properties defined in the base:
```yaml
formulas:
total_cost: 'price * quantity'
formatted_price: 'if(price, "$" + price.toFixed(2), "")'
deadline: 'start_date + "2w"'
overdue: 'if(due_date < now() && status != "Done", "Overdue", "")'
```
Formula values are YAML strings. Use nested quotes for text literals.
### Property References
- **Note properties** (frontmatter): `price`, `status`, or `note.price`
- **File properties** (built-in): `file.name`, `file.size`, `file.mtime`, `file.ctime`, `file.ext`, `file.folder`, `file.tags`, `file.links`
- **Formula properties**: `formula.total_cost`
- **`this`**: refers to the base file itself, the embedding file, or the active file (in sidebar)
### Properties Section
Configure display names for columns:
```yaml
properties:
status:
displayName: Status
formula.total_cost:
displayName: 'Total Cost'
```
### Views Section
```yaml
views:
- type: table # table, cards, list, map
name: 'My Table'
limit: 10
filters: # view-specific filters
and:
- 'status != "done"'
order: # column/property order
- file.name
- note.status
- formula.total_cost
sort: # sort rows (list of property + direction)
- property: file.mtime
direction: DESC
groupBy: # group rows by a property
property: note.status
direction: ASC # or DESC
summaries:
formula.total_cost: Sum
```
**Sorting:** Use `sort` (NOT `sorts`) — a list of objects with `property` and `direction` (ASC/DESC). Supports multiple sort criteria. `groupBy` is separate and controls row grouping.
### Summaries
Built-in summaries: Average, Min, Max, Sum, Range, Median, Stddev (numbers); Earliest, Latest, Range (dates); Checked, Unchecked (booleans); Empty, Filled, Unique (any type).
Custom summaries use the `values` keyword (list of all values for that property):
```yaml
summaries:
weighted_avg: 'values.mean().round(3)'
```
## Operators
### Arithmetic
`+`, `-`, `*`, `/`, `%`, `( )`
### Comparison
`==`, `!=`, `>`, `<`, `>=`, `<=`
### Boolean
`!` (not), `&&` (and), `||` (or)
### Date Arithmetic
Add/subtract durations: `date + "1M"`, `date - "2h"`, `now() + "7d"`
Duration units: `y`/`year`/`years`, `M`/`month`/`months`, `d`/`day`/`days`, `w`/`week`/`weeks`, `h`/`hour`/`hours`, `m`/`minute`/`minutes`, `s`/`second`/`seconds`
Subtracting two dates returns milliseconds.
## Key Functions
### Global
- `now()` — current datetime
- `today()` — current date (time zeroed)
- `date("YYYY-MM-DD HH:mm:ss")` — parse date
- `if(condition, trueResult, falseResult?)` — conditional
- `link(path, display?)` — create link
- `image(path)` — render image
- `icon(name)` — render Lucide icon
- `list(element)` — wrap in list
- `min(a, b, ...)`, `max(a, b, ...)` — numeric min/max
- `number(input)` — convert to number
- `duration(value)` — parse duration string
- `html(string)` — render HTML
### Date Methods
- `.format("YYYY-MM-DD")` — format date (Moment.js syntax)
- `.date()` — strip time portion
- `.time()` — get time string
- `.relative()` — human-readable relative time (e.g., "3 days ago")
- `.year`, `.month`, `.day`, `.hour`, `.minute`, `.second` — date fields
### String Methods
- `.contains(value)`, `.containsAll(...)`, `.containsAny(...)`
- `.startsWith(q)`, `.endsWith(q)`
- `.lower()`, `.title()`, `.trim()`
- `.replace(pattern, replacement)` — supports regex
- `.split(separator, limit?)`, `.slice(start, end?)`
- `.length` — character count
- `.isEmpty()`
### Number Methods
- `.round(digits?)`, `.ceil()`, `.floor()`, `.abs()`
- `.toFixed(precision)` — returns string
- `.isEmpty()`
### List Methods
- `.contains(value)`, `.containsAll(...)`, `.containsAny(...)`
- `.filter(value > 2)` — uses `value` and `index` variables
- `.map(value + 1)` — transform elements
- `.reduce(acc + value, 0)` — reduce to single value
- `.sort()`, `.reverse()`, `.unique()`, `.flat()`
- `.join(separator)`, `.slice(start, end?)`
- `.length`, `.isEmpty()`
### File Methods
- `file.hasTag("tag1", "tag2")` — has any of the tags
- `file.inFolder("folder")` — in folder or subfolders
- `file.hasLink(otherFile)` — links to file
- `file.hasProperty("name")` — has frontmatter property
- `file.asLink(display?)` — convert to link
## View Types
### Table
Rows = files, columns = properties. Supports summaries, grouping, sorting, keyboard shortcuts (Ctrl+C/V, Tab navigation, Enter to edit).
### Cards
Grid layout with optional cover images. Settings: card size, image property (link, URL, or hex color), image fit (cover/contain), aspect ratio.
### List
Bulleted, numbered, or plain list. Can indent properties under primary item or use separators.
### Map
Interactive map with markers. Requires the Maps plugin (Obsidian 1.10+). Coordinates stored as `"lat, lng"` text or `[lat, lng]` list. Supports custom marker icons (Lucide names) and colors (hex, RGB, CSS).
## Common Patterns
**Task tracker:**
```yaml
filters:
and:
- file.hasTag("task")
formulas:
overdue: 'if(due_date < today() && status != "Done", "Overdue", "")'
views:
- type: table
name: Tasks
groupBy:
property: note.status
direction: ASC
```
**Reading list:**
```yaml
filters:
and:
- file.hasTag("book")
views:
- type: cards
name: Library
```
**Project dashboard:**
```yaml
filters:
and:
- file.inFolder("Projects")
formulas:
days_left: 'if(deadline, (deadline - today()) / 86400000, "")'
views:
- type: table
name: Projects
summaries:
note.budget: Sum
```
## Tips
- Formula properties can reference other formulas (no circular references)
- Use `file.hasTag()` and `file.inFolder()` as primary filters
- Embed bases in daily notes using `this` to create context-aware views
- Export views as CSV for spreadsheet use
- Properties edited in table view update the note's frontmatter directlyRelated Skills
obsidian-properties
Work with Obsidian note properties (frontmatter). Activate this skill when users want to add, modify, or organize properties, understand property types, format YAML frontmatter, or use properties with templates, search, or Bases.
obsidian-plugin-development
Build, modify, and debug Obsidian plugins using the TypeScript API. Use this skill when working with Obsidian plugin source code, the obsidian npm package, plugin UI (views, modals, settings, commands, ribbons), vault file operations, editor manipulation, workspace management, metadata cache, events, markdown rendering, or the Obsidian CLI. Covers plugin lifecycle, best practices, common patterns, and the full TypeScript API surface.
obsidian-cli
Use the Obsidian CLI to debug, inspect, and test Obsidian plugins during development. Covers plugin reloading, console inspection, runtime evaluation, and common debugging recipes for the gemini-scribe plugin.
vault-semantic-search
Search vault notes by meaning using semantic search (RAG). Activate this skill when users want to find notes by concept or topic rather than exact keywords, or when keyword search tools return poor results.
recall-sessions
Search past agent conversations to recall prior discussions, decisions, and context. Activate this skill when users ask about previous conversations, want to resume past work, or reference earlier decisions.
image-generation
Generate images from text descriptions and save them to the vault. Activate this skill when users want to create illustrations, diagrams, visual content, or any AI-generated images.
gemini-scribe-help
Answer questions about Gemini Scribe plugin features, settings, and usage. Activate this skill when users ask how to use the plugin, configure settings, or troubleshoot issues.
deep-research
Conduct comprehensive, multi-source research and generate cited reports. Activate this skill when users want in-depth research on a topic, need synthesis across web and vault sources, or want a structured research report saved to their vault.
audio-transcription
Transcribe audio and video files into structured notes. Activate this skill when users want to transcribe recordings, meetings, podcasts, voice memos, or any audio/video content in their vault.
ui-ux-guidelines
UI/UX best practices for obsidian-gemini plugin development. Covers modal sizing, text overflow, message formatting, collapsible UI, animations, icons, file chips, session state, CSS containment, and theme compatibility. Use this skill when building or modifying UI components.
release-process
Full release workflow for obsidian-gemini: update release notes, run checks, bump version with npm, create a GitHub release, and verify. Use this skill when preparing a new plugin release.
gemini-api-dev
Use this skill when building applications with Gemini models, Gemini API, working with multimodal content (text, images, audio, video), implementing function calling, using structured outputs, or needing current model specifications. Covers SDK usage (google-genai for Python, @google/genai for JavaScript/TypeScript, com.google.genai:google-genai for Java, google.golang.org/genai for Go), model selection, and API capabilities.