Simple and visually-pleasing Pomodoro timer.
Pomotroid is a simple and configurable Pomodoro timer. It aims to provide a visually-pleasing and reliable way to track productivity using the Pomodoro Technique.
Built with Tauri 2, Rust, and Svelte 5.
Pomotroid tracks every completed session and surfaces the data across three views: a daily summary with an hourly breakdown, a weekly bar chart with streak tracking, and an all-time 52-week heatmap.
Pomotroid ships with 37 themes and supports fully custom themes with live hot-reload.
See THEMES.md for the full theme list and instructions on creating your own.
Download the latest release from the releases page.
Available for Windows (installer + standalone exe), macOS (universal DMG), and Linux (.deb + AppImage).
Note: Pomotroid is currently unsigned. Depending on your OS security settings you may see a warning on first launch β this is expected and can be safely dismissed.
brew install --cask pomotroid
The Homebrew cask is maintained separately and may lag behind the latest release. Check the releases page for the most current version.
Pomotroid supports user-created themes with automatic hot-reload β no restart required. See THEMES.md for directory paths, the full color reference, and a step-by-step guide.
Pomotroid exposes an optional WebSocket server (disabled by default) for integration with external tools, stream overlays, and automation scripts.
Enable it in Settings β Advanced β WebSocket Server, then connect to ws://127.0.0.1:<port> (default port: 1314).
Client β Server
| Message | Description |
|---|---|
{ "type": "getState" } |
Request the current timer state |
Server β Client
| Event | Payload | Description |
|---|---|---|
state |
TimerState object |
Response to getState |
roundChange |
TimerState object |
Fired whenever the timer advances to a new round |
error |
{ message } |
Protocol error |
TimerState fields: elapsed_secs, total_secs, is_running, is_paused, round_type, work_round_number, work_rounds_total.
See CONTRIBUTING.md for full setup instructions, project structure, and the release process.
# Install dependencies
npm install
# Run in development mode (hot-reload)
npm run tauri dev
# Build a production release
npm run tauri build
UI strings live in src/messages/<locale>.json (en, es, fr, de, ja, zh, pt). The compiled output in src/paraglide/ is generated at build time and is not committed to the repository.
During development, the Paraglide Vite plugin compiles messages automatically whenever npm run tauri dev or npm run tauri build is run β no manual step required.
After adding or changing message keys, regenerate the output explicitly so that svelte-check and your editor can pick up the new types:
npm run paraglide:compile
This is also run automatically as part of npm run check.
MIT © Christopher Murphy