Tasks, projects & contexts
The data model agents reason about.
Every task is a row in your SQLite database with typed fields. Agents don't parse markdown — they query columns.
Fields
| Field | Type | Notes |
|---|---|---|
id | uuid | Stable, survives rename |
title | text | Required |
context | enum | work / personal / learning / custom |
project | text? | Free-form; agents can create new projects |
priority | p1–p4 | p1 = today, p4 = someday |
energy | enum | high / med / low — used by Priority sort |
estimate | minutes? | Free-form natural-language input |
due | date? | Optional |
recurrence | rrule? | Standard iCal RRULE |
agent | text? | Name of an agent.config folder |
status | enum | open / running / done / cancelled |
notes | markdown | Free-form, supports wikilinks |
Projects
Projects are a string on the task, not a separate table. This is intentional — you can rename a project everywhere by running UPDATE tasks SET project = 'New' WHERE project = 'Old'; in the Qalatra SQL console. Your agent can do the same via mcp:rename_project.
Contexts
Contexts bring structure. The built-ins are work, personal, learning. Add your own in Settings → Contexts. Each context gets a color — used consistently across all views.
Priority sort
The Priority view sorts on a composite score:
score = priority_weight
+ overdue_days * 2
+ (due_today ? 10 : 0)
- (estimate_minutes / 60) * energy_mismatchYour agent can read and adjust priority based on context (e.g. bumping a task that's blocking a teammate).
Tags vs. projects vs. contexts
- Context = broad headspace (work / personal). One per task.
- Project = a named effort (Muzebook launch, Studio renovation). Optional.
- Tag = free-form labels. Many per task. Use sparingly.
If you find yourself wanting many tags, you probably want a project.