Tomato32 is a Pomodoro timer for the Waveshare ESP32-S3-Touch-LCD-3.49 development board.
tomato32_demo_video.mp4
- Touchscreen interface
- Three preset timer profiles, each with customizable durations
- You can adjust the durations for focus time, short break, long break, and the number of focus sessions before a long break.
- Various settings to make it fit your workflow.
- Custom background support (see Custom Backgrounds)
- CMake
- SDL2
brew install cmake sdl2- Waveshare ESP32-S3-Touch-LCD-3.49 development board
- Python 3
- Docker (used by the ESP32 build/flash script)
Note
The simulator has only been tested on macOS. If you get it working on Linux or Windows, a PR adding setup instructions would be welcome.
cmake -B build
cmake --build build
./build/platform/simulator/pomodoro_simCreate the environment file first:
cp platform/esp32/.env.example platform/esp32/.envFor NTP/RTC time sync, set these values in .env:
WIFI_SSIDWIFI_PASSWIFI_TZ(default:UTC0)
Note
Why do I need Wi-Fi for a Pomodoro timer?
Wi-Fi is only used to sync the date and time via NTP and update the RTC. This is only needed for the daily "Focused today" statistic. Providing Wi-Fi credentials is completely optional. Without them, the timer will still work, but the "Focused today" stat may not reset at the correct local midnight.
cd platform/esp32
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
./build.sh
./build.sh flash /dev/cu.usbmodem101
./build.sh monitor /dev/cu.usbmodem101Note
Replace /dev/cu.usbmodem101 with the actual serial port of your ESP32 board. Run ls /dev/cu.* before and after plugging in the board to identify the correct port.
To use a custom background image on the timer, go to System Settings → UI → Custom Backdrop and set it to On.
Place your image files (640×172 PNG) in the app/ directory, then rebuild and flash.
Tomato32 uses the most specific matching file available. Name your files accordingly:
| Specificity | File name example | When it's used |
|---|---|---|
| Preset + theme | custom_background_b_dark.png |
Preset B, dark mode only |
| Preset only | custom_background_b.png |
Preset B, both themes |
| Theme only | custom_background_dark.png |
Any preset, dark mode |
| (fallback) | Default solid color |
Valid preset suffixes are _a, _b, and _c. Valid theme suffixes are _dark and _light.
Important
Background images are embedded into the firmware at build time. Whenever you add or remove PNG files in app/, run a clean build so CMake picks up the changes:
cd platform/esp32
./build.sh clean
./build.sh flash /dev/cu.usbmodem101This project vendors LVGL under lvgl/.
- Project-level notices:
THIRD_PARTY_NOTICES.md - LVGL license:
lvgl/LICENCE.txt - LVGL third-party attributions:
lvgl/COPYRIGHTS.md
The typeface used in the UI is Inter, licensed under the SIL Open Font License 1.1.
The sound effect used for timer start/end is sourced from freesound.org and licensed under Creative Commons 0.
- Photo by Federico Respini on Unsplash.
- Photo by Alex Machado on Unsplash.





