jpskill.com
💬 コミュニケーション コミュニティ

wiki-dashboard

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.

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o wiki-dashboard.zip https://jpskill.com/download/22839.zip && unzip -o wiki-dashboard.zip && rm wiki-dashboard.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/22839.zip -OutFile "$d\wiki-dashboard.zip"; Expand-Archive "$d\wiki-dashboard.zip" -DestinationPath $d -Force; ri "$d\wiki-dashboard.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して wiki-dashboard.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → wiki-dashboard フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

[スキル名] wiki-dashboard

Wikiダッシュボード — 動的なVaultビュー

利用可能なツールは2つあります。Obsidian Bases (ネイティブ、GUI駆動、プラグイン不要) と Dataview (コミュニティプラグイン、SQLライク、より強力) です。ユーザーがどちらを持っているかを確認し、Dataviewを要求された場合や、GROUP BY / 算出列が必要な場合を除き、Basesを優先してください。

開始する前に

  1. 設定の解決llm-wiki/SKILL.md のConfig Resolution Protocolに従ってください (CWDを遡って.env~/.obsidian-wiki/config → プロンプト設定)。これにより OBSIDIAN_VAULT_PATH が得られます。
  2. $OBSIDIAN_VAULT_PATH/index.md を読んで、どのようなカテゴリとページが存在するかを理解してください。
  3. 指定されていない場合は、ユーザーに何を表示したいか尋ねてください — フォルダー、タグ、カテゴリ、日付範囲など。
  4. どちらのツールを使用すべきか不明な場合は、Dataviewがインストールされているかユーザーに尋ねてください。

オプションA — Obsidian Bases (.base ファイル)

Basesは、Vaultノートに対するライブビューを定義するYAMLファイルです。Obsidian 1.8以降にネイティブで、プラグインは不要です。

公式の正規スキーマ

トップレベルのキー:

filters:      # すべてのビューに適用されるグローバルフィルター (and/or/notの下の式文字列)
formulas:     # 名前付きの算出プロパティ — formula.<name>として参照
properties:   # プロパティごとの表示設定 — 列ヘッダーのdisplayNameを設定
summaries:    # 集計式 (例: mean, sum)
views:        # ビュー定義の配列 (必須)

views: 内の各項目:

views:
  - type: table          # table | list | cards | map
    name: "View Name"    # 表示ラベル
    limit: 50            # オプションの最大行数
    order:               # 列の表示順序 (プロパティ/式名のリスト)
      - file.name
      - note.updated
    groupBy:             # グループ化 — トップレベルではなく、ビューの内部に配置
      property: note.tags
      direction: ASC     # ASC | DESC
    filters:             # ビュー固有のフィルター (グローバルフィルターとマージされる)
      and:
        - 'note.status != "done"'
    summaries:
      formula.myFormula: Average

フィルター構文 — 非常に重要

フィルターは型付きオブジェクトではなく、式文字列を使用します。 常に and:, or:, または not: で囲んでください — 裸のリストは「may only have one of and/or/not keys」という解析エラーを引き起こします。

# 正しい
filters:
  and:
    - file.inFolder("concepts")

# 間違い — 型付きオブジェクト (解析エラー)
filters:
  - type: folder
    folder: concepts

フィルターはネストをサポートしています:

filters:
  or:
    - file.hasTag("book")
    - and:
        - file.inFolder("concepts")
        - file.hasTag("research")
    - not:
        - file.hasTag("archived")

プロパティ名の慣例

Obsidianの自動再フォーマット動作から確認された、異なるコンテキストでの異なる命名:

コンテキスト Frontmatterフィールド tags ファイル名 Formula
properties: キー note.tags file.name formula.<name>
order: tags (裸) file.name formula.<name>
groupBy.property: tags (裸) file.name
filters: file.hasTag(...) / note.tags file.name formula.<name>
formulas: note.tags, note.updated file.name

基本的なテーブル — フォルダーフィルター

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
      - updated

カードビュー — フォルダーフィルター

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
      - summary

プロパティによるグループ化 — groupBy はビューの内部に配置

groupBy が設定されている場合、そのプロパティを order: から除外してください — それはグループヘッダー行となり、列としても追加すると重複が発生します。

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        # 裸のプロパティ名、note.プレフィックスなし
      direction: ASC
    order:
      - file.name           # ここにtagsを含めないでください — すでにグループヘッダーです
      - summary
      - updated

タグフィルター

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
      - summary

複数フィルター (フォルダー AND タグ)

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
      - updated

ORフィルター (2つのフォルダー)

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
      - updated

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_stale

フィルター式リファレンス

動作
file.inFolder("

(原文がここで切り詰められています)

📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

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

  1. Resolve config — follow the Config Resolution Protocol in llm-wiki/SKILL.md (walk up CWD for .env~/.obsidian-wiki/config → prompt setup). This gives OBSIDIAN_VAULT_PATH.
  2. Read $OBSIDIAN_VAULT_PATH/index.md to understand what categories and pages exist.
  3. Ask the user what they want to view if not specified — folder, tag, category, date range?
  4. 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: Average

Filter 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: concepts

Filters 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
      - updated

Cards 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
      - summary

Group 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
      - updated

Tag 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
      - summary

Multi-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
      - updated

OR 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
      - updated

Computed 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_stale

Filter 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 .base file it may output a simplified shorthand with top-level columns:, sort:, and view: 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: groupBy goes inside the view definition — not as a top-level key
  • [ ] Bases: column headers set via properties: <name>: displayName: "...", not columns: [{title}]
  • [ ] Bases: formulas: used for computed columns, referenced as formula.<name> in order/properties
  • [ ] Dataview: GROUP BY queries use rows.property not bare property
  • [ ] Dataview: date arithmetic uses file.mtime, not choice(updated, ...)
  • [ ] File written to _meta/ with a descriptive slug
  • [ ] log.md updated
  • [ ] User told how to embed Bases (![[_meta/<name>.base]]) or open the dashboard note