dskarbrevik110 downloadsCreate dynamic dashboard visualizations from your markdown tables.
Create dynamic dashboard visualizations from your markdown tables. Progress bars, counters, streaks, and more — all powered by your existing data.
main.js, manifest.json, and styles.css from releases<vault>/.obsidian/plugins/table-dashboard/cd <vault>/.obsidian/plugins/
git clone <repo-url> table-dashboard
cd table-dashboard
npm install
npm run build
Visualize data from a table in the current file:
<!-- table-tag: weekly -->
| Activity | Done |
|----------|------|
| Exercise | ✓ |
| Reading | ✓ |
```table-dashboard
type: progress_bar
source: current-file
tableTag: weekly
keyColumn: Activity
key: Exercise
valueColumn: Done
value: "✓"
goal: 5
label: Weekly Exercise
```

Multiple trackers in one block with compact layout:
````table-dashboard
layout: compact-list
source: current-file
tableTag: weekly
type: progress_bar
keyColumn: Activity
key: Exercise
valueColumn: Done
value: "✓"
goal: 5
label: 🏋️ Exercise
---
type: counter
keyColumn: Activity
key: Reading
valueColumn: Done
value: "✓"
label: 📚 Reading
---
type: counter
keyColumn: Activity
key: Meditation
valueColumn: Done
value: "✓"
label: 🧘 Meditation

## Source Types
### Current File
Scan tables in the file containing the tracker block:
type: progress_bar
source: current-file
keyColumn: Activity
key: Exercise
valueColumn: Done
value: "✓"
label: Exercise Progress
### Specific File
Scan tables in a specific file (useful for dashboards):
type: progress_bar
source: file:Trackers/Monthly Habits.md
keyColumn: Activity
key: Exercise
valueColumn: Done
value: "✓"
goal: 20
label: Monthly Exercise
### Folder (Pattern Mode)
Scan multiple files in a folder, counting text pattern occurrences:
type: streak
source: folder:Daily Notes
pattern: "- [x] Meditation"
period: monthly
label: Meditation Streak
**Note:** For folder mode, filenames should include dates in `YYYY-MM-DD` format for period filtering and streak calculation.
## Table Mode
### Basic Structure
Tables require a **key column** (to identify rows) and a **value column** (to extract data):
```markdown
| Activity | Done |
|----------|------|
| Exercise | ✓ |
| Reading | ✓ |
```
type: counter
source: current-file
keyColumn: Activity
key: Exercise
valueColumn: Done
value: "✓"
label: Exercise Count
### Table Tagging
Filter which tables to scan using HTML comment tags:
```markdown
<!-- table-tag: weekly -->
| Activity | Done |
|----------|------|
| Exercise | ✓ |
<!-- table-tag: monthly -->
| Activity | Done |
|----------|------|
| Project | ✓ |
```
type: counter
source: current-file
tableTag: weekly
keyColumn: Activity
key: Exercise
valueColumn: Done
value: "✓"
label: Weekly Exercise
### Value Types
**Text matching** - count cells containing specific text:
```yaml
value: "✓" # Match checkmark
value: "done" # Match "done"
value: "yes" # Match "yes"
```
**Numeric** - extract and aggregate numbers:
```yaml
value: numeric
aggregate: sum # Sum all numbers
```
**Any** - count any non-empty cell:
```yaml
value: any
```
### Numeric Values
Sum numeric values from a table:
```markdown
<!-- table-tag: reps -->
| Activity | Reps |
|----------|------|
| Pushups | 25 |
| Situps | 30 |
```
type: counter
source: current-file
tableTag: reps
keyColumn: Activity
key: Pushups
valueColumn: Reps
value: numeric
aggregate: sum
label: Total Pushups
### Dynamic Goals
Extract goals from a table column:
```markdown
<!-- table-tag: goals -->
| Activity | Current | Goal |
|----------|---------|------|
| Running | 8 | 20 |
```
```table-dashboard
type: progress_bar
source: current-file
tableTag: goals
keyColumn: Activity
key: Running
valueColumn: Current
value: numeric
aggregate: sum
goalColumn: Goal
label: Running Progress
```

| Type | Description | Best For |
|---|---|---|
progress_bar |
Visual bar showing progress toward goal | Goal tracking |
counter |
Simple count display | Totals |
percentage |
Percentage of goal completed | Completion rates |
streak |
Consecutive days (folder mode) or count | Habit streaks |
line_plot |
Trend chart over time (folder mode) | Trends |
```table-dashboard
layout: grid
gridColumns: 2
source: current-file
tableTag: weekly
type: progress_bar
keyColumn: Activity
key: Exercise
valueColumn: Done
value: "✓"
goal: 5
label: Exercise
---
type: counter
keyColumn: Activity
key: Reading
valueColumn: Done
value: "✓"
label: Reading
```
```table-dashboard
layout: compact-list
source: current-file
tableTag: weekly
type: progress_bar
keyColumn: Activity
key: Exercise
valueColumn: Done
value: "✓"
goal: 5
label: Exercise
---
type: progress_bar
keyColumn: Activity
key: Reading
valueColumn: Done
value: "✓"
goal: 3
label: Reading
```
| Parameter | Description |
|---|---|
type |
Visualization: progress_bar, counter, percentage, streak, line_plot |
source |
Where to scan: current-file, file:<path>, or folder:<path> |
| Parameter | Required | Description |
|---|---|---|
keyColumn |
✅ | Column containing row identifiers |
valueColumn |
✅ | Column to read values from |
value |
✅ | What to match: numeric, any, or exact text like "✓" |
key |
❌ | Filter to rows containing this value in keyColumn |
tableTag |
❌ | Filter to tables with this HTML comment tag |
goalColumn |
❌ | Column to extract dynamic goal from |
aggregate |
❌ | How to combine values: count (default), sum, average, max, min |
| Parameter | Required | Description |
|---|---|---|
pattern |
✅ | Text to search for in file content |
useRegex |
❌ | Enable regex matching (default: false) |
| Parameter | Description |
|---|---|
goal |
Static goal number |
label |
Display label |
period |
Time filter (folder mode): daily, weekly, monthly, yearly, all-time |
Apply to entire dashboard (before first type:):
| Parameter | Description |
|---|---|
layout |
grid (default) or compact-list |
gridColumns |
Number of columns for grid layout |
source |
Default source for all widgets |
tableTag |
Default table tag for all widgets |
See examples/widget-screenshot-demo.md for ready-to-use templates.
When you misconfigure a widget, the plugin displays helpful error messages with guidance on how to fix the issue.
Example: Missing required fields
```table-dashboard
type: counter
source: current-file
keyColumn: Activity
```
This configuration is missing valueColumn and value, which are required for table mode. Instead of a cryptic error, you'll see:

The error display includes:
Tracker shows 0:
keyColumn matches your table header exactly (case-insensitive)key value exists in your tabletableTag: ensure the HTML comment is above the tablevalue matches what's in your cellsStreak shows 0:
Doesn't update:
Period filtering not working:
source: folder:...npm install
npm run dev # Watch mode
npm run build # Production
npm test # Run tests
MIT License - see LICENSE file for details.