A terminal kanban board TUI for GitHub Projects and local task management.
- Kanban board view with vim-style navigation
- GitHub Projects v2 integration (create, edit, move issues)
- Local board mode — no GitHub required, data stored in
~/.config/ghtui/ - Profile selector at startup — switch between GitHub and local boards
- Vim insert mode in all text fields (normal/insert/paste support)
- Full terminal width/height utilization
- Per-column card scrolling with
↑/↓indicators - Search/filter with
/ - Command mode with
:wq(save) and:q(discard)
# Build using the Docker compile script
~/git/slicktrail/docker-projects/compile-ghtui/compile.shThe binary is installed to ~/bin/ghtui-dir/ghtui.
Created automatically on first run. Edit to add more profiles:
# GitHub profile — connects to a GitHub Project board
[work]
type = github
config = ~/.config/ghtui/work.json
# Local profile — stores data in ~/.config/ghtui/boards/personal.json
[personal]
type = localAt startup, ghtui presents a profile selector. Use j/k to move and enter to select.
Required for GitHub profiles:
{
"github_token": "ghp_yourtoken",
"org": "your-org",
"project_number": 1,
"assignee": "your-github-login",
"repo": "your-org/your-repo"
}Multiple GitHub profiles can each point to a different config file via the config key in profiles.conf.
Local board data is stored at ~/.config/ghtui/boards/<profile-name>.json.
New local boards start with three columns: Backlog, In Progress, Done.
| Key | Action |
|---|---|
h / l |
Move between columns |
j / k |
Move between cards |
H / L |
Move selected card left/right |
enter |
Open card detail |
C / shift+c |
Create new issue |
n |
New column (local boards only) |
/ |
Search/filter cards |
r |
Refresh board |
:q |
Quit |
| Key | Action |
|---|---|
j / k |
Move between fields |
enter |
Open field for editing |
i / a |
Enter vim insert mode |
esc |
Back to field normal mode |
ctrl+shift+v |
Paste from clipboard |
:wq |
Save and close |
:q |
Discard and close |
GitHub forms include Assignee and Status fields. Local forms show Title and Body only — the card is placed in the first column automatically.
Type a name and press enter to create. esc cancels.
{
"columns": [
{
"name": "In Progress",
"cards": [
{
"id": 1,
"title": "My task",
"body": "Details here",
"status": "In Progress",
"created_at": "2026-07-24T12:00:00Z",
"updated_at": "2026-07-24T12:00:00Z"
}
]
}
],
"next_id": 2
}