Kanban Markdown
Manage kanban board features stored as markdown files with YAML frontmatter. Each feature is a .md file; the VS Code kanban-markdown extension renders them as a board.
File Format
Every feature file follows this exact format:
---
id: "my-feature-2026-02-20"
status: "backlog"
priority: "medium"
assignee: null
dueDate: null
created: "2026-02-20T10:00:00.000Z"
modified: "2026-02-20T10:00:00.000Z"
completedAt: null
labels: []
order: "a0"
---
# My Feature
Description and details here.
Serialization rules (must match exactly for the extension to parse correctly):
- String fields: always
"double-quoted"
- Nullable fields (
assignee, dueDate, completedAt): bare null when unset
- Labels: inline array
["bug", "ui"] or []
- Order:
"double-quoted" string — fractional index for lexicographic sorting (see below)
- Field order:
id, status, priority, assignee, dueDate, created, modified, completedAt, labels, order
Valid values:
- status:
backlog | todo | in-progress | review | done
- priority:
critical | high | medium | low
For full field specs, see references/data-model.md.
Features Directory
Default: .devtool/features/ relative to workspace root. Configurable via VS Code setting kanban-markdown.featuresDirectory.
- Active features (backlog, todo, in-progress, review):
{featuresDir}/{id}.md
- Completed features (done):
{featuresDir}/done/{id}.md
Fractional Index Ordering
The order field uses fractional indexing — lexicographically sortable strings that allow inserting between any two items without reindexing. The extension uses the fractional-indexing npm package internally.
When creating features, determine the order by reading existing features in the target column (sorted by order):
- If the column is empty: use
"a0"
- To append after the last item: increment the trailing character —
"a0" → "a1", "a1" → "a2", ..., "a9" → "aA", etc.
- The full character sequence is
0-9, A-Z, a-z (base-62, ASCII order)
When moving features via drag-and-drop, the extension computes fractional keys between neighbors automatically. The skill only needs to handle appending new features to the end of a column.
Creating Features
- Generate ID: lowercase title, keep only
a-z 0-9 - space, replace spaces with -, collapse multiple -, trim - from ends, truncate to 50 chars, append -YYYY-MM-DD. If empty, use feature-YYYY-MM-DD.
- Set
created and modified to current ISO timestamp. Set order by reading existing features in the target column and generating a key that sorts after the last one (see Fractional Index Ordering above).
- If status is
done, set completedAt to now and place in done/ subfolder.
- Write frontmatter in exact field order above, then
# Title and body.
Updating Features
- Always update
modified to current ISO timestamp
- Never change
id or created
- Preserve exact serialization format
Moving Features
Update status and modified. When crossing the done boundary:
- To done: set
completedAt to current ISO timestamp, move file to done/ subfolder
- From done: set
completedAt to null, move file back to root
Writing Content
Start with # Title (the extension extracts the display title from the first # heading). Use acceptance criteria checklists, notes, etc. as needed.
1---2name: kanban-markdown3description: Create, read, update, move, and manage kanban board feature files backed by markdown with YAML frontmatter. Use when working with kanban boards, task/feature tracking, `.devtool/features/` directories, feature files with status/priority frontmatter, or any project management tasks involving markdown-based kanban workflows.4---56# Kanban Markdown78Manage kanban board features stored as markdown files with YAML frontmatter. Each feature is a `.md` file; the VS Code kanban-markdown extension renders them as a board.910## File Format1112Every feature file follows this exact format:1314```markdown15---16id: "my-feature-2026-02-20"17status: "backlog"18priority: "medium"19assignee: null20dueDate: null21created: "2026-02-20T10:00:00.000Z"22modified: "2026-02-20T10:00:00.000Z"23completedAt: null24labels: []25order: "a0"26---2728# My Feature2930Description and details here.31```3233**Serialization rules** (must match exactly for the extension to parse correctly):34- String fields: always `"double-quoted"`35- Nullable fields (`assignee`, `dueDate`, `completedAt`): bare `null` when unset36- Labels: inline array `["bug", "ui"]` or `[]`37- Order: `"double-quoted"` string — fractional index for lexicographic sorting (see below)38- Field order: `id`, `status`, `priority`, `assignee`, `dueDate`, `created`, `modified`, `completedAt`, `labels`, `order`3940**Valid values:**41- status: `backlog` | `todo` | `in-progress` | `review` | `done`42- priority: `critical` | `high` | `medium` | `low`4344For full field specs, see [references/data-model.md](references/data-model.md).4546## Features Directory4748Default: `.devtool/features/` relative to workspace root. Configurable via VS Code setting `kanban-markdown.featuresDirectory`.4950- Active features (backlog, todo, in-progress, review): `{featuresDir}/{id}.md`51- Completed features (done): `{featuresDir}/done/{id}.md`5253## Fractional Index Ordering5455The `order` field uses fractional indexing — lexicographically sortable strings that allow inserting between any two items without reindexing. The extension uses the `fractional-indexing` npm package internally.5657**When creating features**, determine the order by reading existing features in the target column (sorted by `order`):58- If the column is empty: use `"a0"`59- To append after the last item: increment the trailing character — `"a0"` → `"a1"`, `"a1"` → `"a2"`, ..., `"a9"` → `"aA"`, etc.60- The full character sequence is `0-9`, `A-Z`, `a-z` (base-62, ASCII order)6162When moving features via drag-and-drop, the extension computes fractional keys between neighbors automatically. The skill only needs to handle appending new features to the end of a column.6364## Creating Features65661. Generate ID: lowercase title, keep only `a-z 0-9 - space`, replace spaces with `-`, collapse multiple `-`, trim `-` from ends, truncate to 50 chars, append `-YYYY-MM-DD`. If empty, use `feature-YYYY-MM-DD`.672. Set `created` and `modified` to current ISO timestamp. Set `order` by reading existing features in the target column and generating a key that sorts after the last one (see Fractional Index Ordering above).683. If status is `done`, set `completedAt` to now and place in `done/` subfolder.694. Write frontmatter in exact field order above, then `# Title` and body.7071## Updating Features7273- Always update `modified` to current ISO timestamp74- Never change `id` or `created`75- Preserve exact serialization format7677## Moving Features7879Update `status` and `modified`. When crossing the done boundary:80- **To done**: set `completedAt` to current ISO timestamp, move file to `done/` subfolder81- **From done**: set `completedAt` to `null`, move file back to root8283## Writing Content8485Start with `# Title` (the extension extracts the display title from the first `# heading`). Use acceptance criteria checklists, notes, etc. as needed.