Download JoinFS: Cross-Sim Multiplayer & Shared Cockpit
Choose the correct version of JoinFS for your simulator. All downloads are for Windows only
JoinFS is built with passion (and a lot of time). If you’d like to support the project, you can buy us a coffee with a PayPal donation.
Every contribution helps us improve and keep everything online. Thanks 🙌

JoinFS for FS2024
Dedicated JoinFS version for Microsoft Flight Simulator 2024

JoinFS for FS2020
Dedicated JoinFS version for Microsoft Flight Simulator 2020

JoinFS for FSX
JoinFS version for Microsoft Flight Simulator X

JoinFS for Prepar3D
Dedicated JoinFS version for Prepar3D.

JoinFS for X-Plane
Dedicated JoinFS version for X-Plane

JoinFS for FSX:SE
JoinFS version for Flight Simulator X Steam Edition
JoinFS v26.5 (v26.5) ▾
New Features▾
- **Command line parameter to lower the CPU usage of the CONSOLE variant** The command line parameter -backgrounddelay with an integer parameter TIME will introduce a TIME milliseconds wait in the main busy loop. Lowering the CPU load comes at the expense of possible induced delay. Use higher values for large distances between planes (line airliners), use small values for close formation flights. (Thanks @degroat-c for the contribution)
- **Auto-detect simulator folder on first install.** JoinFS now tries to resolve your simulator's aircraft/content folder on its own - MSFS's `UserCfg.opt` (FS2020/FS2024, both Steam and MS Store/Xbox), the FSX/Prepar3D registry keys, or X-Plane's `x-plane_install_*.txt` - instead of requiring a manual "Scan For Models" folder browse. For FSX/Prepar3D/X-Plane, the model scan now runs immediately once a folder is known (detected or picked); for FS2020/FS2024 the folder is pre-configured but the scan itself still runs at the next sim connect, since their model data isn't available until then. (Thanks @joeherwig for the contribution)
- **Expanded first-run setup dialog.** The old "enter your nickname" prompt now also asks for your SimBrief username (fetching your flight plan immediately once saved) and, only if the simulator folder couldn't be auto-detected, a folder picker. (Thanks @joeherwig for the contribution)
- **Double-click to join a hub.** In the Public Hubs window, double-clicking a hub now joins it and closes the window directly, instead of select → right-click → Join → close manually. A new hint label next to "Right-click for options" calls this out. (Thanks @joeherwig for the contribution)
- **Model Matching Redesign: unified scoring-based matcher.** Replaces the old tiered ICAO/Category/Auto fall-through with a single weighted scorer (ICAO type, Doc8643 class code, wake turbulence category, engine count/type, registration, ICAO airline, typerole, livery, title-prefix). A candidate no longer needs an exact ICAO type match to win a substitution - sharing class code + WTC can now outscore a same-class-but-wrong-WTC candidate, fixing cases like a Beechcraft Baron remote preferring an installed Diamond DA62 over an installed Douglas DC-3. (Thanks @joeherwig for the contribution)
- **Real aircraft.cfg/livery.cfg data for FS2024, now for the whole catalog, not just what you fly.** SimConnect's `LIVERY FOLDER` is read the moment a model is actually instantiated locally, parsing its real configuration file for `icao_type_designator`/`icao_WTC`/`icao_airline`/`atc_id` - the same reliability tier non-FS2024 builds already had from their upfront folder scan - ahead of the live category/engine-derived classification and title-guessing, both kept as fallbacks. Handles both same-package and cross-package `base_container` references. This same real-config-reading approach is now also applied while building the full installed-model catalog itself (SimConnect model enumeration only ever provided a title/livery string for that, with no file access at all) - see the Bug Fixes section for the misclassifications this fixes. (Thanks @joeherwig for the contribution)
- **Hardened title-guessing.** The fallback guesser that infers an ICAO type from a model's title text now requires a longer, less ambiguous match, fixing false positives like a Cessna Caravan livery for an operator named "Baron Aviation" being mistagged as a Beechcraft Baron. (Thanks @joeherwig for the contribution)
- **Non-flyable models filtered out.** Scenery props, wrecked vehicles, and static display liveries (e.g. tents, cranes, parking-lot cars bundled with some add-ons) are now excluded from the installed-model list entirely via an expanded ban list, so they can no longer appear in the Substitute dialog or become an accidental default fallback. (Thanks @joeherwig for the contribution)
- **Fine-grained matching defaults.** The "Model Matching" defaults now go beyond one fallback per coarse typerole (Rotorcraft/Airliner/etc.) to also auto-configure defaults per class code + WTC combination, wherever more than one installed candidate exists to choose between. (Thanks @joeherwig for the contribution)
- **Network protocol extended** (`Sim.VERSION` 21006→21007): peers now also broadcast their own resolved class code/WTC directly, so receiving clients use the sender's best-available classification instead of each independently re-deriving it from ICAO type - which previously failed whenever ICAO type was a bogus/non-standard string. Purely additive; older peers are unaffected. (Thanks @joeherwig for the contribution)
- **Explain Match dialog implemented.** It shows per-attribute score contributions inline, an "other candidates considered" panel (what almost won and why), and a ban-list exclusion count - both in the dialog and the exported markdown report. (Thanks @joeherwig for the contribution)
- **ICAO type designator is now validated, not trusted blindly.** A config-confirmed `icao_type_designator` is checked against the official ICAO Doc8643 reference list; if it's missing or isn't a real designator (a real, confirmed add-on authoring mistake: `icao_type_designator="500E"`, not a real code, with the actual designator sitting in the separate `icao_model` field instead), JoinFS now tries the `icao_model` field, then a title-text guess corroborated by a class code/WTC derived from that same file's engine/category fields, before finally falling back to the raw value. (Thanks @joeherwig for the contribution)
- **Localization.** All new UI text from the Model Matching redesign, plus existing untranslated text in the Explain Match/Model Matching dialogs and the SimBrief tooltips/status messages, is now localized into all 8 supported languages (German, Spanish, French, Italian, Korean, Dutch, Portuguese, Russian). (Thanks @joeherwig for the contribution)
- **Elevated platform recognition: aircraft no longer sink through helipads, ship decks, or rooftops for other pilots.** Remote aircraft position updates already carried an on-ground flag, but it was parsed and then discarded - JoinFS always corrected a nearby remote aircraft's altitude toward the receiver's own local terrain-mesh reading, which has no knowledge of scenery objects sitting above it. When a peer reports on-ground and the mismatch between what they measured and the receiver's local mesh is large enough to indicate a real platform (not just ordinary cross-client mesh noise), JoinFS now trusts the sender's reported altitude directly. Separately, on MSFS/SimConnect builds, on-ground is now forwarded to the sim's own AI-object placement whenever a peer reports on-ground, for any aircraft type - this is what actually fixed a jitter/bounce previously visible mainly on fixed-wing traffic, letting the sim's own gear/ground-contact physics own the placement instead of fighting an externally-driven altitude every tick. On by default, for every aircraft type, with no configuration needed. Controlled via command-line flags (no Settings-dialog entry, matching the existing WebSocket/webhook flags): `-elevatedplatformrecognition <true|false>` (master switch, default `true`) and `-elevatedplatformthreshold <cm>` (default `50`). See the [wiki](https://github.com/tuduce/JoinFS/wiki/Elevated-Platform-Landing) for details and examples. Also added an `onGround` field to the WebSocket telemetry feed (`-websocket`) for external tools consuming live aircraft state. To check whether elevated platform recognition engaged for a particular aircraft, enable the **Network** category in JoinFS's Monitor window - it logs the callsign, computed mismatch, configured threshold, and whether elevation/ground trust is engaged whenever the decision changes. (Thanks @joeherwig for the contribution)
- **SimBrief button restyle, and auto-import is now opt-in.** The SimBrief button on the main screen is now a text button sized and aligned to match the Join Global button, hidden entirely until a SimBrief username is configured (the Flight Plan button expands to fill the freed space). It now reflects four states instead of two: neutral/default (matching the Flight Plan button) until a fetch has actually been triggered, orange while fetching, green on success, red if no plan could be fetched. A new **Auto import** checkbox in Settings (SimBrief group, off by default) controls whether JoinFS fetches your SimBrief plan automatically on startup - previously this always happened silently whenever a username was saved. Clearing the flight plan via the Flight Plan dialog's Clear button also resets the button back to its neutral state. (Thanks @joeherwig for the contribution)
- **ICAO airline designator derived from callsign as a matching fallback.** When nothing more authoritative (SimBrief, live sim/config data) already supplied an ICAO airline for your own aircraft, JoinFS now checks whether your callsign is shaped like a commercial flight (a 3-letter ICAO airline designator + 1-4 digit flight number + optional trailing letters, e.g. `DLH1234`) and uses the designator from that shape if so - General Aviation tail-number callsigns are left alone. This is broadcast the same way a confirmed airline designator would be, helping peers match a more appropriate substitute model. (Thanks @joeherwig for the contribution)
- **Explain Match available for your own aircraft.** Right-click your own aircraft in the Aircraft window and choose Explain Match to see, as a diagnostic preview, what your currently-installed models would be scored against your own flight plan's values - useful for checking why a particular ICAO type/airline/registration is or isn't influencing matching, without affecting what's actually rendered for other pilots (which is still controlled separately). (Thanks @joeherwig for the contribution)
- **Callsign editing consolidated to one place.** The old "Edit Callsign" aircraft-list context menu and its persistent per-installed-model override (which also silently applied to any locally-simulated AI traffic sharing that model, not just your own aircraft) have been removed. The Flight Plan dialog's callsign field is now the single, session-scoped place to set a callsign. (Thanks @joeherwig for the contribution)
- **Unhandled exceptions are now logged before the process exits.** JoinFS previously had no handler for unhandled exceptions on any thread (including background scans), so a crash would exit with no trace at all. This doesn't fix any specific crash, but turns future silent closes into diagnosable ones. (Thanks @joeherwig for the contribution)
Bug Fixes▾
- Fixed the first-run setup dialog's tab order jumping to the OK button before the SimBrief username field, and the nickname field not being pre-filled (which could blank an already-valid nickname if the dialog was shown for another reason). (Thanks @joeherwig for the contribution)
- Fixed `LIVERY FOLDER`-based config reading silently finding nothing for the many FS2024 add-ons that ship a single `aircraft.cfg` with no separate `livery.cfg` - these now resolve via a title-based lookup against your installed packages instead. (Thanks @joeherwig for the contribution)
- Fixed a `base_container` resolution bug where a variation package's real config data could be discarded if that package had no `livery.cfg` of its own. (Thanks @joeherwig for the contribution)
- Fixed the installed-package index used by the two fixes above missing every package when your configured simulator folder is the sim's base install directory rather than a `Community`-style folder directly - it now looks one level deeper to find the actual package folders. (Thanks @joeherwig for the contribution)
- **Fixed real, reproducible misclassifications of installed FS2024 community liveries.** With no real config data available while building the installed-model catalog, JoinFS previously fell back to guessing the ICAO type purely from the title text - which could pick the wrong aircraft entirely: e.g. an Airbus A320 livery titled `..._Smart_Lynx` was tagged as a Rotorcraft, because "Lynx" (from the airline name "Smart Lynx") is also a real Doc8643 helicopter designator and won a tie-break against the correct "A320". JoinFS now tries reading the real `aircraft.cfg` from disk (following `base_container` references where needed) while cataloging, before ever falling back to guessing. Also fixed the underlying folder discovery to correctly walk a modern Community/Official package-based install instead of assuming a flat layout that doesn't exist there. (Thanks @joeherwig for the contribution)
- Fixed a data error in the bundled model-to-typerole reference list: a real airship (Skyship 600) was tagged as a Rotorcraft. (Thanks @joeherwig for the contribution)
- Manual "Scan For Models" no longer freezes the app while scanning - it now runs in the background like the automatic on-connect scan already did. (Thanks @joeherwig for the contribution)
- **Fixed callsign duplication after upgrading from an older version.** The real-callsign synthesis (ICAO airline + flight number) concatenated the two unconditionally. `ATC FLIGHT NUMBER` was write-only/unread by JoinFS before this line of releases, so many add-ons/pilots had stored an entire pre-existing callsign there instead of a bare numeric flight number - once read, the airline code got glued onto it again (e.g. `DLH1234` becoming `DLHDLH1234`). Now trusted as-is whenever it already carries the airline prefix or isn't purely numeric. (Thanks @joeherwig for the contribution)
- Fixed the Flight Plan dialog's callsign field being read-only - it's the one place to set/override a callsign now that the old context-menu override has been removed. (Thanks @joeherwig for the contribution)
- Pressing Enter in the SimBrief username field now saves the username and runs the import before closing the dialog, instead of closing immediately without saving anything. (Thanks @joeherwig for the contribution)
- Fixed the Flight Plan dialog's tab order (SimBrief username → Import → Clear → OK → Cancel), which had collided with the OK/Cancel buttons' tab indices. (Thanks @joeherwig for the contribution)
- **Fixed a SimBrief-imported callsign being overwritten by a sim/livery-derived guess (e.g. `DLH1234` reverting to `Lufthansa 320`).** Whenever the user's aircraft object was (re-)listed by the sim, its callsign was unconditionally re-derived from the aircraft's `ATC AIRLINE`/`ATC FLIGHT NUMBER` (aircraft.cfg/livery.cfg or MSFS2024 aircraft customization data), clobbering any callsign already fetched from SimBrief - regardless of fetch order. The sim-derived callsign is now only used as a fallback when no callsign is already set, matching how ICAO type/airline are already handled in the same code path. On X-Plane/CONSOLE builds this reset was unconditional rather than fallback-only; fixed the same way there. (Thanks @joeherwig for the contribution)
- **Fixed the Aircraft window's callsign column going stale after editing the flight plan from the main screen.** Committing a flight-plan change via the main-screen Flight Plan/SimBrief buttons only bumped an internal network-broadcast counter and refreshed the main screen's own buttons - it never told the Aircraft window to redraw, so its grid could keep showing a pre-edit callsign until an unrelated event happened to refresh it, even though the underlying data (and a freshly-opened Flight Plan dialog) were already correct. (Thanks @joeherwig for the contribution)
- Fixed the "Flight Plan" context-menu item on a remote (network) aircraft in the Aircraft window silently opening *your own* flight plan instead - it's now disabled for remote aircraft, since their plans aren't locally editable. (Thanks @joeherwig for the contribution)
- **Fixed ICAO airline tags for installed FS2024 models being silently wiped on every rescan.** The SimConnect model-enumeration pass used by "Scan For Models" carries no airline data at all, but was unconditionally overwriting whatever a prior config-file read (or live instantiation) had already captured - so a correctly-tagged livery's airline could be lost the very next time you rescanned, causing it to stop scoring points for ICAO airline matches even though nothing about the installed content had changed. (Thanks @joeherwig for the contribution)
- **ICAO airline matching now distinguishes a config-confirmed tag from a free-text guess.** A candidate model's airline tag inferred by matching an airline name somewhere in its title/livery text (used only when no real ICAO code is available) previously scored identically to a tag read directly from the aircraft's own configuration file. It's now weighted down the same way an uncertain ICAO type already was, so a real, confirmed airline designator reliably outweighs a guessed one. (Thanks @joeherwig for the contribution)
- **Registration lowered to a tie-breaker signal.** A pilot can change their aircraft's registration/tail number mid-session, so it shouldn't independently outweigh ICAO type or airline designator matches. Its score contribution was reduced so it now only ever matters when it's disambiguating between candidates that already agree on type and airline (e.g. picking the exact-tail livery over a generic one for the same airline), rather than being able to sway the outcome on its own. (Thanks @joeherwig for the contribution)
JoinFS v26.4 (v26.4) ▾
New Features▾
- Added support for 8.33kHz channel separation on the COM frequencies. Frequencies are now displayed in the format `XXX.XXX` (e.g., `123.505`).
- Model matching takes into account the ICAO type designator and the ICAO airline code when determining the best match for an aircraft model. (contributed by @joeherwig - Thank you!)
Bug Fixes▾
- Fixed X-Plane models appearing exploded.
- Fixed error in rendering glass for some aircraft models in X-Plane.
JoinFS v26.3 (v26.3) ▾
New Features▾
- Upgraded the XPLANE SDK against which the XPLANE plugin is built to version 4.3.0.
- Added webhook for frequency changes and websocket-server for client updates to the CONSOLE variant (contribution by @joeherwig, thank you!).
Bug Fixes▾
- Fixed some models appear exploded in XPLANE.
JoinFS v26.2 (v26.2) ▾
New Features▾
- Increased the rate at which the position (20Hz) and the variables (5Hz) are sent over the network or recorded.
- Added logging around the recorder functionality to help with debugging issues related to recording and replaying flights.
Bug Fixes▾
- Fixed jittering of recorded flights when replaying them.
JoinFS v26.1 (v26.1) ▾
New Features▾
This release does not introduce new features.
Bug Fixes▾
- Fixed an issue where deplect rapidly in shared cockpit.
- Fixed an issue where engine 2 would not shut down for network (or recorded) airplanes.
- Fixed the architecture of the CONSOLE variant. It should have been x64 since the last version.
- Increased the flight plan length to 512 characters to allow for longer flight plans.
JoinFS v25.9 (v25.9) ▾
New Features▾
This release does not introduce new features.
Bug Fixes▾
- Fixed an issue where JoinFS would crash when an external web-service was not available.
- Fixed an issue where JoinFS would freeze when trying to open the "Substitute..." window from the "Airplanes" window
- Fixed the XPLANE installer. Thank you to all the people who contributed to the testing of and gave solutions for the XPLANE variant.
JoinFS v25.8 (v25.8) ▾
New Features▾
The JoinFS versioning system changes to a timeline versioning scheme. The version number is now in the format `YEAR.SEQUENCE.0`. In some places the trailing .0 is ignored.
The JoinFS project now targets .NET 8.0 for all variants.
The solution file was reorganized.
- A single project builds all the variants, for their corrsponding architecture.
- The project file was simplified to use SDK-style project format.
- The build process was simplified using MSBuild properties and targets.
- The output folder structure was simplified.
- A single installer project builds all the installers.
- A CI/CD pipeline was introduced to use the new build process.
- An automated workflow checks code quality and security features.
- A testing framework was introduced to automate unit and integration tests.
A new model matching algorithm was introduced to improve the accuracy of model matching across different simulators. The new model matching algorithm uses a combination of model name, livery, and other metadata to identify models more accurately. This new model matching is described in more detail in its [wiki page](https://github.com/tuduce/JoinFS/wiki/Enhanced-Model-Matching-System).
Bug Fixes▾
- Replaced the random number generator with a cryptographically secure random number generator.
- Fixed an issue where in MSFS2024 shared cockpit the entered aircraft would bank sharply to the right.
Fly Online Together with JoinFS
JoinFS lets you fly online together in shared sessions with friends and communities. It’s built for group flights, easy coordination, and reliable connections — so you can focus on flying, not setup.
One Multiplayer Solution for Multiple Flight Simulators
With JoinFS, pilots can meet in the same session and enjoy a consistent multiplayer flight simulation experience. It’s ideal for virtual airlines, events, formation flying, and casual flights where staying together matters.
Cross-Simulator Flying
A key advantage of JoinFS is that it can support online flying together even when pilots use different flight simulators. That means communities don’t have to split up — everyone can join the same group flight and stay connected.
Why Choose JoinFS
JoinFS is designed to make online group flights simple and dependable. Whether you’re hosting a public event or flying with a small group, it provides the tools to connect quickly and keep sessions stable.
Key Features
– Fly online together with friends and communities
– Support for cross-simulator multiplayer sessions
– Great for group flights, events, and virtual airline operations
– Lightweight design and straightforward setup
– Reliable connectivity for short hops or long-haul flights
Perfect for Communities and Events
From weekly club flights to large online gatherings, JoinFS helps organizers keep pilots in one place. Create a session, share the details, and let everyone join — even if they’re on different sim platforms.
Use Cases
– Virtual airline group operations
– Community fly-ins and public events
– Formation flying and shared training sessions
– Casual multiplayer flights with friends
– Cross-simulator meetups for mixed groups
Get Started with JoinFS
Choose your simulator on this page, download JoinFS, install it, and launch the app to join a session. If your firewall requests permission, allow it so JoinFS can connect properly for online multiplayer.
Need Help?
If you need support with setup or connectivity, contact us with your simulator name, operating system version, and a short description of the issue. Adding screenshots or logs can speed up troubleshooting.
