A native macOS application that maps Xbox and DualSense controller inputs to keyboard shortcuts, mouse movements, and scroll, magnify, pan actions. Features an on-screen keyboard and full DualSense touchpad support.
Website & Documentation | Download
I created this app because I wanted to vibe code with an Xbox controller and use all my regular shortcuts.
I found other existing apps to be lacking or not configurable enough.
With the rise of whisper-driven voice transcription, just hook up any button to your favorite voice transcription program (mine is the open-source VoiceInk) and you now have full typing abilities with only the controller.
Later on, I realized a PS5 Dualsense controller that has a built in touchpad to control the mouse is an excellent solution for this kind of program. As of v1.1.0, there is now full support for Dualsense controllers in addition to Xbox Series X|S controllers.
There are other controller mapping apps for macOS, but none offered everything I needed:
| Feature | ControllerKeys | Joystick Mapper | Enjoyable | Controlly |
|---|---|---|---|---|
| DualSense touchpad support | ✅ | ❌ | ❌ | ❌ |
| Multi-touch gestures | ✅ | ❌ | ❌ | ❌ |
| Chord mappings (button combos) | ✅ | ❌ | ❌ | ✅ |
| On-screen keyboard | ✅ | ❌ | ❌ | ❌ |
| Quick text/commands | ✅ | ❌ | ❌ | ❌ |
| DualSense LED customization | ✅ | ❌ | ❌ | ❌ |
| DualSense microphone support | ✅ | ❌ | ❌ | ❌ |
| Native Apple Silicon | ✅ | ❌ | ❌ | ✅ |
| Actively maintained (2024+) | ✅ | ❌ | ❌ | ✅ |
| Open source | ✅ | ❌ | ✅ | ❌ |
Joystick Mapper is a paid app that hasn't been updated in years and lacks modern controller support. Enjoyable is open source but abandoned since 2014 with no DualSense support. Controlly is a solid newer app but doesn't support DualSense touchpad gestures, on-screen keyboard, or quick commands. Steam's controller mapping only works within Steam games, not system-wide.
ControllerKeys is the only option with full DualSense touchpad support, making it ideal for vibe coding and couch computing where precise mouse control matters.
-
Button Mapping: Map any Xbox/Dualsense controller button to keyboard shortcuts
- Modifier-only mappings (⌘, ⌥, ⇧, ⌃)
- Key-only mappings
- Modifier + Key combinations
- Long-hold for alternate actions
- Chording (multiple buttons → single action)
-
Joystick Control:
- Left joystick → Mouse movement
- Right joystick → Scrolling
- Configurable sensitivity and deadzone
- Hold modifier (RT by default) to use sensitive mouse movement
-
Touchpad Control: Use the touchpad from a Dualsense controller with taps and multitouch gestures
- Single-finger tap or click → Left click
- Two-finger tap or click → Right click
- Two finger swipe → Scrolling
- Two finger pinch → Zoom in/out
-
On Screen Keyboard, Commands, and Apps: Use the on-screen keyboard widget to quickly select apps, commands, or keyboard keys.
- Use the controller without a keyboard with the on-screen keyboard
- Easily enter configurable text strings and commands in Terminal with a single click
- Use built-in variables to customize text outputted
- Show and hide apps in customizable app bar
-
Profile System: Create and switch between multiple mapping profiles
-
Visual Interface: Interactive controller-shaped UI for easy configuration
-
DualSense Support: Full PlayStation 5 DualSense controller support
- Full touchpad support with multi-touch gestures
- Multi-touch gesture support
- Customizable LED colors in USB connection mode
- Dualsense built-in microphone support in USB connection mode
- Microphone mute button mapping
More Screenshots
- macOS 14.0 or later
- Xbox Series X|S or DualSense (PS5) controller with Bluetooth support
- Accessibility permissions (for input simulation)
- Automation permissions (for launching Terminal app with commands)
Download ControllerKeys - Get the latest signed and notarized build.
- Purchase and download the DMG from Gumroad
- Open the DMG and drag the app to
/Applications - Launch and grant Accessibility permissions when prompted
- Automation permissions will be requested when using terminal commands from the on-screen keyboard
The app is signed with an Apple Developer ID certificate and notarized by Apple, so it will run without Gatekeeper warnings.
This app requires Accessibility permissions to simulate keyboard and mouse input. We understand this is a sensitive permission, which is why this project is fully open source.
Why this app is safe:
-
Open Source: The complete source code is available for audit. You can verify exactly what the app does with your input data.
-
No Network Access: The app does not connect to the internet. Your data cannot be sent anywhere.
-
No Data Collection: The app does not log, store, or transmit any input data. Controller inputs are translated to keyboard/mouse events in real-time and immediately discarded.
-
Signed & Notarized: Releases are signed with an Apple Developer ID certificate and notarized by Apple, ensuring the binary matches the source code and hasn't been tampered with.
What the Accessibility permission is used for:
- Simulating keyboard key presses (when you press controller buttons)
- Simulating mouse movement (when you move the left joystick)
- Simulating scroll wheel events (when you move the right joystick)
The app uses Apple's CGEvent API to generate these input events. This is the same API used by accessibility tools, automation software, and other input remapping utilities.
XboxControllerMapper/
├── XboxControllerMapperApp.swift # App entry point
├── Info.plist # App configuration
├── XboxControllerMapper.entitlements # Sandbox/permissions
│
├── Models/
│ ├── ControllerButton.swift # Xbox button enum
│ ├── KeyMapping.swift # Mapping configuration
│ ├── Profile.swift # Profile with overrides
│ ├── ChordMapping.swift # Multi-button chords
│ └── JoystickSettings.swift # Joystick configuration
│
├── Services/
│ ├── ControllerService.swift # Controller connection
│ ├── InputSimulator.swift # Key/mouse simulation
│ ├── ProfileManager.swift # Profile persistence
│ ├── AppMonitor.swift # Frontmost app detection
│ └── MappingEngine.swift # Mapping coordination
│
├── Views/
│ ├── MainWindow/
│ │ ├── ContentView.swift # Main window
│ │ ├── ControllerVisualView.swift # Controller visualization
│ │ └── ButtonMappingSheet.swift # Button configuration
│ ├── MenuBar/
│ │ └── MenuBarView.swift # Menu bar popover
│ └── Components/
│ └── KeyCaptureField.swift # Shortcut capture
│
└── Utilities/
└── KeyCodeMapping.swift # Key code constants
| Button | Default Action |
|---|---|
| A | Return/Enter |
| B | Escape |
| X | Space |
| Y | Tab |
| LB | ⌘ (hold) |
| RB | ⌥ (hold) |
| LT | ⇧ (hold) |
| RT | ⌃ (hold) |
| D-pad | Arrow keys |
| Menu | ⌘ + Tab |
| View | Mission Control |
| Xbox | Launchpad |
| L-Stick Click | Left Click |
| R-Stick Click | Right Click |
| Left Joystick | Mouse |
| Right Joystick | Scroll |
- Connect your Xbox or DualSense controller via Bluetooth (System Settings → Bluetooth)
- Launch ControllerKeys
- Grant Accessibility permissions when prompted
- Click any button on the controller visualization to configure its mapping
- Use the menu bar icon for quick access to enable/disable and profile switching
Contributions are welcome! If you'd like to contribute code:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Test thoroughly with both Xbox and DualSense controllers if possible and applicable
- Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Please ensure your code follows the existing style and includes appropriate comments for complex logic.
Have an idea for a new feature? I'd love to hear it!
- Open an issue on GitHub with the
feature requestlabel - Describe the feature and the problem it solves
- Include any mockups or examples if applicable
Popular requests are more likely to be implemented. Feel free to upvote existing feature requests that you'd find useful.
Found a bug? Please help by reporting it:
- Check existing issues to avoid duplicates
- Open a new issue with:
- macOS version
- Controller model (Xbox Series X|S, Xbox One, DualSense, etc.)
- Connection method (Bluetooth or USB)
- Steps to reproduce the issue
- Expected vs actual behavior
- Screenshots if applicable
The more detail you provide, the easier it is to diagnose and fix the issue.
Source Available - See LICENSE for details.
The source code is open for transparency and security auditing. Official binaries are available for purchase on Gumroad.













