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

Alloy TUI Guide & Keybinding Cheat Sheet

The Alloy TUI is a terminal-based interface for managing projects, tickets, and sprints. It uses vim-style modal editing — if you know vim, you already know how to navigate.

Launching the TUI

# Default — connects to http://localhost:3000
cargo run --bin alloy-tui

# Custom API server
ALLOY_BASE_URL=https://api.example.com cargo run --bin alloy-tui

# Or export first
export ALLOY_BASE_URL=http://localhost:3000
cargo run --bin alloy-tui

If you have the alloy-tui binary on your PATH:

alloy-tui
ALLOY_BASE_URL=https://api.example.com alloy-tui

Configuration

VariableDefaultDescription
ALLOY_BASE_URLhttp://localhost:3000Alloy API server URL
ALLOY_ORG_ID(auto-discovered)Organization ID override

Auto-Discover Behavior

On startup the TUI automatically discovers your organization:

  1. If ALLOY_ORG_ID is set, that value is used directly.
  2. Otherwise, once connected to the API, the TUI calls GET /api/v1/auth/me and extracts org_id from the response.
  3. After org_id is resolved, projects, tickets, and labels are fetched automatically.

This means you can launch the TUI without any configuration beyond ALLOY_BASE_URL and a valid API key — the org is detected for you.

Modes

The TUI has four modes, displayed in the status bar with distinct colors.

ModeColorHow to enterHow to exitPurpose
NormalBlueEsc from any modeNavigate, select, trigger actions
InsertGreeni from NormalEscEdit text fields
CommandYellow: from NormalEsc or EnterRun commands like :q, :sort
SearchMagenta/ from NormalEscReal-time ticket search

If you are new to vim-style modes: you start in Normal mode. Press keys to navigate (they are not typed into a text field). Switch to Insert mode to type text, Command mode to enter commands, or Search mode to filter tickets. Press Esc to return to Normal.

Views

Ticket List

The default view. Shows all tickets in a table with columns for Key, Title, Status, Assignee, and Priority.

KeyAction
j / DownMove cursor down
k / UpMove cursor up
ggJump to first ticket
GJump to last ticket
EnterOpen ticket detail
TabCycle project filter (All → each project → All)
/Enter Search mode
nCreate new ticket (see Ticket Creation)
lManage labels on selected ticket
tLog time against selected ticket
dDelete selected ticket
DCascade delete (ticket + dependents)
?Show help overlay
qQuit

Ticket Detail

Full view of a single ticket: status, priority, assignee, reporter, sprint, timestamps, description (word-wrapped), and comments.

KeyAction
j / DownScroll down
k / UpScroll up
ggScroll to top
GScroll to bottom
nCreate new ticket
lManage labels on this ticket
tLog time against this ticket
dDelete this ticket
DCascade delete (ticket + dependents)
Esc / qReturn to ticket list

Sprint Board

Horizontal kanban board showing tickets grouped by status columns.

KeyAction
h / LeftMove to previous column
l / RightMove to next column
TabNext column
Shift+TabPrevious column
j / DownMove down within column
k / UpMove up within column
ggJump to top of column
GJump to bottom of column
EnterOpen ticket detail
bToggle burndown chart
LManage labels on selected ticket
tLog time against selected ticket
dDelete selected ticket
DCascade delete (ticket + dependents)
Esc / qReturn to ticket list

Open a sprint board with the :sprint <sprint-id> command.

Quick Actions

Available from Ticket List, Ticket Detail, and Sprint Board views.

KeyActionPopup behavior
sChange statusSelect from: Backlog, Todo, InProgress, InReview, Done, Cancelled
aAssign ticketSelect from known assignees, or Unassign
cAdd commentType comment text, Enter to submit
pChange prioritySelect from: Urgent, High, Medium, Low, None
nCreate ticketEnter title and priority, Enter to submit
lManage labelsToggle labels on/off for a ticket (L on sprint board)
tLog timeEnter duration (minutes) and activity type
dDelete ticketConfirm deletion (Cancel selected by default)
DCascade deletePreview dependents, then confirm

Inside a popup:

KeyAction
j / DownMove selection down
k / UpMove selection up
TabSwitch between fields (multi-field popups)
EnterConfirm selection/submit
EscCancel and close popup

