Your workday, at a glance. Not another thing to manage.
Automatic time tracking for your Mac. Native, local-first, and quietly out of your way.
Download for macOS · Documentation · What's new · Feedback & ideas
Real app views, rendered with sample workdays. Screenshots show the current main branch; the latest release may look different.
Full-size screenshots: Dark mode · Light mode
You opened your Mac, answered a few messages, joined a meeting, and took a coffee break. But when did you actually start? And how much have you worked?
OpenWorktimeTracker keeps the answer in your menu bar. It tracks your day automatically, accounts for pauses, and lets you know when you've reached your limits. No account to create. No browser tab to keep open. No Dock icon competing for attention.
| Made for your day | What you get |
|---|---|
| Start working, not a stopwatch | Launch at login and automatic workday detection across sleep, wake, and restarts. |
| Know when you're done | Net work time, progress toward your daily goal, and an estimated finish time in one compact dashboard. |
| Meetings count, too | After inactivity, choose whether the time was work or a pause. No guessing on your behalf. |
| Keep an eye on overtime | Configurable orange/red menu-bar thresholds, notifications, recent workdays, and week/month summaries. |
| Make it yours | Adjust times, add daily notes, customize thresholds, and switch naturally between light and dark mode. |
| Keep your data yours | Local JSON logs, CSV export, a configurable storage folder, and optional iCloud Drive sync. |
Also included: desktop widgets, pause/resume shortcuts, English and German, and Sparkle auto-updates.
A call, a whiteboard session, or a coffee break can all look like inactivity to a computer. When you return, you decide how that time should count.
Choose when the menu-bar timer changes color, how long inactivity takes to trigger a prompt, and when notifications should nudge you. Color thresholds and notification thresholds are independent.
Break-aware by default. The default calculation follows the 30/45-minute break thresholds in Germany's §4 ArbZG: more than 6 hours of work requires 30 minutes, more than 9 requires 45. Pauses you've already recorded reduce any additional automatic deduction.
Automatic deductions are bookkeeping, not a substitute for actually taking a break or a guarantee of legal compliance. How break calculations work →
Requires macOS 14 Sonoma or later.
- Download the latest release and open its
.dmg. - Drag OpenWorktimeTracker to Applications and launch it.
- Look in your menu bar, not the Dock. Click the timer to see your day.
- Allow notifications if you'd like reminders, and adjust your preferences under … → Settings.
That's it. With Launch at Login enabled, it's ready the next time you sign in. Future releases arrive through the built-in Sparkle updater.
| Want to… | Do this |
|---|---|
| Take a break | Click Pause; click Resume when you're back. |
| Finish for today | Click End Day. Your completed total stays fixed. |
| Correct a time | Use the pencil beside the start/end time, or open … → Edit Log. |
| Take your data with you | Choose … → Export CSV or open your log folder. |
| Open preferences | Choose … → Settings, or press ⌘ , while the app is active. |
Global shortcuts: Ctrl + Option + P to pause/resume, Ctrl + Option + E to end the day.
macOS may require Accessibility permission for global keyboard monitoring.
Your daily logs are ordinary JSON files, not records locked inside a proprietary service. By default, they're stored here:
~/Library/Application Support/OpenWorktimeTracker/logs/
├── 2026-09-07.json
└── 2026-09-08.json
- No account or hosted tracking backend is required.
- CSV export makes it easy to use your hours elsewhere.
- iCloud Drive sync is optional and off by default.
- You can inspect, back up, or move your logs using normal files and folders.
Auto-update checks use Sparkle/GitHub; enabling iCloud sync uses Apple's iCloud Drive. Local-first doesn't mean the app never connects to the network.
Built with SwiftUI + AppKit, not a web app inside a desktop window.
An AppKit lifecycle owns the native menu-bar item and popover; SwiftUI renders the dashboard and settings.
The tracking model uses @Observable, and persistence stays intentionally simple.
| Part | Built with |
|---|---|
| Interface | SwiftUI, AppKit, adaptive design tokens |
| Workday logic | Swift models, explicit state transitions, injectable clock and log store |
| macOS integration | Login items, idle detection, notifications, WidgetKit |
| Storage & updates | Daily JSON files, optional iCloud Drive, Sparkle 2 |
| Development | XcodeGen, XCTest, SwiftLint, GitHub Actions |
Curious about the internals? Start with the architecture docs and the domain vocabulary.
Build it yourself
You'll need macOS, Xcode 16 or later, and XcodeGen. SwiftLint is used for linting.
brew install xcodegen swiftlint
git clone https://github.com/64x-lunicorn/OpenWorktimeTracker.git
cd OpenWorktimeTracker
make generate
open OpenWorktimeTracker.xcodeprojSelect your signing team in Xcode before running the app. For a local ad-hoc build without a provisioning profile, use the included Build OpenWorktimeTracker (Debug) task in VS Code. Release signing is kept separate.
make test # Run the XCTest suite with your signing setup
make lint # Check Swift style
make build # Build the Release configuration with your signing setupMore details: Contributing · Build guide
Found a rough edge? Have an idea that would make this fit your day? Open an issue — bug reports, UI feedback, and small improvements are welcome.
Want to contribute code? See the contribution guide. If the app is useful to you, a GitHub star helps other Mac users discover it.
Less admin. A clearer workday.
Free and open source under GPL-3.0.