| title | WASM Plugins | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| children |
|
This guide covers how to develop WASM/WASIX plugins for Signal K Server 3.0. WASM plugins run in a secure sandbox with isolated storage and capability-based permissions.
A WASM plugin is an npm package that contains the WASM code for the plugin instead of the traditional JavaScript code. A WASM plugin is identified by the signalk-wasm-plugin keyword in package.json and the wasmManifest field in package.json:
{
"name": "my-plugin-name",
"wasmManifest": "plugin.wasm",
"wasmCapabilities": { ... }
}Key points:
wasmManifest(required): Path to the compiled.wasmfile. This field tells Signal K to load this as a WASM plugin instead of a Node.js plugin.wasmCapabilities(required): Declares what permissions the plugin needs (network, storage, etc.)- Package name (flexible): Can be anything -
my-plugin,@myorg/my-plugin, etc. There is no requirement to use@signalk/scope. - Keywords: Include
signalk-wasm-pluginfor discovery (do not usesignalk-node-server-plugin- that's for Node.js plugins only)
Signal K Server supports multiple languages for WASM plugin development:
- AssemblyScript - TypeScript-like syntax, easiest for JS/TS developers, smallest binaries (3-10 KB)
- Rust - Best performance and tooling, medium binaries (50-200 KB)
- Go/TinyGo - Go via TinyGo compiler, medium binaries (50-150 KB)
- Security: Sandboxed execution with no access to host system
- Hot-reload: Update plugins without server restart
- Multi-language: Write plugins in Rust, AssemblyScript, and more
- Crash isolation: Plugin crashes don't affect server
- Performance: Near-native performance with WASM
- Self contained: WASM plugins do not install any additional dependencies
- Small binaries (compared to native options): 3-200 KB depending on language
- Delta Emission: Send SignalK deltas to update vessel data
- Status & Error Reporting: Set plugin status and error messages
- Configuration: The same JSON schema-based configuration as JS plugins
- Data Storage: VFS-isolated file storage
- HTTP Endpoints: Register custom REST API endpoints
- Static Files: Serve web UI from
public/directory - Network Access: HTTP requests via as-fetch (AssemblyScript)
- Resource Providers: Serve SignalK resources
- Weather Providers: Integrate with Signal K Weather API
- Radar Providers: Integrate with Signal K Radar API
Best for:
- Quick prototypes
- Simple data processing
- Migrating existing Node.js plugins
- Developers familiar with TypeScript
Pros:
- TypeScript-like syntax
- Fast development
- Smallest binaries (3-10 KB)
- Familiar tooling (npm)
Cons:
- Smaller ecosystem than Rust
- Some TypeScript features unavailable
- Manual memory management
Best for:
- Performance-critical plugins
- Complex algorithms
- Low-level operations
- Production plugins
Pros:
- Best performance
- Memory safety
- Rich ecosystem
- Strong typing
Cons:
- Steeper learning curve
- Longer compile times
- Larger binaries (50-200 KB)
Best for:
- Go developers wanting to write plugins
- Medium complexity plugins
- Resource providers with hybrid patterns
Pros:
- Familiar Go syntax
- Good standard library support
- Medium binaries (50-150 KB)
- Strong typing
Cons:
- Requires TinyGo (not standard Go)
- Some Go features unavailable
- Slower than Rust