The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Backlog listing page.
Persistent, cross-session task management for Claude Code. Tasks survive sessions so work started by one agent can be picked up by another.
Built on @backloghq/agentdb — typed schemas, auto-increment IDs, virtual filters, blob storage. Pure TypeScript, zero native dependencies.
Add to your project's .claude/settings.json:
| Skill | Description |
|---|---|
/backlog:tasks | Show the current backlog — pending, active, blocked, overdue tasks |
/backlog:plan | Break down a goal into tasks with dependencies, priorities, and specs |
/backlog:standup | Daily standup — done, in progress, blocked, up next |
/backlog:refine | Groom the backlog — fix vague tasks, missing priorities, broken deps, stale items |
/backlog:spec | Write a spec document for a task before implementation |
/backlog:implement | Pick up a task, read its spec, implement it, mark done |
/backlog:handoff | Prepare for next session — annotate progress, stop active tasks, summarize state |
The task-planner agent can be auto-invoked by Claude when someone needs to plan work. It reads the codebase, decomposes goals into tasks with dependencies, and writes specs for complex items.
| Event | What it does |
|---|---|
SessionStart | Shows pending task count when a session begins |
TaskCreated | Syncs Claude's built-in tasks to the persistent backlog |
TaskCompleted | Marks the matching backlog task as done when Claude completes a built-in task |
SubagentStart | Auto-assigns unassigned pending tasks to the spawned agent |
Tools for full task lifecycle management:
| Tool | Description |
|---|---|
task_list | Query tasks with filter syntax. Returns JSON array with all fields. |
task_count | Count tasks matching a filter. Same syntax as task_list. |
task_add | Create a new pending task. Only description required; all other fields optional. |
task_log | Record already-completed work directly in completed status. |
task_modify | Partial-update one or more tasks matching a filter. Only provided fields change. |
task_duplicate | Copy an existing task with optional field overrides. |
task_done | Mark a task as completed with end timestamp. |
task_delete | Soft-delete a task. Restorable with task_undo. Use task_purge to permanently remove. |
task_annotate | Add a timestamped note. Use task_doc_write for longer content. |
task_denotate | Remove an annotation by exact text match. |
task_start | Mark a task as actively being worked on. Visible in +ACTIVE queries. |
task_stop | Stop working on a task. Returns it to pending status. |
task_undo | Undo the most recent operation. Can be called repeatedly. |
task_info | Get full JSON details for a single task by ID or UUID. |
task_import | Bulk-create tasks from a JSON array. Atomic batch operation. |
task_purge | Permanently remove a deleted task. Irreversible. |
task_doc_write | Attach/replace a markdown document on a task (specs, notes, context). |
task_doc_read | Read the markdown document attached to a task. |
task_doc_delete | Remove a task's document. Permanent. |
task_archive | Move old completed/deleted tasks to quarterly archive segments. |
task_archive_list | List available archive segments. |
task_archive_load | Load archived tasks for read-only inspection. |
task_projects | List project names with pending/recurring tasks. |
task_tags | List tags with pending/recurring tasks. |
Supports attribute modifiers (.before, .after, .by, .has, .not, .none, .any, .startswith, .endswith), tags (+tag, -tag), virtual tags (+OVERDUE, +ACTIVE, +BLOCKED, +READY, +TAGGED, +ANNOTATED, etc.), and boolean operators (and, or).
Attach markdown documents (specs, context, handoff notes) to any task:
Writing a doc adds a +doc tag and has_doc:yes, so agents can discover tasks with docs:
Tasks support an agent field for tracking which agent owns a task:
Each project gets its own task data automatically. When used as a plugin, task data lives in ~/.claude/plugins/data/backlog/projects/<project-slug>/. When used standalone, set TASKDATA explicitly.
| Variable | Description |
|---|---|
TASKDATA | Explicit path to task data directory (overrides auto-derivation) |
TASKDATA_ROOT | Root directory for auto-derived per-project task data |
BACKLOG_NAMESPACE | Explicit collection name (default: tasks) |
BACKLOG_AUTO_NAMESPACE | Set to true to derive collection name from CWD |
BACKLOG_AGENT_ID | Agent ID for multi-writer support (Claude, Gemini, etc.) |
BACKLOG_BACKEND | Storage backend: omit for filesystem (default), s3 for Amazon S3 |
BACKLOG_S3_BUCKET | S3 bucket name (required when BACKLOG_BACKEND=s3) |
BACKLOG_S3_REGION | AWS region (optional if using default credentials) |
Backlog supports concurrent access from multiple processes (e.g., Claude Desktop and Gemini CLI) sharing the same data. To enable this:
BACKLOG_AGENT_ID to each process (e.g., claude, gemini).refresh() before operations to pick up changes from other agents.If you want to use a single TASKDATA directory (like a shared S3 bucket or a global ~/.backlog folder) for multiple projects, you can use namespaces to keep tasks separate:
BACKLOG_NAMESPACE=my-project to use a specific collection name.BACKLOG_AUTO_NAMESPACE=true to have Backlog automatically derive a collection name from your current working directory (e.g. my-app-a1b2c3d4).Example Configuration (.claude/settings.json):
Both methods allow multiple projects to share the same storage backend while maintaining isolated, project-specific backlogs.
Store task data in S3 for team sharing or cloud persistence. Requires @backloghq/opslog-s3:
Configure via environment variables in .claude/settings.json:
When using S3, TASKDATA becomes the key prefix in the bucket instead of a filesystem path.
If backlog is useful to you, consider giving it a star — it helps others find the project.
MIT