macOS reads a short list of game controllers and ignores the rest, such as the DualShock 3 above. OpenJoystickDriver (OJD) is a menu-bar app that reads those controllers over USB, Bluetooth or a 2.4 GHz dongle and gives games a virtual Xbox or generic gamepad. A controller macOS already handles is left to macOS. OJD runs in your user session with one DriverKit extension and no kernel extension, so SIP and AMFI stay on.
Warning
Many controllers have no hardware test yet, and some games do not read the virtual controller. Check Supported controllers and Playing games before you rely on it.
Requires macOS 12 or later, on Apple silicon or Intel.
- Download the
.dmgfrom the latest release, drag OpenJoystickDriver.app into Applications and open it. - Click the controller icon in the menu bar. If it shows Grant Access, allow OJD in Input Monitoring and Accessibility.
- Connect the controller, select it under Controllers and click Open Input Test... to watch each control respond live.
- Start a game.
An Xbox One or Series controller on USB also needs the driver extension, under System Settings > General > Login Items & Extensions > Driver Extensions. Stuck? See Troubleshooting.
- 600+ controller records across Xbox, PlayStation, Nintendo Switch, Steam, GameSir, NVIDIA SHIELD, Flydigi and generic HID gamepads.
- Three virtual profiles per controller:
SDLCompatible(an Xbox Adaptive Controller for SDL games and Steam),GameControllerCompatible(an Xbox Wireless Controller for Apple's Game Controller framework) andGeneric. - Remapping with combinations, sequences and layers, plus keyboard, pointer and scroll output.
- A live input test for every button, stick and trigger.
- Mods that add controller records, patches, profiles and virtual devices without touching the signed app.
ojd, a command-line tool with JSON output for scripts.
Install ojd from Settings > Install Command-Line Tool, which links /usr/local/bin/ojd. Check the service, extension and permissions, then list connected controllers:
ojd status
ojd controller listStart an SDL game with your virtual controllers' mappings in SDL_GAMECONTROLLERCONFIG:
ojd virtual launch /Applications/PCSX2.appCheck a mod package, then install it:
ojd mod install ~/Downloads/my-controller-mod --dry-run
ojd mod install ~/Downloads/my-controller-modThe wiki covers the rest: Getting started, Using the app, Remapping profiles and the Command reference.
Do I need to disable SIP or AMFI?
No. OJD needs neither, in any build.
Does it work with Steam?
Yes, with the SDLCompatible profile: Steam read every control and drove the rumble motors on macOS 27. With Generic, Steam was erratic and slow to respond. See Playing games.
Why does my controller work in one app but not another?
Each app reads controllers through its own API, and some SDL apps cannot read the virtual controller. See Game does not see the controller.
Run ./Scripts/ojd setup and just check before opening a pull request; see CONTRIBUTING.md. Bugs and controller test results go through Reporting a bug. Sponsorship pays for the controllers and Macs that tests run on; if your company uses OJD, please sponsor it.
PolyForm Noncommercial 1.0.0 © 2026 Krystian J., from 0.6.0-alpha.2 on. Use, fork and share it freely for noncommercial purposes. For commercial use, talk to the maintainer: see COMMERCIAL.md. Releases up to and including 0.6.0-alpha.1 are MIT. Xbox and PlayStation are trademarks of Microsoft and Sony; OJD is not affiliated with either.




