- Skill ID
- ar9av/obsidian-wiki/wiki-dashboard
- Publisher
- ar9av
- Repository
- obsidian-wiki
- Installs
- 0
- Files
- 1
- Synced
- Sep 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
ar9av/obsidian-wiki/wiki-dashboardInstalls these files- SKILL.md
What this skill tells the agent
Wiki Dashboard — Dynamic Vault Views
Two tools available: Obsidian Bases (native, GUI-driven, no plugin) and Dataview (community plugin, SQL-like, more powerful). Check which the user has and prefer Bases unless they ask for Dataview or need GROUP BY / computed columns.
Before You Start
Writing profile: Before drafting or rewriting natural-language Markdown, read and apply the Writing Profile Resolution section in llm-wiki/SKILL.md. Framework schema, provenance, safety, and operation-specific requirements take precedence. Apply WRITING.md preferences only to optional Markdown dashboard prose; .base syntax remains unchanged.
- Resolve config — follow the Config Resolution Protocol in
llm-wiki/SKILL.md(inline@nameoverride → walk up CWD for.env→ global config → prompt setup). This givesOBSIDIAN_VAULT_PATH. - Read
$OBSIDIAN_VAULT_PATH/index.mdto understand what categories and pages exist. - Ask the user what they want to view if not specified — folder, tag, category, date range?
- Ask if they have Dataview installed if you're unsure which tool to use.
Option A — Obsidian Bases (.base files)
Bases are YAML files that define live views over vault notes. Native to Obsidian 1.8+, no plugin needed.
Official canonical schema
Top-level keys:
filters: # Global filter applied to all views (expression strings under and/or/not)
formulas: # Named computed properties — referenced as formula.<name>
properties: # Display config per property — sets displayName for column headers
summaries: # Aggregation formulas (e.g. mean, sum)
views: # Array of view definitions (required)Each item in views::
views:
- type: table # table | list | cards | map
name: "View Name" # display label
limit: 50 # optional max rows
order: # column display order (list of property/formula names)
- file.name
- note.updated
groupBy: # grouping — goes INSIDE the view, NOT at top level
property: note.tags
direction: ASC # ASC | DESC
filters: # view-specific filter (merges with global filters)
and:
- 'note.status != "done"'
summaries:
formula.myFormula: AverageFilter syntax — CRITICAL
Filters use expression strings, not typed objects. Always wrap in and:, or:, or not: — a bare list causes a "may only have one of and/or/not keys" parse error.
# CORRECT
filters:
and:
- file.inFolder("concepts")
# WRONG — typed objects (parse error)
filters:
- type: folder
folder: conceptsFilters support nesting:
filters:
or:
- file.hasTag("book")
- and:
- file.inFolder("concepts")
- file.hasTag("research")
- not:
- file.hasTag("archived")Property name conventions
Different contexts use different naming — confirmed from Obsidian's auto-reformat behaviour:
| Context | Frontmatter field tags | File name | Formula |
|---|---|---|---|
properties: keys | note.tags | file.name | formula.<name> |
order: values | tags (bare) | file.name | formula.<name> |
groupBy.property: | tags (bare) | file.name | — |
filters: expressions | file.hasTag(...) / note.tags | file.name | formula.<name> |
formulas: expressions | note.tags, note.updated | file.name | — |
Basic table — folder filter
filters:
and:
- file.inFolder("concepts")
properties:
file.name:
displayName: Page
note.tags:
displayName: Tags
note.summary:
displayName: Summary
note.updated:
displayName: Updated
views:
- type: table
name: Table
order:
- file.name
- tags
- summary
- updatedCards view — folder filter
filters:
and:
- file.inFolder("entities")
properties:
file.name:
displayName: Entity
note.title:
displayName: Full Name
note.tags:
displayName: Tags
note.summary:
displayName: Summary
views:
- type: cards
name: Cards
order:
- file.name
- title
- tags
- summaryGroup by property — groupBy goes INSIDE the view
When groupBy is set, omit that property from `order:` — it becomes the group header row and adding it as a column too causes duplication.
filters:
and:
- file.inFolder("concepts")
properties:
file.name:
displayName: Concept
note.summary:
displayName: Summary
note.updated:
displayName: Updated
views:
- type: table
name: By Domain
groupBy:
property: tags # bare property name, no note. prefix
direction: ASC
order:
- file.name # do NOT include tags here — already the group header
- summary
- updatedTag filter
filters:
and:
- file.hasTag("machine-learning")
properties:
file.name:
displayName: Page
note.category:
displayName: Category
note.summary:
displayName: Summary
views:
- type: table
name: Table
order:
- file.name
- category
- summaryMulti-filter (folder AND tag)
filters:
and:
- file.inFolder("projects")
- file.hasTag("active")
properties:
file.name:
displayName: Project
note.summary:
displayName: Summary
note.updated:
displayName: Last Updated
views:
- type: cards
name: Cards
order:
- file.name
- summary
- updatedOR filter (two folders)
filters:
or:
- file.inFolder("concepts")
- file.inFolder("entities")
properties:
file.name:
displayName: Page
note.category:
displayName: Category
note.updated:
displayName: Updated
views:
- type: table
name: Table
order:
- file.name
- category
- updatedComputed column via formulas
filters:
and:
- file.inFolder("concepts")
formulas:
days_stale: "floor((now() - note.updated) / 86400000)"
properties:
file.name:
displayName: Page
note.updated:
displayName: Updated
formula.days_stale:
displayName: Days Stale
views:
- type: table
name: Stale
order:
- file.name
- updated
- formula.days_staleFilter expression reference
| Expression | What it does |
|---|---|
file.inFolder("path") | Pages in that folder |
file.hasTag("tag") | Pages with that tag (no # prefix) |
file.hasLink("Note Name") | Pages linking to a note |
file.name == "note-name" | Exact filename match |
file.ext == "md" | Filter by extension |
note.propertyName | Any frontmatter property |
formula.formulaName | A named formula result |
now() | Current timestamp in ms |
On Obsidian UI-generated format: When Obsidian's GUI writes or reformats a.basefile it may output a simplified shorthand with top-levelcolumns:,sort:, andview:keys instead of the canonical schema. That format also works — Obsidian accepts both. Manually authored files should use the canonical schema above.
Option B — Dataview (community plugin)
Dataview uses a SQL-like query language inside `dataview ` code blocks in any note. More powerful than Bases for computed columns, GROUP BY, and cross-folder queries.
Basic table — folder
TABLE tags AS "Tags", summary AS "Summary", file.mtime AS "Last Modified" FROM "concepts" SORT file.mtime DESC
Table with clickable links (TABLE WITHOUT ID)
TABLE WITHOUT ID file.link AS "Entity", tags AS "Tags", summary AS "Summary" FROM "entities" SORT file.name ASC
GROUP BY — use rows. prefix after grouping
After GROUP BY, individual file properties must be prefixed with rows. — otherwise the column is empty or errors.
TABLE WITHOUT ID rows.file.link AS "Concept", rows.summary AS "Summary" FROM "concepts"
More from ar9av
Use this skill in a project
Open any RiverX project, search the Skills panel for ar9av/obsidian-wiki/wiki-dashboard, and install it in one click.
