The six kinds at a glance
| Kind | ID prefix | Recurs? | Special flags | Done means… |
|---|---|---|---|---|
todo | t- | Optional | --due, --estimate | Completed (or spawns a copy if recurring) |
chore | c- | Required | --every, --last-done, --estimate | Never “done” — rolls forward |
task | k- | Optional | --project, --feature, --estimate | Completed inside its project |
gift | s- | Optional | --for, --occasion, --budget, --url | Given (two-stage: bought → given) |
shopping | s- | Optional | --budget, --url | Purchased |
grocery | g- | Optional | store via --tags | Picked up |
gift and shopping share the s- ID prefix and the same ordering pool, which is why track rank shopping reorders both together.todo
A todo is the most general item kind: a one-off task you want to get done. You can optionally give it a due date, a priority, tags, notes, a time estimate, and a recurrence interval. Without--every it sits in your list until you mark it done. With --every it becomes a self-renewing commitment — marking it done spawns a fresh copy due one interval later (see Recurrence).
Common flags: --due, --priority / -p (1–5), --tags, --notes, --estimate, --every
chore
A chore models a task you repeat forever without ever truly finishing — vacuuming the car, replacing an HVAC filter, watering the plants. Instead of being marked done, a chore’s effective next-due date is calculated from the last completion date plus the recurrence interval. You confirm you did it by runningtrack done <id>, which records today as the completion date. The same chore persists indefinitely; no completion history accumulates.
--every is required when adding a chore.
Common flags: --every, --last-done, --priority / -p, --tags, --notes, --estimate
task
A task is a todo that lives inside a project. It must be attached to a project with--project <slug>, and can optionally be scoped to a specific feature within an engineering project using --feature <feature-id>. Tasks surface in track show <project-slug> alongside the rest of the project’s work.
Common flags: --project (required), --feature, --due, --priority / -p, --tags, --notes, --estimate, --every
gift
A gift tracks a present you need to acquire and then give. It has a two-stage lifecycle: once you’ve purchased the item you runtrack bought <id> to move it to doing (shown as “bought”); when you’ve given it you run track done <id> to move it to done (shown as “given”). This keeps “bought but not yet given” gifts visible without cluttering the fully-done pile.
Required: --for <person>
Special flags: --for, --occasion, --budget, --url
shopping
A shopping item is a one-off thing you need to buy that isn’t a gift for someone. It shares thes- ID prefix and the same ordering pool as gifts. Marking it done sets status to “done” (not “given”). Like gifts, it supports an optional budget and URL.
Special flags: --budget, --url
grocery
A grocery item is something to pick up on a grocery run. It gets its own tab in the web UI and its owng- ID prefix, keeping it visually separate from your broader shopping list. There is no dedicated “store” field — instead you capture the store as a tag, so the tag filter doubles as a per-store view.
Common fields across all kinds
Every item kind supports these shared fields regardless of its specialisations:priority (-p)
Integer 1 (highest) to 5 (lowest). Defaults to 3. Controls sort order across all lists.
tags (--tags)
Comma-separated list. Used for filtering with
track list --tag and as store labels for groceries.due (--due)
Accepts
YYYY-MM-DD, today, tomorrow, weekday names (mon–sun), 3d, 2w.notes (--notes)
Free-form text shown when you run
track show <id>.estimate (--estimate)
Available on
todo, chore, and task. Accepts 15m, 1h, 1h30m, 1.5h, or a bare number of minutes.every (--every)
Recurrence interval. Available on all six kinds. Required for chores; optional elsewhere. See Recurrence.