Awesome-omni-skills obsidian-bases
Obsidian Bases Skill workflow skill. Use this skill when the user needs 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 and the operator should preserve the upstream workflow, copied support files, and provenance before merging or handing off.
git clone https://github.com/diegosouzapw/awesome-omni-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/obsidian-bases" ~/.claude/skills/diegosouzapw-awesome-omni-skills-obsidian-bases && rm -rf "$T"
skills/obsidian-bases/SKILL.mdObsidian Bases Skill
Overview
This public intake copy packages
plugins/antigravity-awesome-skills-claude/skills/obsidian-bases from https://github.com/sickn33/antigravity-awesome-skills into the native Omni Skills editorial shape without hiding its origin.
Use it when the operator needs the upstream workflow, support files, and repository context to stay intact while the public validator and private enhancer continue their normal downstream flow.
This intake keeps the copied upstream files intact and uses
metadata.json plus ORIGIN.md as the provenance anchor for review.
Obsidian Bases Skill
Imported source sections that did not map cleanly to the public headings are still preserved below or in the support files. Notable imported sections: Schema, Filter Syntax, Properties, Formula Syntax, Key Functions, View Types.
When to Use This Skill
Use this section as the trigger filter. It should make the activation boundary explicit before the operator loads files, runs commands, or opens a pull request.
- Use when creating or editing .base files in Obsidian.
- Use for database-like note views with filters, formulas, summaries, or cards/tables.
- Use when the user asks about Obsidian Bases specifically.
- Use when the request clearly matches the imported source intent: 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....
- Use when the operator should preserve upstream workflow detail instead of rewriting the process from scratch.
- Use when provenance needs to stay visible in the answer, PR, or review packet.
Operating Table
| Situation | Start here | Why it matters |
|---|---|---|
| First-time use | | Confirms repository, branch, commit, and imported path before touching the copied workflow |
| Provenance review | | Gives reviewers a plain-language audit trail for the imported source |
| Workflow execution | | Starts with the smallest copied file that materially changes execution |
| Supporting context | | Adds the next most relevant copied source file without loading the entire package |
| Handoff decision | | Helps the operator switch to a stronger native skill when the task drifts |
Workflow
This workflow is intentionally editorial and operational at the same time. It keeps the imported source useful to the operator while still satisfying the public intake standards that feed the downstream enhancer flow.
- Create the file: Create a .base file in the vault with valid YAML content
- Define scope: Add filters to select which notes appear (by tag, folder, property, or date)
- Add formulas (optional): Define computed properties in the formulas section
- Configure views: Add one or more views (table, cards, list, or map) with order specifying which properties to display
- 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
- 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
- Confirm the user goal, the scope of the imported workflow, and whether this skill is still the right router for the task.
Imported Workflow Notes
Imported: Workflow
- Create the file: Create a
file in the vault with valid YAML content.base - Define scope: Add
to select which notes appear (by tag, folder, property, or date)filters - Add formulas (optional): Define computed properties in the
sectionformulas - Configure views: Add one or more views (
,table
,cards
, orlist
) withmap
specifying which properties to displayorder - 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
without definingformula.X
inXformulas - Test in Obsidian: Open the
file in Obsidian to confirm the view renders correctly. If it shows a YAML error, check quoting rules below.base
Imported: Schema
Base files use the
.base extension and contain valid 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
Examples
Example 1: Ask for the upstream workflow directly
Use @obsidian-bases to handle <task>. Start from the copied upstream workflow, load only the files that change the outcome, and keep provenance visible in the answer.
Explanation: This is the safest starting point when the operator needs the imported workflow, but not the entire repository.
Example 2: Ask for a provenance-grounded review
Review @obsidian-bases against metadata.json and ORIGIN.md, then explain which copied upstream files you would load first and why.
Explanation: Use this before review or troubleshooting when you need a precise, auditable explanation of origin and file selection.
Example 3: Narrow the copied support files before execution
Use @obsidian-bases for <task>. Load only the copied references, examples, or scripts that change the outcome, and name the files explicitly before proceeding.
Explanation: This keeps the skill aligned with progressive disclosure instead of loading the whole copied package by default.
Example 4: Build a reviewer packet
Review @obsidian-bases using the copied upstream files plus provenance, then summarize any gaps before merge.
Explanation: This is useful when the PR is waiting for human review and you want a repeatable audit packet.
Imported Usage Notes
Imported: 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_date
Reading 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_time
Daily 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.mtime
Best Practices
Treat the generated public skill as a reviewable packaging layer around the upstream repository. The goal is to keep provenance explicit and load only the copied source material that materially improves execution.
- 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
- Keep the imported skill grounded in the upstream repository; do not invent steps that the source material cannot support.
- Prefer the smallest useful set of support files so the workflow stays auditable and fast to review.
- Keep provenance, source commit, and imported file paths visible in notes and PR descriptions.
- Point directly at the copied upstream files that justify the workflow instead of relying on generic review boilerplate.
Imported Operating Notes
Imported: 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
Problem: The operator skipped the imported context and answered too generically
Symptoms: The result ignores the upstream workflow in
plugins/antigravity-awesome-skills-claude/skills/obsidian-bases, fails to mention provenance, or does not use any copied source files at all.
Solution: Re-open metadata.json, ORIGIN.md, and the most relevant copied upstream files. Load only the files that materially change the answer, then restate the provenance before continuing.
Problem: The imported workflow feels incomplete during review
Symptoms: Reviewers can see the generated
SKILL.md, but they cannot quickly tell which references, examples, or scripts matter for the current task.
Solution: Point at the exact copied references, examples, scripts, or assets that justify the path you took. If the gap is still real, record it in the PR instead of hiding it.
Problem: The task drifted into a different specialization
Symptoms: The imported skill starts in the right place, but the work turns into debugging, architecture, design, security, or release orchestration that a native skill handles better. Solution: Use the related skills section to hand off deliberately. Keep the imported provenance visible so the next skill inherits the right context instead of starting blind.
Imported Troubleshooting Notes
Imported: Troubleshooting
YAML Syntax Errors
Unquoted special characters: Strings containing
:, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, ` must be quoted.
# 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.
# 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.
# 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.
# 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.
# This will fail silently if 'total' is not defined in formulas order: - formula.total # Fix: define it formulas: total: "price * quantity"
Related Skills
- Use when the work is better handled by that native specialization after this imported skill establishes context.@monte-carlo-monitor-creation
- Use when the work is better handled by that native specialization after this imported skill establishes context.@monte-carlo-prevent
- Use when the work is better handled by that native specialization after this imported skill establishes context.@monte-carlo-push-ingestion
- Use when the work is better handled by that native specialization after this imported skill establishes context.@monte-carlo-validation-notebook
Additional Resources
Use this support matrix and the linked files below as the operator packet for this imported skill. They should reflect real copied source material, not generic scaffolding.
| Resource family | What it gives the reviewer | Example path |
|---|---|---|
| copied reference notes, guides, or background material from upstream | |
| worked examples or reusable prompts copied from upstream | |
| upstream helper scripts that change execution or validation | |
| routing or delegation notes that are genuinely part of the imported package | |
| supporting assets or schemas copied from the source package | |
Imported Reference Notes
Imported: References
Imported: Filter Syntax
Filters narrow down results. They can be applied globally or per-view.
Filter Structure
# 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
| Operator | Description |
|---|---|
| equals |
| not equal |
| greater than |
| less than |
| greater than or equal |
| less than or equal |
| logical and |
| logical or |
| <code>!</code> | logical not |
Imported: Properties
Three Types of Properties
- Note properties - From frontmatter:
or justnote.authorauthor - File properties - File metadata:
,file.name
, etc.file.mtime - Formula properties - Computed values:
formula.my_formula
File Properties Reference
| Property | Type | Description |
|---|---|---|
| String | File name |
| String | File name without extension |
| String | Full path to file |
| String | Parent folder path |
| String | File extension |
| Number | File size in bytes |
| Date | Created time |
| Date | Modified time |
| List | All tags in file |
| List | Internal links in file |
| List | Files linking to this file |
| List | Embeds in the note |
| Object | All frontmatter properties |
The this
Keyword
this- 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
Imported: Formula Syntax
Formulas compute values from properties. Defined in the
formulas section.
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, "")'
Imported: 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.
| Function | Signature | Description |
|---|---|---|
| | Parse string to date () |
| | Current date and time |
| | Current date (time = 00:00:00) |
| | Conditional |
| | Parse duration string |
| | Get file object |
| | Create a link |
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.
# 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
# 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
Imported: View Types
Table View
views: - type: table name: "My Table" order: - file.name - status - due_date summaries: price: Sum count: Average
Cards View
views: - type: cards name: "Gallery" order: - file.name - cover_image - description
List View
views: - type: list name: "Simple List" order: - file.name - status
Map View
Requires latitude/longitude properties and the Maps community plugin.
views: - type: map name: "Locations" # Map-specific settings for lat/lng properties
Imported: Default Summary Formulas
| Name | Input Type | Description |
|---|---|---|
| Number | Mathematical mean |
| Number | Smallest number |
| Number | Largest number |
| Number | Sum of all numbers |
| Number | Max - Min |
| Number | Mathematical median |
| Number | Standard deviation |
| Date | Earliest date |
| Date | Latest date |
| Date | Latest - Earliest |
| Boolean | Count of true values |
| Boolean | Count of false values |
| Any | Count of empty values |
| Any | Count of non-empty values |
| Any | Count of unique values |
Imported: Embedding Bases
Embed in Markdown files:
![[MyBase.base]] <!-- Specific view --> ![[MyBase.base#View Name]]
Imported: Limitations
- 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.