InputMetrics
A lightweight macOS menu bar app that tracks your keyboard and mouse usage with beautiful charts, heatmaps, and detailed statistics. Entirely private, entirely local.
macOS 15+ · Free · Open SourceDownload Latest Release
Installation
Download the ZIP from the latest release
Extract and drag to Applications
Launch from menu bar
Grant Accessibility & Input Monitoring
Features
Mouse Distance
Tracks cursor travel in pixels, converted to real-world meters, kilometers, feet, or miles. Includes fun comparisons showing your progress toward circling the Earth or reaching the Moon.
Click Tracking
Separate counters for left, right, and middle mouse clicks. View today's counts and all-time totals at a glance.
Scroll Distance
Measures both vertical and horizontal scroll distance in pixels, with automatic shorthand formatting for large numbers.
Keystroke Counter
Counts every keypress with per-key frequency tracking. See your top 5 most-used keys each day and all-time keystroke totals.
Mouse Heatmap
A 50×50 grid heatmap showing where you click most. Multi-monitor aware with per-display and aggregate views. Color scale from blue to red.
Keyboard Heatmap
Full QWERTZ keyboard layout rendered with color-coded intensity, showing which keys you press most. Tracks modifier combinations (Cmd, Shift, Ctrl, Option).
Interactive Charts
Smooth line charts with area fills and data points for weekly, monthly, and yearly views. Hover tooltips show exact values for any day.
Menu Bar & Dashboard
Quick-access popover from the menu bar for daily stats. Full dashboard window with expanded charts and heatmaps for deeper analysis.
How It Works
InputMetrics lives in your menu bar and passively listens to input events using a read-only CGEventTap. It cannot intercept, modify, or block any input — it only counts.
Data Collected
- Mouse: Cursor distance (pixels), click counts (left/right/middle), scroll distance (vertical/horizontal), click positions bucketed into a 50×50 grid
- Keyboard: Per-key press count by virtual key code and modifier flags
- Timing: Daily and hourly aggregates for trend charts
Data NOT Collected
- What you type (no keystroke content, sequences, or text)
- What is on your screen (no screenshots, window titles, or app names)
- Personal information of any kind
In-memory buffers flush to the local SQLite database every 30 seconds and on app quit. You can configure automatic data pruning (3 months, 6 months, 1 year, or keep forever) in Settings.
Settings & Data Management
- Launch at Login: Start InputMetrics automatically when you log in
- Live Menu Bar Stats: Optionally display today's distance and keystroke count next to the menu bar icon, refreshed every 2 seconds
- Distance Unit: Switch between Metric (m/km) and Imperial (ft/mi)
- Data Retention: Auto-prune data older than 3 months, 6 months, 1 year, or keep everything forever
- Export CSV: Export all data (daily summaries, mouse heatmap, keyboard heatmap) to a CSV file at a location you choose
- Reset All Data: Permanently delete all stored data with a confirmation prompt
Tech Stack
| Layer | Technology |
|---|---|
| Language | Swift 6 |
| UI | SwiftUI with AppKit bridging |
| Charts | Swift Charts (LineMark, AreaMark, PointMark) |
| Event Capture | CGEventTap (listen-only) |
| Database | SQLite via GRDB.swift |
| Login Item | SMAppService (ServiceManagement) |
| Architecture | MVVM with @Observable ViewModels |
| Minimum macOS | 15.0 (Sequoia) |
Permissions
InputMetrics requires two macOS permissions to function. Both must be explicitly granted by you in System Settings > Privacy & Security:
- Accessibility: Allows the app to monitor global input events (keyboard and mouse)
- Input Monitoring: Required by macOS for apps that observe key and pointer events
The app runs outside the sandbox to enable input event monitoring via CGEventTap. It has no network entitlements and makes zero network requests. If permissions are not granted, InputMetrics will prompt you and open the relevant System Settings pane.
Privacy Policy
Last updated: March 11, 2026
The Short Version
InputMetrics collects zero personal data. Everything stays on your Mac. Nothing is ever transmitted anywhere.
Data Collected
InputMetrics records only aggregate usage counts, stored locally in a SQLite database at ~/Library/Application Support/InputMetrics/metrics.db:
- Mouse cursor distance traveled (in pixels)
- Mouse click counts (left, right, middle)
- Scroll distance (vertical, horizontal)
- Click position heatmap (50×50 bucket grid per screen)
- Keystroke count per virtual key code and modifier combination
- Daily and hourly aggregate summaries
Data NOT Collected
- Keystroke content, typed text, or character sequences
- Screen content, screenshots, or window information
- Application names or browsing history
- Personal information, identifiers, or account data
- Location, contacts, or any other sensitive data
Data Storage & Transmission
- All data is stored exclusively on your device
- The app makes zero network requests — no analytics, no telemetry, no crash reporting, no update checks
- The app runs outside the sandbox (required for CGEventTap) and has no network entitlements
- There is no server, no cloud sync, and no third-party service integration
Data Control
- Export: You can export all data to a CSV file at any time from Settings
- Delete: You can reset all data from Settings, which permanently erases the database
- Retention: Configure automatic data pruning (3 months, 6 months, 1 year, or forever)
- Uninstall: Removing the app and its container at
~/Library/Application Support/InputMetrics/deletes all data
Third-Party Services
InputMetrics uses no third-party services, SDKs, or libraries that collect data. The only external dependency is GRDB.swift (local database), which does not perform any network activity. Login item management uses the native macOS ServiceManagement framework.
Children
InputMetrics does not collect personal information from anyone, including children under the age of 13.
Changes
If this policy changes, the updated version will be posted on this page with a new date.
Contact
Questions about this policy? Open an issue on GitHub.