A task tracker built for AI agents, operated entirely through MCP tools — no browser, no GUI, just your AI assistant managing tasks alongside your code.
Willet gives AI coding agents (like Claude Code) full project-management capabilities: creating and tracking tasks, managing workflows, linking dependencies, and searching across everything — all without leaving the terminal.
- Full task lifecycle — Create, update, and organize tasks with types (task, bug, feature, epic), priorities (low through critical), time estimates, tags, and custom metadata. Move tasks through statuses — every change is recorded with what changed, the old and new values, when, and by whom.
- Subtasks and linking — Break work into subtasks, link related tasks with dependency (blocks), relationship, or duplicate links, and explore connections across multiple hops with the dependency graph.
- Semantic search — Willet runs a local embedding model (all-MiniLM-L6-v2) to generate vector embeddings of your tasks. This means search isn't limited to exact keyword matches — it understands meaning. Search for "authentication problems" and find a task titled "login timeout bug." Combine semantic and keyword search in hybrid mode for the best of both worlds.
- Visualizations — Kanban boards, force-directed dependency graphs, and project dashboards rendered as interactive UIs in supported MCP clients, with text fallbacks everywhere else.
- Per-project isolation — Each project gets its own SQLite database. No cross-project interference, easy to back up or move.
- Export and import — Full data portability. Export a project to a ZIP archive and import it elsewhere, including between local and self-hosted instances.
Willet can run locally on your machine or as a self-hosted server for your team.
| Local | Self-hosted | |
|---|---|---|
| Users | Single user | Multi-user with per-user auth |
| Install | npm install |
Docker |
| Best for | Personal use with Claude Code | Teams sharing a task server |
Requires Node.js 20+.
npm install -g @willet/mcpAdd Willet to your MCP client's configuration. For Claude Code, add this to your .mcp.json:
{
"mcpServers": {
"willet": {
"command": "willet-mcp"
}
}
}For Claude Desktop, add this to your Claude Desktop config:
{
"mcpServers": {
"willet": {
"command": "willet-mcp"
}
}
}On first run, Willet downloads the embedding model (~80 MB) to ~/.willet/models/. This is a one-time download.
Then just start using it through your AI agent:
"Initialize a Willet project called My App"
"Create a bug for the login timeout issue, high priority"
"Show me all open tasks tagged 'backend'"
"What tasks are blocking the auth epic?"
"Search for anything related to authentication problems"
All data stays on your machine:
- Registry:
~/.willet/registry.db— maps working directories to projects - Project data:
~/.willet/projects/<id>/tasks.db— one SQLite database per project - Embedding model:
~/.willet/models/— cached ONNX model
The self-hosted server runs via Docker and supports multiple users with secret-based authentication over HTTP.
Create a willet.toml file:
[server]
port = 3000
base_url = "http://<server-ip-or-domain>:3000"
[users.alice]
secret = "change-me-to-a-random-string"
[users.bob]
secret = "change-me-to-another-random-string"Each user gets a [users.<name>] section with a unique secret used for authentication. The config file is watched for changes and reloaded automatically — no restart needed to add or remove users.
Create a docker-compose.yml:
services:
willet:
build:
context: .
dockerfile: packages/server/Dockerfile
ports:
- "3000:3000"
volumes:
- willet-data:/data
- ./willet.toml:/config/willet.toml:ro
volumes:
willet-data:docker compose up -dThe Docker image pre-downloads the embedding model during build, so there's no first-run delay.
For Claude Code, add this to your .mcp.json:
{
"mcpServers": {
"willet": {
"type": "streamable-http",
"url": "http://<server-ip-or-domain>:3000/mcp"
}
}
}When a user connects for the first time, their MCP client will open a page asking for a secret key. Share the secret from the config file with each user — that's all they need to log in.
Willet supports exporting and importing projects as ZIP archives. This is useful for backups, migrating between machines, or moving data between local and self-hosted instances.
Exports include all task data: tasks, comments, links, full change history, and metadata.
Export a project:
willet-export --project <project-id> --output my-project.zipIf you only have one project, the --project flag can be omitted.
Import a project:
# Import as a new project
willet-import my-project.zip
# Import into an existing project
willet-import my-project.zip --project <project-id>Export a project:
docker compose exec willet /app/docker-entrypoint.sh export --project <project-id> --output /data/export.zip
docker compose cp willet:/data/export.zip ./export.zipImport a project:
docker compose cp my-project.zip willet:/data/my-project.zip
docker compose exec willet /app/docker-entrypoint.sh import /data/my-project.zipThe export format is the same for both versions. To move a project from local to self-hosted (or vice versa), export from one and import into the other:
# Local -> Self-hosted
willet-export --output my-project.zip
docker compose cp my-project.zip willet:/data/my-project.zip
docker compose exec willet /app/docker-entrypoint.sh import /data/my-project.zip
# Self-hosted -> Local
docker compose exec willet /app/docker-entrypoint.sh export --project <id> --output /data/export.zip
docker compose cp willet:/data/export.zip ./export.zip
willet-import export.zipAGPL-3.0 — see LICENSE for details.