A Synapse-like control center for Razer devices on Linux. Configure button remapping, macros, RGB lighting, and DPI settings — all without Windows.
Left: Button remapping and macro configuration. Right: RGB lighting and DPI control via OpenRazer.
- Button Remapping: Remap mouse buttons and keyboard keys to different keys, chords, or macros
- Macro Support: Create and execute macro sequences with key presses, delays, and text input
- Multi-Layer Bindings: Support for multiple binding layers with hold-to-shift (Hypershift-like)
- Profile Management: Multiple profiles with per-application auto-switching
- App Watcher: Automatic profile switching when applications gain focus (X11/GNOME Wayland)
- OpenRazer Integration: Control RGB lighting, brightness, and DPI via OpenRazer
- Wayland Compatible: Uses evdev/uinput for reliable input remapping under Wayland and X11
- Python 3.10+
- OpenRazer daemon (for lighting/DPI control)
- Linux with evdev and uinput support
- PySide6 (for GUI)
# Ubuntu/Debian
sudo add-apt-repository ppa:openrazer/stable
sudo apt update
sudo apt install openrazer-daemon openrazer-driver-dkms \
libgirepository1.0-dev gir1.2-gtk-3.0 python3-gi
# Add yourself to the plugdev group
sudo gpasswd -a $USER plugdevOption A: Via pipx (recommended)
pipx install razer-control-centerOption B: From source
cd ~/projects/Razer_Controls
./install.shThe install script will:
- Create a Python virtual environment
- Install all dependencies
- Set up the systemd user service
- Configure permissions
# Start the GUI
razer-control-center
# Or start just the remap daemon
systemctl --user start razer-remap-daemon- Profiles Panel (left): Create, select, and manage profiles
- Devices Tab: Select which input devices to remap
- Bindings Tab: Configure key/button bindings and macros
- Lighting & DPI Tab: Control OpenRazer device settings
- Daemon Tab: Start/stop the remap daemon service
- Select a profile (or create a new one)
- Go to the Bindings tab
- Click "Add Binding"
- Select the input key/button (e.g., BTN_SIDE for mouse side button)
- Choose an action type:
- Key: Output a different key
- Chord: Output multiple keys pressed together
- Macro: Execute a macro sequence
- Passthrough: Pass the original key through
- Disabled: Block the key entirely
- Go to the Macros sub-tab in Bindings
- Click "Add Macro"
- Enter macro steps in the format:
key:A- Press and release Adown:CTRL- Hold Ctrlup:CTRL- Release Ctrldelay:100- Wait 100mstext:hello- Type "hello"
The app watcher automatically switches profiles when you focus different applications.
-
Add
match_process_namesto your profile JSON:{ "name": "Gaming", "match_process_names": ["steam", "*.exe", "lutris", "wine*"], "is_default": false } -
Set one profile as default (fallback when no match):
{ "name": "Default", "is_default": true } -
Start the daemon with app watcher enabled:
razer-remap-daemon --app-watcher
Pattern matching supports:
- Exact match:
firefox - Wildcards:
*.exe,steam* - Substring:
chromematchescom.google.chrome - Case-insensitive:
Firefoxmatchesfirefox
Supported backends:
- X11 (requires
xdotool) - GNOME Wayland (uses DBus)
razer-control-center/
├── apps/gui/ # PySide6 GUI application
├── services/
│ ├── remap_daemon/ # evdev->uinput remapping engine
│ ├── openrazer_bridge/ # DBus communication with OpenRazer
│ ├── app_watcher/ # Per-app profile switching
│ └── macro_engine/ # Macro recording and playback
├── crates/
│ ├── profile_schema/ # Profile data model
│ ├── device_registry/ # Stable device identification
│ └── keycode_map/ # Key code mapping tables
└── packaging/
└── systemd/ # Systemd user service
Profiles are stored in ~/.config/razer-control-center/profiles/ as JSON files.
Add yourself to the input group:
sudo usermod -aG input $USERThen log out and back in.
Load the uinput kernel module:
sudo modprobe uinputTo load automatically on boot, add to /etc/modules-load.d/uinput.conf:
uinput
Make sure the OpenRazer daemon is running:
systemctl --user status openrazer-daemonMIT License


