Skip to content

Latest commit

 

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Tomatick

CI License: MIT Go Platform

Class A (OSS/MIT). A menu bar / system tray timer, stopwatch, alarm and pomodoro — all in one icon, with a timestamped history of everything you run.

This is a Go rewrite of the original macOS-only Python Tomatick, built so a single codebase runs on macOS, Windows, and Linux. Config and history use the same JSON / SQLite schema, so a config.json from the Python app loads here.

Features

  • Timer — natural-language durations (25m, 1h30m, 90s, 2:30), with a live M:SS countdown in the tray (menu-bar title on macOS; tooltip + menu on Windows). Pause / Reset / Stop.
  • Stopwatch — counts up, with optional laps. Pause / Reset / Stop.
  • Pomodoro — 25/5/15 by default, auto-advancing phases (🍅 work, ☕ break), long break after every 4th work cycle. Pause / Skip phase / Stop.
  • Alarms — one-shot (a specific date + time) and recurring (a time of day on chosen weekdays). Rings with a looping sound + notification until dismissed, with Snooze (9 min default).
  • Multiple at once — run several sessions together; the tray shows your "primary" one live, and every active session is listed in the menu with its own count. Pin any session to make it the primary display.
  • History — every event (started / paused / completed / phase change / alarm fired …) is timestamped into SQLite. See recent events in Settings and Export the full log to CSV or JSON.
  • Settings — edit pomodoro durations, default sound, icon theme, and toggle Launch at login.

Everything is driven from the tray icon's menu: start a session → it appears in the menu → click its item to pause/stop it (or dismiss a ringing alarm).

Run it (development)

Requires Go 1.25+. On Linux you also need the usual Fyne OpenGL/X11 headers (libgl1-mesa-dev, xorg-dev). On Windows, a gcc (MinGW) is required because Fyne uses CGO.

git clone https://github.com/MichalAFerber/tomatick2.git
cd tomatick2
go test ./...
go run ./cmd/tomatick

A tomato icon appears in the menu bar (macOS), notification area (Windows), or system tray (Linux). Click it to open the menu.

On Linux, a tray host that speaks StatusNotifierItem / AppIndicator is required (GNOME needs an extension; KDE and most other desktops work out of the box).

Run the tests

The timing, scheduling, history, and settings logic has no GUI dependencies:

go test ./internal/sessions ./internal/alarms ./internal/history ./internal/settings ./internal/core

go test ./... also compiles the UI packages (needs CGO + platform GUI libs).

Build a standalone app

# current OS
go build -o tomatick ./cmd/tomatick

# packaged bundles (run on the target OS, or use fyne-cross)
make package-mac      # Tomatick.app, Dock-hidden
make package-windows  # Tomatick.exe
make package-linux    # Tomatick.tar.xz

fyne package must be installed. Pin it to the fyne.io/fyne/v2 version in go.mod — the packager decides the bundle layout, so a floating @latest changes it under you between releases. The release workflow pins the same version:

go install fyne.io/fyne/v2/cmd/fyne@v2.8.1

fyne.io/fyne/v2/cmd/fyne is deprecated upstream in favor of fyne.io/tools/cmd/fyne (the old binary still works and prints a migration notice on every run). Stay on the path above for now: fyne.io/tools is a separate module with its own version numbers, not locked to fyne.io/fyne/v2, so swapping it in here — and in .github/workflows/release.yml — needs its own verification that packaging output doesn't change, not a drive-by edit.

On macOS the bundle is unsigned; on first launch right-click → Open to get past Gatekeeper, or:

xattr -dr com.apple.quarantine /Applications/Tomatick.app

Tomatick is a tray app — no Dock icon on macOS (runtime LSUIElement / accessory policy). Look for the tomato in the menu bar. To start it at login, use the icon's menu → Settings → Launch at login.

Where data lives

OS Directory
macOS ~/Library/Application Support/Tomatick/
Windows %AppData%\Tomatick\
Linux ~/.local/share/Tomatick/
config.json     # pomodoro settings, alarms, sound, launch-at-login
history.db      # SQLite event history

Honor TOMATICK_SUPPORT_DIR to redirect both files (used by tests).

Platform notes

Capability macOS Windows Linux
Tray title text yes (next to the icon) tooltip + menu title where the tray supports it
Sounds /System/Library/Sounds %WINDIR%\Media bundled ding + paplay/aplay
Keep awake caffeinate SetThreadExecutionState systemd-inhibit
Launch at login LaunchAgent us.tomatick HKCU Run key ~/.config/autostart/
Focus / DND Shortcuts app, by name ignored ignored
Global hotkey Accessibility permission RegisterHotKey X11 grab

Project layout

cmd/tomatick/          # main
internal/
  sessions/            # Timer / Stopwatch / Pomodoro (pure logic)
  alarms/              # Alarm model + scheduling (pure logic)
  history/             # SQLite history store
  settings/            # config.json load/save
  core/                # tick, wiring, no GUI
  ui/                  # Fyne tray + settings windows
  sound/ notify/ keepawake/ autostart/ hotkey/ focus/
  assets/              # tomato art, bundled ding.wav

Website

The product site lives at tomatick.us (source still in the Python repo).

Credits

Component License Used for
Fyne BSD-3-Clause windows, dialogs, system tray
fyne.io/systray Apache-2.0 tray title / icon
modernc.org/sqlite BSD-3-Clause history database (pure Go)
golang.design/x/hotkey MIT global hotkey

The menu-bar tomato icon (red / white / black themes) and the app icon are original artwork, generated by scripts/make_icon.py.

License

Released under the MIT License — © 2026 Michal Ferber.

About

Go rewrite of Tomatick — cross-platform (macOS, Windows, Linux) menu bar / system tray timer, stopwatch, alarm & pomodoro with timestamped history.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages