JoystickGremlinEx
Modified version of Joystick Gremlin to add features I wanted to have but were difficult to do as just a plugin, plus I wanted to run this as 64 bit and on a more current version of Python/QT.
Install / Use
/learn @muchimi/JoystickGremlinExREADME
GremlinEx
GremlinEx (GEX) is a universal controller integrator: it allows you to take input from multiple hardware devices from different manufacturers connected to a local machine, or a remote machine, such as joysticks and HID controllers, OSC (Open Sound Control), MIDI, Keyboard and mouse inputs and map them to virtual outputs like VJOY, or keyboard or mouse output, convert text to speech and play sounds. It can send output to a game or another process.
With OSC support, GremlinEx can receive input from custom designed glass (touch screen) surfaces, and supports two way communication to any device supported by BitFocus Companion such as the Elgato Streamdeck. This communication is two-way so GremlinEx can also send data to a glass surface or an external hardware panel.
GremlinEx can be expanded using custom plugins written in Python.

Documentation
The documentation for GremlinEx has recently moved to GitHub Pages: Documentation
Discord
Please visit the Discord server for discussion, tips and development information.
Test versions
The most current test releases will contain the latest bug fixes, features and optimizations. Not all test releases are stable which is why they are not in the release channel, and many are. Please make a backup of your profiles and enable the versioning option to keep files separate by version just in case, but there is about a year's worth of key updates since the last official release all in the test channel including several stable versions.
The test versions are available here: https://github.com/muchimi/JoystickGremlinEx/releases/tag/test
Change log
(m76RC17):
- Fix: OS Action: handling of persistence for null class names or special characters in class names.
- Fix: Map to Mouse/Ex: button does not release. Note: for this action, the execute on release option has no function currently for mouse button presses on this action. For more advanced uses, use the Map to Keyboard/Mouse Ex action.
(m76RC16):
- Changed: Keyboard Ex and keyboard API: Implemented an experimental alternate method to send keyboard input to a background process.
(m76RC15):
- Fix: Gated Axis Action: resolved an issue where range exit actions could trigger multiple times. The tracking logic for range entry/exit was refactored.
- New: Keyboard Ex and keyboard API additional instrumentation (keyboard and extra mode) for target process data.
(m76RC14):
- New: Joystick Curve: experimental input noise filter. This filter, when enabled, applies a Savitzky-Golay low pass filter to the input data. The purpose of this filter is to smooth data on noisy input sensors, which aims at eliminating spikes. GremlinEx exposes three filter parameters: (1) historical points included in the filtering function - this is the number of data points part of the computation, (2) sliding window sample size - this is a subset of the input data, and (3), the polynomial order. The default for this filter setting is off. Filtering is not usually needed for hall-effect or digital inputs. This feature is experimental for testing only.
- Fix: Map to Vjoy Action: stepped value repeater UI may clip the displayed step value.
(m76RC13):
- Fix: API: check for invalid button state requests (button or device)
(m76RC12):
- Change: Sequence Action: add sync on profile start option.
- Fix: Sequence Action: step interval in non wiggle mode was using incorrect entry.
- Fix: UI: minor layout improvements.
(m76RC11):
- Fix: OSC: incomplete interface declaration before some properties are used.
- Fix: Hat to button container: incomplete import
(m76RC10):
- Change: Map to State: enable latch mode. This mode is a variant where when a state is triggered ON, retriggers are ignored until a timer lapses or the state is turned OFF again. When the timer lapses, the state automatically turns OFF. The use-case is for situations when you need something triggered once in a given amount of time. Thiis is a variant of autorelease. The state's mode do not matter if latching. The state is expected to be a vanilla (non expression) state and default to OFF.
- Fix: Map to State: harden code against invalid states.
- Fix: older log DEBUG entries switched to INFO entries.
- Fix: (experimental) coercing QT to handle input panel width correctly
(m76RC9A):
- Fix: UI: In-use button/axis/hat count can report negative values in some cases. This fix is visual only.
- Fix: General: description/comment string data safe encoding/decoding in profiles.
- Diagnostics: added additional instrumentation to the log file when GEX is unable to derive an axis name.
- Fix: UI: exception when device is not longer found.
(m76RC8):
- Fix: Vjoy Remap Action: design time merge output only updates for added merged axes changes, not self).
- Change: Vjoy Remap Action: UI update for merged axis to match other container styling.
(m76RC7A):
- Fix: (legacy) Remap Action: exception on find next available vjoy input.
- Fix: Profile: list actions missing sync under new API.
- Fix: UI: number input validation exception when pasting or using blank values.
(m76RC6):
- Fix: Cycle mode action: incorrect handling of blank modes.
- Change: Cycle mode action: validation of input modes against profile mode definitions and error output to log if needed.
(m76RC5):
- Fix: Map to keyboard/Ex Action: exception in some pulse modes.
- Change: Map to keyboard/Ex Action: update to pulse/repeat layout.
- Change: Vjoy Remap Action: update to pulse/repeat layout.
(m76RC4):
- Fix: Map to Mouse/Ex Action: fix attribute exception in profile visualizer.
- Fix: Map to keyboard/Ex Action: latched/multi keys: ensure key press/releases follow LIFO sequence.
- Fix: MIDI device: resolved MIDI input not triggering.
- Fix: Vjoy Remap: resolved UI exception in some situations when updating repeaters.
(m76RC3)
- Fix: progress bar color initialization on a new installation could cause an exception.
(m76RC2)
- Fix: input viewer unpack error in some situations.
(m76RC1)
- After almost 200 releases in test mode, moving to release candidate 1. No new features will be added, only dragon and stability fixes as they present themselves as we shift to working to a final release.
(m76T186E)
- Minor change to include keyboard hook diagnostics data for troubleshooting an external application. This is enabled with the keyboard and extra verbose modes and produces increased messaging when keyboard inputs are processed.
(m76T186)
- Change: Clipboard - check format before reading text to avoid a (caught) exception.
- Fix: UI exception in Input Viewer in some situations with controllers with no hats in hat display mode.
- Fix: 1:1 mapping not creating profile entries in new API model.
(m76T185)
-
New: Map to Mouse/Ex Action: gains ability to curve the axis input when mapping an axis to mouse motion. This should help with overly sensitive thumbstick scenarios.
-
New: Remote Control: gains a new option to mimic pre T183 remote control. When an action is setup for remote output (remote is checked), it will use the profile's current remote mode setting and disable local mode (if selected) when checked. If unchecked, the action will output to local or remote based on the checked output options. The profile remote mode can be set at runtime via the control action (or vjoy remap's legacy control modes).
-
New: Control Action: gains execute on input press/release option.
-
New: Control Action: gains sync input option. The action will send, on profile start, the appropriate initial control command based on the input if the input is an enable/disable command. For example, if the action is set to enable remote control on trigger, it will disable remote control if the input is not on, and vice versa.
-
New: Remote Control: client name will appear in title bar for easier reference if a remote mode is enabled.
-
New: UI gains a new status icon in the lower left to reflect the profile remote state. This will change dynamically at runtime as the profile's "remote" state changes.
-
Fix: UI remote control status icon reflect broadcast/receive options global states. A new icon for remote profile is added to separately track the profile's remote state (set by the control action).
-
Fix: remote control port persistence if changed (removed one unused property)
-
Fix: check connection state when refreshing available clients.
-
Fix: status bar no longer updates the runtime mode.
-
Fix: map to mouse/ex action: mouse motion disabled.
(m76T184A)
- Fix: exception when adding vjoy to macro
- Fix: exception when changing modes in playsound action.
(m76T184)
- New: Map to keyboard/Mouse Ex Action: ability to optionally target a specific process by window title or executable path. This enables output to specific background processes who may not be in focus (such as, minimized or in the system tray). The process is located by window title or executable. If selected, can match on a partial match and will send to the first process found that matches the partial title or exe. If a target process is selected, and that process cannot be found, the action will be ignored and an error log entry placed in the log file at profile start. Supports local and remote. Note: this only applies to keystrokes. Mouse output from this action is not directed to target processes. Keys sent in this manner post directly to the process message queue. Note: for performance reasons, GremlinEx does not look for the process list all the time. If you start a process after profile start, you will need to restart the profile for it to find the missing process.
- New: remote control API: support for remote process search.
- New: output API: sup
Related Skills
node-connect
345.4kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
104.6kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
345.4kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
345.4kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
