Skip to content

Custom WASM Nodes

Flow-Like can load custom workflow nodes from WebAssembly binaries. A package may expose one node or a related set of nodes, and the runtime uses the same node definitions and execution result types as the native catalog.

Language support depends on whether a toolchain can produce one of Flow-Like’s supported binary interfaces. Start from a repository template instead of assuming that every generic .wasm file is compatible.

A WebAssembly binary being detected as a Component Model component or core module before both pass through the same Flow-Like capability boundary

BenefitWhat it means in Flow-Like
Language choiceUse one of the maintained Component Model or core-module templates
IsolationWasmtime applies fuel, timeout, memory, and capability controls
Portable packageThe same compatible binary format can be loaded by Flow-Like desktop and hosted executors
Multiple nodesOne package can return several node definitions through get-nodes / get_nodes
Registry distributionPublished versions can be reviewed, installed, cached, updated, or disabled

A typical template contains:

ItemPurpose
flow-like.tomlPackage identity, version, metadata, and package-level resource declarations
node.wasmComponent Model component or core WebAssembly module
Language SDK or bindingsImplements the Flow-Like node contract
Tests and examplesValidate definitions and execution behavior before publishing

The publish screen collects manifest fields and uploads the compiled binary. During registry processing, Flow-Like instantiates the binary and extracts its exported node definitions, so the catalog reflects the executable artifact.

Every compatible package provides:

  • one node definition or a list of definitions;
  • a run implementation;
  • a numeric ABI version where the template exposes it;
  • JSON-compatible inputs and outputs;
  • declared node permissions for any protected host capability.

Definitions can include typed pins, defaults, schemas, documentation, icons, quality scores, and permission labels.

Data typeTypical JSON value
Executionnull control signal
String"hello"
Integer42
Float3.14
Booleantrue
DateISO 8601 string
PathBufFlow-Like storage path
StructJSON object
ByteByte payload represented by the SDK
GenericAny supported JSON-compatible value

Pins can be normal values, arrays, hash maps, or hash sets. A template’s SDK is responsible for mapping its language types to this contract.

Flow-Like auto-detects two binary formats:

ModelInterfaceBest fit
Component ModelWIT interfaces and the canonical ABINew packages, typed bindings, or permission-gated WASI sockets
Core moduleRaw exports plus JSON in linear memoryExisting core-module toolchains and compatibility templates

Both models end at the same Flow-Like node abstraction, but their SDK and networking support differ. See Component Model vs Core Modules.

LanguageTemplate
Rusttemplates/wasm-node-rust
Gotemplates/wasm-node-go
C++templates/wasm-node-cpp
Zigtemplates/wasm-node-zig
C#templates/wasm-node-csharp
Swifttemplates/wasm-node-swift
Pythontemplates/wasm-node-python
TypeScripttemplates/wasm-node-typescript
LanguageTemplate
AssemblyScripttemplates/wasm-node-assemblyscript
Kotlintemplates/wasm-node-kotlin
Nimtemplates/wasm-node-nim
Luatemplates/wasm-node-lua
Javatemplates/wasm-node-java
Graintemplates/wasm-node-grain
MoonBittemplates/wasm-node-moonbit

The repository’s templates/wasm-capability-matrix.md is the source of truth for current template format and SDK parity.

The runtime converts declared permissions into capabilities. Protected operations return no data or fail when the required capability is absent.

Capability areaExamples
NetworkHTTP, WebSocket, TCP, UDP, DNS
Flow contextVariables, cache, streaming, A2UI
StorageScoped reads and writes
AuthenticationConfigured OAuth access
ModelsHosted embedding and language-model calls

Packages also select memory and timeout tiers. Current manifest tiers range from 16 MB to 4 GB and from 5 seconds to 30 minutes; deployment policy can still impose stricter limits.

See Sandboxing & Permissions and Package Manifest before adding external access.

  1. Copy the closest language template.
  2. Change the package identity and node definition.
  3. Implement run with the template SDK.
  4. Declare only the capabilities the node needs.
  5. Run the template’s tests and build task.
  6. Publish the resulting .wasm through Library → Packages → Publish.
  7. Install the approved or private package and test it in a real board.

Installed packages are cached locally. Hosted execution resolves package versions and verified compiled artifacts through the registry.