From your first connection
to your own profile
The WasmPluginBuilder user guide: installation, configuration, hardware bindings, and working with MSFS 2020 and MSFS 2024.
Features documented as of 5 October 202601 · How Builder works
Builder connects physical Skalarki cockpit controls to aircraft variables and commands. Your bindings are stored in a profile. A WASM module installed in MSFS reads values and executes commands. Builder sends the resulting output values to hardware through Skalarki Connect / Profiler.
An input sends a hardware action to the aircraft. An output sends aircraft information to an LED, display, or mechanism. A preset is a saved description and expression that helps you configure a binding.
02 · What you need to install
Prepare a Windows 10/11 x64 computer, MSFS, and working Skalarki hardware. Install the development tools before the simulator SDK so that its Visual Studio integration can be configured.
- Skalarki Connect / Profiler compatible with your hardware. Configure your panels and confirm that buttons and knobs are detected. The current project was integrated with the Connect 7 SDK. Keep the libraries supplied with your Builder package together; do not mix DLLs from different releases.
- .NET 8 Desktop Runtime for Windows x64. If your application package needs an external runtime, download Desktop Runtime from the Microsoft .NET 8 download page. ASP.NET Runtime alone does not provide the WPF desktop runtime. A self-contained application package may already include the runtime.
- Visual Studio 2022 with C++ tools. In Visual Studio Installer, select Desktop development with C++, including MSVC tools and Windows SDK. Builder uses MSBuild and the toolset supplied by the MSFS SDK. You do not need to install CMake separately for the current WASM build process.
- The SDK for your MSFS version. Enable Developer Mode in the simulator and use its Help / SDK menu. Install the SDK and its WASM platform toolset integration with Visual Studio. Install both SDKs if you use both simulators. The official MSFS 2024 SDK overview describes the download and tool integration.
- WasmPluginBuilder. Install or extract the complete package, including its libraries, Resources, and SampleProfiles folders. Run
WasmPluginBuilder.exeand enter your licence key when prompted. Activation and periodic licence verification require a connection to the licensing service.
| Simulator | Typical SDK folder | Toolset |
|---|---|---|
| MSFS 2020 | C:\MSFS SDK | MSFS |
| MSFS 2024 | C:\MSFS 2024 SDK | MSFS2024 |
These are example paths. Your SDK may be installed elsewhere. An SDK root contains folders such as WASM and SimConnect SDK.
Running the application from source: additional requirements
Building the C# application requires a .NET SDK supporting the .NET 8 project and the appropriate Skalarki and SimConnect libraries in the project's libs folder. Users of a prepared application package do not need to compile the C# application themselves.
03 · First launch, step by step
- Start Connect / Profiler and check its connection to your hardware.
- Start Builder. In Settings, enter the Profiler 1 address and port. When it runs on the same computer, typical values are
127.0.0.1and53000. The port must match the Connect configuration. - Click Apply & Reconnect. Check the profiler connection indicator in the status bar.
- In Profiles, open the appropriate aircraft sample and save your own copy, following chapter 06.
- Select MSFS VERSION: 2020 or 2024. Set your Device ID and keep it unchanged during subsequent live edits.
- In Build & Install, check MSFS SDK Path and MSFS Community Folder. If automatic detection fails, select the correct folders with Browse….
- For the first installation, close MSFS. Click Build WASM, wait for a successful result, then click Install to MSFS.
- Start MSFS and load the aircraft matching the profile. Keep Builder and Connect / Profiler running.
- Click Apply live. Wait for
Live configuration applied by WASM.Test one button and one output before checking the entire cockpit.
04 · Options and settings
Profile toolbar
| Field / button | Purpose |
|---|---|
| PROFILE NAME | The name of your binding set. It also affects the package name used during installation. |
| DEVICE ID | The identifier used for Builder ↔ WASM communication. It must match the installed module. Changing it requires Build and Install. |
| AIRCRAFT NAME | Aircraft information stored in the profile. It does not automatically change the aircraft loaded in MSFS. |
| MSFS VERSION | Selects the SDK/toolset and Community detection for MSFS 2020 or 2024. |
| SC PREFIX | A compatibility field from older profiles related to the SimConnect client name. The current live protocol identifies channels mainly through Device ID. |
| Open / New | Load a JSON file or create a profile. New lets you choose whether to retain current bindings. |
| Save / Apply live | Save a file or, separately, apply the current configuration to MSFS. |
Settings
- Profiler 1: the main connection. The IP points to the computer running Connect / Profiler; the port identifies its service.
- Profiler 2: an optional second computer. Check Enable and set its IP and port. Events from both connections are merged. Assign panels so that the same hardware is not duplicated between profilers.
- Apply & Reconnect: saves connection settings and reconnects. This is separate from Apply live.
- Dark Mode: changes the application appearance.
- Toolchain Settings: leave paths empty for automatic detection. In the current version, the field labelled Clang++ path is used to specify
MSBuild.exe. The CMake field is not used by the current WASM build process. - MSFS SDK path / Re-detect Toolchain: choose an SDK root and detect the build tools again. Select the correct MSFS VERSION first.
Build & Install
Build WASM compiles the module. Cancel cancels the build. Install to MSFS copies the result to Community. Build Log shows compiler errors and live diagnostics; Clear clears the log view.
WasmBuilder_* packages from the selected Community folder when installing a new package. Do not use these package folders as a profile archive. Keep your own profiles as JSON files.05 · Presets
A preset contains a Description and an Expression. The description helps you find a function; the expression contains the actual read expression or RPN command. Presets are stored in the profile and appear in autocomplete suggestions in input and output editors.
- Open Presets and type part of a description or expression into Search.
- Choose an existing preset or click Add New.
- Enter a Description such as “Captain BARO — hPa” and an Expression such as
(L:N_FCU_EFIS1_BARO_HPA). Finish editing the cell by moving to another cell. - In a binding dialog, start typing the description or expression and select a suggestion. Check that the field contains the correct expression.
- Click Save to save the profile. After changing a binding, click Apply live.
| Button | Action |
|---|---|
| Delete Selected | Removes selected presets from the profile library. |
| Load Defaults | Replaces the current preset list with the default database. Save a profile copy or export your presets before replacing your own list. |
| Import CSV | Appends presets from a file. The first line is a header; subsequent lines are split into a description and expression at the first comma. |
| Export CSV | Exports the preset library, not the complete profile of inputs and outputs. |
Description,Expression
Captain BARO hPa,(L:N_FCU_EFIS1_BARO_HPA)
Example switch command,1 (>L:MY_SWITCH)CSV import uses a simple parser: avoid commas in descriptions and expressions spanning several lines. Default text files may use Description#Expression; that is not the CSV format.
06 · Profiles, samples, and your own copies
A JSON profile contains inputs, outputs, presets, and identifying settings. Your profile folder defaults to %USERPROFILE%\Documents\WasmPluginBuilder. The Profiles tab shows the actual folder.
Working from a sample profile
- In Profiles, select an entry marked 🔒 and [sample], then click Open.
- Click Save. For a sample in SampleProfiles, Builder requires saving a copy as a new file.
- Select your profile folder and a name such as
Fenix_my_cockpit.json. - Edit and save that copy. Do not overwrite or delete the original in SampleProfiles.
Samples provide a starting point. You can edit a sample's loaded configuration in memory, but save lasting changes as your own profile. A protected sample cannot be removed with Delete.
Saving, creating, and browsing profiles
- Save for an existing file: Yes overwrites that JSON file, No opens Save As, and Cancel cancels the operation.
- New: choose whether to keep current settings/bindings or start with an empty set. Check the name and destination file.
- Refresh: reloads the file list. Changing the folder changes where Builder looks for your profiles.
- Delete: deletes your profile file after confirmation. It does not delete a single binding.
- Profile Details: helps compare aircraft and profile content. Also check the actual bindings on the Inputs and Outputs tabs.
Last session and default profile
The current version restores your last session, including unsaved edits. It saves a separate recovery snapshot every two seconds and when you close Builder. Default Profile → Set selected specifies a starting profile used when no valid session snapshot exists. Clear clears the default profile selection; it does not delete the last-session snapshot.
07 · Adding inputs
- Open Inputs and select the control type.
- Enter a readable Label.
- Click Learn and operate the correct physical button, switch, knob, or axis. Listening lasts up to about ten seconds. Connect / Profiler must be connected.
- Check Hardware Name. Learn identifies the hardware control, not the aircraft variable.
- Enter expressions or a target variable, or select a preset. Save the dialog.
- Click Apply live, test the control, and use Save to save the profile file.
PushButton — momentary button
On Press executes a command when the button is pressed; On Release executes it when released. An empty field ignores that edge. Double activation executes the press command twice. Use it only when the aircraft function needs it.
On Press: 1 (>L:MY_BUTTON)
On Release: 0 (>L:MY_BUTTON)This is a syntax example. For a toggle function, you normally should not put the same toggle command on both edges: one physical click could toggle the state twice.
Latching — two-state switch
On Expression is used for the ON state; Off Expression for OFF. Prefer explicit states such as 1 (>L:MY_SWITCH) and 0 (>L:MY_SWITCH).
Multi-Pos — multi-position switch
Select the number of positions. Each has its own Hardware Name and Expression, and each hardware identifier can be learned separately. For example, use 0 (>L:MY_SELECTOR), 1 (>L:MY_SELECTOR), and 2 (>L:MY_SELECTOR) for three positions. Check whether the hardware emits events only when entering a position or also when leaving it.
Encoder — incremental knob
Clockwise handles rotation to the right; Counter-clockwise handles rotation to the left. Example numeric commands are (L:MY_VALUE) 1 + (>L:MY_VALUE) and (L:MY_VALUE) 1 - (>L:MY_VALUE). Choose a step size and limits suitable for the aircraft.
Axis — analogue input
Specify Target SimVar, Unit, and a transform. Use an explicit L:NAME for a local variable. The current live path forwards the raw SDK value, despite the dialog's 0–1 hint. Depending on hardware, the range may be 0–255 or 0–65535. Establish the raw range before setting Input Min/Max.
| Transform | Behaviour |
|---|---|
| Passthrough | Passes the value through without scaling. |
| LinearScale | Maps Input Min/Max to Output Min/Max, for example 0–65535 → 0–1. Values outside the input range are not automatically clamped. |
| Invert | Calculates 1 − value. Use for values in the 0–1 range. |
| Threshold | Returns Output if ≥ when the value meets the threshold, otherwise Output if below. |
| RangeMap | Range mapping exists in the profile model; the current editor does not provide full editing of the range list. |
08 · Adding outputs
- Open Outputs and choose LED, Display, LCD, Servo, Stepper, or Dimmer.
- Set the Label and correct hardware address. For LEDs and displays, use Section → Panel → LED/Display Name. A placeholder such as
DISPLAY_is not a valid display address. - In Source Preset, select or enter a read expression.
- Set the transform or multiplier. Save the dialog, click Apply live, and check the result.
- Save the profile file.
(L:N_FCU_EFIS1_BARO_HPA), not (>L:N_FCU_EFIS1_BARO_HPA). The > symbol means writing a value and belongs in input commands.LED
Select the physical LED. The ON/OFF test buttons check the hardware path independently of aircraft values. A typical transform is Threshold with a 0.5 threshold, output above the threshold set to 1, and output below it set to 0. A nonzero transformed value turns the LED on.
Display — numeric display
Select the display and source. Multiplier multiplies the read value before sending it to hardware: for example, 123450 × 0.001 = 123.45. To display a read value of 1019 as 1019, use 1. Show Test (8888…) and the clear button test the selected physical display.
Display also supports an alternate source and dashes, described in the next chapter. Available digits, decimal points, and presentation also depend on the physical display and SDK.
LCD
The current live runtime sends a numeric value to LCD hardware. Format string is stored in the profile, but custom text/prefixes and full printf formatting are not yet implemented in the live path. Do not rely on it to produce text such as “IAS: 250”. Choose Display for numeric displays needing conditional logic.
Servo
Select the mechanism and source, then use LinearScale to match the device's range. Do not assume all gauge needles use the same scale.
Stepper
The source and transform determine the stepper position. The profile model also includes MaxSteps, the maximum step count passed to the SDK. The current dialog does not expose a separate MaxSteps editor. Match the configuration to your device.
Dimmer
The source controls brightness/PWM. LinearScale can map 0–1 to 0–255, for example. Check the range expected by the particular SDK output.
Inputs and Outputs filters search parts of Hardware Name, Label, and respectively Target/Event or Source SimVar. Filtering changes only the visible rows; it does not remove bindings.
09 · Conditional display logic
In the Display editor, you can select another numeric source and independently replace the number with dashes. Disabled options do not affect the display.
Use alternate source when
- Set the primary Source Preset, for example
(L:N_FCU_EFIS1_BARO_HPA). - Enable Use alternate source when.
- Enter the condition variable in Condition source, for example
(L:S_FCU_EFIS1_BARO_MODE). - Select a comparison and enter Compare with, for example Equal and 0.
- Enter
(L:N_FCU_EFIS1_BARO_INCH)in Alternate source. - Save and click Apply live. MODE = 0 selects INCH; other values select HPA.
| Comparison | Meaning |
|---|---|
| Equal / NotEqual | Equal to / different from the specified value. |
| Greater / GreaterOrEqual | Greater than / greater than or equal to. |
| Less / LessOrEqual | Less than / less than or equal to. |
The comparison uses the condition variable, not the primary displayed value. Equal means exact equality; a threshold may be better for continuously varying values. The same Multiplier applies to both sources. Put any additional conversion needed for one source in that source's RPN expression.
Show dashes when
- Enable Show dashes when (takes priority).
- Enter a condition source, comparison, and value, for example
(L:MY_MANAGED_MODE), Equal, 1. - Set Dashes to suit the physical display, for example
---or----. - Save and click Apply live.
Dashes take priority. When their condition becomes false, the numeric display returns even if its numeric read value has not changed. Dashes accepts 1–16 hyphens; the actual number of available digits depends on hardware.
L: variables. For standard SimVars, explicitly use a form such as (A:INDICATED ALTITUDE, feet). The clearest form for Fenix variables is (L:NAME). Verify the meaning of MODE = 0/1 and each LVar name for your aircraft; the example does not guarantee identical values in every aircraft release.10 · Daily operation and live changes
- Start Connect / Profiler, Builder, and MSFS with the correct aircraft.
- Check the restored profile, Device ID, and simulator version.
- Edit your bindings. Saving a dialog updates the profile in the application.
- Click Apply live and wait for the WASM acknowledgement.
- Check operation, then click Save to keep a permanent JSON profile.
| Change | Required action |
|---|---|
| Input expressions, output sources, multipliers, transforms, conditions, and dashes | Apply live; Save to keep the profile file. |
| Add/remove bindings or select another profile with the same Device ID | Apply live. |
| Device ID, simulator version, or WASM runtime code update | Build → Install → restart the simulator to load the module. |
| Profiler IP/port | Apply & Reconnect in Settings. |
Inputs are not forwarded while Builder waits for configuration acknowledgement. The acknowledgement confirms that the module accepted the configuration; it does not validate every aircraft variable.
Removing an output does not automatically clear it: hardware may retain its last value. The protocol supports 512 read slots. Each output uses one slot, and each enabled dashes condition uses an additional slot. Each expression is limited to 1023 UTF-8 bytes.
11 · Troubleshooting
| Symptom | What to check |
|---|---|
| Learn does not react | Profiler 1 connection, IP/port, the control in Connect, and the selected input type. Click Learn again and operate the hardware during the listening period. |
| Only part of the cockpit works after restarting | The active profile name and binding counts. A small test profile does not contain the full set. Open your copy of the full profile and Apply live. |
| No Apply live acknowledgement | MSFS must be running, the live module installed in its Community folder, and Device ID must match. Restart the simulator after installation. An older module cannot acknowledge the new protocol. |
| The display shows the wrong number | Source, L:/A: prefix, units, and Multiplier. For HPA, read the HPA variable rather than an E_… event variable. Check alternate conditions. |
| The display stops updating after adding a condition | Use explicit (L:NAME) forms in both fields, verify the LVar names and comparison, and use the current Builder version. Apply the configuration again. |
| A button toggles twice | Check that the toggle is not assigned to both press and release, and that Double activation is enabled only when needed. |
| The build cannot find its toolset | VS 2022 with C++, the SDK's WASM integration, and the correct SDK version. Use Re-detect Toolchain and read the first relevant Build Log error. |
| MSFS 2024 does not load the module | MSFS VERSION = 2024, an MSFS2024 build, and the MSFS 2024 Community folder. Do not substitute the 2020 folder. |
| Hardware tests work but aircraft control does not | The test confirms hardware communication. Check the aircraft-specific variable/command, Apply live, and input/output logs. |
Reading the log
[Live config] ... inputs=480; outputs=356
[Live input] AP1 FCU: raw=1; RPN=...
[Live output] ... source=(L:N_FCU_EFIS1_BARO_HPA); raw=1019; multiplier=1; dashes=False; sent=1019raw is the read result, multiplier is the applied scale, and sent is the value/text sent to hardware. no binding means no input binding matched. waiting for configuration acknowledgement means the configuration is not yet acknowledged. Detailed diagnostics depend on your Builder release. Outputs are mainly logged when their value or condition changes, so no new line for an unchanged value can be normal.
12 · Glossary and resources
| Term | Meaning |
|---|---|
| Binding | A connection between a hardware control/device and an aircraft action or read source. |
| SimVar / A: | A standard MSFS variable, such as altitude. Its unit affects the read value. |
| LVar / L: | An add-on/aircraft local variable, such as a Fenix panel mode. |
| RPN / Expression | An MSFS calculator expression: read (L:X), write 1 (>L:X), add (L:X) 1 +. |
| Community | The selected simulator's add-on package folder. |
| SDK / toolset | Tools and libraries used to build a module for a particular MSFS version. |
| WASM | A module running inside the simulator. |
| SimConnect | The communication interface between an application and MSFS. |
Official resources
- Microsoft — .NET 8 Desktop Runtime
- MSFS 2020 — SDK contents
- MSFS 2024 — SDK installation and overview
- MSFS 2024 — WASM projects and toolset
This guide describes the current project code, including live configuration, conditional displays, and last-session recovery. Older installers may not include these features. Example variables must be checked against your aircraft and its version.