Gallery › Vibe Tracks › Vibe Tracks feature board
Vibe Tracks feature board
Vibe Tracks' 76 feature notes on a kanban board: one column per vibe-status, in Vibe Tracks' own order, each with
its count. Drag a card to another column to propose a new status; drag a column header to reorder the columns, which
rewrites the view's groupOrder. The proof board groups by a derived property, so its cards stay put.
The .base file and its data
Every tab above is one entry of this file; the views read these rows. ⋯ in the toolbar copies the current view as YAML.
# Vibe Tracks' 76 feature notes on a board: columns are vibe-status in Vibe Tracks' own order, dragging a card
# proposes a new status, dragging a column rewrites groupOrder below. Obsidian Bases grammar (kanban since 1.14)
# plus data-ui's keys (docs/CONTRACT.md §5). Check it: node bin/data-ui.mjs check <this file> --data features.json
data: features.json
facets:
- status
- priority
- areas
- proof
views:
- type: kanban
name: By status
order: [title, id, priority, areas]
groupBy: { property: status }
groupOrder: [backlog, ready, running, waiting, review, frontier, done, archived]
columnWidth: 260
sort:
- { property: id, direction: ASC }
- type: kanban
name: By priority
order: [title, id, status, areas]
groupBy: { property: priority }
groupOrder: [high, medium, low]
columnWidth: 280
filters: 'status != "done" && status != "archived"'
sort:
- { property: id, direction: ASC }
- type: kanban
name: By proof (derived)
order: [title, id, status, commits, evidence]
groupBy: { property: proof }
groupOrder: [none, evidence, commits]
columnWidth: 300
sort:
- { property: commits, direction: DESC }
- type: table
name: Table
order: [id, title, status, priority, areas, proof, depends, evidence, commits, description]
groupBy: { property: status }
groupOrder: [backlog, ready, running, waiting, review, frontier, done, archived]
sort:
- { property: id, direction: ASC }
// features.json: 76 rows, 25 KB; the first 3
{
"id": "vibetracks-features",
"title": "Vibe Tracks features",
"titleProperty": "title",
"properties": {
"id": {
"type": "text",
"label": "ID"
},
"title": {
"type": "text",
"label": "Feature"
},
"status": {
"type": "text",
"label": "Status",
"facet": true
},
"priority": {
"type": "text",
"label": "Priority",
"facet": true,
"colors": {
"high": 8,
"medium": 4,
"low": 0
}
},
"areas": {
"type": "list",
"label": "Areas",
"facet": true
},
"description": {
"type": "text",
"label": "Description"
},
"depends": {
"type": "number",
"label": "Depends on",
"note": "notes this feature waits on"
},
"evidence": {
"type": "number",
"label": "Evidence",
"note": "evidence links in the note"
},
"commits": {
"type": "number",
"label": "Commits"
},
"proof": {
"type": "text",
"label": "Proof",
"facet": true,
"derived": "from the note's vibe-commits and vibe-evidence",
"colors": {
"commits": 3,
"evidence": 1,
"none": 0
}
}
},
"rows": [
{
"id": "VT-001",
"title": "File-first renderer V0",
"status": "done",
"priority": null,
"areas": [
"data",
"renderer",
"model"
],
"description": "Codex V0: Base-compatible loading, Graph/Kanban/Focus, fenced status writes, pyblocks example.",
"depends": 0,
"evidence": 0,
"commits": 1,
"proof": "commits"
},
{
"id": "VT-002",
"title": "Production refactor and dispatcher protocol",
"status": "done",
"priority": null,
"areas": [
"data",
"model",
"writes",
"agent",
"renderer"
],
"description": "Fable pass: modular backend, three fenced panel writes, area-catalog memory, init/new/status/comment CLI, /vibetracks skill for Claude and Codex, paper-minimal UI.",
"depends": 1,
"evidence": 0,
"commits": 3,
"proof": "commits"
},
{
"id": "VT-003",
"title": "Obsidian plugin wrapper",
"status": "archived",
"priority": null,
"areas": [
"obsidian"
],
"description": "Register vibetracks-graph/kanban/focus as custom Base views; write through processFrontMatter so live buffers are safe.",
"depends": 1,
"evidence": 0,
"commits": 0,
"proof": "none"
}
]
}README.md
# Vibe Tracks feature board
Vibe Tracks' 76 feature notes on a kanban board: one column per `vibe-status`, in Vibe Tracks' own order, each with
its count. Drag a card to another column to propose a new status; drag a column header to reorder the columns, which
rewrites the view's `groupOrder`. The proof board groups by a derived property, so its cards stay put.
- **App:** Vibe Tracks
- **Replaces:** the sunset Obsidian Vibe Kanban plugin's board (its `.base` files in Zach's vault now fall back to a
stock table grouped by a `formula.status` that hard-codes the column order) and the Board display of Vibe Tracks'
own home (VT-018), whose rule this board keeps: "derived columns still refuse drops: state is derived, never
claimed" (VT-025).
- **Shows:** `type: kanban` with Bases' `groupBy`, `groupOrder` (a named status with no features, `frontier`, is
still a column; a status the order does not name, `todo`, follows it) and `columnWidth`; a card drag as
`host.propose()`, which lands here because `site.json` makes the page `editable` (the edit lives in memory until
reload; a read-only page refuses it with its reason); a column drag as `host.setView({groupOrder})`; moving cards and columns from the
keyboard (Alt+←/→, or M for the Move menu); a derived group property (`proof`) locking the board.
- **Data:** `features.json`, written by `source/make.py` from `~/vibetracks/features/VT-*.md` front matter
(vibetracks @ 90b71b0). Feature notes carry no KPI figures.
The original UI it replaces
the sunset Obsidian Vibe Kanban plugin's board (its .base files in Zach's vault now fall back to a stock table grouped by a formula.status that hard-codes the column order) and the Board display of Vibe Tracks' own home (VT-018), whose rule this board keeps: "derived columns still refuse drops: state is derived, never claimed" (VT-025).
What it shows
type: kanban with Bases' groupBy, groupOrder (a named status with no features, frontier, is still a column; a status the order does not name, todo, follows it) and columnWidth; a card drag as host.propose(), which lands here because site.json makes the page editable (the edit lives in memory until reload; a read-only page refuses it with its reason); a column drag as host.setView({groupOrder}); moving cards and columns from the keyboard (Alt+←/→, or M for the Move menu); a derived group property (proof) locking the board.
Data
features.json, written by source/make.py from ~/vibetracks/features/VT-*.md front matter (vibetracks @ 90b71b0). Feature notes carry no KPI figures.