kevinmcaleer254 downloadsCompose content from across your vault into a dashboard using a rows and columns layout, with charts, embeds, stats, and more.
Compose content from across your vault into a dashboard layout — charts, note embeds, stats, and link cards arranged in rows and columns, right inside a note.
dashboard code blockDrop a fenced code block with dashboard into any note:
```dashboard
title: Project overview
rows:
- height: 220
columns:
- width: 4
widget:
type: stat
label: Active projects
value: "12"
trend: +3
- width: 4
widget:
type: stat
label: Completed this week
value: "5"
trend: +2
- width: 4
widget:
type: stat
label: Blocked
value: "1"
trend: -1
- height: 360
columns:
- width: 6
widget:
type: chart
chart:
type: pie
sql: SELECT COUNT(*) FROM "Projects.base" GROUP BY status
title: Projects by status
- width: 6
widget:
type: chart
chart:
type: bar
sql: SELECT COUNT(*) FROM notes GROUP BY month(file.ctime) ORDER BY label asc
title: Notes per month
- columns:
- width: 12
widget:
type: embed
target: "[[Weekly summary]]"
```
Click the pencil icon in the top-right to switch to edit mode. You can then:
There's also a command — Dashboards: Insert layout — that drops a starter template at the cursor.
The Chart widget is the main reason this plugin exists. It has two modes:
The chart field takes the same YAML that Bases Chart accepts. Everything — type, sql, title, colors, dataLabels, height, fontSize, fontColor, etc. — flows through verbatim.
widget:
type: chart
chart:
type: bar
sql: SELECT COUNT(*) FROM "Todos.base" GROUP BY status
title: Todos by status
dataLabels: outside
showGridlines: false
Point at a note that contains a bases-chart fenced block. The dashboard renders that chart in place. Useful when you want a single source of truth for a chart and reuse it across multiple dashboards.
widget:
type: chart
source: "[[Charts/Project status]]"
The stat chart type is perfect for dashboard tiles — set height small and fontSize large for a clean KPI card:
widget:
type: chart
chart:
type: stat
title: Notes created today
sql: SELECT COUNT(*) WHERE day(file.ctime) = today() AS "Today" FROM notes
fontSize: 96
fontColor: "#4e79a7"
height: 180
Requires the Bases Chart plugin to be installed and enabled. The dashboard detects it automatically — charts render if it's present, and a helpful notice appears if it isn't.
Any markdown content — including wikilinks, embeds, tags, and fenced code blocks:
widget:
type: markdown
content: |
### Today's tasks
- [[Review PR]]
- [[Write docs]]
- #urgent Fix deploy pipeline
Either inline (chart:) or linked (source:). See Working with charts.
Transclude another note or section using Obsidian's native ![[...]] embed:
widget:
type: embed
target: "[[Weekly summary]]"
You can embed a whole note, a heading ([[Weekly summary#Highlights]]), or a block ([[Notes#^block-id]]).
Big-number KPI card with optional trend and icon — driven by the values you set (not a query). For SQL-driven stats, use the chart widget with type: stat instead.
widget:
type: stat
label: Active projects
value: "12"
trend: +3
icon: folder
Clickable card that opens the target note:
widget:
type: link
target: "[[Reading list]]"
description: My current reading queue
Section divider — useful at the start of a row to label what's below:
widget:
type: heading
text: This week
level: 2
width: 6 means the column takes half the row.width is omitted, columns auto-distribute evenly (12 / N columns).height is in pixels — omit for content-driven height.One-row KPI strip on top, a two-column analytics row, a full-width activity calendar below.
```dashboard
title: Daily driver
rows:
- height: 160
columns:
- widget:
type: chart
chart:
type: stat
sql: SELECT COUNT(*) WHERE day(file.ctime) = today() AS "Today" FROM notes
title: Created today
fontSize: 72
- widget:
type: chart
chart:
type: stat
sql: SELECT COUNT(*) WHERE file.mtime >= 1760000000000 AS "Recent" FROM notes
title: Modified (24h)
fontSize: 72
fontColor: "#f28e2b"
- widget:
type: chart
chart:
type: stat
sql: SELECT COUNT(*) AS "Notes" FROM notes
title: Total notes
fontSize: 72
fontColor: "#59a14f"
- height: 320
columns:
- width: 7
widget:
type: chart
chart:
type: bar
sql: SELECT COUNT(*) FROM notes GROUP BY month(file.ctime) ORDER BY label asc
title: Notes per month
dataLabels: top
- width: 5
widget:
type: chart
chart:
type: pie
sql: SELECT COUNT(*) FROM "Todos.base" GROUP BY status
title: Todos
- columns:
- widget:
type: chart
chart:
type: calendar
sql: SELECT COUNT(*) FROM notes
title: Note activity
```
title: Active projects
rows:
- columns:
- width: 4
widget:
type: link
target: "[[Project Alpha]]"
description: Shipping next week
- width: 4
widget:
type: link
target: "[[Project Beta]]"
description: In review
- width: 4
widget:
type: link
target: "[[Project Gamma]]"
description: Discovery phase
- height: 280
columns:
- widget:
type: embed
target: "[[Sprint notes]]"
Chart widgets require the Bases Chart plugin; install that too.
cd /path/to/vault/.obsidian/plugins
git clone https://github.com/kevinmcaleer/obsidian-dashboards.git dashboards
cd dashboards
npm install
npm run build
Restart Obsidian, then enable Dashboards in Settings → Community plugins.
Download main.js, manifest.json, and styles.css from the latest release, place them in .obsidian/plugins/dashboards/, restart Obsidian, and enable.
npm install
npm run dev # watch build with source maps
npm run build # production build
npm run lint # eslint
npm run release # bump version, tag, push (triggers GitHub release workflow)
MIT