A terminal-based Kanban board management tool built with Go, featuring a beautiful TUI interface.
- 📋 Three-column board: Todo / In Progress / Done
- ✨ Full CRUD operations: Add, edit, and delete tasks
- 🏷️ Task tags: Categorize tasks with colored tags
- 📅 Due dates: Set deadlines with color-coded status (overdue, today, upcoming)
- 🔍 Search & filter: Quick search across tasks with tag: syntax support
- 🎨 Beautiful TUI interface: Built with Bubble Tea framework
- 💾 SQLite persistence: Data automatically saved to local database
- ⌨️ Keyboard shortcuts: Efficient keyboard navigation
- Go 1.21 or higher
- GCC (for compiling SQLite)
# Clone or navigate to project directory
cd cli_kanban
# Download dependencies
go mod tidy
# Build
go build -o cli_kanban
# Run
./cli_kanban# Use default workspace (default)
./cli_kanban
# Use a named workspace (stored under ~/.cli_kanban/)
./cli_kanban -w work
# List existing workspaces
./cli_kanban --list
# Delete a workspace database
./cli_kanban --delete workcli_kanban stores data in separate workspaces. Each workspace maps to its own SQLite database file.
- Default workspace:
default - Select workspace:
--workspace <name>
Workspace name rules
- Allowed characters: lowercase letters, digits,
_,- - Length: 1–32
- Examples:
default,work,personal_2025,proj-a
All databases are stored under your home directory:
- Directory:
~/.cli_kanban/ - Database file:
~/.cli_kanban/cli_kanban__<workspace>.db
Examples:
~/.cli_kanban/cli_kanban__default.db~/.cli_kanban/cli_kanban__work.db
Older versions used a single default database at ~/.cli_kanban.db.
On first run with the default workspace, if ~/.cli_kanban/cli_kanban__default.db does not exist but ~/.cli_kanban.db does, the old database is copied to the new location.
←/→orh/l- Switch between columns↑/↓orj/k- Move between tasks
a- Add new task to current columneorEnter- Edit selected task titlei- Edit selected task descriptiont- Edit selected task tagsu- Edit selected task due datedorDelete- Delete selected taskm- Move task to next column
/- Open search inputEnter- Apply search filterEsc- Clear search filter (when active)
Search syntax:
keyword- Search in title, description and tagstitle:text- Search only in titledesc:text- Search only in descriptiontag:name- Search only in tags (exact match)due:YYYY-MM-DD- Exact due date matchdue:<YYYY-MM-DD- Due before datedue:>YYYY-MM-DD- Due after datedue:<=YYYY-MM-DD- Due on or before datedue:>=YYYY-MM-DD- Due on or after datedue:today- Due todaydue:yesterday- Due yesterdaydue:tomorrow- Due tomorrowdue:overdue- Past due datedue:none- No due date set
F5- Refresh board (reload tasks)?- Show helpqorCtrl+C- Quit applicationEsc- Cancel current action or quit
cli_kanban/
├── main.go # Entry point and Cobra commands
├── go.mod # Go module dependencies
├── internal/
│ ├── db/
│ │ └── sqlite.go # SQLite database operations
│ ├── model/
│ │ └── task.go # Data model definitions
│ └── tui/
│ ├── model.go # Bubble Tea model
│ ├── update.go # Event handling logic
│ └── view.go # View rendering
└── README.md
- Bubble Tea - TUI framework
- Lipgloss - Styling and layout
- Bubbles - TUI components
- Cobra - CLI framework
- SQLite - Data persistence
| Field | Type | Description |
|---|---|---|
| id | INTEGER | Auto-increment primary key |
| title | TEXT | Task title |
| description | TEXT | Task description |
| status | TEXT | Task status (todo/in_progress/done) |
| tags | TEXT | Comma-separated tags |
| due | DATETIME | Due date (optional) |
| created_at | DATETIME | Creation timestamp |
| updated_at | DATETIME | Last update timestamp |
# Run (development mode)
go run main.go
# Format code
go fmt ./...
# Run tests
go test ./...MIT
