The Valve Steam Controller — internally codenamed Triton — is a brilliant piece of hardware that has been almost completely orphaned on macOS. There is no first-party macOS driver. Steam itself only supports it inside game sessions, not as a system-wide pointing device. Pull the dongle out of a Mac, press the Steam button, and you get a few stubborn fake keyboard and mouse inputs that ignore every config tool you throw at them.
That layer of fake input has a name: lizard mode. This guide explains what it is, why it gets in the way, and how to use a Steam Controller as a real macOS input device by routing it through ControllerKeys over raw HID instead of relying on Steam.
What Is Lizard Mode?
Lizard mode is Valve's term for the Steam Controller's built-in fallback behavior. When the controller is connected but no game is actively claiming its input, the firmware pretends to be a generic USB keyboard and mouse: the right touchpad nudges the cursor, the left pad fires arrow keys, ABXY map to Enter / Escape / Space, and the triggers click. It is meant to give Big Picture mode a "couch keyboard and mouse" experience.
Why It's a Problem on Mac
On macOS, lizard mode cannot be overridden by software running above the HID layer. If you try to remap the right pad to scroll, the OS still receives raw mouse-move events from the controller's own firmware on top of whatever your remapping does. You get double inputs, drifting cursors, and stray Tab / Escape presses you can't trace.
How ControllerKeys Disables It
Steam handles this internally by sending a USB HID feature report that turns the firmware emulation off as soon as a game grabs the controller. ControllerKeys does the same thing the moment it detects the Steam Controller — without needing Steam to be installed:
- It opens the Steam Controller's HID interface directly via macOS's
IOHIDManager. - It sends the lizard-disable feature report (
0x87 0x09on report ID0x01— the same payload Steam itself sends; this is verified in the project's HID test suite against the Triton output layout). - It holds back all controller input until the disable is acknowledged, so you don't get any phantom keystrokes during the handshake.
- It re-sends the disable on a low-priority timer, because lizard mode tries to re-enable itself on certain firmware events.
- It also seizes the controller's "lizard mouse" HID child interface so macOS itself stops listening for built-in trackpad-style input from the puck.
The net effect: from the moment ControllerKeys connects, the Steam Controller stops pretending to be a keyboard/mouse, and every button, stick, touchpad, and gyro event becomes a clean signal that you can map to whatever you want.
What You'll Need
Steam Controller
Valve Steam Controller (Triton)
Puck, Cable, or BT
Wireless puck (also acts as a charger), USB-C cable, or Bluetooth
Mac Computer
macOS 11 Big Sur or later
ControllerKeys
To handle the lizard-mode bypass and mapping
You Don't Need Steam Running — But You May Need It Once for Firmware
ControllerKeys talks to the controller directly over USB HID at runtime. Steam does not have to be open, no Steam Input layer, no steamwebhelper, no background services.
One caveat: Valve ships Steam Controller and puck firmware updates only through the Steam client. If your controller or puck arrived from the factory with firmware older than what ControllerKeys expects (or you ever need to flash Bluetooth firmware), you'll want to install Steam on your Mac once, connect the controller while Steam is running, and let it apply any pending updates. After that you can quit Steam, uninstall it if you want, and run ControllerKeys on its own.
Method 1: Connect via the Wireless Puck (Recommended)
The puck that ships with the Steam Controller does double duty: it's a wireless receiver and a wireless charger. Plug it into your Mac once, drop the controller on it to top up the battery, and pick it up to use untethered — the same puck keeps the connection alive when the controller leaves the cradle.
Plug the Puck into a USB-C Port
The puck connects to your Mac over USB-C. Plug it directly into a port on the Mac — passive hubs sometimes hide HID feature-report paths, so prefer a direct connection. The puck's status LED lights up as soon as it has power.
Drop the Controller on the Puck (or Pick It Up)
Resting the controller on the puck charges it wirelessly. Lift it off and it stays connected over the puck's wireless radio — same connection, no handshake interruption.
Press the Steam Button to Wake the Controller
The Steam button (the round button with the Steam logo) wakes the controller from sleep. The status light blinks while it negotiates with the puck and goes solid once paired.
Launch ControllerKeys
Open ControllerKeys. In the sidebar you'll see Steam Controller appear within a second or two. The Buttons tab automatically switches to the Steam Controller preview layout (square touchpads, symmetric sticks, Steam glyph, three-dot share button).
Wait for Lizard Mode to Disable
The first time the controller connects in a session, ControllerKeys holds back input for ~500 ms while it confirms lizard mode is off. After that, every input flows cleanly to your mappings.
Start Mapping
Click any button, stick direction, or touchpad region in the preview to bind it to a keyboard shortcut, macro, system command, or JavaScript snippet.
Method 2: Connect via USB-C Cable (Wired)
If you don't have the puck handy — or you want the absolute lowest latency for gyro aiming or fast-twitch mapping work — run a USB-C cable directly from the controller to your Mac. Same connection, no wireless link, and the controller charges off your Mac at the same time.
Connect a USB-C Cable Directly to the Controller
The Steam Controller has a USB-C port. Use any USB-C data cable (charge-only cables won't enumerate the HID interface) to connect the controller to your Mac.
Press the Steam Button
The controller wakes immediately and your Mac enumerates the HID device. No pairing step — it's a direct USB connection.
Open ControllerKeys
ControllerKeys detects the controller, runs the lizard-mode handshake, and you can start mapping. The cable also keeps the battery topped up.
Method 3: Connect via Bluetooth
The Steam Controller supports Bluetooth as a third option if you don't want to plug anything into your Mac at all:
Put the Controller in Bluetooth Pairing Mode
Hold the Y button + Steam button together for two seconds. The status LED double-blinks rapidly to indicate Bluetooth pairing mode.
Pair from macOS Bluetooth Settings
Open System Settings → Bluetooth. "Steam Controller" appears in the device list. Click Connect.
Open ControllerKeys
ControllerKeys picks up the Bluetooth-connected Steam Controller the same way it picks up the puck- or cable-connected one, runs the lizard-mode handshake, and starts forwarding inputs.
Which Should You Use?
Puck — best all-rounder: wireless freedom and the controller stays charged when you set it down. USB-C cable — lowest latency, useful when you need every frame for gyro aim or fast-twitch input. Bluetooth — most convenient if you don't want anything plugged into your Mac, but slightly higher latency than the puck.
What You Can Map
Once lizard mode is out of the way, every physical surface of the Steam Controller becomes a programmable input:
Both Square Touchpads
Use each pad as one big trackpad (Whole Pad) or split into four corner regions (Quadrants) — eight bindable touch zones across both pads. Tap, click, and hold are independent events.
Two-Pad Pinch-to-Zoom
Touch both pads at once and drag fingers apart or together to fire a zoom gesture. Configurable native vs synthesized zoom.
Gyro Aiming
The controller's built-in gyroscope drives the macOS cursor. Activate it always, only while holding a trigger or grip, or as a focus-mode burst.
Gyro Gestures
Tilt forward, back, left, right, and yaw left/right as discrete mappable gestures — separate from gyro-as-mouse.
Grip Buttons
The two paddles on the back of the controller fire as L4 / R4 and are bindable like any other button.
Touchpad Haptics
The pads' rumble motors fire on click and tap. You can disable, soften, or boost the feedback per pad.
Analog Triggers
Map a soft pull and a full click independently. The triggers are pressure-aware so you can chain different bindings to threshold crossings.
Battery Status
The controller's battery percentage shows in ControllerKeys' menu-bar badge and in the Activity tab.
Touchpad Modes Explained
The Steam Controller's two touchpads are its defining feature. ControllerKeys exposes them in two modes:
| Mode | Whole Pad | Quadrants |
|---|---|---|
| Bindable regions per pad | 1 (the whole surface) | 4 (top-left, top-right, bottom-left, bottom-right) |
| Best for | Mouse/scroll, swipe gestures, pinch-to-zoom | Discrete shortcuts (clipboard, browser tabs, app launch) |
| Tap vs click | Both supported independently | Both supported independently per region |
| Two-pad pinch-to-zoom | Yes | Yes (zoom takes priority over region taps) |
Mix Modes Across Pads
You don't have to pick one mode for both pads. Run the right pad as a Whole-Pad cursor and the left pad in Quadrants for four discrete shortcuts.
Troubleshooting
Cursor Moves on Its Own / Phantom Tab Presses
- This is lizard mode talking — the firmware emulator hasn't been disabled yet.
- Quit ControllerKeys, unplug the puck (or USB-C cable), reconnect it, then open ControllerKeys before pressing the Steam button. This makes sure ControllerKeys grabs the HID interface first.
- If it persists, the controller may have re-enabled lizard mode after a firmware event — toggle "Steam Controller" off and on in the Hardware tab.
Controller Detected as "Generic HID Controller"
- Make sure you have ControllerKeys 1.8.2 or later — earlier versions only had partial Steam Controller support.
- Plug the puck or the USB-C cable directly into your Mac, not through a passive USB hub. Some hubs hide the HID feature report path.
- Restart ControllerKeys. The detection runs at startup; if the controller was connected mid-session it may not have been claimed.
Built-in Trackpad Disabled After Steam Controller Connects
- macOS has a system preference that disables the built-in trackpad whenever a "mouse" is connected — the Steam Controller's lizard mouse interface used to trigger this.
- ControllerKeys overrides that behavior automatically; if you still see it, make sure you're on the latest build.
- Otherwise: System Settings → Accessibility → Pointer Control → Trackpad Options, uncheck "Ignore built-in trackpad when mouse or wireless trackpad is present."
Touchpad Click Fires Twice
- This was a hardware-bounce issue in early ControllerKeys builds. The current build debounces both the press and the release.
- If it still happens, raise the click threshold in the Hardware tab — the steel touchpads pick up press flex more aggressively than DualSense pads do.
Gyro Cursor Drifts Slowly Even When Still
- Gyros need a calibration pass. Place the controller flat on a table and don't touch it for five seconds — ControllerKeys auto-calibrates the resting bias.
- If you want gyro only while aiming, bind gyro aiming to "Hold to activate" with a trigger or grip button.
Battery Reports as Unknown
- Battery is read from the Steam Controller's HID input report and only updates when the controller is actively connected.
- If it stays at "Unknown", the controller may be running very old firmware. Connect it once on a PC with Steam to get a firmware update, then return to your Mac.
Steam Controller vs Steam Deck Controls
This guide covers the Steam Controller — Valve's standalone gamepad, internally codenamed Triton — not the controls built into a Steam Deck. The Deck's built-in pads and buttons expose themselves to macOS through a different HID path that ControllerKeys handles as a generic XInput-compatible device. Everything below — the puck handshake, lizard-mode bypass, both-touchpad mapping — applies to the standalone Steam Controller hardware.
ControllerKeys as an Alternative to Steam Input
Steam Input is genuinely good. Its Desktop Configuration mode binds the controller system-wide and works in any app — Safari, Xcode, video calls, media players, Cursor, Claude Code — as long as Steam is running in the background. The catch is exactly that: Steam has to be running. Quit Steam (or never install it) and the Steam Controller falls back to lizard mode and becomes a generic dumb keyboard/mouse again. Your Desktop Configuration also lives in Steam Cloud, tied to your account, in Valve's binary VDF format.
ControllerKeys takes a different stance. It's a standalone macOS app whose only job is mapping controllers, your profiles are plain JSON files you own, and the source is on GitHub so you can audit exactly what's reading your Accessibility-tier permissions. Below is the head-to-head most users care about:
| Capability | Steam Input (Desktop Config) | ControllerKeys |
|---|---|---|
| System-wide mapping | Yes, while Steam is running | Yes, no Steam required at runtime |
| Background process needed | Full Steam client + helpers | One small native app |
| Per-app profiles on macOS | Game-specific configs (Steam games) + one global Desktop config | Any macOS app via linked profiles + app bar switcher |
| Layers / modifier modes | Action sets, action layers | Layers + per-layer stick mode override + layer-aware preview |
| Macros and scripts | Static action sequences | JavaScript scripts, macros, webhooks, OBS, system commands |
| Profile format | Binary VDF in Steam Cloud, tied to your Steam account | Plain JSON files, sync via Dropbox / git / iCloud |
| Open source | Proprietary | Source available on GitHub (security transparency) |
| Mac-to-Mac handoff | No | Universal Control-style relay over LAN |
| Profile snapshots / undo | No | Auto-snapshot before every destructive action (20-deep history) |
| Realtime low-latency mode | Standard | Per-profile realtime mode bypasses chord-detection window |
The pitch in one sentence: ControllerKeys is a more flexible, more portable, open-source alternative to Steam Input for using the Steam Controller as a general-purpose macOS input device. You give up Steam's per-game configuration community; in return you get a smaller standalone app, profiles you own as JSON files you can git-track or sync however you want, and a productivity feature set (chords, sequences, layers, macros, JavaScript, webhooks, command wheel, snapshots, Mac-to-Mac handoff) built around system-wide use rather than retrofitted onto a game launcher.
Two touchpads, a gyroscope, four grip buttons, analog triggers, and a wireless puck that doubles as a charger make the Steam Controller one of the most input-dense and ergonomically polished controllers ever shipped. If you already live inside Steam and your Desktop Configuration is dialed in, you don't need to switch. If you want a controller mapper that runs without Steam, treats your config as files you own, and gives you scripting and per-app profiles for the rest of your Mac, ControllerKeys is built for that.
Map Your Steam Controller in 60 Seconds
Plug it in, open ControllerKeys, and start binding. Both touchpads, gyro aiming, grip buttons, haptics — all routed through clean HID. No Steam required.