Feature Reference

Keyboard shortcuts, configuration, and technical details

Keyboard Shortcuts

Board Navigation

KeyActionContext
qQuit the applicationGlobal
TabToggle focus between search box and boardGlobal
EscapeReturn to board from search / dismiss modalGlobal
UpNavigate to previous task in columnBoard
DownNavigate to next task in columnBoard
LeftNavigate to previous columnBoard
RightNavigate to next columnBoard
EnterOpen task detail dialogBoard (focused card)
rRefresh board from diskBoard
sSync task data with remoteBoard
OOpen board options/settings dialogBoard
aSwitch to All view (show all tasks)Board
gSwitch to Git view (show git-linked tasks)Board
iSwitch to Implementing view (show implementing tasks + context)Board

Task Operations

KeyActionContext
Shift+RightMove task to next column (skips collapsed)Board (parent cards only)
Shift+LeftMove task to previous column (skips collapsed)Board (parent cards only)
Shift+UpSwap task with one aboveBoard (parent cards only)
Shift+DownSwap task with one belowBoard (parent cards only)
Ctrl+UpMove task to top of columnBoard (parent cards only)
Ctrl+DownMove task to bottom of columnBoard (parent cards only)
nCreate a new taskBoard
xToggle expand/collapse child tasksBoard (parent or child card)
cCommit focused modified taskBoard (shown when task is modified)
CCommit all modified tasksBoard (shown when any task is modified)

Column Operations

KeyActionContext
Ctrl+RightMove column one position rightBoard
Ctrl+LeftMove column one position leftBoard
X (Shift+X)Toggle collapse/expand for focused card’s columnBoard (focused card)
Ctrl+BackslashOpen command paletteGlobal
Click / Toggle column collapse/expandColumn header
Click Open column edit dialogColumn header
KeyActionContext
UpFocus previous fieldInside modal dialogs
DownFocus next fieldInside modal dialogs
LeftCycle to previous optionOn CycleField
RightCycle to next optionOn CycleField
EnterActivate focused button / navigate to linked taskInside modal dialogs
EscapeClose the dialogInside modal dialogs

Task Card Anatomy

┌─────────────────────────────────┐  ← Border color = priority
│ t47 *  playlists support        │  ← Task number (cyan), * if modified (orange), title (bold)
│ 💪 medium | 🏷️ ui,api | GH | PR:GH | @alice │  ← Effort, labels, issue/PR indicator, contributor
│ 🔒 alice@example.com            │  ← Lock indicator (if locked)
│ 🚫 blocked | 👤 alice           │  ← Status/blocked, assigned to
│ 🔗 t12, t15                     │  ← Blocking dependency links
│ 📎 folded into t42              │  ← Folded indicator (if applicable)
│ 👶 3 children                   │  ← Child task count (if parent)
└─────────────────────────────────┘

Not all lines are shown on every card — lines only appear when the corresponding data exists.

Priority Color Coding

PriorityBorder Color
HighRed
MediumYellow
Low / NormalGray

The focused card always shows a double cyan border, regardless of priority.

Issue Platform Indicators

The board detects the issue tracking platform from the URL hostname:

