Devboard
A development dashboard for your projects.
Installation With uv :
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 the information collected in your projects. Projects are supposed to be Git repositories from which we can collect information such as status, commits, branches, tags, etc.
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 Commit ││ ▶ To Pull ││ ▶ To Push ││ ▶ To Release │ │ 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 ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ └───────────────────────┘└───────────────────────┘└───────────────────────┘└───────────────────────┘ Q Exit F5 Refresh ? Help ▏ ^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:
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 Commit ││ ▶ To Pull ││ ▶ To Push ││ ▶ To Release │ │ 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 ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ └───────────────────────┘└───────────────────────┘└───────────────────────┘└───────────────────────┘ Q Exit F5 Refresh ? Help ▏ ^p palette
You can scroll using the mouse wheel and the arrows. You can dismiss the modal window with any other key press.
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 Commit ││ ▶ To Pull ││ ▶ To Push ││ ▶ To Release │ │ 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 Q Exit F5 Refresh ? Help ▏ ^p palette
Upon success, you'll see a success notification, and the row will be removed from the table:
Devboard ┌───────────────────────┐┌───────────────────────┐┌───────────────────────┐┌───────────────────────┐ │ ▶ To Commit ││ ▶ To Pull ││ ▶ To Push ││ ▶ To Release │ │ 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 Q Exit F5 Refresh ? Help ▏ ^p palette
If there is an error, you'll see an error notification:
Devboard ┌───────────────────────┐┌───────────────────────┐┌───────────────────────┐┌───────────────────────┐ │ ▶ To Commit ││ ▶ To Pull ││ ▶ To Push ││ ▶ To Release │ │ 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 Q Exit F5 Refresh ? Help ▏ ^p palette
Sometimes the column will prevent you from applying action, for example when the repository is dirty:
Devboard ┌───────────────────────┐┌───────────────────────┐┌───────────────────────┐┌───────────────────────┐ │ ▶ To Commit ││ ▶ To Pull ││ ▶ To Push ││ ▶ To Release │ │ 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 Q Exit F5 Refresh ? Help ▏ ^p palette
Devboard will also prevent applying multiple actions rapidly to the same project, to prevent race conditions:
Devboard ┌───────────────────────┐┌───────────────────────┐┌───────────────────────┐┌───────────────────────┐ │ ▶ To Commit ││ ▶ To Pull ││ ▶ To Push ││ ▶ To Release │ │ 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 Q Exit F5 Refresh ? Help ▏ ^p palette
Row selection You can select multiple rows and apply actions on all selected rows at once.
To select a row, press Space . To unselect it, press Space again. To select all rows, press Ctrl + A or Num * . To reverse the selection, press ! . To expand the selection upwards or downwards, hold Shift and press Up or Down . Devboard ┌───────────────────────┐┌───────────────────────┐┌───────────────────────┐┌───────────────────────┐ │ ▶ To Commit ││ ▶ To Pull ││ ▶ To Push ││ ▶ To Release │ │ 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 ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ │ ││ ││ ││ │ └───────────────────────┘└───────────────────────┘└───────────────────────┘└───────────────────────┘ Q Exit F5 Refresh ? Help ▏ ^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:
You can set a board as the default one in Devboard's configuration file. Use devboard --show-config-dir to get its location, then:
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