Last updated: June 16, 2026
Overview
ControllerKeys is a macOS utility by Kevin Tang that maps game controllers to keyboard input, mouse input, macros, scripts, webhooks, OBS commands, and system actions.
The app is designed to keep your configuration local. ControllerKeys does not run a third-party analytics SDK, and never sends your controller input, key presses, profiles, macros, scripts, quick text, or configuration to Kevin Tang or anyone else. The app does send a small amount of anonymous usage data — described in Anonymous Usage Analytics below — so its developer can see how many people use it and which app versions and Macs to support. That data contains no personal information and can be turned off in Settings.
Anonymous Usage Analytics
Because ControllerKeys is distributed free (through GitHub and Homebrew) with an optional paid license, the app sends a small anonymous ping so its developer can understand its user base — how many active installs there are, which app and macOS versions are in use, and roughly where users are — and prioritize support and updates accordingly.
What is sent:
- A random install identifier (a UUID generated on your Mac). It is not tied to your name, email, Apple ID, or Gumroad account, and is wiped if you uninstall the app.
- App version and build, macOS version, and Mac type (Apple Silicon or Intel).
- Your system language/region (e.g.
en_US) and whether the app is in trial, expired, or licensed state. - Whether the app was installed via Homebrew or downloaded directly.
- When you activate a license, an anonymous reference to the matching purchase, so a sale can be tied to an activation without revealing who you are.
What is not sent: your name, email, controller input, key presses, profiles, macros, scripts, quick text, or any configuration. Approximate country is determined from your network connection at the server's edge — your IP address is not stored; only a one-way salted hash is kept, used to roughly de-duplicate installs.
The app's automatic update check (via the Sparkle framework) also includes anonymized system information — app version, macOS version, Mac model, CPU, and memory — with each check. This is standard Sparkle system profiling.
The analytics endpoint is operated by Kevin Tang and runs on Cloudflare. You can turn all of this off in ControllerKeys → Settings → General → Privacy → "Share Anonymous Usage Data".
Data Stored Locally
ControllerKeys stores app configuration on your Mac. This can include:
- Controller mappings, profiles, layers, chords, sequences, macros, scripts, and settings.
- Linked app and linked controller settings used for profile switching.
- On-screen keyboard settings, quick text, app shortcuts, website shortcuts, and command wheel settings.
- Profile snapshots and backups used for restore and undo behavior.
- Optional usage statistics used by the local Controller Wrapped feature.
Current app data is generally stored under ~/.config/controllerkeys/ and related macOS preference/storage locations. Older installs may still have migrated data under ~/.controllerkeys/ or ~/.xbox-controller-mapper/. If you export a profile, you choose where that exported file goes.
Permissions
ControllerKeys needs macOS Accessibility permission to simulate keyboard and mouse input system-wide. Some features may also require Input Monitoring or other macOS permissions depending on your settings and macOS version.
These permissions are used so the app can perform the mappings you configure. They do not give ControllerKeys a reason to upload your data, and the app does not use them for telemetry.
Network Activity
Apart from the anonymous analytics ping and the automatic update check described above (both of which can be disabled), ControllerKeys makes network requests only when a feature you use requires it, including:
- Webhooks: if you configure a button, macro, chord, script, or profile to call a URL.
- OBS WebSocket: if you configure ControllerKeys to control OBS Studio.
- Mac-to-Mac controller handoff: if you pair two Macs running ControllerKeys. This is designed for local/private networks and uses authenticated relay frames.
- Community profiles or external imports: if you choose to fetch or import profile data from a URL or file.
- User scripts or shell commands: if you create scripts or commands that access the network.
For user-configured webhooks, scripts, shell commands, OBS commands, and imported profiles, you are choosing the endpoint or code path. Review third-party profiles before importing them.
Third-Party Services
ControllerKeys is sold through Gumroad. Gumroad handles purchases, payment processing, receipts, and related customer/payment data under Gumroad's own policies.
The anonymous app analytics and the app's update feed are served through Cloudflare, which processes the network request (including your IP address) in order to deliver the response and provide approximate location, under Cloudflare's own policies. App updates use the Sparkle framework.
The ControllerKeys website at kevintang.xyz may use Google Analytics to understand page traffic. That website analytics is separate from the macOS app itself.
Crash Reports, Support, and Feedback
If you email support, open a GitHub issue, post in Discord, or otherwise contact Kevin Tang, the information you provide in that message may be used to respond to you and improve the app.
Please do not send private profile files, secrets, API keys, webhook tokens, or shell commands containing credentials unless you have reviewed and intentionally redacted them.
Profile Sharing and Imports
ControllerKeys profiles can be exported and shared. Exported profiles may include mappings, macros, scripts, shell commands, webhook URLs, OBS commands, app identifiers, quick text, and other settings you configured.
Before sharing a profile, review it for private text, commands, URLs, tokens, or app-specific information. Before importing a profile from someone else, review any code-execution surfaces such as shell commands, JavaScript scripts, webhook follow-up commands, and URLs.
Children's Privacy
ControllerKeys is not directed to children under 13, and Kevin Tang does not knowingly collect personal information from children through ControllerKeys.
Changes
This policy may be updated from time to time. The latest version will be posted on this page with the updated date above.
Contact
Questions about this privacy policy can be sent to Kevin Tang through the contact information on kevintang.xyz.