Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add sailingnaturali/claude-skills --skill signalk-wasm-plugingit clone --depth 1 https://github.com/sailingnaturali/claude-skillsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/sailingnaturali/claude-skills/signalk-wasm-plugin)<a href="https://agentmods.dev/skills/sailingnaturali/claude-skills/signalk-wasm-plugin"><img src="https://agentmods.dev/badge/skills/sailingnaturali/claude-skills/signalk-wasm-plugin/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/sailingnaturali/claude-skills/signalk-wasm-plugin"><img src="https://agentmods.dev/badge/skills/sailingnaturali/claude-skills/signalk-wasm-plugin.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00114 | $0.03809 |
| Opus 5.5 | $0.00046 | $0.01524 |
| Sonnet 5.5 | $0.00023 | $0.00762 |
| Haiku 4.5 | $0.00011 | $0.00381 |
Grade A, and why
signalk-wasm-plugin scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured today.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
config file, and `curl` the endpoints and `/signalk/v1/api/vessels/self/...` paths you emit. How it starts
The opening of the file, as written. The whole thing — 224 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Write a SignalK WASM plugin
A SignalK WASM plugin is an npm package whose plugin logic is a .wasm binary, run by the
server in Node's built-in WASI (node:wasi, preview1) instead of being require()d. It talks
to the server only through env.sk_* host imports, so it gets no app object, no npm
dependencies at runtime and no install scripts. That makes it a good fit for self-contained
logic: protocol decoders, calculations, device drivers over UDP/TCP, and providers.
It is not the only way to use WebAssembly in SignalK. If you need the full
@signalk/server-api (app.*, Express routes with read-only access, serial ports, the NMEA
event bus) and only want WASM for speed or for reusing Rust/C code, write a normal Node plugin
and load a wasm-pack module inside it — the sibling skill signalk-wasm-library covers
that. Decide first:
| You need… | Use |
|---|---|
Sandbox, no app access, Rust/AssemblyScript end to end |
WASM plugin (this skill) |
Serial/BLE/CAN, nmea0183/nmea2000JsonOut events, read-only plugin routes, streaming responses |
Node plugin, optionally + a WASM library |
| A UI for a cockpit display | A static webapp (signalk-webapp) reading the server's own APIs — see §6 |
starter/ next to this file is a complete Rust plugin (config, poll-driven delta, one HTML
endpoint) verified on a live server. Copy it, rename, npm run build.
1. package.json: what makes it a WASM plugin
{
"name": "my-wasm-plugin",
"keywords": ["signalk-wasm-plugin"],
"wasmManifest": "plugin.wasm",
"wasmCapabilities": { "dataRead": true, "dataWrite": true },
"files": ["plugin.wasm", "public/"]
}
wasmManifestis what routes the package to the WASM loader (not the keyword). The keywordsignalk-wasm-pluginis what gets it discovered innode_modules.wasmCapabilitiesis optional;dataRead/dataWritedefault totrue, everything else tofalse(storagedefaults to"vfs-only").- The plugin ID comes from the package name, never from your
plugin_idexport:@and/become_, so@me/foo→_me_foo. Config lives at<configdir>/plugin-config-data/<id>.json. - Use an unscoped package name. Verified on 2.33.0: with a scoped name (
@scope/x) the host bindings are keyed by the package name while everything else uses the derived ID, sosk_set_statusnever reaches the admin UI (status stays empty),sk_read_configreturns{}, and deltas carry$source: "@scope/x". Unscoped names make all three agree. - App Store visibility. The App Store searches npm for
signalk-node-server-plugin(and the webapp keywords) only — a package with justsignalk-wasm-pluginnever shows up there, thoughnpm installinto the server dir still works. Adding both keywords makes it listed; the loader de-duplicates and still loads it as WASM becausewasmManifestwins. The cost: a server too old to know WASM would try torequire()it. The official docs say not to add the Node keyword — make the trade-off consciously. - The plugin is disabled until enabled in Plugin Config; there is no enabled-by-default.
What ships with it
5 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- today First seen · 224 lines · 114 tokens per session scan A 8f92bde7aa00
signalk-wasm-plugin is a skill published in the GitHub repository sailingnaturali/claude-skills (3 stars, last pushed yesterday), licensed MIT. It adds 114 tokens to every session and 3,809 once invoked, about $0.0005 per session on Opus 5.5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-10-19.
Other skills, from other repositories
wasm
WebAssembly (WASM) integration, WASI, component model, Rust/Go to WASM compilation. Use when implementing WASM modules, browser/edge compute, or polyglot runtime.
raspberry-pi-rust-embedded
Production-grade embedded Rust guidelines for Raspberry Pi (bare-metal nostd and Linux embedded std/rppal/embedded-hal). Use when developing low-latency hardware control apps, embedded Rust drivers, Linux GPIO/SPI/I2C/UART software, real-time interrupt handlers, and memory-safe hardware abstractions.
rust-no-std
Guide nostd Rust development for embedded and bare-metal targets. Use when writing #![nostd] crates, understanding core vs alloc vs std, implementing custom global allocators, selecting panic handlers for embedded, or testing nostd crates on the host without hardware.
domain-embedded
A guide for developing Rust software that runs directly on microcontrollers or other hardware without a standard operating system. This includes firmware, hardware interfaces, and peripherals.
woml
Create, explain, validate, and repair WOML workflow automation files. Use when a task involves .woml files, WOML triggers, steps, embedded JavaScript, context references, control flow, approvals, lifecycle hooks, services, providers, secrets, local modules, or WOML CLI operations.
analyzing-rust-malware-internals
Analyzes Rust-compiled malware by detecting the Rust toolchain signature, demangling Rust v0/legacy symbol names, and identifying crate dependencies from embedded paths. Activates for requests to analyze Rust malware, demangle Rust symbols, or identify a Rust binary build and its crates.