Tomato Timer
A Pomodoro timer for the Omarchy bar, with the clock sitting on a full-size background photo and every setting living in the panel itself — no config file to hand-edit.
<p align="center"> <img src="preview.png" alt="The Tomato Timer panel, paused mid-session" width="425"> </p>Features
- Work / break cycles. N cycles of work + break, then the session ends. There is no long break, and the last cycle has no break: when its work phase runs out, the session is complete.
- A different sound for each of the four moments — session start, break start, break end, session complete — chosen from 27 bundled sounds, with a preview button next to each.
- Background images. Eight bundled wallpapers, or any image of your own by path. The clock sits on top with a darkening veil so it stays readable.
- Desktop notifications when a break starts, when work resumes, and when the session is done.
- Runs in a service, so the timer keeps going with the panel closed and shows the same clock on every monitor.
- Survives suspend and restarts. The clock is deadline-based rather than counted down, phases that elapsed while the machine slept are caught up in one step, and a session interrupted by a shell restart comes back paused rather than silently resuming.
Install
omarchy plugin add https://github.com/SLcode777/tomato-timer
omarchy plugin enable slcode777.tomato-timer
omarchy restart shell
The shell restart matters on first install: a newly added service is not picked up by a running shell.
Removing it
omarchy plugin disable slcode777.tomato-timer
omarchy plugin remove slcode777.tomato-timer
Disabling takes the widget off the bar and stops the service; removing deletes the plugin folder. Neither touches your settings, so reinstalling picks up where you left off. To clear those too:
rm -f ~/.local/state/omarchy/tomato-timer-settings.json \
~/.local/state/omarchy/tomato-timer-state.json
Settings
Click the ring in the bar, then the gear. Everything is in there and saves as you change it:
| Group | What |
|---|---|
| Timer | Work duration (1–120 min), break (1–60), cycles (1–10), auto-start breaks and work |
| Sounds | Global on/off, volume, and the sound for each of the four events |
| Background | The eight bundled wallpapers, your own image by path, or none |
| Colours & bar | Clock colour over the image, break accent colour, clock in the bar, notifications |
Settings and session state live in ~/.local/state/omarchy/tomato-timer-settings.json
and tomato-timer-state.json.
Keyboard
With the panel open: arrow keys move between the buttons, Enter activates, Esc closes (or leaves the settings view), Tab moves to the next bar panel.
Scripting and keybindings
The panel:
omarchy shell shell summon slcode777.tomato-timer '{}'
omarchy shell shell hide slcode777.tomato-timer
The timer itself, without opening anything — handy for a Hyprland bind:
omarchy shell tomato-timer toggle # start / pause
omarchy shell tomato-timer start
omarchy shell tomato-timer pause
omarchy shell tomato-timer skip # jump to the next phase
omarchy shell tomato-timer reset
omarchy shell tomato-timer status # e.g. "running work 24:12 cycle 2/3 (1 completed)"
Gallery
<table> <tr> <td><img src="assets/preview1.webp" alt="Tomato Timer panel" width="210"></td> <td><img src="assets/preview2.webp" alt="Tomato Timer panel" width="210"></td> <td><img src="assets/preview3.webp" alt="Tomato Timer panel" width="210"></td> <td><img src="assets/preview4.webp" alt="Tomato Timer panel" width="210"></td> </tr> <tr> <td><img src="assets/preview5.webp" alt="Tomato Timer panel" width="210"></td> <td><img src="assets/preview6.webp" alt="Tomato Timer panel" width="210"></td> <td><img src="assets/preview7.webp" alt="Tomato Timer panel" width="210"></td> <td><img src="assets/preview8.webp" alt="Tomato Timer panel" width="210"></td> </tr> </table>What it runs on your machine
Plugins share the long-running Omarchy shell process and run unsandboxed with your permissions, so here is everything this one touches.
| Command | When | Why |
|---|---|---|
pw-play |
on each timer sound and on the preview button | plays a bundled audio file, in a detached process |
omarchy-notification-send |
at a phase change, if notifications are on | the desktop notification |
omarchy-file-select |
only when you press Browse in the settings | Omarchy's own file chooser, to pick a custom background |
mkdir -p |
once at startup | creates ~/.local/state/omarchy/ if it is missing |
All four ship with Omarchy or PipeWire — there is nothing extra to install, no setup step, and no installer or remote build.
The plugin writes exactly two files, both under ~/.local/state/omarchy/:
tomato-timer-settings.json and tomato-timer-state.json. It reads nothing
else of yours, asks for no elevated privileges, opens no network connection,
and never starts a second Quickshell process.
Notes
- Image formats. Qt here ships decoders for JPEG, PNG, GIF and SVG. WebP
needs the
qt6-imageformatspackage, so the bundled photos are JPEG and a custom WebP path will fall back to the plain plate rather than failing. - Sound playback goes through
pw-play(PipeWire) in a detached process, so a bad audio file can never take the shell down with it. - Testing durations. Adding
"workSec": 5/"breakSec": 3to the settings file runs phases in seconds instead of minutes, which makes a full session testable in under a minute. The minutes fields stay authoritative for the UI.
Credits
Sounds come from Freesound under Creative Commons 0 and Creative Commons Attribution licences — see CREDITS.md for the per-sound attribution.
The bundled backgrounds are wallpapers shipped with Omarchy's own themes, downscaled to 720px tall.
Licence
MIT — see LICENSE. The bundled audio keeps its own licences.