Build EEG pipelines like a studio session.
Signal Studio is a node-based workspace for neural data. Drag cards onto a canvas, wire them into a pipeline, drop in a model, and process EEG — from raw recording to publication-grade output. This guide goes deep on the three building blocks: cards, workflows, and models.
Overview
Signal Studio turns an EEG analysis pipeline into something you can see. Instead of a 400-line Python script, you place cards on a canvas, wire them together into a workflow, and let the engine execute the graph. Models — from a simple SVM to an EEG-Conformer — drop in as specialised cards.
The whole system is built on three primitives. Everything else is a combination of them:
Cards
Self-contained processing nodes. Typed inputs, typed outputs, a faceplate UI. 93 ship builtin.
Workflows
Cards wired on a canvas into an executable pipeline, from raw signal to result.
Models
Trainable architectures placed as cards — classic ML and deep learning alike.
Core concepts
| Term | Meaning |
|---|---|
card | A node: one processing step with declared inputs/outputs and a UI faceplate. Defined by a card.json + run.py. |
canvas | The infinite 2D workspace where cards are placed and connected. |
workflow | A connected set of cards forming a runnable pipeline. |
phase | Where a card runs in the pipeline order (run.phase) — preprocessing, epoching, analysis, ML… |
model | A learnable estimator (SVM, EEGNet…) placed via the Model Library as one or more cards. |
skin | A purely visual faceplate for a card (.sscard, role skin). No effect on the pipeline. |
Install & first run
Signal Studio is a native desktop app (macOS / Windows) with a Python engine running underneath. After install, the node palette is populated from Resources/cards/index.json.
SIGNALSTUDIO_CARDS_PATH). User cards live in ~/Library/Application Support/Signal Studio/cards/user/.Cards — what is a card
A card is the atomic unit of work. It declares what it consumes, what it produces, and renders a faceplate so you can tune it. The engine loads any folder containing a card.json — builtin cards from Resources/cards/, and user cards when third-party loading is on.
Signal Studio ships 93 builtin cards plus 2 user examples (user.hjorth_extractor, user.example.echo). They span the entire pipeline, from temporal filtering to deep-learning architectures and live monitors.
Card anatomy
Every card is two files in a folder: a declarative manifest and an implementation.
{
"id": "signalstudio.band_pass",
"name": "Band Pass",
"category": "preprocessing.temporal",
"inputs": [{ "id": "in", "type": "Raw|Epochs" }],
"outputs": [{ "id": "out", "type": "Raw|Epochs" }],
"params": {
"l_freq": { "type": "float", "default": 1.0 },
"h_freq": { "type": "float", "default": 40.0 }
},
"run": { "phase": "preprocessing.temporal", "entry": "run.py" }
}# Receives typed inputs + params, returns typed outputs. def run(ctx): raw = ctx.inputs["in"] out = raw.copy().filter( l_freq=ctx.params["l_freq"], h_freq=ctx.params["h_freq"], ) return { "out": out }
Card catalog
The 93 builtin cards are grouped by pipeline role. A condensed map:
Temporal preprocessing · preprocessing.temporal
Spatial preprocessing · preprocessing.spatial
Artifacts & cleaning
Events & data
Epoching & rejection
Analysis
Machine learning
Deep learning
Visualisation & monitors
Live monitors render results as the graph runs — 22 of them, plus visualisation cards.
Authoring a card
If you can write a Python function, you can write a card. Create a folder with a card.json describing the I/O and params, and a run.py exposing a run(ctx) function. Drop it in the user cards folder, enable third-party cards, restart — it appears in the palette with full typed wiring.
user/_template/ ships an Example Echo Card (user.example.echo) you can copy and modify — and a working Hjorth Extractor as a real reference.Skinning cards
Skins are pure visual faceplates — they change how a card looks, never what it does. A skin is a .sscard file with role skin, targeting a specific card id (e.g. signalstudio.notch_premium_skin → signalstudio.notch). Browse and publish them on the Instruments page; install via Install skin… or drag-and-drop.
~/Library/Application Support/Signal Studio/cards/user/<skinId>/. Because skins are cosmetic, they're safe to share and swap without affecting reproducibility.Workflows — the canvas
A workflow is what you get when cards are wired together. The canvas is an infinite 2D space; connections carry typed data from one card's output port to the next card's input. The engine resolves the graph into an execution order based on each card's run.phase.
Pipeline model
Data flows left-to-right through phases. A typical EEG pipeline:
The Workflow Library (rail → Workflows) ships 5 one-click pipelines that drop a full chain onto the canvas. Each requires an EEG or Dataset source already present (except Motor Imagery, which lays down a complete FBCSP workflow).
| Workflow | Chain placed on the canvas |
|---|---|
preprocessStandard Preprocessing | Notch → High Pass → Low Pass → CAR → ICA |
erpStandard ERP | Epoching → Baseline Correction → Averaging → ERP Monitor |
timefreqTime-Frequency | Epoching → Morlet TFR + Monitor → PSD Welch + Monitor |
restingResting State | High Pass → CAR → (reorder Epoching) → PSD Welch + Monitor |
motor_imageryBCI | Full FBCSP workflow |
Execution & caching
When you run a workflow, the engine topologically sorts the graph and executes each card once its inputs are ready. Outputs are cached per card, so re-running after tweaking a downstream parameter only recomputes what changed — not the whole pipeline.
Train / Test Split before any fitting card, and use the Leakage Auditor to catch information bleeding from test into train.Saving & sharing
Workflows save as .sbuilder files — a serialisation of the canvas graph, card params, and layout. Share them with collaborators, or publish recipes the community can open and run on their own data via the Workflows library.
Models — the model layer
Models are estimators you train and run inside a workflow. In the Builder's Models tab, each library tile places a ready-made ML or DL pipeline on the canvas — the architecture card plus its fit/predict plumbing. Under the hood they're regular cards, so they wire into the same graph.
Model catalog
Classic ML — geometry- and feature-based estimators:
SVM
Support Vector Machine over extracted features. The reliable baseline.
Riemannian Geometry
Covariance-on-manifold classification (pyriemann). Strong for motor imagery.
FBCSP
Filter Bank Common Spatial Patterns — the BCI workhorse.
xDAWN
Spatial filtering tuned for P300 / ERP detection.
Deep learning — convolutional, sequence/transformer, and specialised architectures:
EEGNet
Compact depthwise-separable CNN, the DL baseline for EEG.
DeepConvNet
Deeper convolutional stack for richer feature hierarchies.
ShallowConvNet
Shallow net tuned for oscillatory / band-power features.
EEG-TCNet
Temporal convolutional network for long-range dependencies.
EEG-Conformer
Convolution + self-attention hybrid. State-of-the-art on many BCI sets.
TSCeption
Multi-scale temporal + spatial inception for emotion/MI.
EEG-Transformer
Pure attention over channel-time tokens.
GNN
Graph neural net over the electrode montage as a graph.
Riemannian AE
Unsupervised autoencoder on the covariance manifold.
SNN
Spiking neural network for event-driven, low-power inference.
Domain Adaptation
Transfer learning across subjects / sessions / sites.
Generative EEG
GAN / diffusion for synthetic EEG and augmentation.
riemann_snn → snn, riemann_da → domain_adapt, riemann_gan → generative.Inputs & outputs
Models don't stand alone — they sit between feature-producing cards and evaluation monitors. A canonical ML chain:
Epochs → Epochs Vectorizer # flatten to feature matrix → Standard Scaler → Train / Test Split # before any fit — avoid leakage → Model Fit (svm) → Model Predict → Confusion Matrix + ROC / AUC
Placeable ML building blocks (beyond the library tiles): epochs_vectorizer, label_extractor, standard_scaler, bandpower_extractor, train_test_split, leakage_auditor, model_fit, model_predict.
Bring your own
Because architectures are declared as cards (*_architecture) feeding Neural Net Fit / Neural Net Predict, you can author a new architecture card the same way you author any card — expose a builder function returning your model, and it slots into the existing training/inference plumbing.
Data formats
| Type | Carried between |
|---|---|
Raw | Continuous recording — source → temporal/spatial preprocessing. |
Epochs | Segmented trials — after Epoching → analysis / ML. |
Evoked | Averaged response — after Averaging → ERP monitors. |
Features | Numeric matrix — after vectorising → models. |
.sbuilder | Saved workflow graph (canvas + params + layout). |
.sscard | Card skin (visual faceplate, role skin). |
Glossary
| Term | Definition |
|---|---|
| CAR | Common Average Reference — spatial re-referencing. |
| ICA | Independent Component Analysis — artifact separation. |
| CSP / FBCSP | (Filter Bank) Common Spatial Patterns — discriminative spatial filters. |
| ERP | Event-Related Potential — averaged response to stimuli. |
| TFR | Time-Frequency Representation — e.g. Morlet wavelets. |
| PSD | Power Spectral Density — e.g. Welch's method. |
| LORETA | Source estimation onto a cortical/MNI grid. |
Counts reflect the current repo: 93 builtin cards + 2 user examples · 5 Builder workflows · 16 model tiles. Something missing or unclear? Ask on the community forum.