Skip to content

Releases: ruffsl/CtrlAssist

v0.4.0

14 Jan 03:41
e7be894

Choose a tag to compare

CtrlAssist v0.4.0 introduces demultiplexing functionality along with enhancements to the system tray and rumble targeting. The updated README now features FAQ and Cookbook sections with practical examples, such as the "Double Agent Tag Team" scenario, where a single assist controller uses a demux to help multiple primary players across separate mux instances, and the "Couch Co-Op Swap" scenario, in which two players take turns assisting each other using toggle mode, with force feedback following the currently active controller by default.

While controller demultiplexing was a requested feature from a prior release, I didn't have a concrete use case until I found myself helping a pair of youngsters play couch co-op multiplayer games with each other. Instead of needing separate assist controllers for each player, otherwise charging/pairing four controllers in total, being able to unicast between mux instances with a single assist controller made juggling both inputs much simpler. Then after being roped into the "It Takes Two" session myself, I found being able to swap primary and assist players outright much simpler when both helping and playing, allowing the Helpee to also aid the Helper when it really does take two.

New Features

Demux Operation Mode

CtrlAssist now supports demultiplexing (demux), allowing a single physical controller to be split into multiple virtual gamepads. This complements the existing multiplexing (mux) functionality and enables more advanced input routing scenarios.

Demux Modes:

  • Unicast (default): Routes primary controller input to the currently active virtual gamepad. Cycle between virtual gamepads using the reserved Mode button.
    • Assist multiple players across separate mux instances
  • Multicast: Broadcasts primary controller input to all virtual gamepads simultaneously.
    • Replicate controller input for advanced input multiplexing pipelines

Enhanced System Tray

The system tray interface has been redesigned with improved usability and better state management:

  • Unified Operation Management: Toggle between Mux and Demux modes directly from the tray menu
  • Per-Mode Configuration: Separate, persistent settings for mux and demux operations
  • Dynamic Reconfiguration: Update mode and rumble settings while operations are running
  • Improved Menu Structure: Streamlined menu organization using radio groups and submenus

Active Rumble Targeting

A new "Active" rumble target has been added as the default option for mux operations. This routes force feedback to whichever controllers are currently active according to the selected mode:

  • Toggle Mode: Rumble follows the currently active controller
  • Priority/Average Modes: Rumble sent to both controllers, same as before

Expanded Documentation

The README has been significantly expanded with:

  • FAQ Section: Addresses common questions about who CtrlAssist is for, why it was developed, game compatibility, supported controllers, and running multiple instances
  • Cookbook Section: Provides practical examples demonstrating complex multi-instance setups:
    • Couch Co-Op Swap: Two players alternating assistance
    • Double Agent Tag Team: One assist controller helping multiple primary players

Technical Improvements

Robust Steam Configuration Handling

Steam blacklist modifications now use file locking to prevent race conditions. The implementation also now always removes added entries on shutdown rather than restoring only from prior state, ensuring hidden devices are consistently unhidden.

Enhanced Signal Handling

Replaced the ctrlc crate with signal-hook for more robust signal handling. The application now properly responds to both SIGINT and SIGTERM, ensuring graceful shutdown in containerized and systemd-managed environments.

Improved Device Discovery

Simplified gamepad resource discovery by leveraging an upstreamed devpath API from gilrs-core, eliminating fragile device matching logic and improving reliability.

Better Shutdown Management

  • Asynchronous shutdown signaling using tokio::sync::watch channels
  • Proper thread lifecycle management with efficient blocking on shutdown signals
  • ScopedDeviceHider lifetime now tied to operation handles, ensuring devices are properly restored

Bug Fixes

  • Fixed race conditions in operation startup and shutdown
  • Corrected device hiding lifetime issues
  • Improved error propagation in device open operations

Breaking Changes

  • The rumble target enum options now defaults to "Active" instead of "Both"
  • Configuration file format has been extended to accommodate separate mux and demux settings

Installation

CtrlAssist v0.4.0 can be installed via:

  • Cargo: cargo install ctrlassist --force
  • Flatpak: Download the bundle from the releases page and install with flatpak install

Full installation instructions are available in the README.

What's Changed

  • docs: add FAQ or Frequently Asked Questions by @ruffsl in #43
  • feat: add demux subcommand and operation config for system tray by @ruffsl in #44
  • refactor: rename source file and folder hierarchy by @ruffsl in #45
  • refactor: streamline gamepad resource discovery by @ruffsl in #46
  • refactor: ScopedDeviceHider for clarity and robustness by @ruffsl in #47
  • chore: update gilrs dependency to version 0.11.1 by @ruffsl in #48
  • fix: idiomatic async shutdown of system tray by @ruffsl in #49
  • feat: add Active as default for MuxRumbleTarget enum by @ruffsl in #50
  • chore: update release version to v0.4.0 by @ruffsl in #51
  • chore: update release version to v0.4.0 in metainfo.xml by @ruffsl in #52

