Skip to content

Devboard¤

ci documentation pypi version gitter

A development dashboard for projects, issues, pull requests, and other work.

Installation¤

pip install devboard

With uv:

uv tool install devboard

Sponsors¤

Usage¤

Devboard displays columns stacked horizontally, like a Kanban board. Each column is a "To Do Something" and presents information in a data table. Data tables have a header line with labels, and multiple rows presenting information collected from source items. An item can be a project, an issue, a pull request, or an object from another provider. The default board uses Git projects and collects their status, commits, branches, and tags.

Press Ctrl+R to scan all columns again. On the default Git board, Ctrl+Shift+R fetches remote data before scanning each project.

To start using Devboard, try to run the devboard command in your terminal. It will show you a default board with four columns:

Devboard ╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮ │▶ To Commit3││▶ To Pull2││▶ To Push1││▶ To Release2│ │ Project     Details││ Project        Bran││ Project  Branch  Co││ Project  Details │ │ archan      1M     ││ failprint      feat││ duty     main    3 ││ duty     2F 1X   │ │ dependenpy  1D 2U  ││ git-changelog  main││││ mvodb    1F      │ │ failprint   1U     │││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ╰───────────────────────╯╰───────────────────────╯╰───────────────────────╯╰───────────────────────╯  ^k Keys ^p Palette

If the columns are empty and collapsed, that is normal. It's because Devboard does not know where to look for your projects. By default, it looks into the dev folder in your home/user directory. To change that directory, you can modify it directly in the default board, located in your user configuration directory (use devboard --show-config-dir), or you can set the DEVBOARD_PROJECTS environment variable:

export DEVBOARD_PROJECTS=~/path/to/your/projects
setx DEVBOARD_PROJECTS ~/path/to/your/projects

Keyboard controls¤

Boards keep these default shortcuts unless they override the same keys. Custom boards can add shortcuts and column actions.

Key Action
? Show help for the current board
Ctrl+K Show or hide the Keys panel
Ctrl+P Open the command palette
Ctrl+C or Esc Exit from the main board
Ctrl+R Refresh all columns
Ctrl+F5 Force-refresh all columns
Ctrl+F Filter all columns
Ctrl+E Collapse or expand the focused column
Ctrl+X Maximize the focused column or restore its previous layout

The Keys panel includes shortcuts hidden from the footer and updates when focus changes. The command palette also provides item refresh, column refresh, their forced versions, and Filter column, without default shortcuts.

In the filter prompt, press Enter to apply the text or Esc to cancel. Submit empty text to clear the filter. The default filter searches displayed cells and ignores case.

Navigation key Action
Tab / Shift+Tab Move focus forward / backward between widgets, including collapsed columns
Up / Down Move the row cursor
Left / Right Scroll the table horizontally
Page Up / Page Down Move the row cursor by a page
Ctrl+Home / Ctrl+End Move to the first / last row
Home / End Scroll to the left / right edge of the table

Use Space to toggle a row's checkbox. Pressing Enter emits Textual's row-selection event, which the default board does not handle.

Default application shortcuts leave unmodified letters available for custom board and column actions. Special characters such as ?, *, and ! have built-in bindings. See the tutorial to customize bindings.

The default Git board adds these actions in the focused column:

Column Key Action
To Commit S Show Git status
To Commit D Show Git diff
To Pull P Pull the branch from origin; blocked if the project has uncommitted changes
To Pull D Force-delete the local branch without a confirmation prompt
To Push P Push the branch to origin

The To Release column has no additional shortcuts.

Informative actions¤

Once your board displays some rows in the "To Commit" column, try showing the Git status or diff with S and D keys.

Devboard ╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮ │▶ To Commit3││▶ To Pull2││▶ To Push1││▶ To Release2│ │ Proje█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█etails │ │ archa█On branch main█F 1X   │ │ depen█Your branch is up to date with 'origin/main'.█F      │ │ failp██│ │█Changes not staged for commit:█│ │█  (use "git add/rm <file>..." to update what will be committed)█│ │█  (use "git restore <file>..." to discard changes in working directory)█│ │█deleted:    pyproject.toml█│ │██│ │█Untracked files:█│ │█  (use "git add <file>..." to include in what will be committed)█│ │█detect_cycles.py█│ │█standard_lib.py█│ │██│ │█no changes added to commit (use "git add" and/or "git commit -a")█│ │██│ │██│ │██│ │█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█│ ││││││││ ╰───────────────────────╯╰───────────────────────╯╰───────────────────────╯╰───────────────────────╯  s Show status  d Show diff  ^k Keys ^p Palette

You can scroll using the mouse wheel and the arrows. Press Esc or any unbound key to close the dialog.

Background actions¤

Try to move focus to different columns with the Tab and Shift+Tab keys. In the "To Pull" column, try to start a background action that will pull a branch using the P key. If action started successfully, you should see a notification:

