Releases: Patola/sc-controller-cc
Release list
v0.6.0.7 — Steam Controller 2: right touchpad, gyro orientation, d-pad OSD; DualSense gyro fix
Bug-fix release on top of v0.6.0.6, focused on the Steam Controller 2: the right touchpad now behaves like a touchpad, the gyro's orientation data actually streams, and the d-pad navigates the OSD. Also fixes a DualSense gyro regression introduced in v0.6.0.6.
Note on the project: development now happens directly on this fork's
mainbranch. The pull request against upstream sc-controller was closed, somainhas been brought up to date with a month of work that lived on a side branch. Nothing was dropped in the process.
Changes
Steam Controller 2
- The right touchpad is treated as a touchpad again (#6, #9). Trackball mode, per-pad sensitivity and pad haptic feedback were all silently disabled on the right pad — adjusting any of those settings did nothing at all. The controller flag meaning "has a right stick instead of a touchpad" was set on a controller that has both, so four separate places skipped the pad handling entirely. Trackball rolls, friction and sensitivity respond, and pad feedback fires. (This also repaired the same three behaviours on the Steam Deck's right pad, which was affected in three of those four places.)
- Gyro orientation data now streams (#3). The configuration block sent at connect enabled the raw rates and the accelerometer but not the controller's fused orientation quaternion, and nothing ever wrote that register afterwards. Anything reading rotation rather than rate therefore did nothing: absolute (tilt) gyro, lean-to-turn gyro→mouse, and every Tilt binding. Rate-driven bindings worked, which is what made this so confusing to pin down. It appeared to work for some people only because Steam had already switched the quaternion on and the controller kept that state.
- The d-pad navigates OSD menus (#8). Menus accepted d-pad input only in the form the DualShock 4 sends it (a hatswitch reported as the left pad). The SC2 and the Deck have a real separate d-pad and were ignored. Radial menus never accepted d-pad input on any controller; they do now.
DualSense / PS5
- Fixes a gyro regression from v0.6.0.6: in absolute mode yaw and roll read inverted, and in relative mode the axes bled into one another — a yaw binding drifted diagonally, pitch moved sideways. Orientation was derived by decomposing a quaternion into euler angles, which is a sequential decomposition: once one axis was off-neutral, rotating about another moved all three outputs (pitching 20° then yawing 40° leaked 13° into roll). Each axis is now integrated independently, as the DualShock 4 already did. Gimbal lock near ±90° of pitch goes away with it.
Project
- Links now point at this fork. The About dialog was fetching release notes from upstream's tag page, which does not have our releases (
Failed to read release notes at …/C0rn3j/sc-controller/…); that, the bug-report link, the source-code link, the AppImage metadata and the README badges/clone URLs now all reference this repository. Links that credit the original authors, and wiki links (this fork's wiki is not populated yet), deliberately still point upstream.
Gyro (all controllers)
- "Mouse (Emulate Stick)" now emulates a stick. All three mouse modes in the "Joystick or Mouse" tab behaved identically — none gave cursor velocity proportional to how far you tilt. Emulate Stick now does, which is what its name always implied. Existing profiles are not modified and keep their current behaviour.
Still open
- Haptics on the SC2 are weak (#7). Feedback now fires and responds to its settings, but the driver can only emit a single click per event; continuous variable rumble ("HD rumble") is not implemented yet.
- The DualSense's raw gyro scale constant is still unverified, and its orientation has no accelerometer fusion, so pitch and roll drift slowly during sustained motion.
Which AppImage do I download?
…-x86_64.AppImage→ a normal PC (Intel/AMD desktop or laptop, and the Steam Deck). If you're not sure, this is the one you want.…-aarch64.AppImage→ ARM devices only (Raspberry Pi, ARM boards, etc.). It will not run on a normal PC.
There's a single build, made on Ubuntu 22.04 (jammy); it runs on Ubuntu 22.04+, Debian 12+, Arch, Fedora and anything newer.
⚠️ AppImage users: install the udev rules first
The AppImage cannot install the udev rules it needs, so a detected controller will appear to do nothing (no device access, and the virtual gamepad at /dev/uinput can't be created) until you install them. This is needed only for the AppImage — the Arch and other distro packages already include these rules.
Steam Deck (SteamOS): you can skip all of this — SteamOS already ships udev rules for Steam devices, so the AppImage works out of the box.
Download the attached 69-sc-controller.rules, then:
sudo cp 69-sc-controller.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger
(Log out and back in — or replug the controller — afterwards.)
v0.6.0.6 — DualSense (PS5) gyroscope, gyro trigger/sensitivity fixes, OSD over fullscreen games
Bug-fix release on top of v0.6.0.5. The DualSense (PS5) gyroscope now works — it never had, on any release — and a round of gyro fixes came out of a detailed user report against the Steam Controller 2 (thank you for the reports!). The OSD also finally draws over fullscreen games on Wayland.
Changes
DualSense / PS5 (all new)
- The gyroscope works. It was reading the wrong quantity entirely: the driver stored raw quaternion components where the mapper expected euler angles, so the pitch-bound axis sat pegged at full deflection, the yaw-bound axis followed your pitch, and real yaw did nothing at all. Absolute (tilt) gyro, lean-to-turn and every tilt binding were affected. Now converted in the driver, putting the DualSense on the same hardware-verified gyro path as the Steam Controller v1/v2 and DS4.
- Gyro drift is gone. The DualSense reports a small zero-rate offset on each axis even sitting untouched on a table — measured here at about 1.5 °/s, enough to walk an absolute gyro across its whole range in half a minute. It is now measured whenever the controller is at rest and subtracted.
- Turning the controller off no longer kills sc-controller. The DualSense has no "powering off" signal — a long press on the PS button just drops the link — and the resulting read error crashed the whole daemon, taking every other connected controller down with it and sometimes leaving a stuck OSD menu on screen. It now disconnects cleanly.
Gyroscope (all controllers)
- Gyro bound to a trigger is usable. It was being fed stick-range values and clamped into the trigger's 0–255 range, so about 0.7° of rotation pinned the trigger at maximum — it behaved like a button — and rotating the other way did nothing at all, because the whole negative half was silently discarded. Now scaled to the trigger's own range, resting at "released".
- Gyro sensitivity was being squared.
⚠️ Behaviour change: a per-axis sensitivity was applied twice (and one of the two came from the wrong axis), so a setting of2.0actually behaved as4.0. If you tuned a value by feel on an earlier release, square it to match — a working2.0becomes4.0. Sensitivity also now moves the point at which the axis reaches full deflection, instead of scaling an already-saturated reading. - Gyro gated behind an analog trigger works. A mode-shift condition like "right trigger ≥ 70%" had no hysteresis, so a trigger held near that threshold flickered across it many times a second. Each flicker re-centered the gyro, which left absolute gyro → stick and lean-to-turn → mouse looking completely dead while other bindings worked. The threshold now has a 5% band.
OSD
- The OSD draws over fullscreen games on Wayland. Menus and the circular menu were being hidden behind the game — which is most of the point of an OSD. They now sit on the compositor's overlay layer. (Verified on KDE Plasma;
SCC_OSD_LAYER=TOPoverrides it if a compositor prefers that.) Also fixes OSD positioning measuring positive Y from the wrong screen edge.
Known limitations
- DualSense pitch beyond about 75° couples into yaw and roll (gimbal lock). This is inherent to the euler-angle representation every controller here shares, and sits far outside the range gyro aiming uses.
- DualSense yaw still drifts slowly during sustained motion. The zero-rate correction removes the constant part, and the angle re-zeros whenever the controller rests or the gyro re-engages. Accelerometer fusion — which would pin pitch and roll absolutely — is planned for a later release.
Which AppImage do I download?
…-x86_64.AppImage→ a normal PC (Intel/AMD desktop or laptop, and the Steam Deck). If you're not sure, this is the one you want.…-aarch64.AppImage→ ARM devices only (Raspberry Pi, ARM boards, etc.). It will not run on a normal PC.
There's a single build, made on Ubuntu 22.04 (jammy); it runs on Ubuntu 22.04+, Debian 12+, Arch, Fedora and anything newer.
⚠️ AppImage users: install the udev rules first
The AppImage cannot install the udev rules it needs, so a detected controller will appear to do nothing (no device access, and the virtual gamepad at /dev/uinput can't be created) until you install them. This is needed only for the AppImage — the Arch and other distro packages already include these rules.
Steam Deck (SteamOS): you can skip all of this — SteamOS already ships udev rules for Steam devices, so the AppImage works out of the box.
Download the attached 69-sc-controller.rules, then:
sudo cp 69-sc-controller.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger
(Log out and back in — or replug the controller — afterwards.)
v0.6.0.5 — gyro bug-fix round: recenter-on-engage, Steam Controller v1 gyro parity, grip enablers
Bug-fix release on top of v0.6.0.4, closing every gyroscope bug reported against it — including three found by a user (thank you for the reports!) — and completing the Steam Controller v1 gyro overhaul: all supported controllers now share one hardware-verified gyro code path.
Changes
Gyroscope (all controllers)
- Absolute (tilt) gyro re-centers at every activation. The neutral pose is captured the moment you press the gyro-enable button — rotating while disengaged no longer carries a stale offset into the next engage, and cycling the enable button no longer "moves the origin". Deterministic and Steam-like; found on the v1 but fixed for every controller (the bug lived in the shared layer).
- The "Recenter Gyro" special action actually recenters. Lean-to-turn (relative gyro → mouse) now has a real neutral reference — captured at gyro activation and re-captured by Recenter Gyro. (On the laser-pointer mouse, recenter doing nothing is intended: a rate-driven cursor has no center.)
- "Mouse (Desktop)" pitch is no longer inverted ("Joystick or Mouse" tab) — it now uses the same hardware-calibrated sign table as everything else.
Steam Controller v1
- Full gyro parity. The v1's hardware quaternion (measured from held-pose captures: identical axis convention to the SC2's) is now converted in the driver to the same euler representation the DS4/SC2 use — fixing relative-mouse (pitch inverted, roll/yaw drifting left) and putting the v1 on the single shared gyro path: absolute, relative, tilt, lean-to-turn and laser mouse all verified on real hardware, including dual-controller multi-controller operation.
Steam Controller 2 (and Steam Deck)
- Gyro can be enabled by the capacitive grips: new "Left/Right Grip Touched" entries in the gyro-enable lists — the natural "aim while gripping" gesture. The lower rear paddles (L5/R5) are also selectable now.
- The rear paddles are named L4/L5/R4/R5 (their physical labels) in the gyro, chord/modeshift and binding editors — while the v1 keeps its classic "Left/Right Grip" naming, and controllers don't show buttons they don't have anymore (no phantom "Grip Touched" on a v1).
Other fixes
- A DualShock 4 connected over Bluetooth is named "DualShock 4" in the controller list (was: generic "Controller").
- The daemon no longer crashes when an input device node vanishes mid-detection (e.g. a Bluetooth pad reconnecting) — a hotplug race, now skipped quietly.
- Merged upstream: the Wayland OSD-keyboard crash fix (equivalent to ours), CI updates.
Which AppImage do I download?
…-x86_64.AppImage→ a normal PC (Intel/AMD desktop or laptop, and the Steam Deck). If you're not sure, this is the one you want.…-aarch64.AppImage→ ARM devices only (Raspberry Pi, ARM boards, etc.). It will not run on a normal PC.
There's a single build, made on Ubuntu 22.04 (jammy); it runs on Ubuntu 22.04+, Debian 12+, Arch, Fedora and anything newer.
⚠️ AppImage users: install the udev rules first
The AppImage cannot install the udev rules it needs, so a detected controller will appear to do nothing (no device access, and the virtual gamepad at /dev/uinput can't be created) until you install them. This is needed only for the AppImage — the Arch and other distro packages already include these rules.
Steam Deck (SteamOS): you can skip all of this — SteamOS already ships udev rules for Steam devices, so the AppImage works out of the box.
Download the attached 69-sc-controller.rules, then:
sudo cp 69-sc-controller.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger
(Log out and back in — or replug the controller — afterwards.)
v0.6.0.4 — working gyroscope (DS4 + Steam Controller 2), DS4 Bluetooth, NixOS package
Feature and bug-fix release on top of v0.6.0.3, focused on gyroscope support — the DualShock 4 and the Steam Controller 2 now have fully working, hardware-verified gyro aiming — plus a NixOS package contributed by the community.
Changes
Gyroscope (DualShock 4 + Steam Controller 2)
- Absolute (tilt) gyro works. Map pitch/yaw/roll to gamepad axes and the stick deflection follows the controller's actual orientation — hold a tilt and it holds the deflection. On the DS4 this is host-side sensor fusion (gyro integration with accelerometer drift-correction, calibrated on real hardware: a held tilt stays pinned, no drift); on the SC2 it uses the controller's own firmware-fused orientation.
- Gyro→mouse got intuitive, Steam-like semantics. With Absolute checked you get a laser pointer — the cursor tracks the controller's rotation and stops when you stop. Unchecked gives lean-to-turn — cursor speed proportional to how far you hold the tilt. Previously one mode did nothing and the other scrolled forever.
- The Tilt tab actually works. It used to fire continuously with the pad at rest on euler-gyro controllers; now all six directions (nose up/down, tilt left/right, rotate left/right) trigger correctly past ~45°, verified on hardware.
- Steam Controller 2: the IMU protocol was reverse-engineered wrong and is now fixed. The orientation quaternion and the angular rates were mis-split in the report layout, which scrambled or deadened every gyro mode. Layout, axes and signs are now pinned down from held-pose captures (unit-quaternion norm checks) and documented in
docs/steam-controller-v2-protocol.md. - Fixed a family of bugs that made gyro→mouse bindings label wrong ("Mouse" vs "Mouse X"), route to the joystick instead of the cursor, or not highlight in the axis-selector dialog.
- A gyro binding released from a mode-shift no longer leaves the axis stuck (runaway cursor).
DualShock 4
- Bluetooth support via a new hidraw driver — full report parsing, so touchpad and gyro work wirelessly too.
- Touchpad coordinates are scaled correctly (no more jitter/jumpiness), the touchpad highlights in Input Test, and right stick / triggers / touchpad no longer die after a mapper crash.
Steam Controller 2
- Hovering Left/Right Trigger in the GUI now brightens the actual trigger (it used to light up a region beside the shoulder buttons).
- The daemon warns explicitly if a future firmware switches the motion stream to the quaternion-less
0x45report instead of failing silently.
NixOS
- New:
package.nixfor NixOS users (works with rootless nix-user-chroot too, and includes testing capabilities) — attached below and shipped in the repo. Contributed by @ThomasEricB in #1 — thank you! The attached file pins this release (v0.6.0.4, updated in #2).
Packaging / infrastructure
- Python ≥ 3.11 is now required for source installs (3.10 is EOL soon). The AppImages keep working regardless of the bundled Python.
- CI builds AppImages for four distro bases again (jammy, noble, bookworm, trixie) for compatibility coverage; releases ship the most-compatible jammy pair, now with
.zsync(delta updates) and.sha256checksums. - Two fixes were split out and sent upstream: the AppImage tray/librsvg minimal-host fix (C0rn3j/sc-controller#101, merged) and the empty-enum crash on Python ≤ 3.10 with the 3.11 floor (C0rn3j/sc-controller#102).
Which AppImage do I download?
…-x86_64.AppImage→ a normal PC (Intel/AMD desktop or laptop, and the Steam Deck). If you're not sure, this is the one you want.…-aarch64.AppImage→ ARM devices only (Raspberry Pi, ARM boards, etc.). It will not run on a normal PC.
There's a single build, made on Ubuntu 22.04 (jammy); it runs on Ubuntu 22.04+, Debian 12+, Arch, Fedora and anything newer.
⚠️ AppImage users: install the udev rules first
The AppImage cannot install the udev rules it needs, so a detected controller will appear to do nothing (no device access, and the virtual gamepad at /dev/uinput can't be created) until you install them. This is needed only for the AppImage — the Arch and other distro packages already include these rules.
Steam Deck (SteamOS): you can skip all of this — SteamOS already ships udev rules for Steam devices, so the AppImage works out of the box.
Download the attached 69-sc-controller.rules, then:
sudo cp 69-sc-controller.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger
(Log out and back in — or replug the controller — afterwards.)
v0.6.0.3
Feature and bug-fix release on top of v0.6.0.2, focused on the Steam Deck OSD and the on-screen Display Current Bindings window.
Changes
Steam Deck
- The Deck now has its own "Display Current Bindings" artwork. It used to fall back to — and show — a Steam Controller v1 picture. The binding-display templates are now generated automatically from each controller's own drawing, so the Deck shows a real Deck silhouette with the bindings laid out around it.
- The OSD menu entries work in the AppImage. "Run Program…", "Display Current Bindings…" and "Edit Bindings…" now launch correctly — they silently did nothing before.
- "Turn Controller OFF" is hidden for the Deck's built-in controls — the Deck can't power its own controller off. It still shows for controllers that can be turned off (e.g. a Steam Controller plugged into the Deck).
Display Current Bindings (all controllers)
- It shows the controller you invoked it from. With several controllers connected it used to always show the first one's bindings — and because its cancel button was locked on that other controller, the window couldn't even be dismissed. Fixed.
- It fits the screen. The window is now capped to fit (it overflowed the Steam Deck's screen), and the connector lines stay inside the window and point at the correct controls.
- Labels stay inside their frames. A crowded binding box now shrinks its text to fit instead of spilling out.
GUI
- The profile Save/Edit buttons show their icons again (they were rendering blank).
Which AppImage do I download?
…-x86_64.AppImage→ a normal PC (Intel/AMD desktop or laptop, and the Steam Deck). If you're not sure, this is the one you want.…-aarch64.AppImage→ ARM devices only (Raspberry Pi, ARM boards, etc.). It will not run on a normal PC.
There's a single build, made on Ubuntu 22.04 (jammy); it runs on Ubuntu 22.04+, Debian 12+, Arch, Fedora and anything newer.
⚠️ AppImage users: install the udev rules first
The AppImage cannot install the udev rules it needs, so a detected controller will appear to do nothing (no device access, and the virtual gamepad at /dev/uinput can't be created) until you install them. This is needed only for the AppImage — the Arch and other distro packages already include these rules.
Steam Deck (SteamOS): you can skip all of this — SteamOS already ships udev rules for Steam devices, so the AppImage works out of the box.
- Download
69-sc-controller.rulesfrom this release. - Copy it into place — this needs
sudo:sudo cp 69-sc-controller.rules /etc/udev/rules.d/69-sc-controller.rules
- Reload and re-apply the rules:
sudo udevadm control --reload-rules && sudo udevadm trigger - Unplug and replug the controller (or its wireless dongle) — or reboot.
Assets
- AppImage —
x86_64(PC / Steam Deck) andaarch64(ARM). 69-sc-controller.rules— udev rules for AppImage users (see above).- Source archives —
.tar.gz/.zip. - Arch package + PKGBUILD —
sc-controller-cc.
v0.6.0.2
Bug-fix release on top of v0.6.0.1.
Fixes
- Steam Deck: the back-paddle buttons in the side panel now match the device — the left column reads L4 (top) → L5 (bottom) and the right R4 → R5, instead of being upside-down. The SC2 and other controllers are unchanged.
Which AppImage do I download?
…-x86_64.AppImage→ a normal PC (Intel/AMD desktop or laptop, and the Steam Deck). If you're not sure, this is the one you want.…-aarch64.AppImage→ ARM devices only (Raspberry Pi, ARM boards, etc.). It will not run on a normal PC.
There's a single build, made on Ubuntu 22.04 (jammy); it runs on Ubuntu 22.04+, Debian 12+, Arch, Fedora and anything newer.
⚠️ AppImage users: install the udev rules first
The AppImage cannot install the udev rules it needs, so a detected controller will appear to do nothing (no device access, and the virtual gamepad at /dev/uinput can't be created) until you install them. This is needed only for the AppImage — the Arch and other distro packages already include these rules.
Steam Deck (SteamOS): you can skip all of this — SteamOS already ships udev rules for Steam devices, so the AppImage works out of the box.
- Download
69-sc-controller.rulesfrom this release. - Copy it into place — this needs
sudo:sudo cp 69-sc-controller.rules /etc/udev/rules.d/69-sc-controller.rules
- Reload and re-apply the rules:
sudo udevadm control --reload-rules && sudo udevadm trigger - Unplug and replug the controller (or its wireless dongle) — or reboot.
Assets
- AppImage —
x86_64(PC / Steam Deck) andaarch64(ARM). 69-sc-controller.rules— udev rules for AppImage users (see above).- Source archives —
.tar.gz/.zip. - Arch package + PKGBUILD —
sc-controller-cc.
v0.6.0.1
Bug-fix release on top of v0.6.0.
Fixes
- "Register new controller" no longer crashes (it raised an ImportError when opening the controller-registration dialog).
- Input Test highlights clear when you turn Input Test off — a control held at that moment (e.g. a grip sensor) no longer stays stuck highlighted on the image.
Which AppImage do I download?
…-x86_64.AppImage→ a normal PC (Intel/AMD desktop or laptop). If you're not sure, this is the one you want.…-aarch64.AppImage→ ARM devices only (Raspberry Pi, ARM boards, etc.). It will not run on a normal PC.
There's a single build, made on Ubuntu 22.04 (jammy); it runs on Ubuntu 22.04+, Debian 12+, Arch, Fedora and anything newer.
⚠️ AppImage users: install the udev rules first
The AppImage cannot install the udev rules it needs, so a detected controller will appear to do nothing (no device access, and the virtual gamepad at /dev/uinput can't be created) until you install them. This is needed only for the AppImage — the Arch and other distro packages already include these rules.
Steam Deck (SteamOS): you can skip all of this — SteamOS already ships udev rules for Steam devices, so the AppImage works out of the box.
- Download
69-sc-controller.rulesfrom this release. - Copy it into place — this needs
sudo:sudo cp 69-sc-controller.rules /etc/udev/rules.d/69-sc-controller.rules
- Reload and re-apply the rules:
sudo udevadm control --reload-rules && sudo udevadm trigger - Unplug and replug the controller (or its wireless dongle) — or reboot.
Assets
- AppImage —
x86_64(PC) andaarch64(ARM). 69-sc-controller.rules— udev rules for AppImage users (see above).- Source archives —
.tar.gz/.zip. - Arch package + PKGBUILD —
sc-controller-cc.
v0.6.0
LLM-assisted fork of sc-controller — the user-mode driver and GTK3 GUI for game controllers — adding Steam Controller v2 (2026) and Steam Deck support, plus a batch of GUI / OSD / AppImage fixes.
Highlights
- Steam Controller v2 (2026): dedicated controller artwork, face and side-panel button icons, rear-paddle icons, and config.
- Steam Deck: controller image, correct control layout (D-Pad, L4, L5, View, Steam), Input-Test areas and on-hover highlights for the sticks / D-Pad / trackpads.
- OSD: works under Wayland (GtkLayerShell); the "All Profiles" and "Autoswitch Options" submenus show again; the OSD daemon now spawns correctly from the AppImage.
- Steam Controller v1: Steam logo on the C button (controller image + side panel); fixed the hover offset and a phantom right-stick button.
- AppImage: bundles GtkLayerShell and the full Ayatana AppIndicator chain — working tray icon, no glibc-symbol errors at startup.
Assets
- AppImage — Ubuntu (jammy / noble) and Debian (bookworm / trixie), x86_64 + arm64. Built and attached by CI.
- Source archives —
.tar.gz/.zip. - Arch package + PKGBUILD —
sc-controller-git, pointing at this fork.
Known issues are tracked in TODO.md (notably the Deck OSD-menu actions and the Deck tray icon).