Kanban

June 12, 2026 · View on GitHub

CI Crates.io AUR nixpkgs stable nixpkgs unstable Homebrew License

Keyboard-first kanban for the terminal.

Kanban Demo

Inspired by lazygit · Built on ratatui


Why Kanban?

  • Zero latency — pure keyboard flow — hjkl, never reach for the mouse
  • Your data is a file on your disk — private, offline, always yours
  • Git-native — generate branch names and git checkout commands from any card
  • LLM-native — full MCP server (44 tools) works with Claude Code, Cursor, and any MCP client
  • Offline-first — works anywhere; JSON and SQLite backends, atomic writes, live conflict detection

Quick Start

TUI

kanban                  # launch in-memory; pick or skip a file from the startup dialog
kanban boards.json      # open or create a JSON board file
kanban boards.sqlite    # open or create a SQLite board file

Press ? at any time to see context-sensitive help.

CLI

export KANBAN_FILE=boards.json   # or pass the path as the first argument

kanban board create --name "My Project"
kanban board list
kanban card create --board "My Project" --column TODO --title "Fix the bug" --priority high
kanban card list --board "My Project"
kanban sprint create --board "My Project"
kanban sprint activate yarara-release --duration-days 14
kanban card assign-sprint KAN-5 --sprint yarara-release
kanban relation add --parent KAN-5 --child KAN-7   # KAN-7 is now a subtask of KAN-5
kanban relation children KAN-5                     # list direct children of KAN-5

Init (non-interactive setup)

kanban init boards.json --board "My Project"  # create file + first board, exit
kanban init --board "My Project"              # uses KANBAN_FILE or boards.json
kanban init                                   # creates the file with no entities

Every entity argument accepts either a UUID or a human-readable name (sprint numbers also work for sprints; cards accept their KAN-N identifier). When a name doesn't match, the error lists what's available.

All commands output JSON. Use kanban --help for full reference.

MCP Server

Claude Code

{
  "mcpServers": {
    "kanban": {
      "command": "kanban-mcp",
      "args": ["boards.json"]
    }
  }
}

Installation

From crates.io

cargo install kanban-cli

From source

git clone https://github.com/fulsomenko/kanban
cd kanban
cargo install --path crates/kanban-cli

Homebrew

brew install fulsomenko/tap/kanban

Using Nix

nix run github:fulsomenko/kanban

Arch Linux (AUR)

yay -S kanban

Linux Clipboard Support

For y/Y clipboard operations to persist after the app exits, you need a clipboard manager:

  • Wayland: wl-clip-persist, cliphist, clipman, or your DE's built-in manager
  • X11: Most desktop environments include one by default

Windows and WSL

If your setup is Windows and WSL, and you often switch between them, then it is recommended to install separate binaries for each system to avoid constant recompiles.


EDITOR configuration

Changes are made in an external editor as defined by your EDITOR. Neovim, nano, or some other terminal-based editor is recommended, both for easier switching between edits and browsing, and because editors that leave the terminal may cause issues.

VS Code is known not to work in the current implementation.

kanban is well-tested on supported OSes and is designed to be shell-agnostic. If your EDITOR is not set, it will default to notepad on Windows and vi otherwise.


Features

Boards & Cards

  • Multiple boards, each with custom columns and WIP limits
  • Rich cards: title, description, priority (Low/Medium/High/Critical), status (Todo/InProgress/Blocked/Done), story points, due dates
  • Card numbering with configurable prefix (e.g. KAN-42)
  • Card relations: parent/child (Spawns), blocking (with severity), and undirected relates (with sub-kind) — each with cycle / self-reference detection and dedicated kanban relation CLI + MCP tools
  • Archive and restore cards

Sprint Planning

  • Full sprint lifecycle: Planning → Active → Completed / Cancelled
  • Carry uncompleted cards to the next sprint with one key
  • Per-sprint card prefix overrides
  • Sprint logs track assignment history per card

Views & Navigation

  • 3 view modes: Flat list / Grouped by column / Kanban board — toggle with V
  • Real-time / search
  • Sort by priority, points, status, or position
  • Filter by sprint, status, or search result
  • Multi-select for bulk archive / move / sprint-assign

Productivity

  • Undo/redo (u/U, up to 100 levels)
  • External editor for descriptions (respects $EDITOR)
  • Clipboard: y copies git branch name, Y copies git checkout command
  • Import/export boards as JSON

Storage & Sync

  • JSON and SQLite storage backends
  • Atomic writes (temp file → rename) prevent corruption
  • Live file watching: auto-reload when another instance writes
  • Conflict detection with user prompt when local edits clash

Interfaces

  • TUI — full keyboard-driven terminal UI
  • CLI — scriptable; all operations, JSON output, pagination
  • MCP server — 44 tools for LLM integration

Key Bindings

Press ? in the app to see bindings for the current context.

Boards Panel

KeyAction
j/Navigate down
k/Navigate up
ggJump to top
GJump to bottom
Enter/SpaceOpen board detail
nNew board
rRename board
eEdit board
xExport board
XExport all boards
iImport board from file
uUndo
URedo
SOpen settings
1/2Focus boards/cards panel
qQuit
?Help

