Documentation · v0.9

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:

01
Cards

Self-contained processing nodes. Typed inputs, typed outputs, a faceplate UI. 93 ship builtin.

02
Workflows

Cards wired on a canvas into an executable pipeline, from raw signal to result.

03
Models

Trainable architectures placed as cards — classic ML and deep learning alike.

Core concepts

TermMeaning
cardA node: one processing step with declared inputs/outputs and a UI faceplate. Defined by a card.json + run.py.
canvasThe infinite 2D workspace where cards are placed and connected.
workflowA connected set of cards forming a runnable pipeline.
phaseWhere a card runs in the pipeline order (run.phase) — preprocessing, epoching, analysis, ML…
modelA learnable estimator (SVM, EEGNet…) placed via the Model Library as one or more cards.
skinA 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.

To load your own cards, enable Third-party cards in Settings (or set 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.

card.json
{
  "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" }
}
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 }
Raw / Epochs PREPROCESSING.TEMPORAL Band Pass l_freq h_freq filtered

Card catalog

The 93 builtin cards are grouped by pipeline role. A condensed map:

Temporal preprocessing · preprocessing.temporal

NotchFilter ProBand B2High PassLow PassBand PassPoly Band Pass

Spatial preprocessing · preprocessing.spatial

CARCSDCSP

Artifacts & cleaning

ICANEURICAR1 Reject

Events & data

Read EventsEvent MapperLatency ShifterBehavioral Linker

Epoching & rejection

EpochingAutoRejectMNE Threshold

Analysis

AveragingChannelMathPsdWelchMorletTfrFunctionalConnectivityResampleDropChannelsBaselineCorrectionConcatenate EpochsForwardModelSourceEstimate LORETAClusterPermutationExportDataManualInterpolationBasicStats t-testStats

Machine learning

Label ExtractorEpochs VectorizerBandpower ExtractorCovariance EstimatorTrain / Test SplitStandard ScalerModel FitModel PredictLeakage AuditorFilter Bank ExtractorSVMRIEMANNFBCSPXDAWN ClassifierxDAWN Spatial Filter

Deep learning

Domain SplitterAdversarial FitSynthetic InjectorSpike EncoderEpochs TensorizerTransfer LearningGenerative ArchAutoencoder ArchSNN ArchEEGNet ArchDeepConvNet ArchShallowConvNet ArchEEG-TCNet ArchEEG-Conformer ArchTSCeption ArchGNN ArchEEG-Transformer ArchNeural Net FitNeural Net Predict

Visualisation & monitors

Live monitors render results as the graph runs — 22 of them, plus visualisation cards.

2D MapKestrelEEGNet 2KNOBTopo MonitorPSD MonitorConfusion MatrixClassification ReportROC / AUCModel InspectorGNN BrainTraining HistoryEvaluation MonitorFC MatrixRiemann ManifoldFBCSP SelectionxDAWN ERPGraph StructureRecon MonitorLatent ExplorerDomain AlignmentSynthetic InspectorSNN Raster

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.

Start from the template. 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_skinsignalstudio.notch). Browse and publish them on the Instruments page; install via Install skin… or drag-and-drop.

Installed skins land in ~/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:

Raw EEG Filter ICA Epoching Model PHASES RESOLVED AUTOMATICALLY FROM run.phase

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).

WorkflowChain placed on the canvas
preprocess
Standard Preprocessing
Notch → High Pass → Low Pass → CAR → ICA
erp
Standard ERP
Epoching → Baseline Correction → Averaging → ERP Monitor
timefreq
Time-Frequency
Epoching → Morlet TFR + Monitor → PSD Welch + Monitor
resting
Resting State
High Pass → CAR → (reorder Epoching) → PSD Welch + Monitor
motor_imagery
BCI
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.

Watch for leakage. In ML workflows, place the 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:

Classic ML

SVM

Support Vector Machine over extracted features. The reliable baseline.

id · svm
Classic ML

Riemannian Geometry

Covariance-on-manifold classification (pyriemann). Strong for motor imagery.

id · riemann
Classic ML

FBCSP

Filter Bank Common Spatial Patterns — the BCI workhorse.

id · fbcsp
Classic ML

xDAWN

Spatial filtering tuned for P300 / ERP detection.

id · xdawn

Deep learning — convolutional, sequence/transformer, and specialised architectures:

Convolutional

EEGNet

Compact depthwise-separable CNN, the DL baseline for EEG.

id · eegnet
Convolutional

DeepConvNet

Deeper convolutional stack for richer feature hierarchies.

id · deepconvnet
Convolutional

ShallowConvNet

Shallow net tuned for oscillatory / band-power features.

id · shallowconvnet
Sequence

EEG-TCNet

Temporal convolutional network for long-range dependencies.

id · eeg_tcnet
Transformer

EEG-Conformer

Convolution + self-attention hybrid. State-of-the-art on many BCI sets.

id · eeg_conformer
Sequence

TSCeption

Multi-scale temporal + spatial inception for emotion/MI.

id · tsception
Transformer

EEG-Transformer

Pure attention over channel-time tokens.

id · eeg_transformer
Specialised

GNN

Graph neural net over the electrode montage as a graph.

id · gnn
Specialised

Riemannian AE

Unsupervised autoencoder on the covariance manifold.

id · riemann_ae
Specialised

SNN

Spiking neural network for event-driven, low-power inference.

id · snn
Specialised

Domain Adaptation

Transfer learning across subjects / sessions / sites.

id · domain_adapt
Specialised

Generative EEG

GAN / diffusion for synthetic EEG and augmentation.

id · generative
Aliases resolve to the same workflow: 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:

ML pipeline
Epochs
  → Epochs Vectorizer      # flatten to feature matrixStandard ScalerTrain / Test Split     # before any fit — avoid leakageModel Fit (svm)
  → Model PredictConfusion 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

TypeCarried between
RawContinuous recording — source → temporal/spatial preprocessing.
EpochsSegmented trials — after Epoching → analysis / ML.
EvokedAveraged response — after Averaging → ERP monitors.
FeaturesNumeric matrix — after vectorising → models.
.sbuilderSaved workflow graph (canvas + params + layout).
.sscardCard skin (visual faceplate, role skin).

Glossary

TermDefinition
CARCommon Average Reference — spatial re-referencing.
ICAIndependent Component Analysis — artifact separation.
CSP / FBCSP(Filter Bank) Common Spatial Patterns — discriminative spatial filters.
ERPEvent-Related Potential — averaged response to stimuli.
TFRTime-Frequency Representation — e.g. Morlet wavelets.
PSDPower Spectral Density — e.g. Welch's method.
LORETASource 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.