A quick tour of what's happening under the hood.
A SynFlo patch is a graph. Each node is a module — an oscillator, a filter, a sequencer, a scope — and each wire carries a signal from one module to another. Drag a module out of the browser, drop it on the canvas, then drag from an output port to an input port to connect them. That's the whole editing model.
Ports come in two flavours: audio (green) and control (cyan). Audio carries sound — anything you'd want to hear or process. Control carries everything else: LFO sweeps, envelope shapes, sequencer pitches, gates, triggers. The editor only lets you connect like to like, so you can't accidentally patch a drum trigger into a filter cutoff and wonder why nothing happens.
Pitches travel on dedicated note ports as one volt per octave — the same convention used by modular hardware. C4 is 0 V, C5 is +1 V, and a sequencer's note output drops straight into an oscillator's note input without any conversion on your part.
Every sound you hear is generated on your own machine, in your own browser, using the WebAudio API. SynFlo doesn't stream audio from a server — there's no server in the audio path at all. When you hit play, your browser starts running the patch as a tree of native audio nodes, plus a handful of small AudioWorklet programs for the bits the standard library can't quite cover (band-limited oscillators, pitch CV conversion, the envelope state machine, and so on).
That means latency is whatever your browser and OS give you — typically a few milliseconds — and CPU usage is whatever your patch demands. A big patch on a phone will work harder than the same patch on a desktop, but the topology and behaviour are identical.
A SynFlo session is identified by a URL. Open one, send the link to a friend, and they're in. There's no account, no login, no install — the link is the room.
Behind the scenes, a small relay server shuttles graph edits between everyone in the session: node positions, parameter changes, new wires, cursor positions. The relay is stateless and knows nothing about audio. It exists only to keep everyone's view of the patch in sync.
Because audio runs locally on every client, collaboration doesn't have to wait on the network. Edits propagate over the relay in tens of milliseconds, but the sound each person hears is generated right there in their own browser, free of any collaboration overhead.
The trade-off is that each client renders the patch independently, so two collaborators might hear very slightly different things if their machines drift apart on a long stochastic patch. For tight rhythmic work we use shared room time so beats stay aligned across the session.
Patches save to a small JSON file (.sfg) — the full graph, every parameter, every position. They load
back exactly as you left them, and they're plain text so you can
read them, diff them, or share them outside a session.