Last updated: May 29, 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 collect telemetry, does not run an analytics SDK inside the macOS app, and does not send your controller input, profiles, scripts, or usage history to Kevin Tang or to a ControllerKeys server.
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 ~/.controllerkeys/ and related macOS preference/storage locations. 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
ControllerKeys does not phone home for analytics. Network activity happens 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 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.