Local-only macOS menu bar Pomodoro timer with per-account tracking (personal / work / client) and weekly reporting. Inspired by TomatoBar, with persistent SQLite storage so you can mine the data later.
Screenshot placeholder — capture once the UI is dialed in.
- macOS 13 Ventura or newer
- Xcode 15+
- XcodeGen (
brew install xcodegen)
brew install xcodegen # one-time
xcodegen # regenerates BeanCounter.xcodeproj from Project.yml
open BeanCounter.xcodeproj # ⌘R to runRegenerate the project whenever Project.yml changes. The generated BeanCounter.xcodeproj is gitignored on purpose.
./install.sh # build Release, replace /Applications/BeanCounter.app, relaunch
./install.sh --no-launch # same but don't relaunchThe script never touches ~/Library/Application Support/BeanCounter/, so your session history survives every reinstall. It also quits any running instance, clears Gatekeeper quarantine, and reports the preserved session count.
xcodebuild test \
-scheme BeanCounter \
-destination 'platform=macOS' \
CODE_SIGNING_ALLOWED=NO \
| xcprettyTests use an in-memory GRDB queue, so no on-disk database is created during the run.
The SQLite database lives at:
~/Library/Application Support/BeanCounter/beancounter.sqlite
Inspect with the sqlite3 CLI:
sqlite3 ~/Library/Application\ Support/BeanCounter/beancounter.sqlite "select * from session;"The app is signed only with the local "Sign to Run Locally" identity, so macOS Gatekeeper will block first launch. Either right-click the .app and choose Open → Open, or drop the quarantine attribute:
xattr -d com.apple.quarantine /Applications/BeanCounter.appSettings → Launch at login uses SMAppService.mainApp. macOS will silently ignore the registration if the app isn't living in /Applications, so move it there before flipping the toggle.
MIT — see LICENSE.