The comment popup accepts free-text input. Type your comment and press Enter to submit or Esc to cancel.

Ticket Creation

Press n to open the ticket creation popup. It has two fields:

FieldInput typeNotes
TitleTextRequired — popup will not submit if empty
PrioritySelectorUrgent, High, Medium, Low, None (default)

Use Tab to switch between the Title and Priority fields. In the Priority field, j/k cycle through options. Press Enter to create the ticket or Esc to cancel.

The ticket is created in the currently selected project. The reporter is set to the authenticated user automatically.

Label Management

Press l (or L on the sprint board) to open the label popup for the selected ticket. The popup lists all organization labels with a toggle indicator:

  • ✓ label-name (#COLOR) — label is attached to the ticket
  • label-name (#COLOR) — label is not attached

Navigate with j/k and press Enter to toggle a label on or off. Press Esc to close the popup.

Time Logging

Press t to open the time logging popup for the selected ticket. It has two fields:

FieldInput typeNotes
DurationNumberMinutes (1–1440). Only digits accepted
Activity TypeSelectorCoding, Testing, CodeReview, Design, Architecture, PM, Requirements, Training, Maintenance, BugFixing, Documentation, Deployment, Meetings

Use Tab to switch between fields. The default activity type is Coding. Press Enter to submit or Esc to cancel. The time entry is logged for today’s date against the selected ticket.

Delete

Press d to delete the selected ticket. A confirmation popup appears with Cancel selected by default for safety. Select “Yes, delete” and press Enter to confirm.

If the ticket has dependents (comments, etc.), the simple delete returns a 409 Conflict. Use D instead for cascade delete:

  1. A dry-run request previews what will be deleted (e.g., comment count).
  2. A confirmation popup shows “Yes, delete ticket + N comments” and “Cancel”.
  3. On confirmation the ticket and all dependents are removed.

After deletion the ticket is removed from the local list and the cursor adjusts automatically.

Burndown Chart

When viewing a sprint board, a burndown chart is displayed at the bottom showing sprint progress over time. The chart includes:

  • Sprint date range (start to end)
  • Total tickets vs completed/remaining count
  • Completion percentage
  • Progress sparkline

Press b to toggle the burndown chart on or off. It is shown by default when opening a sprint board.

Sprint Management

Sprint operations are available via command mode (:sprint).

CommandDescription
:sprint <id>Open sprint board for the given sprint ID
:sprint listList all sprints in the current project
:sprint create <name> <start> <end>Create a new sprint (dates: YYYY-MM-DD)
:sprint start <sprint-id>Start a planned sprint
:sprint complete <sprint-id>Complete an active sprint

Examples:

:sprint list
:sprint create Sprint-4 2026-04-01 2026-04-14
:sprint start abc123-def456
:sprint complete abc123-def456
:sprint abc123-def456

Command Mode

Press : to enter Command mode. Type a command and press Enter to execute.

CommandDescription
:q / :quitExit the application
:filter status=XFilter tickets by status (e.g., :filter status=Todo)
:filterClear status filter
:sort field:dirSort tickets (e.g., :sort priority:desc)
:sortClear sort, return to default order
:sprint <id>Open sprint board for given sprint ID
:sprint listList sprints in current project
:sprint create <name> <start> <end>Create a new sprint
:sprint start <id>Start a planned sprint
:sprint complete <id>Complete an active sprint
:project <key>Switch to a specific project by key
:projectClear project filter (show all)

Sort fields: priority, status, title, assignee Sort directions: asc (default), desc

Command mode helpers:

KeyAction
TabAuto-complete command name
UpPrevious command from history
DownNext command from history
BackspaceDelete character (empty → Normal mode)
EscCancel, return to Normal mode

Press / to enter Search mode. Type to filter tickets in real time.

  • Matches against ticket key, title, and status (case-insensitive)
  • Press Esc to stop searching (matches remain highlighted)
  • Press n for next match, N for previous match (in Normal mode)
  • Filtering respects active project and status filters

Complete Keybinding Reference

Normal Mode — Global

KeyAction
:Enter Command mode
/Enter Search mode
?Show help overlay
qQuit application
EscReturn to Normal mode / close popup

Normal Mode — Navigation

KeyAction
j / DownMove down / scroll
k / UpMove up / scroll
ggJump to top
GJump to bottom
h / LeftPrevious column (sprint board)
l / RightNext column (sprint board)
TabNext column / cycle project filter
Shift+TabPrevious column (sprint board)
EnterOpen ticket detail

Normal Mode — Actions

KeyActionViews
sChange statusList, Detail, Board
aAssign ticketList, Detail, Board
cAdd commentList, Detail, Board
pChange priorityList, Detail, Board
nCreate ticketList, Detail
lManage labelsList, Detail
LManage labelsSprint Board
tLog timeList, Detail, Board
dDelete ticketList, Detail, Board
DCascade deleteList, Detail, Board
bToggle burndownSprint Board

Search Mode

KeyAction
anyAppended to search query
EscExit search (matches highlighted)
nNext match (after exiting search)
NPrevious match
KeyAction
j / DownMove selection down
k / UpMove selection up
TabSwitch field (multi-field popups)
EnterConfirm / submit
EscCancel / close
BackspaceDelete character (text fields)

TUI Layout

┌──────────────────────────────────────────────────────────────────┐
│                                                                  │
│                      Main Content Area                           │
│                                                                  │
│   Ticket List ─────────────────────────────────────────────────  │
│   ┌──────────┬────────────────────┬────────────┬──────────────┐  │
│   │ Key      │ Title              │ Status     │ Priority     │  │
│   ├──────────┼────────────────────┼────────────┼──────────────┤  │
│   │ PROJ-1   │ Fix login bug      │ InProgress │ High         │  │
│   │ PROJ-2   │ Add dark mode      │ Todo       │ Medium       │  │
│   │ PROJ-3   │ Update docs        │ Done       │ Low          │  │
│   └──────────┴────────────────────┴────────────┴──────────────┘  │
│                                                                  │
│   — or —                                                         │
│                                                                  │
│   Ticket Detail ───────────────────────────────────────────────  │
│   ┌────────────────────────────────────────────────────────────┐ │
│   │ Status: InProgress   Priority: High                        │ │
│   │ Assignee: alice      Reporter: bob                         │ │
│   │ Sprint: Sprint 3     Created: 2026-03-01                   │ │
│   │                                                            │ │
│   │ Description                                                │ │
│   │ ────────────────────────────────────                       │ │
│   │ [scrollable content with word wrapping]                    │ │
│   │                                                            │ │
│   │ Comments                                                   │ │
│   │ ────────────────────────────────────                       │ │
│   │ alice (2026-03-02): Looks good to me                       │ │
│   └────────────────────────────────────────────────────────────┘ │
│                                                                  │
│   — or —                                                         │
│                                                                  │
│   Sprint Board (kanban) ───────────────────────────────────────  │
│   ┌───────────────┬───────────────┬───────────────┐              │
│   │ Todo (3)      │ InProgress (2)│ Done (4)      │              │
│   ├───────────────┼───────────────┼───────────────┤              │
│   │ PROJ-1: Fix   │ PROJ-3: API  │ PROJ-2: Docs  │              │
│   │ PROJ-4: Auth  │ PROJ-5: Test │ PROJ-6: Setup │              │
│   │ PROJ-7: UI    │              │ PROJ-8: CI    │              │
│   │               │              │ PROJ-9: Deps  │              │
│   └───────────────┴───────────────┴───────────────┘              │
│   ┌────────────── Burndown ──────────────────────┐               │
│   │ Sprint 3 (2026-03-01 → 2026-03-14)  67%     │               │
│   │ Total: 9  Done: 6  Remaining: 3             │               │
│   │ ▁▂▃▄▅▆▇█ progress sparkline                 │               │
│   └──────────────────────────────────────────────┘               │
│                                                                  │
├──────────────────────────────────────────────────────────────────┤
│ [NORMAL] Connected │ [PROJ] 2/15                    Status Bar   │
└──────────────────────────────────────────────────────────────────┘

The status bar shows:

  • Mode indicator — current mode with colored background
  • Connection status — whether the API is reachable
  • Context info — varies by view:
    • Ticket List: project key and cursor position (e.g., [PROJ] 5/23)
    • Sprint Board: sprint name, date range, progress, and board position
    • Command/Search mode: the command or search buffer being typed