Issue tracking for AI and humans.
Docket is a local-first, SQLite-backed CLI issue tracker that lives inside your repository. It provides enterprise-grade issue tracking without requiring a server, network connection, or third-party service.
Docket serves two audiences equally: human developers who want a fast, beautiful terminal experience with rich styling, and AI coding agents that need structured, machine-readable output to plan and execute work. Every command renders colorful, styled output by default and clean, parseable JSON with --json. Neither mode is an afterthought. Both are first-class.
curl -fsSL https://raw.githubusercontent.com/ALT-F4-LLC/docket/main/scripts/install.sh | shThis installs the latest nightly build to $HOME/.local/bin.
Customize with environment variables:
# Install a specific version
DOCKET_VERSION=v1.0.0 curl -fsSL https://raw.githubusercontent.com/ALT-F4-LLC/docket/main/scripts/install.sh | sh
# Install to a custom directory
DOCKET_INSTALL_DIR=/usr/local/bin curl -fsSL https://raw.githubusercontent.com/ALT-F4-LLC/docket/main/scripts/install.sh | sh| Variable | Default | Description |
|---|---|---|
DOCKET_INSTALL_DIR |
$HOME/.local/bin |
Directory to install the binary |
DOCKET_VERSION |
nightly |
Release tag to download |
Requires Go 1.24.2+.
# Build the binary to ./bin/docket
make build
./bin/docket --help
# Install to $GOPATH/bin
make install# Initialize a new issue database in the current directory
docket init
# Create an issue with priority and type
docket issue create -t "Build auth module" -p high -T feature
# Create a sub-issue that depends on the first
docket issue create -t "Set up database schema" -p high -T task --parent DKT-1
docket issue link add DKT-2 depends-on DKT-1
# See what's ready to work on (unblocked, sorted by priority)
docket next
# View the Kanban board
docket boardAI agents: add --json to any command for structured, machine-readable output:
docket next --json
docket issue list --json -s todo -s in-progress- No servers, no network — everything is a local SQLite file in
.docket/. Works offline, on planes, in CI. - AI-native from day one — every command supports
--jsonwith a consistent envelope. Agents can create, query, plan, and update issues without parsing human text. - Dependency-aware planning —
docket nextanddocket planuse a DAG to surface only unblocked, work-ready issues. No stale sprint boards. - Zero configuration —
docket initand you're done. No accounts, no tokens, no YAML. - Portable data — the
.docket/directory travels with your repo. Clone it, fork it, archive it.
Every command supports --json for structured, machine-readable output. All JSON responses use a consistent envelope:
Success: {"ok": true, "data": { ... }, "message": "..."}
Error: {"ok": false, "error": "...", "code": "NOT_FOUND"}
Error codes: GENERAL_ERROR (exit 1), NOT_FOUND (exit 2), VALIDATION_ERROR (exit 3), CONFLICT (exit 4).
- Read the backlog —
docket next --jsonto get unblocked, priority-sorted issues. - Pick an issue —
docket issue show DKT-N --jsonto read full details, sub-issues, and relations. - Work on it —
docket issue move DKT-N in-progress --jsonto signal you've started. - Complete it —
docket issue close DKT-N --jsonwhen done, ordocket issue move DKT-N review --jsonif it needs review. - Check what's next —
docket next --jsonagain. Dependencies auto-resolve; newly unblocked work appears.
Add to your project's CLAUDE.md:
Use `docket` for issue tracking. Always pass `--json` when reading or updating issues.
Run `docket next --json` to find work. Move issues to `in-progress` before starting.Any agent that can run shell commands works with Docket. Point it at docket next --json to discover work items, and use docket issue show <id> --json to get full context before starting a task. The consistent JSON envelope (ok, data, error, code) makes parsing straightforward in any language.
Verbose JSON examples
docket issue create --json -t "Build auth module" -p high -T feature --parent DKT-3{
"ok": true,
"data": {
"id": "DKT-12",
"parent_id": "DKT-3",
"title": "Build auth module",
"description": "",
"status": "backlog",
"priority": "high",
"kind": "feature",
"assignee": "",
"labels": [],
"created_at": "2026-02-13T18:30:00Z",
"updated_at": "2026-02-13T18:30:00Z"
},
"message": "Created DKT-12"
}docket next --json{
"ok": true,
"data": {
"issues": [
{
"id": "DKT-7",
"title": "Set up database schema",
"status": "todo",
"priority": "high",
"kind": "task",
"assignee": "",
"labels": [],
"created_at": "2026-02-13T18:30:00Z",
"updated_at": "2026-02-13T18:30:00Z"
}
],
"total": 1
}
}docket plan --json --root DKT-3{
"ok": true,
"data": {
"phases": [
{
"phase": 1,
"issues": [
{
"id": "DKT-7",
"title": "Set up database schema",
"priority": "high",
"status": "todo"
}
]
}
],
"total_issues": 5,
"total_phases": 3,
"max_parallelism": 2
}
}docket issue list --json -s todo -s in-progress -p high--json Structured JSON output (for agents and scripts)
--quiet, -q Suppress non-essential output
| Command | Description |
|---|---|
docket issue create |
Create a new issue (interactive or via flags) |
docket issue list / docket issue ls |
List issues with filtering and sorting |
docket issue show <id> |
Show full issue detail with sub-issues, relations, comments |
docket issue edit <id> |
Edit issue fields |
docket issue move <id> <status> |
Change issue status |
docket issue close <id> |
Shorthand for move <id> done |
docket issue reopen <id> |
Shorthand for move <id> todo |
docket issue delete <id> |
Delete an issue (with confirmation prompt) |
docket issue log <id> |
View activity history for an issue |
| Command | Description |
|---|---|
docket issue comment add <id> |
Add a comment (-m for inline, stdin, or $EDITOR) |
docket issue comment list <id> |
List all comments on an issue |
| Command | Description |
|---|---|
docket issue label add <id> <label>... |
Add labels to an issue |
docket issue label rm <id> <label>... |
Remove labels from an issue |
docket issue label list |
List all labels in the database |
docket issue label delete <label> |
Delete a label entirely |
| Command | Description |
|---|---|
docket issue link add <id> <relation> <target_id> |
Create a relation (blocks, depends-on, relates-to, duplicates) |
docket issue link remove <id> <relation> <target_id> |
Remove a relation |
docket issue link list <id> |
Show all relations for an issue |
| Command | Description |
|---|---|
docket issue graph <id> |
Show the dependency graph for an issue |
| Command | Description |
|---|---|
docket issue file add <id> <path>... |
Attach files to an issue |
docket issue file rm <id> <path>... |
Remove file attachments from an issue |
docket issue file list <id> |
List file attachments on an issue |
| Command | Description |
|---|---|
docket next |
Show work-ready issues (unblocked, sorted by priority) |
docket plan |
Compute a phased execution plan from the dependency graph |
docket board |
Kanban board view in the terminal |
| Command | Description |
|---|---|
docket init |
Initialize .docket/ directory and database |
docket config |
Show current configuration (database path, schema version, etc.) |
docket version |
Print version, commit, and build date |
docket stats |
Show summary statistics for the issue database |
| Command | Description |
|---|---|
docket export |
Export issues as JSON (default), CSV, or Markdown |
docket import <file> |
Import issues from a JSON export file |
Add .docket/ to your .gitignore to keep the issue database local:
echo ".docket/" >> .gitignoreNote:
docket initwill remind you to do this if.docket/is not already ignored.
Docket stores its SQLite database at $PWD/.docket/issues.db by default. This means each project gets its own isolated issue database.
Override the location with the DOCKET_PATH environment variable:
export DOCKET_PATH=/path/to/custom/.docketWhen set, DOCKET_PATH points to the .docket directory (the database file will be $DOCKET_PATH/issues.db).
Use docket config to verify the resolved database path and whether DOCKET_PATH is active.
Issues follow a Kanban workflow with five statuses:
| Status | Description |
|---|---|
backlog |
Acknowledged but not yet planned (default) |
todo |
Planned for current work cycle |
in-progress |
Actively being worked on |
review |
Work complete, pending review |
done |
Finished |
| Priority | Description |
|---|---|
critical |
Immediate attention required |
high |
Important, address soon |
medium |
Normal priority |
low |
Address when convenient |
none |
No priority set (default) |
| Type | Description |
|---|---|
bug |
Defect or broken behavior |
feature |
New functionality |
task |
General work item (default) |
epic |
Large body of work with sub-issues |
chore |
Maintenance or housekeeping |
Issues use the DKT-N format (e.g., DKT-1, DKT-42). The DKT prefix is constant and IDs auto-increment within each database. Commands accept both the full prefixed form (DKT-5) and the bare number (5).
cmd/
docket/ Entry point (main.go)
internal/
cli/ Cobra command definitions (one file per command)
config/ Configuration resolution (DOCKET_PATH, defaults)
db/ SQLite queries and migrations
filter/ Shared filtering helpers
model/ Domain types (Issue, Status, Priority, Activity, etc.)
output/ JSON envelope writer (ok/data/error/code)
planner/ DAG builder, topological sort, phase planner
render/ Lipgloss-based terminal rendering (tables, board, graphs)
scripts/
qa.sh End-to-end QA test suite
git clone https://github.com/ALT-F4-LLC/docket.git
cd docket
make build # Build to ./bin/docket
make test # Run unit tests
make lint # Run staticcheck + go vet
make clean # Remove build artifactsThe QA suite exercises the full CLI end-to-end:
./scripts/qa.sh # Run all sections
./scripts/qa.sh --verbose # Show all results, not just failures
./scripts/qa.sh ./bin/docket G # Run a single section (with prerequisites)- One file per command in
internal/cli/(e.g.,issue_create.go,board.go). - Every command must support
--jsonusing the sharedoutput.Writerenvelope. - Terminal styling uses lipgloss via helpers in
internal/render/. - Add QA checks to
scripts/qa.shfor any new command or flag.
Apache 2.0. See LICENSE for the full text.