Building from source
You only need this guide to change the main application. To build an external plugin, use writing plugins; plugin projects do not need a MAUI application build or a sibling SDK checkout.
Windows prerequisites
- A Git checkout of MultiShock.
- The .NET 10 SDK,
including a version accepted by the checkout's
global.json. - The MAUI workload and Windows SDK required by
MultiShock.csproj. Use Visual Studio's MAUI development workload or restore the project's workloads with the .NET CLI. - Node.js and the pnpm version selected by
package.jsonfor Tailwind builds.
The current Windows target is net10.0-windows10.0.22621.0. Its minimum runtime
OS version is Windows 10 build 17763; the target SDK number is a build-time
requirement. global.json currently selects SDK 10.0.100 with latestPatch
roll-forward, so an installed SDK from a different feature band alone may not
satisfy it. Check the files in your checkout before substituting newer versions.
Build and run
Run these commands from the application repository directory containing
MultiShock.csproj, global.json, and package.json:
dotnet --version
dotnet workload restore MultiShock.csproj
pnpm install --frozen-lockfile
pnpm run rebuild:tailwind
dotnet build MultiShock.csproj -f net10.0-windows10.0.22621.0
Close any installed copy before launching the development build:
dotnet watch --project MultiShock.csproj run -f net10.0-windows10.0.22621.0 -- --enable-dev-tools
Development builds share the normal per-user configuration and flows. Back them up before development. Stop existing automation and use a test setup with shocks disabled before running changed code. Unpackaged builds skip the installed app's automatic updater.
For Razor or theme changes, watch core CSS in a second terminal:
pnpm run watch:css
Run pnpm run rebuild:tailwind when changes also need to reach the shared plugin
stylesheet. The application uses Tailwind 3; the separate website has its own
package manifest and toolchain.
Find the relevant code
| Directory or file | Responsibility |
|---|---|
Components/Pages/ | Home, settings, devices, diagnostics, and plugin management UI |
Components/FlowEditor/ | Canvas, node palette, property panel, and flow library UI |
Components/Layout/ | Sidebar, app navigation, and shortcuts |
Core/ | MAUI composition and application lifecycle |
Platforms/ | Native startup and platform-specific integration |
Plugins/PluginHost.cs | Desktop implementation of SDK host services |
MultiShock.Core/Configuration/ | Settings models, persistence, paths, and migrations |
MultiShock.Core/Flow/Engine/ | Flow definitions, runtime, registry, validation, and storage |
MultiShock.Core/Flow/Editing/ | Editor state, history, and canvas event routing |
MultiShock.Core/Flow/Nodes/ | Built-in nodes |
MultiShock.Core/Plugins/ | Discovery, manifests, load contexts, catalog, and reload |
MultiShock.Core/Services/ | Device actions, queues, transports, and startup orchestration |
Tests/ | Portable core regression tests |
wwwroot/, tailwind.tokens.js | Web assets and application design tokens |
MultiShock.Core.csproj references the published PiShock.MultiShock.PluginSdk
package. Its package version is the host's SDK contract. Installing a different
NuGet version in a plugin does not upgrade the SDK inside the application.
Checks
The core tests do not require a MAUI desktop build:
dotnet test Tests/MultiShock.Tests.csproj
Run a desktop build for UI or platform changes and test the affected behavior in the app. Passing portable tests does not verify sign-in, a real USB hub, native hotkeys, or device output.
Other desktop targets
- Mac Catalyst: the project selects
net10.0-maccatalyston macOS. Build on macOS with the matching .NET/MAUI toolchain and Xcode. The project declares Mac Catalyst 18.0 as its supported platform minimum. Windows update packages do not apply. - Linux, experimental: the project selects
net11.0and uses the Avalonia MAUI backend with WebKitGTK. The checkout'sscripts/publish-linux.shselects the Linux build toolchain and outputs toartifacts/linux-x64. Review the script's SDK/workload requirements before running it; workload installation needs write access to the .NET installation. Runtime prerequisites include WebKitGTK 4.1 (libwebkit2gtk-4.1-0on Debian/Ubuntu).
Automatic updates are Windows-only. Linux global hotkeys require X11 or XWayland; plugin native libraries must match the actual platform. These source targets do not imply that every plugin is supported on every desktop OS.
Build problems
- SDK not found: run
dotnet --list-sdks, compare withglobal.json, and install an accepted SDK. Do not change the target framework just to bypass it. - Missing workload or Windows SDK: restore the project workloads and install the Windows SDK named by the target framework.
- NuGet restore failure: check the configured sources and network access. Confirm the SDK package version in the core project is available to your feed.
- Styles missing after a change: rebuild the appropriate CSS bundle; running
dotnet buildalone does not regenerate Tailwind output. - Second app fails to start or output doubles: close the other copy. Both use the same settings, flows, and device connections.
Use logs and diagnostics for problems that occur after the build starts successfully.