goofi v3.0.0

Bundles

A directory of nodes and the packages they import. Everything goofi ships is one, but three of them are the engines' own and the rest are optional packs.

what a bundle is on disk
node-bundles/eeg/
  eeg_playback.py  eeg_power_bands.py  fooof.py  lsl_in.py
  requirements.txt

Every shipped bundle is built into goofi, so cargo run carries them all without a flag. A type is namespaced by the plane it runs on, as signal:Psd or audio:Osc, which is why two bundles can both hold a node called Gain without either shadowing the other.

--extra-nodes adds a root outside the repo the same way. It is a folder of node files, scanned after the shipped bundles and before the open patch's own workspace. The extension picks the engine: a .py is a signal node, a .wgsl a graphics one, and a .rs names its own:

cargo run -- --extra-nodes ~/my-nodes

A bundle with Python nodes names the packages they import in a requirements.txt. goofi-init installs every shipped bundle's requirements, and at startup goofi checks every scanned root's against both interpreters. A terminal is asked before anything is installed, and without one the nodes are unavailable: greyed in the palette and naming what is missing.

Core, and the rest

A bundle named after an engine is that engine's own node set: signal, audio and graphics today. Those are the core. They carry no dependency you have to think about, and every clone has them.

The others are packs: nodes for one domain, gathered under a name. Most are Python and lean on packages named in their requirements.txt, and a node in one goes unavailable when those are missing and says which. simulation is the exception that shows what the split really is: it is Rust, so it is always available, and it is still a pack because it is a domain rather than an engine's own set. Core is what the engine is; a pack is what someone gathered on top of it.

BundleKindNodesWritten in
audiocore17rust
graphicscore27python + wgsl
signalcore47python + rust
biotunerpack21python + rust
complexitypack10python
computer-visionpack4python
eegpack8python
harmonic-geometrypack6python
imagepack2python
image-generationpack1python
mlpack4python
simulationpack14rust

Each name goes to that bundle in the node reference, where its nodes are listed with what they do.

Your own

--extra-nodes is repeatable, and a later root wins a type name it shares with an earlier one. A patch's own workspace is scanned last of all, so a patch can always override what it was given.