Unofficial Windows utility for driving vibration motors on supported WinWing Orion 2 controllers in Microsoft Flight Simulator using SimConnect telemetry.
This project is developed and tested on Microsoft Flight Simulator 2024.
It relies on real-time telemetry provided through SimConnect.
Compatibility with other simulators, including previous Microsoft Flight Simulator versions, has not been tested and therefore cannot be guaranteed.
The bridge is aircraft-agnostic.
It uses standard Microsoft Flight Simulator SimConnect variables rather than aircraft-specific integrations. This means vibration effects work with virtually any aircraft that correctly exposes SimConnect data, regardless of the developer.
Whether you fly default aircraft or third-party add-ons, the bridge automatically adapts its effects based on the aircraft type (jet, piston, turboprop, or helicopter) and the available flight data.
No aircraft-specific profiles or plugins are required.
Both interfaces share the exact same vibration core. Choose the interface that best fits your workflow: the Desktop Launcher for configuration and live telemetry, or the lightweight Classic CLI for VR, diagnostics and scripting.
The recommended interface for most users, with:
- live SimConnect telemetry;
- fighter-inspired HUD;
- Aircraft and Helicopter vibration profiles;
- local preferences;
- standalone Windows runtime with no Node.js required.
The original lightweight console interface remains available for:
- minimal resource usage;
- VR sessions;
- diagnostics;
- scripting and direct console feedback.
| CLI | Desktop launcher | |
|---|---|---|
| Role | Run the vibration bridge | Configure profiles / themes; Start/Stop shared bridge |
| Feel curves | Built-in defaults from the shared core | Editable Aircraft / Helicopter profiles (local only) |
| Preferences file | None | OS app data via Tauri Store (launcher-preferences.json) |
| SimConnect / HID | Active via shared createBridge() |
Same runtime via packaged bridge-host sidecar (UI never talks to HID/SimConnect) |
| Runtime dependency | Node.js (source) or packaged CLI exe | None (sidecar embedded in the installer) |
| Best for | VR, minimal footprint, diagnostics | Desktop tuning with live HUD and telemetry |
Launcher preferences live under the Windows app data directory for identifier community.winwing.msfs2024-vibration-bridge (managed by Tauri / the Store plugin). They are never read by the CLI and are not stored in the git repository.
- March 23, 2026 — Initial private CLI prototype.
- July 17, 2026 — Development resumed for a public release, introducing the Desktop Launcher and numerous improvements.
- Functional on the hardware listed below
- First public / community release (
v0.1.0) - Desktop Launcher and Classic CLI share the same vibration engine.
- Not affiliated with, endorsed by, or supported by WinWing or Microsoft
- Compatibility is limited to the devices and grips that were actually tested
| Item | Notes |
|---|---|
| WinWing Orion 2 Throttle Base II | USB PID 0xBD64 |
| F-15EX throttle grips (left + right) | Vibration motors on each grip |
| WinWing Orion 2 Joystick Base 2 | USB PID 0xBEA8 |
| F-16 joystick grip | Vibration motor |
| Microsoft Flight Simulator 2024 | Windows |
Other WinWing PIDs, grips, or bases are not claimed to work.
When a GitHub Release is published, download WinwingVibration.exe, connect the tested hardware, start MSFS 2024, then run the executable.
Windows Defender / SmartScreen may warn about an unsigned community binary. That is expected until a signed release exists. Prefer building from source if you want to verify the code yourself.
(No release artifact is guaranteed to exist yet—check the repository Releases page.)
Desktop launcher: install the NSIS build (or run npm run dev:launcher), start MSFS 2024, then use Start in the title bar.
Classic CLI:
- Connect the Throttle Base II and/or Joystick Base 2 with the tested grips.
- Launch MSFS 2024 and load a flight.
- Start the bridge (
npm startorWinwingVibration.exe). - Keep the console window open while flying.
- Press
Ctrl+Cfor a clean shutdown (motors are zeroed before exit).
If hardware is plugged in later, the bridge periodically re-scans and opens newly available devices.
- SimConnect streams selected aircraft variables each simulation frame.
- The bridge converts those values into haptic intensities (engine, aero, etc.).
- Intensities are sent as short HID output reports to the open WinWing devices.
- A ~50 Hz refresh loop keeps motors active (vibration stops if reports stop).
SimAppPro is not required while this bridge is running. Close or avoid exclusive locks from other tools if a device fails to open.
This program does not send flight data over the Internet. It only uses local SimConnect and local HID I/O (plus normal Node.js package installs when building from source).
Effects are a haptic interpretation of available SimVars, not certified flight fidelity.
Intensity sliders (launcher) map to the real HID motor byte:
| Slider | HID byte |
|---|---|
| 0% | 0 |
| 50% | ≈128 |
| 100% | 255 |
Each effect keeps its trigger conditions and 0..1 dynamic curve. The slider is that effect’s hardware ceiling. Master multiplies the summed contribution last, then the value is clamped to 0..255 (never 256).
effectOutput = dynamicFactor × (effectSlider / 100) × 255
finalOutput = clamp(sum(activeEffects) × (master / 100), 0, 255)
Effects include:
- Engine RPM per engine (piston / turboprop / jet)
- Afterburner per engine (where SimVars are present)
- Touchdown pulse (based on last airborne vertical speed, wall-clock decay)
- Landing gear transit and gear drag
- Stall buffet
- G-force buffet
- Transonic / supersonic buffet
- Speed brake
- Flap buffet
- Helicopter rotor rumble, ETL, and VRS cues
- Light APU vibration when engines are off
Aircraft that do not expose a given SimVar will simply not produce that effect.
Requirements
- Windows
- Node.js 20 or newer (build uses
@yao-pkg/pkgtargetnode22-win-x64) - MSFS 2024 installed (for SimConnect)
- Compatible WinWing hardware connected
npm ci
npm startBuild the CLI executable:
npm run build
# or explicitly:
npm run build:cliOutput: dist/WinwingVibration.exe (not committed to git). The packaged runtime is Node 22.
Build the launcher bridge-host sidecar (autonomous; no system Node.js at runtime):
npm run build:bridge-hostOutput (not committed):
dist/sidecars/bridge-host-x86_64-pc-windows-msvc.exeapps/launcher/src-tauri/binaries/bridge-host-x86_64-pc-windows-msvc.exe
Build the desktop launcher (NSIS, embeds the sidecar):
npm run build:launcherRun unit tests (CLI core + host protocol + launcher preferences; no simulator / no hardware required):
npm testRequirements beyond the CLI: Rust toolchain, Windows WebView2 (usually preinstalled). The bridge host sidecar is built with @yao-pkg/pkg before Tauri starts.
npm --prefix apps/launcher ci
npm run build:bridge-host
npm run dev:launchertauri dev / tauri build also call scripts/ensure-bridge-host.js automatically so the sidecar exists under apps/launcher/src-tauri/binaries/.
Build the launcher NSIS installer (embeds the sidecar):
npm run build:launcherTypecheck:
npm run typecheck:launcherLauncher highlights: FR/EN i18n; Flight panel with sticky HUD and scrollable telemetry; resizable config/flight splitter; panel rail collapse; stick reverse option — see docs/TELEMETRY.md and docs/INTENSITY.md.
MSFS → createBridge() → host stdout (≤15 Hz) → Tauri → launcher UI / HUD
↘ 50 Hz HID vibration (unchanged)
- Without MSFS: launcher stays usable; SimConnect shows Disconnected / Connecting; HUD stays neutral.
- Without WinWing HID: telemetry and HUD still work; HID status is independent.
- Sidecar crash: last values marked stale; Start again after the host respawns.
Smoke-test the packaged sidecar (not node lib/bridge/host.js):
npm run build:bridge-host
npm run smoke:bridge-hostRequires MSFS 2024 in a flight for a full SimConnect pass (exit code 4 if the sim is offline).
The following are planned improvements only (not available yet):
- Silent bridge-host startup when launched from the Desktop Launcher.
- Optional Windows system tray support.
- Configurable launcher close behavior:
- Exit application
- Minimize to tray
- Tray menu:
- Open
- Start / Stop bridge
- Exit
- Windows only
- Only the listed USB PIDs / grip combinations are supported
- Desktop launcher is autonomous (bundled
bridge-hostsidecar); CLI from source still needs Node.js - UI telemetry is capped at ~15 Hz; HUD interpolates locally (not a certified instrument)
- Control positions use SimConnect surface/lever positions (not raw USB HID axes)
- Release binaries are unsigned
- Effect quality depends on SimVars each aircraft publishes
- Third-party aircraft may omit or mishandle some variables
- Packaged sidecar uses EvenAR
node-simconnect(pure JS over the SimConnect service); noSimConnect.dllis shipped
Experimental HID research scripts are not part of the public runtime and are not required to run the bridge.
- Unofficial community software
- Not affiliated with, approved by, or supported by WinWing or Microsoft
- Use at your own risk; provided without warranty of any kind
- Stop the software immediately if vibration behaviour is unexpected or excessive
- Never use this software as a source of real-world flight information
During the reverse engineering of WinWing Orion 2 vibration support, one issue remained unsolved: although valid HID vibration commands were being sent, the motors would not stay active reliably.
After many unsuccessful experiments, I studied the Ursa Minor FFB project by rtroncoso. While no code from that project was reused, it helped me understand the communication behavior required by WinWing devices, which ultimately led to the solution.
Once that missing piece was understood, the Orion 2 implementation worked as expected.
All Orion 2 support, vibration effects, SimConnect integration, Desktop Launcher, and application code were developed independently.
Bug reports and compatibility notes are welcome. Please include:
- Exact hardware (base + grip) and USB PID if known
- Aircraft title
- MSFS 2024 version / build if available
- Steps to reproduce
- Relevant console logs without personal paths or account data
Pull requests that change feel curves should explain the motivation; please keep the supported hardware scope clear.
MIT — Copyright (c) 2026 Apch132

