Rust-Powered Performance
Zero-cost abstractions, async I/O, and no garbage collector. 10× throughput with 10× less memory than Node.js runtimes.
Node-RED compatible runtime with 10× less memory, WASM plugin security, and single-binary deployment. Drop-in replacement for your existing flows.
Node-RED changed how we think about flow-based programming. RustRED takes that vision and makes it production-ready.
Zero-cost abstractions, async I/O, and no garbage collector. 10× throughput with 10× less memory than Node.js runtimes.
Custom nodes run in a sandboxed WASM runtime. No more supply-chain attacks through unrestricted npm packages.
No Node.js, no npm install, no Python. One 22MB static binary that runs on Linux, macOS, ARM, and WASI.
Import your existing flow JSON files directly. Compatible with the Node-RED editor and flow format.
Compile only what you need. Disable Modbus, PostgreSQL, AI, or clustering with cargo feature flags.
Topic trie with wildcard matching, QoS 0/1, and retained messages. No external Mosquitto dependency needed.
Side-by-side with the tools you're already using.
| Capability | RustRED | Node-RED | n8n |
|---|---|---|---|
| Runtime | Native Rust | Node.js | Node.js |
| Memory Usage | ~22MB | ~150MB | ~300MB |
| Plugin Security | WASM Sandbox | Unrestricted JS | Unrestricted JS |
| Industrial Protocols | Modbus, MQTT | Via plugins | ✕ |
| Edge Deployment | Single binary | Requires Node.js | ✕ |
| Cold Start | <5ms | ~2s | ~5s |
| License | AGPL-3.0 | Apache 2.0 | Fair-code |
Write custom nodes in Rust, Go, or C/C++. They compile to WASM and run in a secure sandbox.
Implement the FlowNodeBehavior trait in Rust, Go, or any language that compiles to WASM.
cargo build --target wasm32-wasip1 — produces a tiny ~13KB binary.
Place the .wasm file in your plugin directory. Hot-reloaded, no restart needed.
use rust_red_macro::*;
// Annotate with flow_node to register
struct MyCustomNode {
base: BaseFlowNodeState,
}
impl MyCustomNode {
fn build(
flow: &Flow,
base: BaseFlowNodeState,
config: &RedFlowNodeConfig,
) -> Result<Box<dyn FlowNodeBehavior>> {
Ok(Box::new(Self { base }))
}
}
impl FlowNodeBehavior for MyCustomNode {
async fn run(self: Arc<Self>, stop: CancellationToken) {
while let Ok(msg) = self.recv_msg(stop.clone()).await {
// Process your message
}
}
}
Install, import your flows, and run.