KeyStats, a menu bar counter for your daily keystrokes
Keyboard & Mouse Stats for macOS/Windows
At a glance
- What is it?
- KeyStats is a native menu bar application for macOS and Windows that counts daily key presses, mouse clicks, movement distance and scroll distance, resets at midnight and keeps the totals on the device. An optional sync path encrypts selected daily totals locally before upload, and the macOS build is unsigned, which has consequences for permissions.
- Who is it for?
- KeyStats suits someone who wants a glanceable daily count of their typing and clicking without installing a full activity tracker, and it suits macOS and Windows users who are comfortable granting Accessibility permission to a small unsigned app.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 1 day ago.
- What is it written in?
- Mainly Swift, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Four counters and a midnight reset
KeyStats is a lightweight native menu bar application for macOS and Windows that tracks daily keyboard keystrokes, mouse clicks, mouse movement distance and scroll distance. The set is deliberately small. Keyboard keystroke statistics are the headline number, tracked in real time for the day. Mouse clicks are counted separately for the left and right buttons, so you can see whether you are a clicker or a dragger. Mouse movement distance records the total distance the pointer travels, and scroll distance records the cumulative page scroll.
The display model is two-level. The core data appears directly in the macOS menu bar, so the numbers are always one click away, and clicking the menu bar icon opens a detailed panel with the complete statistics. The screenshots in the README show the compact menu bar view and the expanded panel, plus two wider views that appear to be the full statistics layout.
The reset behaviour is the part that makes this a daily tool rather than a lifetime counter. Statistics reset automatically at midnight, and the data persists after the application is restarted, so closing and reopening the app during a day does not lose the count. The repository layout shows a Swift package with a Package.swift, an Xcode project, a KeyStats/ directory for the main app, a KeyStatsHelper/ directory, a KeyStatsTests/ directory, a KeyStats.Windows/ directory for the Windows implementation, and separate contracts/, services/ and docs/ directories, with a vendor/ directory and a scripts/ directory for the build.
The naming of a helper as a separate component is worth noting, since on macOS an event tap for global keyboard and mouse input normally has to live in a helper process rather than in the main app bundle.
Accessibility permission, and what an unsigned build costs you
On macOS, KeyStats requires Accessibility permissions to monitor keyboard and mouse events. The first run flow is spelled out: the app prompts a permission request dialog, you click Open System Settings, find KeyStats under Privacy & Security then Accessibility, enable the toggle, and once authorized the app starts tracking automatically. Without that permission the app tracks nothing, so this is a hard gate rather than a degraded mode.
The friction is in the unsigned builds, and the README is honest about it. Because the app is not signed, macOS will not automatically update the Accessibility authorization after each reinstall. The fix is manual: remove the existing KeyStats entry in Privacy & Security then Accessibility, return to the app and click the Get Permission button to request access again. In other words, every upgrade of the app means a trip to System Settings.
The auto-update path has its own catch on macOS Ventura and later. The first Sparkle update may fail, and the remedy is to enable KeyStats in Privacy & Security then App Management first. If the update already failed, you click the system authorization notification, turn on the toggle in Settings, and click Update Now again. Sparkle is the update framework referenced here, and the name of the permission it needs, App Management, is the one macOS introduced for exactly this class of problem.
Windows is simpler by comparison. The Windows version requires no additional permission setup and starts tracking once launched, with a possible Windows security warning on first launch that you dismiss by clicking Run anyway.
Installing on macOS and Windows
macOS has two routes, a Homebrew tap and a direct download. The tap route is two commands:
# Tap the repository
brew tap debugtheworldbot/keystats
# Install the app
brew install keystatsUpgrades go through the same tap with brew upgrade keystats. The alternative is to download from the GitHub Releases page, which is the same page that hosts the versioned builds.
Windows is the same shape with Scoop:
scoop bucket add keystats https://github.com/debugtheworldbot/scoop-keystats
scoop install keystatsThe Scoop bucket lives in a separate repository, debugtheworldbot/scoop-keystats, which is the normal way to distribute a Windows app that has no upstream package. The second option on Windows is again the GitHub Releases page.
There is a Linux build too, but it is not published from this repository. The README links to the Linux version on a different project, 0x5c0f/keyStats, so the Linux artefact comes from elsewhere and its version and behaviour may not line up with the builds described here.
The system requirements are modest. macOS needs 13.0 Ventura or higher. Windows needs Windows 10 from 1903 onward or Windows 11, and the README stresses that no dependencies are required because the Windows version uses .NET Framework 4.8, which is pre-installed on those systems. The stated app size on Windows is around 5 to 10 MB. If you are on a Windows 10 build older than 1903, the README gives the two options of upgrading the system or manually installing .NET Framework 4.8 from the Microsoft download link.
That combination of a Swift codebase for macOS and a .NET Framework implementation for Windows explains the two-platform split in the repository, with KeyStats.xcodeproj and Package.swift for the Apple side and KeyStats.Windows/ for the other.
What the app deliberately does not record
The privacy statement is the part of the README that deserves a careful read, because a keystroke counter is exactly the kind of software people worry about.
KeyStats stores aggregate statistics and does not record typed text or the order of keystrokes, and it does not record specific cursor or click locations. That is the important design decision. An app that counts keys can either log which keys and in what sequence, or keep only a running total, and this one keeps the total. The same applies to the mouse: it counts clicks by button and measures how far the pointer moved, without capturing where on the screen you clicked.
The optional multi-device sync narrows that further. When you explicitly enable sync, the supported daily key-press totals, per-key and per-key-combination counts, mouse-button click counts and encrypted device information are encrypted locally before upload. The service cannot read the encrypted statistics. And the README is specific about what does not travel: mouse movement distance, scroll distance and per-app statistics are not currently synced. So a synced device pair shares how many keys you pressed and which ones, but not where your pointer went or which app you were in.
The default posture is local. Data stays on the local device unless you turn sync on yourself. For a tool that sits in the menu bar watching every keystroke on your machine, that is the right default, and the fact that sync is opt-in rather than a prompt on first launch matters.
Where it fits, and where it does not
KeyStats is a curiosity counter, not an analytics product. It tells you that you pressed 4,000 keys today and scrolled 30 metres, and it tells you that in a menu bar. It does not give you a searchable history of what you typed, and per-app statistics are not among the data it syncs, so the picture stays aggregate and local.
That makes it a different tool from the activity trackers that log application history and heatmaps. If you want to know how much you typed, in aggregate, and see whether the number feels right, it will.
The comparison with a more capable system is also constrained by the platform split. The macOS and Windows applications are separate codebases that share a product idea and a name, and the Linux build comes from a third repository. Features therefore do not necessarily arrive on all three at once, and the sync feature in particular is described in terms of paired devices, with no indication of which platforms can pair with which.
Practically, the project is actively worked on. The last push was on 2026-10-17, and the release tags are v1.54 from 2026-10-03, v1.53 from 2026-09-28 and v1.52 from 2026-08-23, which is a steady cadence for a menu bar utility. The MIT licence covers the code, the homepage is keystats.vercel.app, and the README also exists in Simplified Chinese as README_ZH.md, and the repository carries AGENTS.md, CLAUDE.md and a.agents/ directory, which suggests it is developed with some agent assistance in the loop.
Editorial conclusion
KeyStats suits someone who wants a glanceable daily count of their typing and clicking without installing a full activity tracker, and it suits macOS and Windows users who are comfortable granting Accessibility permission to a small unsigned app. It is the wrong choice if you need per-application breakdowns carried across devices or a searchable log, since per-app statistics are not currently synced and the app stores aggregate counts rather than typed content, and it is the wrong choice if you want a signed build with automatic permission handling, since the macOS release is unsigned and macOS will not carry the Accessibility authorisation across a reinstall. Before installing on macOS, note that macOS 13.0 Ventura or higher is required and that the Accessibility entry has to be removed and re-granted after each upgrade, and check the last push on 2026-10-17 and the v1.54 release from 2026-10-03 for the current state of the project.
Frequently asked questions
How do I install KeyStats on macOS?
Run brew tap debugtheworldbot/keystats followed by brew install keystats, and use brew upgrade keystats for updates. You can also download a build directly from the GitHub Releases page. macOS 13.0 Ventura or higher is required.
How do I install KeyStats on Windows?
Add the Scoop bucket with scoop bucket add keystats https://github.com/debugtheworldbot/scoop-keystats, then run scoop install keystats, or download from GitHub Releases. The Windows build needs Windows 10 from 1903 onward or Windows 11, and uses .NET Framework 4.8 which is already present on those systems.
Does KeyStats record what I type?
No. The privacy statement says KeyStats stores aggregate statistics and does not record typed text, the order of keystrokes, or specific cursor and click locations. Data stays on the local device unless you explicitly enable multi-device sync.
Why does macOS ask for Accessibility permission and why do I have to redo it after an update?
The app needs Accessibility permission to monitor keyboard and mouse events, and on first run it opens a prompt that sends you to Privacy & Security then Accessibility to enable the toggle. Because the build is not signed, macOS does not carry that authorisation across a reinstall, so you must remove the existing entry and click Get Permission again after each upgrade.
What is included in the optional multi-device sync?
When sync is enabled, daily key-press totals, per-key and per-key-combination counts, mouse-button click counts and encrypted device information are encrypted locally before upload, and the service cannot read them. Mouse movement distance, scroll distance and per-app statistics are not currently synced.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/debugtheworldbot-keystats)Was this useful?