Tasks and projects
Markdown-native task management. One file per task, YAML frontmatter, threads as callouts, a generated dashboard.
Projects and tasks are files. There is no database to sync, nothing to export, and Obsidian renders all of it.
Projects
project create scaffolds projects/<slug>/ with a README and a tasks/ folder. The two-letter task prefix derives from the slug automatically. project archive retires one cleanly: moves the folder to the archive, strips references from active docs, banners the README, recompiles the index. project handoff <id> hands a task's work to the team: it drafts a GitHub issue on the repo the project's README names (issues_repo, plus optional issue_labels), opens it once you approve the draft, and links the task to it. The issue becomes the record of the work, and sync offers to close the task when the issue closes.
Tasks
Each task lives at projects/<slug>/tasks/<id>-<slug>.md:
---
schema: 1
id: bd-004
title: "Write blog post: Why Bun is a joy for local TS scripts"
type: task
status: open
priority: P2
project: blog-dev
assignee: [basem]
labels: []
created: 2026-04-21
updated: 2026-07-24
due:
horizon: 2026-W30
depends_on: []
---
## Description
...
## Checklist
- [ ] ...
## Thread
> [!quote] Basem · 2026-07-24
> Let's frame it around the postinstall story.
> [!info] Kevin · 2026-07-24
> Drafted an outline in the description.| Field | Values |
|---|---|
| ID | Two-letter project prefix plus a three-digit number. Globally unique. Kevin assigns them |
| Type | task · bug · idea · epic |
| Status | open · active · blocked · done · cancelled. Transitions are validated |
| Priority | P0 drop everything · P1 this week · P2 this sprint · P3 backlog |
| Horizon | The period the task is planned for: a day (2026-07-24), an ISO week (2026-W30), a month (2026-07), or later. Set it with today, week, next-week, month, or later; once the period ends the task reads as carried over. See Attention |
| Issue | The GitHub issue the task was handed off to, as its URL. Empty until a hand-off |
| Thread | Append-only. [!quote] for you, [!info] for Kevin, [!warning] for automated actions |
Closed tasks move to tasks/archive/ on the next sync so the active folder stays scannable.
Driving them
Inside a session, Kevin uses the task_* MCP tools (query, get, create, update, close, thread, scan). Outside a session, the same operations are on the CLI:
kevin task query --status=active
kevin task create --project=blog-dev --title="Draft launch post" --priority=P1
kevin task close bd-004In Claude Code, /done bd-004 closes a task without a model turn (after /done , the start of the id or a word of the title suggests the open and active tasks), and /today lists what's overdue and due today with the last sync. See Mods.
The dashboard file
projects/TASKS.md is generated from task frontmatter on every mutation: daily, weekly, monthly, and yearly goals at the top, then active tasks grouped by project, blocked, overdue, stale, and recently closed. It loads into every session, so Kevin always knows the board. Never edit it by hand.
The goals blocks come from the goals skill, one playbook per horizon (goals day, goals week, goals month, goals year). See Daily rhythm.