Doctor
The Doctor page is a one-stop health check. It runs a handful of probes against the device, the sim, and the host environment, and where there's an obvious fix it offers an inline action to apply it. Start here whenever something isn't working — odds are Doctor already knows what it is.
How checks are laid out
Every check row has four parts:
- Status dot — green (pass), amber (warning), red (fail), grey (not applicable on this platform).
- Title — what's being checked.
- Detail — a one-line summary of what was found. Hover (or tap on touch) to see the full detail.
- Action button — present only when there's something actionable. Examples: Install udev rule, Use port :5111, Fix….
The checks
Device
Confirms the Sidewinder Force Feedback 2 is visible to the OS and the bridge can open it exclusively. Fails if the VID/PID isn't present, or if another process is holding the handle.
Linux udev rule
Checks whether /etc/udev/rules.d/99-ffb-bridge.rules
is present and matches the canonical content. When absent,
the action is Install udev rule — this
triggers a pkexec prompt to write the file into a
privileged location.
Doctor detects NixOS (by looking for /etc/NIXOS)
and replaces the udev-rule row with an instruction to add
the rule to configuration.nix instead. See
Install for the snippet.
SimConnect config
Looks for MSFS's SimConnect.xml in the
platform-appropriate location, parses it, and compares any
enabled IPv4 entries against the port the bridge is using.
Three possible outcomes:
- Matching entry found. Green — nothing to do.
- Entry at a different port. Amber — offers a Use port :X button to adopt that port.
- No usable entry (or unparseable file). Red — offers a Fix… button that opens the install dialog (see below).
SimConnect reachability
Probes the configured TCP port. Sends a real SimConnect OPEN packet and inspects the response header so it can distinguish MSFS is listening from something else is listening.
X-Plane reachability
Sends a tiny RREF probe to 127.0.0.1:49000 and
waits briefly for a dataref in response. Maps both timeout and
Winsock's WSAECONNRESET (received when an ICMP
port-unreachable was delivered) to “not running”.
Runtime
Checks that the control loop is ticking at its target 50 Hz. Warns if the last 60 s mean drops below 45 Hz.
Crash log
If there's a crash log from the last session, the row goes amber and offers Reveal to jump to it in your file manager, and Send via feedback form which pre-populates a feedback submission with the log attached.
Fix dialog
Fix… buttons don't apply changes directly — they open a dialog that shows exactly what's about to change, where, and (on Linux) what the auth prompt will ask you to approve.
The dialog is always additive: existing entries are never overwritten. If the target file is unparseable, the dialog explains that a timestamped backup will be taken first. Cancel is always the safe choice.
Linux pkexec behaviour
Actions that write to system paths (udev rules, anything under
/etc) route through pkexec. You'll
see your distro's normal polkit prompt — the same one that
pops up for gparted or a package manager GUI.
Exit codes Doctor interprets:
| Exit | Meaning | Doctor reports |
|---|---|---|
0 | Success | Green check; row re-evaluates. |
126 | User dismissed the auth prompt | Amber “Cancelled” — try again when ready. |
127 | No polkit agent / auth failure | Red “Authentication failed.” |
Running the bridge in a minimal environment (headless Linux, sway without a polkit agent) is fine — you just can't use Doctor's privileged fixes. Install the required files manually or start a polkit agent before launching the bridge.
When Doctor is green everywhere
The app should work. If it doesn't, Diagnostics' event log will show more detail than Doctor's one-line status. Head there next, or jump to Troubleshooting for common symptoms and fixes.