PlatformIndicatorColor
GitHub (github in hostname)GHBlue
GitLab (gitlab in hostname)GLOrange (#e24329)
Bitbucket (bitbucket in hostname)BBBlue
OtherIssueBlue

PR Platform Indicators

Tasks created from pull requests (via ait pr-import) display a pull request indicator on the task card info line:

PlatformIndicatorColor
GitHub (github in hostname)PR:GHGreen
GitLab (gitlab in hostname)MR:GLOrange (#e24329)
Bitbucket (bitbucket in hostname)PR:BBBlue
OtherPRGreen

GitLab uses “MR” (Merge Request) terminology, which the indicator reflects.

View Modes

The View Selector widget at the top-left of the filter area provides three task filtering modes. The active mode is highlighted in bold cyan; inactive modes appear dimmed. View modes combine with text search using AND logic.

ModeKeySelector LabelShows
Allaa AllAll tasks (default)
Gitgg GitTasks with issue or pull_request metadata
Implementingii ImplTasks with status “Implementing”, plus parent tasks with implementing children and all siblings of implementing children

Implementing view auto-expansion: When Implementing mode is activated, parent tasks that have at least one child with status “Implementing” are automatically expanded (their child cards are displayed). When switching away from Implementing mode, these auto-expanded parents are collapsed back unless they were manually expanded before entering the mode.

Column Configuration

Columns are stored in aitasks/metadata/board_config.json:

{
  "columns": [
    {"id": "now", "title": "Now", "color": "#FF5555"},
    {"id": "next", "title": "Next Week", "color": "#50FA7B"},
    {"id": "backlog", "title": "Backlog", "color": "#BD93F9"}
  ],
  "column_order": ["now", "next", "backlog"],
  "settings": {
    "auto_refresh_minutes": 5,
    "sync_on_refresh": false
  }
}
  • id — Unique identifier (auto-generated from title on creation)
  • title — Display name (can include emojis)
  • color — Hex color code for the column header and border
  • column_order — Controls left-to-right display order
  • settings.auto_refresh_minutes — Interval in minutes for periodic board refresh (0 to disable, default 5)
  • settings.sync_on_refresh — Enable automatic sync with remote on each auto-refresh interval (default false). Requires .aitask-data worktree (data branch mode). When enabled, the board subtitle shows “+ sync”
  • settings.collapsed_columns — List of column IDs that are currently collapsed (default: empty). Collapsed columns show only their title and task count in a narrow strip. Tasks in collapsed columns are not rendered, which improves performance for boards with many tasks

The “Unsorted / Inbox” column is a special dynamic column (ID: unordered) that appears automatically when tasks exist without a boardcol assignment.

Color Palette

When adding or editing a column, you can choose from 8 predefined colors:

ColorHex CodeName
#FF5555Red
#FFB86COrange
#F1FA8CYellow
#50FA7BGreen
#8BE9FDCyan
#BD93F9Purple
#FF79C6Pink
#6272A4Gray

Task Metadata Fields

The board reads and displays the following frontmatter fields from task files:

FieldTypeEditable from BoardDescription
prioritystringYes (cycle)low, medium, or high
effortstringYes (cycle)low, medium, or high
statusstringYes (cycle)Ready, Editing, Implementing, Postponed, Done, Folded
issue_typestringYes (cycle)Loaded from task_types.txt (defaults: bug, chore, documentation, feature, performance, refactor, style, test)
labelslistRead-onlyTag list, displayed comma-separated
dependslistRead-only*Task IDs this task depends on. *Can remove stale references.
assigned_tostringRead-onlyPerson assigned to the task
issuestringRead-onlyURL to external issue tracker
pull_requeststringRead-onlyURL to external pull request / merge request (set by ait pr-import)
contributorstringRead-onlyPR author username, displayed as @username on the card
contributor_emailstringRead-onlyPR author email (shown in detail dialog)
implemented_withstringRead-onlyCode agent and model used to implement the task (e.g., claudecode/opus4_6)
created_atstringRead-onlyCreation timestamp (YYYY-MM-DD HH:MM)
updated_atstringAuto-updatedUpdated automatically on save
children_to_implementlistRead-onlyChild task IDs for parent tasks
folded_taskslistRead-onlyTask IDs that were merged into this task
folded_intostringRead-onlyTask ID this task was folded into
boardcolstringAuto-managedColumn ID (set by board operations)
boardidxintegerAuto-managedSort index within column (set by board operations)

Board Data Fields

Two metadata fields are managed internally by the board:

  • boardcol — The column ID where the task is placed (e.g., "now", "backlog", "unordered"). Tasks without this field appear in the “Unsorted / Inbox” column.
  • boardidx — The sort index within a column. Lower values appear higher. After any movement operation, indices are normalized to 10, 20, 30, etc.

These fields are always written last in the frontmatter and are updated using a reload-and-save mechanism that prevents overwriting other metadata fields changed externally.

Lock Status Display

Lock information is not stored in task files – it is fetched from the remote aitask-locks branch via aitask_lock.sh --list and maintained in memory as a lock map. The board refreshes the lock map on startup, on every manual/auto refresh, and after lock/unlock operations.

Display LocationLockedUnlocked
Task card🔒 user@example.com (additional line)No lock line shown
Task detail🔒 Locked: user@co on hostname since timestamp🔓 Lock: Unlocked (dimmed)

Locks older than 24 hours show a (may be stale) warning in the detail view.

Button states in detail dialog:

ButtonEnabled whenDisabled when
🔒 LockTask is unlocked AND status is not Done/Folded AND not read-onlyTask is already locked, or Done/Folded/read-only
🔓 UnlockTask is lockedTask is not locked

For details on the underlying lock mechanism, see the ait lock command reference.

DialogTriggerPurpose
Task DetailEnter on card / double-clickView/edit task metadata, lock status, pull request link, contributor info, and content; access Pick, Lock, Unlock, Save, Revert, Edit, Delete, Close buttons
Column EditCommand palette “Add/Edit Column” / click in column headerSet column title and color
Column SelectCommand palette “Edit/Delete/Collapse/Expand Column”Pick which column to act on
Delete Column ConfirmAfter selecting column to deleteConfirm column deletion; warns about task count
Commit Messagec or C keyEnter commit message for modified task(s)
Delete Confirm“Delete” button in task detailConfirm task deletion; lists all files to be removed
Dependency PickerEnter on Depends field (multiple deps)Select which dependency to open
Remove Dep ConfirmEnter on missing dependencyOffer to remove stale dependency reference
Child PickerEnter on Children field (multiple children)Select which child task to open
Folded Task PickerEnter on Folded Tasks field (multiple)Select which folded task to view (read-only)
Lock Email“🔒 Lock” button in task detailEnter email for lock ownership; confirms to acquire lock via aitask_lock.sh
Unlock Confirm“🔓 Unlock” button (when lock belongs to different user)Shows lock details (who, where, when); offers “Force Unlock” or “Cancel”
Sync ConflictSync detects merge conflictsShows conflicted files; offers “Resolve Interactively” (opens terminal) or “Dismiss”
SettingsO key / command palette “Options”Configure board settings (auto-refresh interval, sync on refresh)

Git Integration Details

The board auto-detects whether task data lives on a separate aitask-data branch (via the .aitask-data/ worktree) or on the current branch (legacy mode). All git operations are routed through a worktree-aware helper, so the board works transparently in both modes.

Modified file detection:

The board queries git status --porcelain -- aitasks/ on startup and after each refresh to identify modified .md files. Modified tasks show an orange asterisk (*) next to their task number. In branch mode, this targets the aitask-data worktree automatically.

Commit workflow:

  1. Selected files are staged with git add <filepath>
  2. A commit is created with the user-provided message
  3. The board refreshes git status after commit

In branch mode, commits target the aitask-data branch, not the main code branch.

Revert workflow:

Runs git checkout -- <filepath> to discard local changes and restore the last committed version.

Delete workflow:

  1. Files are removed with git rm -f <filepath> (falls back to os.remove for untracked files)
  2. Empty child task/plan directories are cleaned up
  3. An automatic commit is created: “Delete task t and associated files”

Configuration Files

FileFormatPurpose
aitasks/metadata/board_config.jsonJSONBoard column definitions, order, and settings (auto-refresh)
aitasks/metadata/task_types.txtText (one per line)Valid issue types for the Type cycle field

Both files are auto-created with defaults if they don’t exist.

Environment Variables

VariableDefaultPurpose
EDITORnano (Linux/macOS), notepad (Windows)External editor opened by the “Edit” button
TERMINALAuto-detectedTerminal emulator for “New Task” and “Pick” actions
PYTHONpython3Python interpreter (used by launcher if shared venv is unavailable)

Terminal auto-detection order: $TERMINAL, then x-terminal-emulator, xdg-terminal-exec, gnome-terminal, konsole, xfce4-terminal, lxterminal, mate-terminal, xterm. If none found, the board suspends to run commands in the current terminal.