Cards Panel

KeyAction
j/, k/Navigate down/up
gg / GJump to top/bottom
{ / }Half-page up/down
h/lPrevious/next column
H/LMove card left/right column
Enter/SpaceOpen card detail
nNew card
eEdit card
cToggle done
pSet priority
dArchive card(s)
DView archived cards
vToggle card selection
Ctrl+aSelect all visible cards
EscClear selection
PSet priority (bulk)
aAssign to sprint
oSort cards
OToggle sort order
tToggle sprint filter
TFilter options
/Search
sManage child cards
VToggle view mode
u / UUndo / Redo
1/2Focus boards/cards panel
qQuit
?Help

Card Detail View

KeyAction
15Focus Title / Metadata / Description / Parents / Children panel
eEdit current panel
rManage parent cards
RManage child cards
yCopy git branch name to clipboard
YCopy git checkout command to clipboard
aAssign to sprint
dDelete card
u / UUndo / Redo
q/EscBack
?Help

Board Detail View

KeyAction
15Focus Name / Description / Settings / Sprints / Columns panel
eEdit current panel
pSet branch prefix
nNew sprint (Sprints panel) / New column (Columns panel)
rRename column (Columns panel)
dDelete column (Columns panel)
J/KReorder column up/down (Columns panel)
j/kNavigate within panel
Enter/SpaceOpen sprint detail (Sprints panel)
u / UUndo / Redo
q/EscBack
?Help

Sprint Detail View

KeyAction
h/lSwitch between uncompleted/completed panels
j/kNavigate cards
aActivate sprint
cComplete sprint
pSet sprint prefix
CSet card prefix override
o/OSort / Toggle sort order
vSelect card(s)
u / UUndo / Redo
q/EscBack
?Help

Archived Cards View

KeyAction
j/kNavigate
gg/GJump to top/bottom
{/}Half-page up/down
rRestore card(s)
xDelete card(s) permanently
vSelect for bulk operation
VToggle view mode
u / UUndo / Redo
q/EscBack

Architecture

crates/
├── kanban-core               → Shared types, error handling, config, reusable state primitives
├── kanban-domain             → Domain models, business logic, filtering & sorting
├── kanban-persistence        → Persistence trait layer — pure trait definitions, all I/O lives in backend crates
├── kanban-persistence-json   → JSON file storage backend
├── kanban-persistence-sqlite → SQLite storage backend
├── kanban-service            → KanbanContext, persistence orchestration, undo/redo
├── kanban-tui                → Terminal UI with ratatui
├── kanban-cli                → CLI entry point (clap)
└── kanban-mcp                → Model Context Protocol server
graph LR
    CLI[kanban-cli] --> TUI[kanban-tui]
    CLI --> SVC[kanban-service]
    MCP[kanban-mcp] --> SVC
    TUI --> SVC
    SVC --> PER[kanban-persistence]
    SVC -.-> JSON[kanban-persistence-json]
    SVC -.-> SQL[kanban-persistence-sqlite]
    JSON --> PER
    SQL --> PER
    PER --> DOM[kanban-domain]
    DOM --> CORE[kanban-core]
CrateDescriptionREADME
kanban-coreShared types, config, errors, graph, pagination
kanban-domainDomain models, business logic
kanban-persistencePersistence trait layer
kanban-persistence-jsonJSON file backend
kanban-persistence-sqliteSQLite backend
kanban-serviceService layer, KanbanContext, undo/redo
kanban-tuiTerminal UI
kanban-cliCLI entry point
kanban-mcpMCP server

Data & Persistence

JSON Backend (default)

  • V2 envelope format: { "version": 2, "metadata": {...}, "data": {...} }
  • Atomic writes: crash-safe — every write is atomic (temp file → rename)
  • Debounced saving: 500ms minimum interval between saves
  • Default for any plain file path

SQLite Backend

  • WAL mode with foreign key enforcement
  • Connection pool: max 2 connections
  • Relational schema: boards, columns, cards, archived cards, sprints, sprint logs, dependency graph edges, and more
  • Schema versioning with migration skeleton for future upgrades
  • File selected by .sqlite, .sqlite3, or .db extension

Multi-Instance Support

  • File watching: detects changes written by other TUI or MCP instances
  • Auto-reload: applies external changes automatically when the local state is clean
  • Conflict prompt: when local edits clash with an external write, you choose to reload or keep

Roadmap

  • Progressive auto-save
  • Full CLI interface
  • Card relations (parent/child, blocks with severity, relates with sub-kind)
  • Multiple storage backends (JSON + SQLite)
  • MCP server for LLM integration
  • Full undo/redo
  • Sprint planning lifecycle
  • Bulk operations
  • Configurable keybindings
  • Attachments (files on cards)
  • Audit log
  • HTTP API for remote access
  • Collaborative / sync features

Contributing

See CONTRIBUTING.md for development workflow, code style, and testing guidelines.

License

Apache 2.0 — see LICENSE.md