wiki-dashboard
Skill3 starsChanged 11 days agoMITView on GitHub
Create dynamic, queryable dashboard views of the Obsidian vault using Obsidian Bases or Dataview. Use this skill when the user says "create a dashboard", "vault dashboard", "show all X as a table", "dynamic view", "query my vault", "build a content index", "show me all concepts/entities/projects", or wants a structured, auto-updating view of their wiki content. Bases is native to Obsidian 1.8+ (no plugin needed). Dataview requires the community plugin.
- Reads credentials
2 other projects use a version of this, 2 of them edited.
Adopted by
Most recently taken up by
- Ar9av/obsidian-wikiedited, first seen Nov 8, 2026
- Ivy-Chen1999/llm-wiki-kitedited, first seen Jun 23, 2026
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 2
- Ar9av/obsidian-wiki★ 3.7k87% same
- Ivy-Chen1999/llm-wiki-kit★ 2119% same
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository30 other files it gives its agents.
- claude-history-ingestSkill
- cross-linkerSkill
- daily-updateSkill
- graph-colorizeSkill
- hermes-history-ingestSkill
- impl-validatorSkill
- llm-wikiSkill
- memory-bridgeSkill
- skill-creatorSkill
- tag-taxonomySkill
- vault-skill-factorySkill
- wiki-agentSkill
- wiki-captureSkill
- wiki-context-packSkill
- wiki-dedupSkill
- wiki-digestSkill
- wiki-exportSkill
- wiki-history-ingestSkill
- wiki-importSkill
- wiki-ingestSkill
- wiki-lintSkill
- wiki-querySkill
- wiki-rebuildSkill
- wiki-researchSkill
- wiki-setupSkill
- wiki-stage-commitSkill
- wiki-statusSkill
- wiki-switchSkill
- wiki-synthesizeSkill
- wiki-updateSkill
The file
We split this skill into the rules it gives an agent
12 rules. About 0 are common, 4 are distinctive, and 8 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 18
Read $OBSIDIAN_VAULT_PATH/index.md to understand what categories and pages exist.
- Distinctive: line 19
Ask the user what they want to view if not specified — folder, tag, category, date range?
- Distinctive: line 20
Ask if they have Dataview installed if you're unsure which tool to use.
- Very specific: line 62
Filters use expression strings, not typed objects: Always wrap in and:, or:, or not: — a bare list causes a "may only have one of …
- Very specific: line 152
When groupBy is set, omit that property from order: — it becomes the group header row and adding it as a column too causes duplication.
- Very specific: line 318
After GROUP BY, individual file properties must be prefixed with rows.
- Very specific: line 332
Avoid choice(updated, date(updated), file.mtime) — mixed date formats in updated frontmatter cause arithmetic errors.
- Very specific: line 381
Dataview: Write queries directly into any .md note.
- Very specific: line 390
Create _meta/ if it doesn't exist yet.
- Distinctive: line 401
Ask before modifying an existing note.
- Distinctive: line 410
No manifest or index update needed — dashboards are live queries, not static pages.
- Very specific: line 441
When it is set, read llm-wiki/references/qmd.md and follow the *Refresh* section after this skill has written vault markdown.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
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
- Resolve config — follow the Config Resolution Protocol in
llm-wiki/SKILL.md(inline@nameoverride → walk up CWD for.env→~/.llm-wiki/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
```dataview
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)
```dataview
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.
```dataview
TABLE WITHOUT ID
rows.file.link AS "Concept",
rows.summary AS "Summary"
FROM "concepts"
GROUP BY tags[0] AS "Domain"
```Stale pages — use file.mtime for date math
Avoid choice(updated, date(updated), file.mtime) — mixed date formats in updated frontmatter cause arithmetic errors. file.mtime is always a valid DateTime.
```dataview
TABLE WITHOUT ID
file.link AS "Page",
category AS "Type",
file.mtime AS "Last Modified",
(date(today) - file.mtime).days + " days" AS "Age"
FROM "concepts" OR "entities" OR "projects"
WHERE file.name != file.folder
WHERE (date(today) - file.mtime).days > 30
SORT (date(today) - file.mtime).days DESC
```Multi-folder query
```dataview
TABLE
summary AS "Summary",
file.mtime AS "Last Modified"
FROM "projects"
WHERE file.name != file.folder
SORT file.mtime DESC
```Dataview reference
| Clause | Usage |
FROM "folder" | All notes in folder |
FROM #tag | All notes with tag |
FROM "a" OR "b" | Union of two folders |
WHERE file.name != file.folder | Exclude folder index pages |
GROUP BY field AS "Label" | Group rows — use rows. for properties after this |
SORT field DESC | Sort direction |
file.link | Clickable wikilink |
file.mtime | Last modified time (always valid DateTime) |
(date(today) - file.mtime).days | Days since last modification |
Step 3: Write the File
Bases: Target path $OBSIDIAN_VAULT_PATH/_meta/<dashboard-name>.base
Dataview: Write queries directly into any .md note. A dedicated dashboard note at $OBSIDIAN_VAULT_PATH/_meta/dashboard.md works well for multi-section views.
Slug examples:
- "All concepts" →
_meta/concepts-index.base - "Recent ingests" →
_meta/recent-ingests.base - "Project overview" →
_meta/projects-overview.base - "Stale pages" →
_meta/stale-pages.base - "Full dashboard" →
_meta/dashboard.md
Create _meta/ if it doesn't exist yet.
Step 4: Embed Bases (optional)
To embed a .base inside a note:
## Entities
![[_meta/entities-tracker.base]]Ask before modifying an existing note.
Step 5: Update Tracking
Append to $OBSIDIAN_VAULT_PATH/log.md:
- [TIMESTAMP] WIKI_DASHBOARD name="<slug>" tool=bases|dataview view=<type> filter="<description>"No manifest or index update needed — dashboards are live queries, not static pages.
Common Dashboard Recipes
| Dashboard | Best tool | What it shows |
| Content index | Bases or Dataview | All pages grouped by category, sorted by updated |
| Entity tracker | Bases (cards) | Entity pages as a visual card gallery |
| Concepts by domain | Dataview | Concepts grouped by first tag using GROUP BY |
| Ingestion log | Either | Pages sorted by created date |
| Stale content | Dataview | Pages not touched in 30+ days with day count |
| Project overview | Either | Project pages with last-sync date |
| Research tracker | Dataview | Synthesis pages tagged research |
Quality Checklist
- Bases: filters use expression strings under
and:/or:/not:, never typed objects - Bases:
groupBygoes inside the view definition — not as a top-level key - Bases: column headers set via
properties: <name>: displayName: "...", notcolumns: [{title}] - Bases:
formulas:used for computed columns, referenced asformula.<name>in order/properties - Dataview: GROUP BY queries use
rows.propertynot bareproperty - Dataview: date arithmetic uses
file.mtime, notchoice(updated, ...) - File written to
_meta/with a descriptive slug log.mdupdated- User told how to embed Bases (
![[_meta/<name>.base]]) or open the dashboard note
QMD Refresh After Vault Writes
GUARD: If $QMD_WIKI_COLLECTION is unset — the default — skip this step. QMD is a
search index, not the source of truth.
When it is set, read llm-wiki/references/qmd.md and follow the Refresh section
after this skill has written vault markdown. If refresh fails, do not roll back the
vault changes; report the QMD status separately.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

