Control a Razer DeathAdder Essential on macOS — polling rate, DPI, and logo lighting — without Razer Synapse (which doesn't support this mouse on Mac).
It talks to the mouse directly using the same vendor HID protocol as OpenRazer: small USB feature reports that write settings into the mouse's onboard memory. These are configuration writes, not firmware flashing — low risk and reversible, and the settings persist across reboots and machines.
Ships a command-line tool and a menu-bar app.
| Device | USB PID | Status |
|---|---|---|
| DeathAdder Essential (2021) — incl. White Edition | 0x1532:0x0098 |
✅ Verified on hardware |
| DeathAdder Essential (original) | 0x1532:0x006E |
⛔ Not yet — add it |
| DeathAdder Essential White Edition (older) | 0x1532:0x0071 |
⛔ Not yet — add it |
The app auto-detects the connected device. Adding a new model is a single profile-table entry — see CONTRIBUTING.md. Only devices verified on real hardware are marked ✅.
- macOS (Apple Silicon or Intel)
- Homebrew
- Python 3.10+
hidapi(installed automatically by the installer via Homebrew)
git clone https://github.com/Kartik4152/razer-deathadder-mac.git
cd razer-deathadder-mac
./scripts/install.shThe installer creates a virtualenv, installs the package, and sets up a login LaunchAgent for the menu-bar app.
macOS gates access to mouse/keyboard HID devices behind Input Monitoring. After install:
- System Settings → Privacy & Security → Input Monitoring
- Enable the Python binary the installer prints (it may appear as Python).
- Re-run:
launchctl kickstart -k gui/$(id -u)/com.github.kartik4152.razer-da-menubar
Without this, the app runs but shows "Not connected." (The CLI run from a terminal inherits your terminal's grant, so it works immediately.)
A mouse icon appears in the menu bar (no Dock icon). Click it to set polling rate, DPI, lighting, and brightness — checkmarks show the current values. It auto-starts at login.
razer-da info # firmware, serial, poll rate, DPI, brightness
razer-da poll get
razer-da poll set 1000 # 125 | 500 | 1000 Hz (per device)
razer-da dpi get
razer-da dpi set 1600 # or: dpi set 1600 3200 (X Y)
razer-da light brightness 75 # 0–100 %
razer-da light static # steady (default white)
razer-da light breath # breathing
razer-da light offset commands read the value back to confirm. Add --debug to print raw HID bytes. (If you didn't install, run with python3 -m razer_da.cli … from the repo.)
Note on color: the DeathAdder Essential has a single fixed-color LED (white on the White Edition), not RGB — so brightness, on/off, and breathing work, but the hue can't be changed.
# restart (after granting permission, or to reload)
launchctl kickstart -k gui/$(id -u)/com.github.kartik4152.razer-da-menubar
# stop + disable auto-start
./scripts/uninstall.sh # add --purge to also remove the venv- Menu shows "Not connected" → grant Input Monitoring (above), then
kickstart -k. SIGBUS/ crash when the icon renders → caused by a too-broadDYLD_LIBRARY_PATH(e.g./opt/homebrew/lib) letting Homebrew'slibpnghijack macOS ImageIO. The tooling scopesDYLD_LIBRARY_PATHto the hidapi-only keg dir ($(brew --prefix hidapi)/lib) to prevent this — never widen it.Unable to import the 'hid' module→brew install hidapi.- Unsupported device →
razer-da infoprints the detected PID; see CONTRIBUTING.md to add it.
Each command is a 90-byte HID feature report: a fixed header (status, transaction id, command class/id, data size), an 80-byte argument area, and an XOR checksum. Transaction ids and per-zone command bytes are device-specific and live in razer_da/profiles.py; the report format and CRC are generic (razer_da/protocol.py). All command bytes were derived from the OpenRazer driver source and verified live against the hardware.
- Protocol reverse-engineering thanks to the OpenRazer project.
- Licensed under the MIT License.
- Not affiliated with or endorsed by Razer Inc. "Razer" and "DeathAdder" are trademarks of Razer Inc. Use at your own risk.