org.nvim

Kanban board

Stability: stable (org-extensions-stability)

A board with a column per TODO keyword and a card per heading:

require("org").setup({ extensions = { kanban = {
  columns = {
    "TODO",
    { "NEXT", "WAITING", name = "Doing", wip = 3 },
    "DONE",
  },
} } })

:Org kanban [agenda|buffer|subtree|<file>] [filter] opens it; the actions kanban_open (<prefix>Vk), kanban_buffer and kanban_subtree open it on the source option, the current buffer and the subtree at the cursor.

Columns are the TODO keywords in the order they are defined (with the keywords of #+TODO lines in the source files after them) unless columns lists them; a column can gather several keywords under a name. The header shows the number of cards, or count/limit with a WIP limit (wip in the column or the wip option), in the error colour with a ! once over it. Headers use the TODO keyword faces (ui.todo_keyword_faces).

A card shows the priority, the title (wrapped to title_lines), the deadline countdown (◆ in 3d, in the warning colour within the deadline's warning period, the error colour when overdue), the Effort (◷ 2:30) and the tags; card turns each part on or off (scheduled and category are off by default). Cards are sorted by sort.

Keys in the board

  h / l     move the card to the previous / next column: the heading gets
            the column's first keyword through the regular TODO code, so
            logging, CLOSED, blocking and repeaters work as with C-c C-t.
            Columns whose keywords the card's file doesn't have (another
            #+TODO sequence) are skipped. With choose_keyword, a column
            of several keywords asks which one.
  j / k     next / previous card
  J / K     move the card after the next / before the previous card of the
            column: its subtree moves past the other one in the file. Only
            for cards under the same heading, with sort = "file" (in the
            other orders the board would put it back)
  H / L     previous / next column
  <CR>      open the heading
  /         filter (empty clears it)
  r         refresh
  <Esc> q   quit

The cursor can also be moved onto a card with any motion or the mouse. The board redraws itself when an org file is written, when one of its files is changed (in Normal mode; a burst of changes redraws once), and when a TODO state or clock changes; a board in a hidden tab waits until it is shown. Moving the selection redraws nothing. A board of thousands of cards takes a noticeable moment to build (about 0.2 s for 5,000 cards). Moved cards are saved with save = true (default: agenda.save_after_edit).

Options (defaults)

  columns            {} (one per keyword)
  choose_keyword     false
  wip                {} (limits by column name or keyword)
  show_done          true
  source             "agenda"
  query, tag       nil
  sort               "priority" | "deadline" | "scheduled" | "file"
  layout             "float" | "tab" | "split" | "vsplit" | "current"
  width, height    0.94, 0.88 (of the editor, or columns / lines)
  min_column_width   22
  max_column_width   44
  title_lines        2
  card               { priority, tags, deadline, effort = true,
                       scheduled, category = false }
  save               nil
  keys               the keys above, by name: prev_state, next_state,
                       down, up, move_down, move_up, prev_column,
                       next_column, jump, refresh, filter, quit

Highlight groups: OrgKanbanTitle, OrgKanbanHint, OrgKanbanBorder, OrgKanbanSelected, OrgKanbanCardTitle, OrgKanbanDoneTitle, OrgKanbanCount, OrgKanbanWipExceeded, OrgKanbanOverdue, OrgKanbanDueSoon, OrgKanbanDue, OrgKanbanScheduled, OrgKanbanEffort, OrgKanbanCategory, OrgKanbanEmpty.