Devboard ╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮ │▶ To Commit3││▶ To Pull2││▶ To Push1││▶ To Release2│ │ Project     Details││ Project        Bran││ Project  Branch  Co││ Project  Details │ │ archan      1M     ││ failprint      feat││ duty     main    3 ││ duty     2F 1X   │ │ dependenpy  1D 2U  ││ git-changelog  main││││ mvodb    1F      │ │ failprint   1U     │││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ │││▌│ │││▌INFO  Started: Pulling branch main in│ │││▌git-changelog│ ╰───────────────────────╯╰───────────────────────▌─╯  p Pull  d Delete branch  ^k Keys ^p Palette

Upon success, you'll see a success notification, and the row will be removed from the table:

Devboard ╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮ │▶ To Commit3││▶ To Pull1││▶ To Push1││▶ To Release2│ │ Project     Details││ Project        Bran││ Project  Branch  Co││ Project  Details │ │ archan      1M     ││ failprint      feat││ duty     main    3 ││ duty     2F 1X   │ │ dependenpy  1D 2U  ││││││ mvodb    1F      │ │ failprint   1U     │││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ │││▌│ │││▌SUCCESS  Finished: Pulling branch main in│ │││▌git-changelog│ ╰───────────────────────╯╰───────────────────────▌─╯  p Pull  d Delete branch  ^k Keys ^p Palette

If there is an error, you'll see an error notification:

Devboard ╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮ │▶ To Commit3││▶ To Pull2││▶ To Push1││▶ To Release2│ │ Project     Details││ Project        Bran││ Project  Branch  Co││ Project  Details │ │ archan      1M     ││ failprint      feat││ duty     main    3 ││ duty     2F 1X   │ │ dependenpy  1D 2U  ││ git-changelog  main││││ mvodb    1F      │ │ failprint   1U     │││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ │││▌│ │││▌ERROR  Pulling branch main in git-changelog:│ │││▌fatal: unable to access│ │││▌'https://github.com/pawamoy/git-changelog':│ │││▌Failed to connect to (domain) port 443: Timed│ │││▌Out│ ╰───────────────────────╯╰───────────────────────▌─╯  p Pull  d Delete branch  ^k Keys ^p Palette

Sometimes the column will prevent you from applying action, for example when the repository is dirty:

Devboard ╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮ │▶ To Commit3││▶ To Pull2││▶ To Push1││▶ To Release2│ │ Project     Details││ Project        Bran││ Project  Branch  Co││ Project  Details │ │ archan      1M     ││ failprint      feat││ duty     main    3 ││ duty     2F 1X   │ │ dependenpy  1D 2U  ││ git-changelog  main││││ mvodb    1F      │ │ failprint   1U     │││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ │││▌│ │││▌WARNING  Prevented: Pulling branch│ │││▌feat/capture-fd in failprint: project is dirty│ ╰───────────────────────╯╰───────────────────────▌─╯  p Pull  d Delete branch  ^k Keys ^p Palette

Devboard will also prevent applying multiple actions rapidly to the same project, to prevent race conditions:

Devboard ╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮ │▶ To Commit3││▶ To Pull2││▶ To Push1││▶ To Release2│ │ Project     Details││ Project        Bran││ Project  Branch  Co││ Project  Details │ │ archan      1M     ││ failprint      feat││ duty     main    3 ││ duty     2F 1X   │ │ dependenpy  1D 2U  ││ git-changelog  main││││ mvodb    1F      │ │ failprint   1U     │││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ │││▌│ │││▌INFO  Started: Pulling branch main in│ │││▌git-changelog│ │││▌│ ││││││││ │││▌│ │││▌WARNING  Prevented: Pulling branch main in│ │││▌git-changelog: An operation is ongoing│ ╰───────────────────────╯╰───────────────────────▌─╯  p Pull  d Delete branch  ^k Keys ^p Palette

Row selection¤

Column actions apply to selected visible rows in the focused column. If no visible rows are selected, actions use the current row. Hidden rows retain their selections but do not participate in actions.

  • To select a row, press Space. To unselect it, press Space again.
  • To select all visible rows, press Ctrl+A or *. If all visible rows are selected, this clears their selection.
  • To reverse the selection of visible rows, press !.
  • Press Shift+Up or Shift+Down to move to the previous or next row and toggle that row's selection.

Devboard ╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮╭───────────────────────╮ │▶ To Commit3││▶ To Pull2││▶ To Push1││▶ To Release2│ │ Project     Details││ Project        Bran││ Project  Branch  Co││ Project  Details │ │■ archan      1M     ││ failprint      feat││ duty     main    3 ││ duty     2F 1X   │ │ ■  dependenpy  1D 2U  ││ git-changelog  main││││ mvodb    1F      │ │ failprint   1U     │││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ││││││││ ╰───────────────────────╯╰───────────────────────╯╰───────────────────────╯╰───────────────────────╯  ^k Keys ^p Palette

Building your own board¤

Follow our tutorial!

Choosing boards¤

Boards in the configuration directory can be chosen by passing their name to the devboard command:

devboard myboard

You can set a board as the default one in Devboard's configuration file. Use devboard --show-config-dir to get its location, then:

board = "myboard"

Now when calling devboard it will use myboard instead of the default one.

Finally, you can also pass a path to a board module:

devboard ./path/to/myboard.py