flowRS Open the IDE

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.toml at 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.