macOS

A time tracking app for Mac that runs in the menu bar

Stunda is a native macOS app, not a web page in a window. It sits in the menu bar, measures what you work on through the system APIs Apple provides for exactly this, and never asks you to start a timer.

In short

Stunda is an automatic time tracking app for Mac that lives in the menu bar and records your working hours without timers. It is a native binary for Apple silicon and Intel, reads activity through the macOS Quartz Event Services and Accessibility APIs, counts keystrokes without recording them, and turns tracked hours into invoices. The Mac app is free for one person.

Apple silicon download
8.9 MB
Installed on disk
23 MB
Activity sample interval
250 ms
Idle threshold
30 s

Native, in the sense that word used to mean

The tracker is a Rust binary. It is not Electron, it does not ship a browser engine to draw a menu bar icon, and the window it opens is a system WebView rather than a bundled copy of Chromium. On Apple silicon the download is a signed DMG and the installed bundle is almost entirely one executable.

The reason to care is not the megabytes. It is that a tracker has to run for eight hours a day, every day, in the background, on battery, while you do the work it is measuring. Anything that treats "always running" as a special case is the wrong shape for the job.

  • Universal coverage: separate arm64 and x64 builds, not one Rosetta binary for both.
  • Menu bar first. The main window is somewhere you visit, not somewhere you live.
  • Keeps tracking with the network down, and reconciles when it comes back.
  • Survives sleep correctly, which is harder than it sounds. See below.

What it reads from macOS, and which API it reads it from

Every one of these is a documented system API. None of it requires a background agent you cannot see, and the permissions macOS asks for are the ones the feature genuinely needs.

Keystroke and click counts, via Quartz Event Services
CGEventSourceCounterForEventType returns a running total of HID events. Stunda samples it and keeps the difference. That gives a count of how much you typed, and it is structurally incapable of telling anyone what you typed, because the API returns a number and never a character.
Idle time, via the same event source
CGEventSourceSecondsSinceLastEventType reports how long it has been since any input anywhere on the machine. After thirty seconds with no input the session is treated as idle, which is what stops a lunch break being billed as focus.
The frontmost app, via lsappinfo
Sampled every three seconds. This is what produces the app breakdown: how much of the afternoon was Figma, how much was the terminal, how much was a mail client you did not intend to open.
Window titles and browser tabs, via Accessibility
Optional, and gated behind the one-time Accessibility grant in System Settings. It is what turns "Chrome, 40 minutes" into "the client dashboard, 40 minutes". The tracker only ever calls the non-prompting trust check, so it will never surprise you with a permission dialog while you are working.

The URL is cut down before it is stored, not after

When the Accessibility grant is on and the frontmost window is a browser, Stunda records the host and the path and throws away the query string and the fragment. That is not a setting, it happens on the way in.

The reason is specific. Query strings carry search terms, session tokens, password reset links and document ids. A timesheet has no business holding any of those, and the safest way to be sure it never does is to never receive them.

Closing the lid does not invent hours

This is the bug every Mac tracker has to get right and many do not, so it is worth saying how it is handled here.

On Darwin, the monotonic clock most code reaches for stops counting while the machine is asleep. Measure a session with it and a laptop that was shut at six and opened at nine reports three minutes, not three hours. Measure with the wall clock instead and you get the opposite failure: the session is three hours long and none of it was worked.

Stunda reads both. Real elapsed time comes from the sleep-inclusive clock, awake time comes from the one that stops, and the difference between them is exactly how long the machine slept. A suspend ends the session at the sleep boundary rather than billing through it.

Setting it up on a Mac

About a minute, most of which is the download.

  1. Download and drag to Applications

    Pick the Apple silicon build for an M-series Mac or the Intel build for anything older. Both are on the download page and both are signed.

  2. Grant Accessibility if you want window titles

    System Settings, Privacy and Security, Accessibility. Skip it and tracking still works, you just get app names instead of window titles. Nothing about the tracker breaks.

  3. Sign in, then forget about it

    The menu bar icon starts counting when you log in. There is no session to start and no project to pick up front. Projects get attached later, to time that has already been measured.

  4. Review the week and bill it

    Open the dashboard on Friday, see the week split by project and app, drag the billable parts into an invoice, send it as a PDF or a link.

Questions

Is Stunda a native Mac app or an Electron wrapper?

Native. The tracker is a Rust binary and the interface renders in the system WebView, so no browser engine is bundled with the app. The installed bundle is almost entirely one executable.

Does the Mac time tracker work on Apple silicon?

Yes, and there is a separate arm64 build rather than one Intel binary running under Rosetta for everyone. An Intel build is published alongside it for older Macs.

What permissions does the macOS app ask for?

None are required to track time. Accessibility is optional and only adds window titles and browser tab hosts to the timeline. Screen Recording is only requested if you switch screenshots on, and screenshots are off by default.

Does it keep tracking when my Mac is offline?

Yes. The desktop app writes to a local SQLite database first and syncs afterwards, so a flight or a dropped connection does not cost you a session.

Will it bill me for time my Mac was asleep?

No. A suspend ends the session at the point the machine slept. Stunda reads both the sleep-inclusive and awake-only system clocks specifically so that closing the lid cannot produce hours that were never worked.

Can I use it without the desktop app?

You can track manually in the web dashboard from any browser, but automatic tracking is what the desktop app is for. The two share one account and one set of projects.

Still measuring, since the moment you opened this page

You've been here 2:40.
That's $3.78 unbilled.

That's how it slips away: a few quiet minutes at a time, on every project. Stunda catches them all day, silently, and turns them into invoices that send in four steps.

Free forever for solo freelancers. No card required. Setup takes 60 seconds.