CtrlAssist: Controller Assist for gaming on Linux 🎮

CtrlAssist – an open source project to bring more accessible, collaborative gaming to Linux! Inspired by PC gaming sessions with my own family, where both young and old relish exploring rich stories with immersive worlds (like Witcher 3, RDR3, Hogwarts Legacy, etc) but find coordinated combat or movement control too challenging to play solo, CtrlAssist lets you combine multiple controllers into one virtual gamepad, much like assist features on dedicated game consoles.

Whether your helping grandparents through tough boss fights, or co-oping with nieces and nephews to level age gaps, CtrlAssist aims to make PC gaming on Linux fun and accessible for everyone. While I’m certain similar utilities exist, I also just wanted a holiday hobby project to practice Rust development while scratching a personal itch.

Please give it a try, share your feedback in the relevant discussion categories, or check out the open issues if you’d like to contribute, help is always welcome!

2 Likes

I just cut another release with a lot refracting (announcement below). I'd welcome if folks have suggestions about adding a configuration framework to extend customization for assist modes. I'm thinking a paired approach that could be done either with extended CLI parsing via the -- separator or config file parsing. Would be nice to plan an abstraction suitable for wrapping a GUI aground it all down the road.


Excited to announce release v0.2.0 for CtrlAssist, adding rumble pass-through support and significant improvements to controller multiplexing! CtrlAssist brings "controller assist" functionality to Linux gaming by allowing multiple physical controllers to operate as a single virtual input device. This enables collaborative play and customizable gamepad setups, making it easier for players of all ages and abilities to enjoy games together.

:bullseye: What's New

Rumble Pass-Through

Force feedback can now be forwarded to paired physical controllers! Configure which controller(s) receive rumble effects—route them to Primary, Assist, both, or neither. Share every haptic encounter from turbulence, engine failure, and hard landings with your co-pilot. Even better: if a controller disconnects mid-game (swapping batteries, USB cords, etc.), CtrlAssist automatically recovers and restores all force feedback effects when it reconnects.

Smoother Input Transitions

All assist modes now feature improved synchronization for more natural gameplay:

  • Joysticks snap cleanly: When assistance begins or ends, both X and Y axes update together—no more jarring diagonal-to-cardinal transitions

  • Toggle mode syncs instantly: Switching between Primary and Assist now mirrors the active controller's complete current state, eliminating phantom inputs from buttons or sticks that were held during the switch

Better Device Discovery

Controllers device trees are now discovered more reliably, preventing edge cases where multiple similar devices could cause conflicts. This also improves device hiding and rumble pass-through selection.

:hammer_and_wrench: Under the Hood

  • Refactored input handling for consistency across all three modes

  • Fixed button mapping quirks across physical and virtual device boundaries

  • Improved error handling and logging for edge cases and issue reporting

  • More graceful shutdown on Ctrl+C with robust cleanup

:package: Install and Upgrade


cargo install ctrlassist --force

Full changelog available at the GitHub release page.

Just cut a new release, including a new system tray, flatpak, and dynamic settings:

The dynamic settings took a lot more refactoring than I had initially envisioned, but it worked out.

Really enjoyed using ksni in creating a functional UI without needing a full blown GUI toolkit:

Thanks @iovxw !

1 Like