flowRS Open the IDE

Node library

The signal graph emits Rust in one direction. crates/flowrs-core/src/codegen/rust.rs walks the diagram and writes the program. Nothing parses that program back into the diagram.

A separate artifact round-trips a visual syntax tree. crates/flowrs-core/src/rir/bridge.rs converts Rust source to an RIR tree, to graph nodes, and back again. That path is a syntax tree, and it is a different diagram from the signal graph.

The builtin widget census (273 builtin widgets: 0 seams, 16 stand-ins, 257 shipping) is computed, never typed. The count is flowrs_core::graph::widget::seam_widget_ids, stand_in_widget_ids and shipping_widget_count, locked by crates/flowrs-core/tests/seam_visibility.rs. A seam is codegen that emits unimplemented! at declared defaults, in process or init. The generated program compiles, then panics on the first run. A stand-in compiles and runs, but what runs is a deterministic substitute for the model or device it is named after. Models: the gen.* widgets (10) (seeded noise for Stable Diffusion, a byte histogram for CLIP, a pitch class for Whisper) and ai.complete, whose generated program answers with a local word rotation. Devices: audio.record and microphone return a synthetic 1 kHz tone, audio.play only counts samples, video.open / video.write move raw frames through flowRS's own container instead of a codec. No embedded widget (12) is a stand-in: on the Host target each drives a simulated in-memory board, and on the Embassy/RTIC targets in the Code view they reach the real pin, UART, I2C, SPI, ADC or timer through flowrs-hal (and on the Linux target through flowrs-device's LinuxBoard), with T0 and the firmware held byte for byte on the STM32F4 and RP2040 twins (crates/flowrs-pil/tests/mcuio_acceptance.rs). Each declares Widget::stand_in, carries "(stand-in)" or says so in its summary, and the editor badges it. 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, not a front-panel control. The machine is a line-oriented parameter. The interpreter and the generated Rust run that chart the same way, and the generated program is not parsed back. A parallel state raises done on itself when every region is final. Assigned keys live on the data wire. A guard reads them with KEY==VALUE, KEY!=VALUE, or an integer comparison. on: and always: may write one key when taken, after the trace line and before entry. A delay reads elapsed and does not sleep. The node reference lists the ports and the parameter text from the registry.

The lists below are front-panel control and indicator kinds in the IDE. They are not that census. A Control is a Control (numeric), BoolLiteral, or StringLiteral node carrying a widget prop. An Indicator is an Indicator node carrying a kind prop. control_widget / indicator_widget render by that prop. Selection controls add an options prop and emit the chosen index.

Controls (INPUT)

Numeric

  • Knob ✅, Dial ✅ — rotary
  • Slider ✅, Vertical slider ✅
  • Range slider (dual-thumb, min/max) ✅ — emits an (f64,f64) tuple
  • Spinner / numeric entry (±) ✅
  • Log slider (later)

Boolean

  • Toggle ✅
  • Switch (sliding) ✅, Rocker (later)
  • Push button (momentary) ✅
  • Checkbox ✅, LED-style toggle ✅

Selection (value = chosen index; options prop)

  • Dropdown / Select ✅
  • Radio group ✅
  • Segmented control ✅
  • Combobox (typeahead) ✅, Multi-select ✅
  • Cascader (2-level) ✅ — Tree-select (later)

Text / misc

  • Text ✅, Memo (text area) ✅, Password (widget) ✅
  • Date ✅, Time ✅, Time-range picker ✅
  • Color picker ✅
  • File upload ✅ (captures filename; bytes client-side)

Compound (Array / Cluster)

  • Array ✅ — variable-length numeric list → Vec
  • Cluster ✅ — fixed named numeric fields → a Rust tuple
  • Matrix, heterogeneous-typed cluster fields (later)

Indicators (OUTPUT)

Numeric

  • Radial gauge ✅
  • Semicircular meter, 90° gauge
  • Linear bar gauge (thresholds)
  • Bullet chart (measure + target + bands)
  • Progress bar / ring
  • Thermometer, Tank (level)
  • Digital / 7-seg numeric readout
  • VU / level meter (peak-hold)

Boolean / status

  • LED ✅, Lamp, Status dot, Valid ✓/✗

Series / charts

  • Strip chart (scrolling) ✅
  • Sparkline ✅
  • Area ✅, Bar ✅, Scatter ✅
  • Histogram ✅, Box plot ✅, Violin ✅
  • Heatmap ✅ (calendar heatmap later)
  • Pie/Donut ✅, Radar ✅
  • Candlestick ✅, Treemap ✅, Funnel ✅, Waterfall ✅
  • Sankey ✅, Calendar heatmap ✅

Data / text

  • String / label indicator ✅
  • KPI / stat tile (value + delta + sparkline) ✅
  • Data table (sortable) ✅ (filter later)
  • Array cells ✅ — a Vec shown as value cells
  • Matrix ✅ — a Vec shown as a numeric grid
  • Geo map ✅ — equirectangular graticule scatter (no basemap)
  • XY plot ✅, Timeline ✅ (from grid rows)

Command palette ✅

⌘K / Ctrl+K — fuzzy launcher over every widget; ↑↓ + Enter drops onto Front.

Containers / layout ✅

Dashboard tabs (pages, per-widget tab tag) ✅ · grid-snap drag ✅ · Cluster/Array ✅ (compound data on one wire).

Honest deferrals (need a bigger model/data than their value warrants)

  • Nesting containers — Accordion/collapse, splitter panes, Card-with-contents: need a containment + sizing model in the flat draggable canvas. Tabs already give multi-page grouping.
  • Real basemap for the geo map — needs actual coastline vector data (can't be fabricated accurately); the graticule scatter is the honest version.
  • Heterogeneous-typed cluster fields, tree-select, table export, crosshair-synced multi-chart tooltips.

A mark means that front-panel kind is in the IDE. Unmarked rows, and rows tagged later, are not. This checklist is not the builtin widget census above.