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 |
If you're working with Docket through an AI coding agent, also install the companion skill so the agent has the full CLI workflow and command reference available without re-deriving usage from --help output. Copy this repo's skills/docket/SKILL.md into your agent's skill directory:
| Harness | Project-scoped | User-scoped |
|---|---|---|
| Claude Code | .claude/skills/docket/SKILL.md |
~/.claude/skills/docket/SKILL.md |
| Codex | .agents/skills/docket/SKILL.md |
~/.agents/skills/docket/SKILL.md |
| Opencode | .opencode/skills/docket/SKILL.md |
~/.config/opencode/skills/docket/SKILL.md |
# Claude Code (project-scoped)
mkdir -p .claude/skills/docket && cp skills/docket/SKILL.md .claude/skills/docket/SKILL.md
# Codex (project-scoped)
mkdir -p .agents/skills/docket && cp skills/docket/SKILL.md .agents/skills/docket/SKILL.md
# Opencode (project-scoped)
mkdir -p .opencode/skills/docket && cp skills/docket/SKILL.md .opencode/skills/docket/SKILL.mdSee Drop-in Skill for what the skill teaches.
Requires Go 1.26.0+ (toolchain go1.26.5).
# 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.
skills/docket/SKILL.md is a thorough reference teaching the full Docket CLI workflow and command/flag reference in one file, so your agent doesn't need to re-derive usage from --help output. See Agent Skill Setup in the Installation section above for where to drop it in for Claude Code, Codex, and Opencode.
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 (filterable by --status/-s, --label/-l, --priority/-p, --type/-T, --assignee/-a) |
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 |
Docket keeps ONE shared SQLite store at ~/.docket/issues.db, serving every
project on the machine. Each repository is a project in that store, keyed
by a worktree-stable identity (the git common directory), so every worktree of
a repository — including throwaway ones — reads and writes the same issues.
Resolution order, checked on every invocation:
DOCKET_PATH— points directly at a.docketdirectory (the database file is$DOCKET_PATH/issues.db). The escape hatch for custom layouts and for reaching a legacy repo-local store.- A repo-local
.docket/issues.db— discovered by walking up from the current directory to the worktree root. Pre-global stores keep working exactly as before, now from subdirectories too. Create one deliberately withdocket init --local(and gitignore it). ~/.docket— the shared store.docket initcreates it.
Use docket config to see the resolved store, its source (env / local /
global), the execution root, and the project identity.
Instance configuration (workflows, schemas, contracts, fragments, policy) is read from an ordered list of roots, and activation registers and pins the union of what they hold:
| store | roots, in precedence order |
|---|---|
DOCKET_PATH |
$DOCKET_PATH/config/ |
| repo-local | <repo>/.docket/config/ |
~/.docket |
~/.docket/config/, then <worktree>/.docket/config/ |
With the shared store, ~/.docket/config/ is the corpus every project draws
from and a repository's own .docket/config/ adds to it — so a repo that ships
nothing needs no .docket/ directory at all, and a linked worktree resolves the
same files as the checkout beside it. A root that does not exist is skipped; a
root that is a broken symlink is an error, because a broken install must not
look like having no config. A workflow, schema, or pinned file offered by two
roots with different bytes refuses the activation and names both paths —
which is what makes "first root wins" a rule rather than a coin flip.
docket workflow init writes into the repository's root, never the shared
one.
Move an old repo-local database into the shared store with export/import — colliding ids are remapped automatically, nothing is dropped:
DOCKET_PATH=/path/to/repo/.docket docket export -f repo.json
cd /path/to/repo && docket import repo.jsonIssue ids (DKT-N) stay globally unique across projects, so an id names one
issue machine-wide. docket project set-prefix VOR gives a project its own
display voice — issues render and parse as VOR-N there, while DKT-N and
bare numbers keep working everywhere, because the number is the identity.
docket project list shows the store's projects. Lists, boards, plans, labels, workflows, schemas, and
engine configuration are scoped to the invoking project; docket config set
writes a per-project override, or a store-wide default with --global. The
event feed (docket events list) is project-scoped too — store-level events
like trust changes always show — with --all-projects for the whole stream.
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
engine/ Run activation, claims, gates, and the dispatch saga
exec/ Registered-command execution with env policy and capture
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)
schema/ Payload validation and the ordered_enum annotation
testsupport/ Helpers shared across the repo's test packages
trust/ User-level allowlist of commands Docket may execute
watch/ Live-updating watch output
workflow/ Workflow-definition grammar and matching
scripts/
qa.sh End-to-end QA test suite (drives scripts/qa/)
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.