Full Changelog: v0.3.0...v0.4.0

v0.3.0

30 Dec 13:48
3ebd331

Choose a tag to compare

Announcing the release of CtrlAssist v0.3.0, which introduces significant new features and usability improvements.

Major Features

System Tray Interface

This release introduces a graphical system tray application that provides desktop integration for managing controller multiplexing. Users can now:

  • Configure primary and assist controller assignments via dropdown menus
  • Start and stop the mux without using the command line
  • Adjust settings through a context menu interface
  • Receive desktop notifications for status changes
  • Persist configuration across sessions

The tray interface supports live reconfiguration of device-invariant settings (mux mode and rumble target) while the mux is running.

Multiple Hiding Strategies

Controller hiding now supports three distinct strategies:

  • None: No hiding, manual configuration required
  • Steam: Automatically manages Steam's controller blacklist via config.vdf modification
  • System: Restricts device permissions system-wide (requires root access)

The Steam hiding strategy enables proper functionality in sandboxed environments without requiring elevated privileges, addressing a key limitation for Flatpak users.

Live Runtime Updates

The mux runtime now supports dynamic reconfiguration without restart for:

  • Mux mode changes (Priority, Average, Toggle)
  • Rumble target adjustments (Primary, Assist, Both, None)

This functionality is available through both the system tray and programmatic (D-BUS) interfaces, allowing users to adapt behavior during gameplay sessions.

Flatpak Distribution

CtrlAssist is now packaged as a Flatpak application with:

  • Automated GitHub Actions workflow for release builds
  • Desktop entry and metainfo for application catalogs
  • Proper sandbox permissions for device access
  • Support for Steam configuration modifications within the sandbox

Flatpak bundles are automatically built and attached to GitHub releases.

Additional Improvements

  • Configuration persistence to $XDG_CONFIG_HOME/ctrlassist/config.toml
  • Controller selection by name with best-effort matching across sessions
  • Enhanced documentation with installation instructions for both Cargo and Flatpak
  • New pixel art banner and application icon (via Aseprite)
  • Improved force feedback device recovery after disconnection
  • Better error handling and user feedback throughout the application

Installation

CtrlAssist v0.3.0 can be installed via:

  • Cargo: cargo install ctrlassist --force
  • Flatpak: Download the bundle from the releases page and install with flatpak install

Full installation instructions are available in the README.

Breaking Changes

The --hide flag now requires an enum value (none, steam, system) instead of being a boolean flag. Users upgrading from v0.2.x should update their scripts accordingly:

  • Previous: ctrlassist mux --hide
  • Current: ctrlassist mux --hide system

What's Changed

  • feat: package CtrlAssist for Flatpak by @ruffsl in #25
  • feat: Add Multiple Hide Strategies with Steam Blacklist Support by @ruffsl in #26
  • feat: add System tray app by @ruffsl in #27
  • feat: update banner to pixel art by @ruffsl in #28
  • feat: polish for flatpak submission by @ruffsl in #29
  • feat: update version to 0.3.0 in Cargo files and README by @ruffsl in #30
  • fix: improve flatpack manifest and support multi instance while sandboxed by @ruffsl in #31
  • feat: add Flatpak release workflow for GitHub Releases by @ruffsl in #32
  • fix: flatpak release workflow by @ruffsl in #33 #34 #35 #36 #37 #38 #39 #40
  • feat: enable live updates for mux mode and rumble settings by @ruffsl in #41
  • docs: improve clarity and consistency in README documentation by @ruffsl in #42

Full Changelog: v0.2.0...v0.3.0

v0.2.0

20 Dec 21:14
01ad0fc

Choose a tag to compare

What's Changed

  • docs: add badges for CI and Crates.io by @ruffsl in #16
  • feat: Add Force Feedback (Rumble) Forwarding from Virtual to Physical Controllers by @ruffsl in #20
  • fix: correct upstream button mappings for virtual gamepad by @ruffsl in #21
  • fix: correctly resolve gamepad devices by @ruffsl in #22
  • fix: sync input between active and primary transitions by @ruffsl in #23
  • chore: bump version to v0.2.0 by @ruffsl in #24

Full Changelog: v0.1.0...v0.2.0

v0.1.0

07 Dec 18:30
65c5989

Choose a tag to compare

What's Changed

  • Initial working MVP and project outline for CtrlAssist by @ruffsl in #1
  • Fix and include web banner for README by @ruffsl in #2
  • Refactor mux modes into separate modules by @ruffsl in #3
  • docs: cleanup and reformat README by @ruffsl in #11
  • chore: cleanup for initial release by @ruffsl in #12

Full Changelog: https://github.com/ruffsl/CtrlAssist/commits/v0.1.0