You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Kevin Schoon 309277a115
Merge pull request #62 from sboysel/feature/ui-task-message
Display current task message while running or paused
2 years ago
.github/workflows run tests in ci 3 years ago
bin improve build support 6 years ago
cmd/pomo restructure project into modules 4 years ago
contrib adds contrib dir for user contributed scripts 2 years ago
docs update docs 3 years ago
man add man page 2 years ago
pkg display current task message while running or paused 2 years ago
www fix broken docs links 3 years ago
.dockerignore add new build environment for cross compile 5 years ago
.gitignore fix missing demo on docs site 3 years ago
.gitmodules add hugo sources 6 years ago
LICENSE update license 5 years ago
Makefile add man page 2 years ago adds contrib dir for user contributed scripts 2 years ago
go.mod bump dependencies 2 years ago
go.sum bump dependencies 2 years ago
tomato-icon.png refactor run loop, add simple libnotify support, improve notifications, binpack tomato image 6 years ago


🍅 pomo


pomo is a simple CLI for using the Pomodoro Technique. There are some amazing task management systems but pomo is more of a task execution or timeboxing system. pomo helps you track what you did, how long it took you to do it, and how much effort you expect it to take.


The Pomodoro Technique is simple and effective:

  • Decide on a task you want to accomplish
  • Break the task into timed intervals (pomodoros), [approx. 25 min]
  • After each pomodoro take a short break [approx. 3 - 5 min]
  • Once all pomodoros are completed take a longer break [approx 15 - 20 min]
  • Repeat



git clone
cd pomo
# copy pomo somewhere on your $PATH
cp bin/pomo ~/bin/

Package Managers

On Arch Pomo is available on the aur.

On macOS, pomo can be installed via MacPorts.


Once pomo is installed you need to initialize it's database.

pomo init

Start a 4 pomodoro session at 25 minute intervals:

pomo start -t my-project "write some codes"


Pomo has a few configuration options which can be read from a JSON file in Pomo's config directory ~/.config/pomo/config.json.


You can map colors to specific tags in the colors field.


    "colors": {
        "my-project": "hiyellow",
        "another-project": "green"

Execute command on state change

Pomo will execute an arbitrary command specified in the array argument onEvent when the state changes. The first element of this array should be the executable to run while the remaining elements are space delimited arguments. The new state will be exported as an environment variable POMO_STATE for this command. Possible state values are RUNNING, PAUSED, BREAKING, or COMPLETE.

For example, to trigger a terminal bell when a session completes, add the following to config.json:

"onEvent": ["/bin/sh", "/path/to/script/"],

where the contents of are


if [ "$POMO_STATE" == "COMPLETE" ] ; then
   echo -e '\a'

See the contrib directory for user contributed scripts for use with onEvent.


By default pomo will setup a Unix socket and serve it's status there.

echo | socat stdio UNIX-CONNECT:$HOME/.pomo/pomo.sock | jq .
  "state": 1,
  "remaining": 1492000000000,
  "count": 0,
  "n_pomodoros": 4

Alternately by setting the publish flag to true it will publish it's status to an existing socket.

Status Bars

The Pomo CLI can output the current state of a running task session via the pomo status making it easy to script and embed it's output in various Linux status bars.


You can create a module with the custom/script type and embed Pomo's status output in your Polybar:

type = custom/script
interval = 1
exec = pomo status


Configured this bar by setting publish to true.

widget = {
	plugin = "unixsock",
	opts = {
		path = "pomo.sock",
		timeout = 2,
	cb = function(t)
		local full_text
		local foreground = ""
		local background = ""
		if t.what == "line" then
			if string.match(t.line, "R") then
				-- green
				foreground = "#ffffff"
				background = "#307335"
			if string.match(t.line, "B") or string.match(t.line, "P") or string.match(t.line, "C") then
				-- red
				foreground = "#ffffff"
				background = "ff8080"
			return { full_text = t.line, background = background, foreground = foreground }
		elseif t.what == "timeout" then
			return { full_text = "-" }
		elseif t.what == "hello" then
			return { full_text = "-" }


  • Generate charts/burn down
  • ??