breaktimer
Break reminder for Linux/Wayland. A small Bash daemon that nudges you to take micro-pauses while working at the PC, with desktop notifications, sounds, and a Waybar module showing a live countdown.
Notifications and tooltips are in Italian.
How it works
State machine: working β micro-pause β working, and every 4th block a long pause instead. The countdown freezes when you pause manually and outside your work-hours window, so breaks never eat into work time and the Waybar number stays honest.
| Phase | Default | Notification |
|---|---|---|
| working | 30 min | β |
| breaking | 3 min | "πΆ Micro-pausa" |
| longbreak | 10 min | "βΈοΈ Pausa lunga" (every 4th) |
Dependencies
dunst(or anynotify-sendprovider)pipewireβpw-play, falls back topaplay(PulseAudio)- coreutils, Bash
- Waybar (optional, for the bar module)
- A Nerd Font for the Waybar glyphs (optional)
Install
The Waybar config calls the scripts from ~/bin. Put both there and make them
executable:
mkdir -p ~/bin
cp breaktimer.sh waybar-breaktimer.sh ~/bin/
chmod +x ~/bin/breaktimer.sh ~/bin/waybar-breaktimer.sh
Make sure ~/bin is on your PATH (or call the scripts by full path).
Sounds
Defaults use the Modern Minimal UI sound set at:
~/.local/share/sounds/modern-minimal-ui-sounds/stereo/
Three events map to message-new-instant.oga (micro), alarm-clock-elapsed.oga
(long), service-login.oga (back to work). Don't have that set? Either install
it there, or edit the SOUND_DIR / SYS_SOUND_* variables at the top of
breaktimer.sh to point at any .oga/.wav you like (e.g. the freedesktop
sounds in /usr/share/sounds/freedesktop/stereo/). A missing file is simply
silent β no error.
Usage
breaktimer.sh start # start the daemon in the background
breaktimer.sh stop # stop it
breaktimer.sh restart # stop + start
breaktimer.sh pause # freeze the countdown
breaktimer.sh resume # unfreeze
breaktimer.sh toggle # pause/resume in one command
breaktimer.sh status # print state, phase, seconds remaining
(breaktimer.sh run is the internal loop β don't call it directly; it will
refuse if a daemon is already running.)
Auto-start on login by adding breaktimer.sh start to your compositor's
autostart (e.g. Hyprland exec-once, Sway exec).
Configuration
Edit the variables at the top of breaktimer.sh:
| Variable | Meaning |
|---|---|
MICRO_MIN / BREAK_MIN |
work block / micro-pause length (minutes) |
LONG_MIN / LONG_EVERY |
long-pause length / every N-th block |
WORK_START / WORK_STOP |
work-hours window (HH:MM); outside it the work countdown freezes |
URGENCY_MICRO / URGENCY_LONG |
dunst urgency (low/normal/critical) |
SOUND_DIR, SOUND_*, SYS_SOUND_* |
sound files (see above) |
Waybar integration
Three pieces:
waybar-breaktimer.shβ emits JSON ({text, class, tooltip}) that Waybar renders. Reads the daemon's state files; no recalculation.waybar-breaktimer.config.jsoncβ thecustom/breaktimermodule.breaktimer.cssβ phase colors (Catppuccin).
1. Add the module
Paste the inner block of waybar-breaktimer.config.jsonc into your
~/.config/waybar/config modules, then add "custom/breaktimer" to one of your
modules-left/center/right arrays:
"custom/breaktimer": {
"exec": "~/bin/waybar-breaktimer.sh",
"return-type": "json",
"interval": 5,
"on-click": "~/bin/breaktimer.sh toggle", // left-click: pause/resume
"on-click-right": "~/bin/breaktimer.sh restart", // right-click: restart
"tooltip": true
}
2. Add the styling
Append breaktimer.css to ~/.config/waybar/style.css. It colors the module by
phase:
| Class | Color | Meaning |
|---|---|---|
working |
green | working |
breaking |
blue | micro-pause |
longbreak |
purple | long pause |
paused |
yellow | manually paused |
stopped |
grey | daemon not running |
3. Reload
breaktimer.sh start
killall -SIGUSR2 waybar # reload Waybar
Left-click the module to pause/resume, right-click to restart.
License
GPLv2 β see LICENSE. Copyright (C) 2026 Danilo M.
