Looking for a way to drive Train Sim World, Train Simulator Classic or Wonders of Sodor using your own joystick, throttle, or custom controller setup? This open-source mod and program directly injects input into the game, giving you complete control over the train.
Installation & More information
For installation instructions and more information you can refer to the Github page
Feature Highlights
Controller Specific Profile Selection
You can select a profile for each controller allowing for a complex multi controller set-up with different active profiles.
Cab Debugger
The cab debugger gives a real time status of the current in-game locomotive as the in game controls are changing. This is useful for configuring new train profiles and checking the relevant values.
Visual Calibration
The new 1.0.0 version also brings a completely overhauled visual calibration mode making it easier than ever to calibrate and configure existing or new controllers
Profile Builder
A graphical profile builder is now available online to help with configuring new profiles if you are not comfortable creating the JSON profiles
Shared Profiles
You can submit profiles for other users to use and download right from the app
Changelog
v1.19.1 - 2026/06/30
Fix cab_state_value listener config
Fix HID handling
Updated listeners schema
v1.19.0 - 2026/06/23
Add internal technical support for HID output and feature reports (only for advanced custom controllers - currently largely undocumented)
Updated udev rule installer
Add anti-jitter option in calibration
Fix CPU polling
v1.18.0 - 2026/06/18
Jitter and backoff API retries
Enable keep-alive
Add debugger control pinning
v1.17.3 - 2026/06/16
Updated icons
v1.17.2 - 2026/06/15
Add WEBKIT_DISABLE_DMABUF_RENDERER on Wayland
Add udev installer for linux
Update wails to 2.21
v1.17.1 - 2026/06/11
Fixed macos build
v1.17.1 - 2026/06/10
Update UE4SS to latest experimental
Update mapping save profile modal with option to replace all assignments
Updated default calibration values for InfiniteRailtech
Update HID matching
Add unique ID to UI
v1.17.0 - 2026/06/04
Added map keybinding dialog
Added beta support for running train
v1.16.1 - 2026/06/01
Upgrade to SDL3
v1.15.0 - 2026/05/30
Add option to calibrate using the unique device ID instead of the standard device ID (useful for arduino's and other similar devices)
Improve direct control server restart handling and error logging
Website security updates
v1.14.2 - 2026/04/12
Fix invert handling in step thresholds
v1.14.1 - 2026/04/11
Minor changes to mods and socket lib
v1.14.0 - 2026/04/09
Minor update to max change rate handling in API control
Updated direct control to try multiple ports
Updated logging
Updated default calibration and SDL map for M3
Upgrade UE4SS
v1.13.0 - 2026/04/07
Fix button handling in API control mode
v1.12.0 - 2026/04/01
Added inspect dialog for debugging controller values
Disabled status bar overlay for android
v1.11.2 - 2026/03/31
Minor profile update
v1.11.1 - 2026/03/21
Updates calibration form to ignore empty control names instead of silently failing
v1.11.0 - 2026/03/20
Add mod installation path for Wonders of Sodor
Add side dection support in API control
Add named thresholds for step thresholds
Fixes a bug with the {SIDE} placeholder in direct control
v1.10.1 - 2026/03/15
Add auto-reloading of configuration when file(s) change
Updated {SIDE} placeholder to support customizing the placeholders with a new {SIDE:F:B} syntax. This is to support the new Czech locomotives where F = 1 and B = 2 on some controls. With this new placeholder implementation it is possible to use ControlName_{SIDE:1:2}
v1.10.0 - 2026/03/08
Adds an easier way of mapping controls through the UI
Adds option to include the USB ID in the control name specifier to create a multi-controller setup
Adds the enable_api_fallback option to direct control to simplify configuration
v1.9.3 - 2026/03/02
Fix calibration modal bug
Update negative value handling
v1.9.2 - 2026/03/01
Added new step_thresholds option for direct/api/sync control assignments which can be used to manually map lever inputs onto direct control values more accurately
v1.9.1 - 2026/02/26
Add support for eq operator in conditions
Add match parameter to momentary and toggle assignments which can be a value of exceeds (default) or equals
v1.9.0 - 2026/02/22
Add searchbox to explore tab
v1.8.3 - 2026/02/20
Disable UE4ss hot reload by default
v1.8.1 - v1.8.2 - 2026/02/14
Fixes tags not showing for all profiles in explore tab
v1.8.0 - 2026/02/11 Major Features
Added support for Train Simulator Classic
Fixes & Improvements
Refactored data fetching mechanism for better performance and maintainability
Added support for rail class specific assignments in controller configurations
Made general improvements to API control and improved stability
Made general improvements to direct control and improved stability
Fixed CommAPIKey detection for TSW5
Add support for embedded configuration and profiles
Fixed bug with inverted calibration normalization
Add way to remap values when using conditional direct control with partial range
v1.7.1 - 2026/01/14
Fix calibration bug
v1.7.0 - 2026/01/08
It is now possible to configure a virtual controller using any android device. You can find a quick start guide on how to do so on the website (https://tsw-controller-app.vercel.app/docs)
Clarify exe selection
Add select CommAPIKey.txt option
Don't use control mode if not connected
Allow embedding calibration into shared profiles to enable fully pre-configured profiles
v1.5.3 - 2025/12/12
Add notice for unconfigured controllers
v1.5.2 - 2025/12/09
Change deadzone logic to update the value but set it to 0
Update deadzone logic to start 0 at the deadzone limit instead
Apply default deadzones and min/max limit adjustment when configuring new controllers
Add "notify" flag to enable in-game notifications when changing values with direct control
v1.5.0 - 2025/12/06
Add axis easing to calibration dialog
v1.4.2 - 2025/12/04
Fixes virtual toggles
v1.4.1 - 2025/12/04
Fixes auto-selection
Fixes virtual conditions
v1.4.0 - 2025/12/03
Implement virtual controls
Cab Debugger can connect
Only show last 1000 logs by default
Fix raw events
Fix unique joystick IDs
Allow auto-selecting with only rail class information
Fix SDL events
Improvements to DLL mod for memory safety and performance
v1.3.6 - 2025/11/30
Fix bug when saving calibration files
Add way to select profile for all controllers
v1.3.5 - 2025/11/29
Update webkit to 4.1 for debian/ubuntu
Fix conditions missing from sharing and profile builder
Fix "Submit now" link
v1.3.3-v1.3.4 - 2025/11/28
Fix explore tab sources
Add proxy mode
Fixes a bug with controller throttling
v1.3.2 - 2025/11/27
Update profile IDs to not include updated time
Streamline profile selection logic
Fixes event throttling bug
Fixes sync control auto-detection
Fixes bug in TSW API debugger
v1.3.0-v1.3.1 - 2025/11/26
Show all profiles regardless of duplicate names
Show better warnings for duplicate extends
Add full support for autodetection based on rail class and controller
Added controller name and USB ID to UI
Added auto-detection notice
v1.2.0-v1.2.1 - 2025/11/23
Fixed additional "Metadata" key when saving profile for sharing
Added "Always on top" option in settings
Fixed api control action bug
Added more information in profile selection dropdown
Added support for author information in explore tab
Add "extends" option for profiles to compose profiles
v1.1.0 - 2025/11/22
Implements new "api_control" mode to utilize the API instead of the mod. This uses the same control name but sends the value using the HTTP API (may require the API key to be configured). Note has higher overhead than the direct control mode.
Updates cab debuggger to utilize HTTP API if available
Added search box to cab debugger
Added preferred control mode in settings
Made minor improvements and fixes
v1.0.4 - 2025/11/04
Fixed filepath handling on Windows
v1.0.3 - 2025/11/04
Fixed build version on Windows
Show all logs in logs tab
Add option to save logs to file
Add option to reset cab debugger state
v1.0.2 - 2025/11/02
Small bug fixes
v1.0.0 MAJOR NEW RELEASE - 2025/11/02
This is a major overhaul release. Check out the full changelog details on github
v0.2.6 - 2025/09/13
fixes build to work with the latest UE4SS experimental build (YOU WON'T NEED THIS UPDATE IF YOU ARE STILL ON AN OLDER UE4SS BUILD)
v0.2.5 - 2025/07/27
fixes calibration mode SDL mapping writing same filename for all controllers
v0.2.4 - 2025/06/15
Fix calibration mode not exiting and writing files.
v0.2.3 - 2025/06/06
Update the mixing of null values to act as free range zones instead of automatic interpolation zones. This makes for smoother actions between detents. Eg, the following steps value: [0.0, null, 0.5, 0.6, null, 1.0] - will snap to 0.5 and 0.6 but allow free range of motion between 0.0 and 0.5 and 0.6 and 1.0.
To install the mod and program just head to the releases page and download the latest installer for your platform. Once you launch the app you will just need to use the "Install mod" action to install the latest mod into Train Sim World/Train Simulator Classic
Loading comments…