Simple kanban that just works. No bloat, no login, no SaaS.
JSON-backed boards with a REST API, MCP server, and a dark UI. For devs who want tasks tracked without the overhead.
uv sync
uv tool install .
sanban # http://localhost:8900The web server runs independently. Agents connect via MCP separately.
Paste this into opencode, Claude Code, Cursor, or any AI agent — it will install sanban, start the server, register MCP, load the skill, and verify everything:
Clone https://github.com/aancw/sanban, run `uv tool install .` from inside the repo (binary lands at ~/.local/bin/sanban — ensure ~/.local/bin is on PATH, e.g. `export PATH="$HOME/.local/bin:$PATH"`), start the server with `sanban` running in the background (or nohup/disown), register it as an MCP server named "sanban" running `sanban --mcp-only`, copy SKILL.md from the cloned repo into the agent's skills folder (e.g. ~/.claude/skills/sanban/SKILL.md or ~/.agents/skills/sanban/SKILL.md), then call `list_boards` to confirm it works.
- Multiple boards with custom columns
- Drag-and-drop between columns
- Priority, effort, tags, assignees, due dates
- Full-text search and filters
- Markdown in titles and descriptions (code blocks with syntax highlighting)
- Edit and delete buttons on every card
- Keyboard shortcuts (
/search,nnew,eexpand) - Agent-ready via MCP server
- No database — one JSON file per board in
~/.sanban/boards/, easy to diff, commit, back up - No auth — local-first, runs on localhost
- No framework — vanilla JS frontend, Geist font, dark mode
- Multi-board — one server, unlimited boards
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/boards |
List all boards |
POST |
/api/boards |
Create board { name, columns? } |
GET |
/api/boards/:id |
Get board with items |
DELETE |
/api/boards/:id |
Delete board |
GET |
/api/boards/:id/items |
List items (?q=, ?status=, ?tag=, ?assignee=) |
POST |
/api/boards/:id/items |
Create item |
PATCH |
/api/boards/:id/items/:iid |
Update item |
DELETE |
/api/boards/:id/items/:iid |
Delete item |
GET |
/api/search?q= |
Search across boards |
Agents interact with boards via MCP stdio. This is a separate process from the web server — both read/write the same JSON files.
{
"mcp": {
"sanban": {
"type": "local",
"command": ["sanban", "--mcp-only"],
"enabled": true
}
}
}Or running from source:
{
"mcp": {
"sanban": {
"type": "local",
"command": ["uv", "run", "--directory", "/path/to/sanban", "python", "-m", "sanban.server", "--mcp-only"],
"enabled": true
}
}
}Other agents: Adapt the config format for your CLI agent (Claude Desktop, Cursor, etc.). The command is always
sanban --mcp-only— only the config wrapper changes.
| Tool | Description |
|---|---|
list_boards |
List all boards |
create_board(name, columns?) |
Create a new board |
get_board(board_id) |
Get board details + items |
create_item(board_id, title, ...) |
Add an item |
update_item(board_id, item_id, ...) |
Update fields |
move_item(board_id, item_id, new_status) |
Move to column |
delete_item(board_id, item_id) |
Remove item |
search(query, board_id?) |
Search across boards |
sanban # web server (REST API + UI) — keep this running
sanban --mcp-only # MCP stdio — for agent config
sanban --rest-only # REST only, no UI
sanban --port 9000 # custom portTypical setup: run sanban in a terminal (or background it), then add sanban --mcp-only to your agent config. Both use the same ~/.sanban/boards/ data.
Boards live in ~/.sanban/boards/<id>.json. Override with SANBAN_DATA_DIR.
See SKILL.md for the full agent reference — API examples, MCP tools, item fields, and keyboard shortcuts.
Python 3.10+, FastAPI, uvicorn, MCP SDK. No database, no framework, no build step.
MIT

