Quick start
A browser-native dataflow graph that emits Rust. Apache-2.0.
To try flowRS you need none of this page: open the hosted IDE at flowrs.openie.dev/ide/, which runs in the browser with nothing to install. The rest of this page is for building and testing flowRS from its source.
Prerequisites
- Rust stable (
rust-toolchain.tomlat the repo root). - The wasm target:
rustup target add wasm32-unknown-unknown. - Trunk:
cargo install trunk.
Trunk in crates/flowrs-ui selects that directory's nightly toolchain. Shared-memory rayon needs it.
Open the IDE
From the repository root:
make dev
The same command without Make:
cd crates/flowrs-ui && trunk serve --address 127.0.0.1 --port 8100
Open http://127.0.0.1:8100/ide/ .
Trunk has to run in crates/flowrs-ui. crates/flowrs-ui/Trunk.toml sets public_url = "/ide/". The root index.html is an old page; serving from the repo root builds that page.
Tests
cargo test --workspace --exclude flowrs-ui --exclude flowrs-desktop
cargo test -p flowrs-core --features onnx
cargo run -p flowrs-core --example codegen_demo
Format, unused dependencies and every clippy line (the Makefile names the crates each line excludes, and why):
make check
Browser suite, Playwright, under e2e/ (127 spec files). Needs npm and Chrome:
cd e2e && npm ci && npm test
Outside the workspace
embedded/ and crates/embedded/ are teiOS firmware projects. cargo --workspace skips them.
The builtin widget census (273 builtin widgets: 0 seams, 16 stand-ins, 257 shipping) is computed from the registry when the site is built. A seam is codegen that still emits unimplemented! at declared defaults, in process or init. Those generated programs panic on the first run. A stand-in runs a deterministic substitute for the model or device it is named after (the gen.* widgets (10), ai.complete in generated programs, the audio recorder, microphone and player, and the video reader and writer); the editor badges it (crates/flowrs-core/tests/seam_visibility.rs). The count covers declared defaults only. It does not mean every widget behaves the same in the interpreter and in generated Rust: a codegen-only widget does not run in the interpreter, and unexecuted lists it as codegen_only with its reason. Where each node runs is computed too (412 of the palette's 419 nodes run in the browser; 7 only in the exported program), by flowrs_core::graph::tiers from the executors themselves: the palette marks every node that runs only in the exported program, with the reason, before it is dropped, and a run in the editor lists each node it did not run, with why.
flow.statechart is one of those nodes. The interpreter and the generated Rust run the same chart. A parallel state raises done on itself when every region is final. Assigned keys live on the data wire, a guard can read them, and a transition can write one key before entry. The generated program is not parsed back. The line language is in README.md.