Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Kanban (TUI)

pinto kanban opens an interactive board in the terminal. It reads and writes the same .pinto/ board as the non-interactive commands, so a move made in the TUI is immediately visible to pinto list and pinto board, and vice versa.

pinto kanban

Start with a focused view

Startup flags narrow what the board shows without changing stored data:

pinto kanban --column in-progress review   # show only these columns
pinto kanban --maximize --column review     # open maximized on one column
pinto kanban --sprint S-1                    # show cards assigned to one Sprint
pinto kanban --label ui backend             # match either label
pinto kanban --label ui backend --all-labels # require both labels
pinto kanban --search parser                # filter cards by substring
pinto kanban --sprint S-1 --label ui --column in-progress --search '^T-1\d' --regex
                                             # compose all startup filters

Explicit --column values override the [tui] hidden_columns setting for that run. --sprint matches the assigned Sprint ID exactly. --label uses the same OR matching as pinto board; add --all-labels for AND matching. --regex requires --search. All startup filters are read-only and remain active when the TUI reloads after an edit, move, or reorder.

The board separates selecting a card from moving it: lowercase keys move the cursor, uppercase (Shift) keys move the selected item. Defaults are:

ActionKeys
Select column / rowh j k l or arrow keys
Move item across columnsH / L (Shift+Left / Shift+Right)
Reorder item within a columnK / J (Shift+Up / Shift+Down)
Expand or collapse a parentSpace / Enter
Add a PBIa
Edit the selected PBIe
Add / remove a dependencyd / D
Set or clear the parentp
Split the selected PBIs
Open the details popupv
Substring / regex search/ / Ctrl+?
Clear an active filterEsc
Toggle a maximized columnm
Reload the boardr
Help window?
Quitq or Esc
Quit into the shellQ

Press ? inside the board to open the built-in help window, which always lists the bindings that are actually in effect.

Pressing s starts a split of the selected PBI: enter a title, choose the relationship to the source (Enter for none, c for a child, d for a dependency), then choose the body (Enter copies the source, e empties it, t types explicit text, m names an item template). The same operation is available from the command line as pinto split.

Cards follow the same hierarchical display order as pinto list and pinto board: top-level cards by rank, each parent followed by its subtree, with siblings ordered by rank. Expanding a parent reveals its children directly beneath it, so a child may sit ahead of a standalone card that outranks it — that is the point, since the parent’s priority carries its whole subtree. The completion column leads with the most recently finished card (done_at descending).

Customize behavior

The [tui] section of .pinto/config.toml adjusts the shared parts of the interactive board:

[tui]
confirm_quit = true                 # ask before leaving the board
hidden_columns = ["done"]           # hide columns unless --column overrides

Unknown column names in hidden_columns are rejected at load time, so a typo surfaces immediately rather than silently hiding nothing.

Personal keybindings

Keybindings are personal preferences and are stored outside the board. Create $XDG_CONFIG_HOME/pinto/config.toml or, when XDG_CONFIG_HOME is unset, use $HOME/.config/pinto/config.toml on Unix-like systems or %APPDATA%/pinto/config.toml on Windows. Put the existing [tui.key_bindings] table there. Each action takes an array of one or more key expressions, and an action may keep several bindings at once:

[tui.key_bindings]
quit = ["q", "Esc"]                 # keep the defaults
add = ["a", "n"]                    # add a second key for "add"
move_left = ["Shift+Left"]          # replace the default for this action
help = ["?", "F1"]

Only the actions you list are overridden; every other action keeps its default keys. The action names are the snake_case forms shown by the built-in help window (quit, shell, select_left, move_left, reorder_up, add, split, edit, dependency_add, parent, maximize, search, regex_search, details, help, and so on).

A key expression is a key name, optionally prefixed with +-separated modifiers:

  • Printable keys are the character itself: q, /, ?. Use an uppercase letter (H) rather than Shift+h for shifted letters.
  • Named keys: Enter, Esc, Tab, Backspace, Delete, Insert, Home, End, PageUp, PageDown, the arrows Left / Right / Up / Down, and function keys F1F12.
  • Modifiers: Ctrl, Alt, Shift, Cmd, Meta, and Hyper — for example Ctrl+a or Alt+Shift+Left. Write the literal plus key as Plus.

Terminal protocols do not represent every modified key identically. The matcher accepts crossterm’s control-byte forms, including lowercase control letters, Ctrl+? as Backspace, ? with Control, or Ctrl+7 (the Ghostty/Zellij Ctrl+Shift+/ encoding), and the other ASCII control punctuation aliases. Non-Control modifier bits are preserved. A legacy terminal may make Ctrl+? indistinguishable from Backspace, but the plain ? help binding remains separate.

Invalid expressions (an empty name, an unknown modifier, or Shift+ on a printable character) are reported when the user configuration loads, so a bad binding is caught before the TUI starts rather than failing silently.