NeuroPype Version: 2026.0.0
(Note: There was no Neuropype 2025.x release.)
Summary
This release brings a large Bayesian machine-learning expansion (a new family of sparse Bayesian logistic-regression classifiers), new connectivity and spectral methods (cross-spectral density, phase slope index, ridge/ARD MVAR), new diagnostics and signal-quality nodes, new real-time visualization nodes (including a new PlotDashboard node that can aggregate realtime plots from other visualization nodes into a single tiled window, and a new "stacked lines" mode to the TimeSeriesPlot). A new Notification node sends alerts via Email, Slack, Teams, Discord, or Pushover. The Resample node has been upgraded to perform realtime resampling on streaming data.
The major change in this release is the addition of a new, human-readable YAML-based pipeline file format (retains the .pyp extension) as an alternative to the legacy XML .pyp format. Unlike the old format, YAML pipelines are plain-text throughout (no base64 blobs), embed each node's properties directly in the node definition, and are diff- and merge-friendly, making them well suited to version control. The Neuropype API reads and writes both formats and auto-detects the legacy XML vs. YAML by inspecting the file content, so existing pipelines keep loading regardless of extension. Beyond full pipelines, NeuroPype can now load lightweight YAML parameter-override files that apply per-node property values to an already-loaded graph (matched by node UUID) — handy for parameter sweeps and configuration variants — and these can be supplied over the API. The bundled example pipelines have been converted to YAML. While the XML format will continue to be supported the YAML-based format will be the default going forward (the separate Pipeline Designer app has been updated to save in YAML format by default). You can load one of the example pipelines (in resources/examples/pipelines) in a plain text editor to see the format in action.
NeuroPype's REST API adds new endpoints and configuration options, including new /inputs and /outputs endpoints that return the files received / generated by an offline pipeline. Under the hood, the engine moves to NumPy 2.x, enables JAX 64-bit support by default, adds a graceful compute-backend fallback, and gains a number of new user-configurable settings.
As always, plenty of minor improvements, bugfixes, node documentation improvements/clarifications, etc.
New Nodes
- Bayesian package:
- TemplateModel: Classify data instances using Bayesian Logistic Regression with numpyro.
- Connectivity package:
- BayesianARDMVAR: Fit an adaptive multivariate autoregressive model (MVAR) using Bayesian regression with a grouped Automatic-Relevance-Determination (ARD) prior.
- RidgeMVAR: Fit an adaptive multivariate autoregressive model (MVAR) using Tikhonov-regularized (ridge) regression.
- Control_flow package:
- Import: Import definitions from another pipeline.
- Diagnostics package:
- ChannelQualityClassification: This node inputs several other nodes, such as LineNoise, CorrelationMetric and HighFrequencyNoise, with provided classification cutoff values to threshold each metric and provide a final weighted "Bad Channel Classification" signal quality metric displayed as a single topoplot and/or output data packet as classification values 1, 2, or 3 (good, ok, bad).
- DetectReferenceChannels: Automated detection of EEG channel(s) being used as a reference.
- EEGQualityScore: Automated EEG quality scoring per channel based on weighted quality metrics.
- EstimateTimeshift: Estimate the time shift between two streams in the given data, in seconds.
- LowFrequencyNoise: A meta-node that obtains a ratio of low frequencies (e.g
- PrintTable: Pretty-print tabular data to the console.
- File_system package:
- FileInfoExtraction: Extract metadata from a file containing signal data and (optionally) events, including filename, size, date created, date modified, number of channels, number of timepoints, sampling rate, and the list of channels.
- File_system package:
- ImportBIDSMetadata: Import metadata from BIDS sidecar files and apply it to an existing data packet.
- Formatting package:
- AxisToStream: Promote one or more axes in a packet to their own stream(s).
- StreamToAxis: Reconstitute axes that had previously been promoted to a stream; this is the reverse operation of Axis to Stream.
- Machine_learning package:
- EmpiricalBayesClassification: Sparse Bayesian logistic regression using the empirical Bayes (type-II maximum likelihood) framework.
- MethodEnsemblePredictor: Combine predictions from multiple distinct predictive pipelines.
- R2D2BayesianClassification: Classify data instances using sparse Bayesian logistic regression with the R2-D2 prior.
- RegularizedHorseshoeClassification: Classify data instances using sparse Bayesian logistic regression with a regularized horseshoe prior (Piironen and Vehtari, 2017).
- RelaxedSpikeSlabClassification: Classify data instances using binary sparse Bayesian logistic regression with a relaxed (Gaussian) spike-and-slab prior.
- SkinnyGibbsClassification: Binary sparse Bayesian logistic regression using the Skinny Gibbs Markov chain Monte Carlo sampler.
- SpikeSlabHeredityClassification: Classify data instances using sparse Bayesian logistic regression with explicit main effects and interaction terms under a heredity-structured spike-and-slab prior.
- SpikeSlabVBClassification: Classify data instances using binary sparse Bayesian logistic regression with a point-mass spike-and-slab variational posterior.
- StackedPredictor: Learn a binary meta-predictor from out-of-fold predictions of several distinct base methods.
- TangMartinClassification: Binary sparse logistic regression using the model- space variational empirical-Bayes approximation of Tang and Martin (2025).
- Markers package:
- ExtractMarkers: Extract (select) event markers that match one or more patterns, dropping all others.
- Network package:
- Notification: Send a notification via Email, Slack, Microsoft Teams, Discord, or Pushover.
- Programming package:
- StringSubstitute: Replace multiple placeholders in a string using a dictionary mapping.
- Source_localization package:
- ProjectOntoMesh: Projects each position on the space axis onto its nearest vertex on the mesh for the given headmodel.
- Spectral package:
- CrossSpectralDensity: Compute the complex multichannel cross-spectral density (CSD) matrix via the multi-taper method.
- Statistics package:
- CurveArea: Integrate area under the curve (AUC) using the composite trapezoidal rule of the data over a given axis.
- Statistics package:
- Mode: Compute the mode (most common value) of the data over a given axis value in the passed array.
- Visualization package:
- ImagePlotViewer: Plot streaming 2D data as a live image (heatmap) in real time.
- MarkerTablePlot: Display event markers and their timestamps in a real-time table.
- PlotDashboard: Display multiple plots side by side in a single window.
- TablePlot: Display data values in a real-time table.
- TimeSeriesDiff: Show the difference between two time series.
Renamed/Deprecated Nodes:
Newly deprecated (still available in this release, but slated for removal):
- BreakStructure: replaced by DictSplit.
- CreateStructure: replaced by CreateDict.
- DateOperation: use ShiftTimestamps to shift timestamps.
- ExtractMarkerTimestamps: use ExtractMarkers.
- FindROIs: use SelectROIs.
- LearningMethod: superseded by the pipeline import system (the Import node).
- SanityCheck: use GateCheck instead, which now covers all of its checks.
Removed in this release (previously deprecated; no longer included in the build):
- ArrayLookup: use GetItem (Get Item) instead.
- CastValueToType: renamed to CastToType (Cast To Type).
- ConcatStrings: renamed to StringConcatenate (String Concatenate).
- CreateIndexRange: renamed to CreateSelectionInterval (Create Selection Interval).
- InputPort, OutputPort: use the Input Slot / Output Slot nodes instead.
- InspectData: renamed to InspectPacket (Inspect Packet).
- Operate: renamed to OperateAxis (Operate Axis).
- ProximalGradientDescentSolver: renamed to ProximalGradientDescentSolve (Proximal Gradient Descent Solve).
- RenameAxisValues: renamed to ReplaceAxisValues (Replace Axis Values).
- SelectTargetEvent: removed (use marker-selection nodes such as ExtractMarkers, optionally preceded by RewriteMarkers).
- SplitList: replaced by BreakList (Break List), which counts outputs in a 0-based fashion.
- VectorLength: renamed to VectorNorm (Vector Norm).
Node Features:
- Array nodes: linear-algebra/array operations now also accept blocks, chunks, and packets as operands.
- AssignChannelLocations: ignores EXG channels in location files when identifying the best-matching location file.
- BadChannelRemovalNIRSSCI: channel-pair matching now uses the space-axis source/detector/wavelength metadata rather than channel-name strings, making matched-pair detection more reliable.
- BalanceClasses: fixed a class-sorting issue that affected which samples are balanced.
- BatchInstances:
pad_valuecan be set to NaN; padding now works with integer-valued axis fields; can specify the axis to insert and optionally its label; can sort instances by order of appearance. - Bayesian inference (MCMC / SVI): fixed the reparameterization heuristic for the case where the distribution node is not wired directly into a Random Draw.
- CastToType: now correctly handles 2-character strings with leading zeros when casting to int/float.
- ChannelDiagnostics: visualization sub-nodes are no longer initialized when running with a headless Neuropype build.
- ChannelRepair, CorrelationMetric: added a
serialcalibration-backend option (and exposed the calibration backend on CorrelationMetric). - CognionicsInput: an explicitly set headset model now takes precedence over the model inferred from the device name; non-signal channels are added only if not already present in the custom channel list.
- ComputeImpedance: added automatic detection of the impedance carrier wave (
auto_detect_carrier), an option to remove the carrier wave (remove_carrier_wave), and atarget_freqparameter. - ConditionSwitch, ConditionTest: input ports are now re-evaluated each tick even when the incoming value is unchanged.
- ConnectivityMeasure: added new measures — phase slope index (PSI) and renormalized PDC (rPDC); added basic support for time-reversed connectivity (e.g., TRGC); added control over the output stream name.
- CoregisterExistingLocations: added optional thin-plate-spline denoising of locations (with regularization and spline-order controls), an
on_erroroption (raise / ignore / fall back to template), a maximum-location-error threshold, and a 3D visualization option. - CorrelationCoefficient: added support for returning p-values.
- CrossValidation: exposed the compute order; option to embed a
FoldNumfield in outputs; now also exports theRepeatNumandtrain_test_ratioproperties; supports randomized (repeated) grouped cross-validation; ignorescensor_labelsfor continuous data. - DeepModel: added fallbacks for the case where the model renames the stream.
- DelayEmbedding: now supports delay-embedding along axes other than time.
- ExportEDF: added a
unitproperty (V/mV/uV/nV/noscaling) to scale signals to a target unit;fuse_streams(default True) to export each modality to a separate file when False;modality_prefix(default True) to prefix channel names with modality; now writes markers from all event streams; stores digital/physical min/max; rounds values to EDF's 8-character limit and warns when values appear out of range (suggesting FixSignalUnit). - ExtractStreams: added a
streamsparameter as an alias forstream_names(for consistency with other nodes). - FunctionCall: deep-copy of inputs is now optional.
- FunctionDef: now defaults to
export=True. - GateCheck: no longer writes an error
.txtfile — failures are now surfaced via the/errorsAPI endpoint and raise a more specific ValidationError. - GetNested: now handles the case where the input data is None; the
notfoundproperty is now a combo (raise/ignore). - HighFrequencyNoise, ChannelDiagnostics: added an
hf_stop_attenparameter (default 120) in place of a hardcoded value. - IfElse, Switch: added
on_clearhandling. - Import nodes (all): added a
file_missingoutput port that routes downstream when the input file is missing; added cloud-storage support to import nodes that lacked it. - ImportCSV: added
rows_header_columnto designate a column as an Instance-axis row descriptor (removed from the Feature axis); addednondata_rowsto drop leading non-data rows. - ImportEDF, ImportGDF: now use pyedflib for EDF (with MNE as an optional fallback) and MNE for GDF; added a
unitparameter and astrip_modalityoption; readprefiltering/transduceracquisition fields; flag marker streams as non-signal; import digital channels as a separate stream. - ImportNirs: now verifies that the input file is a
.nirsfile. - ImportSnirf: fixed channel labels being misaligned with data rows; handles accelerometer/gyroscope channels of differing time lengths.
- ImportStructure, ExportStructure: added YAML format support; ExportStructure's default pickle protocol bumped from 4 to 5; JSON/YAML import now uses UTF-8.
- ImportVHDR: updated to work with the current neo library; fixed events import.
- InspectPacket: table row colors now support dark mode; now respects the
always_on_topoption; reports done/finished when not streaming once data is shown andkeep_window_activeis enabled. - InterpolateMissingChannels: added a
reinterpolate_existingoption to reinterpolate channels even if they already have data. - MarkerStreamWindow: added a
font_sizeproperty; now handles thealways_on_topoption. - MeasureLoss: added support for a t-test against negated metrics (losses) and the corrected resampled t-test; now outputs confidence intervals and can include the raw measure observations; improved batching support.
- MovingAverage: automatically resets when the shape of incoming data changes (avoids an exception).
- MplPlot nodes (TimeSeriesPlot, BarPlot, SpectrumPlot): added a
max_redraw_hzproperty to control redraw rate (replacing the older every-N-ticks behavior); can now output a figure for use with the new PlotDashboard node; markers are no longer drawn outside the axes; handle the plot type changing while live. - MultipleComparisonCorrection: falls back to a scipy implementation when statsmodels is unavailable (BH and BY methods only).
- ParallelForEach: the
materializedoption has graduated from experimental status. - ParameterPort: added a debug option to print unique values by parameter name across all ports in a pipeline.
- PathIterator: added an
allmetaoutput port (list of per-file metadata, including aFilePathentry); added support forparticipants.tsvwhen loading from BIDS (enabled by default). - PipelineDone: added a
wait_n_ticksproperty to delay pipeline termination until N ticks after the Done node is reached; added an optional popup to inform the user when the pipeline is done. - PreprocessEEG: added a
reference_channelsparameter, with handling for the case where a scalp EEG channel is used as the reference. - PruneFlatlineChannels: fixed a bug where channels whose values are all exactly zero were not pruned.
- QuadraticDiscriminantAnalysis: now reports a user-friendly rank-deficiency error instead of a raw sklearn exception.
- RandomDraw: fixed incorrect behavior when both a batched distribution and a
like=input were provided. - RecordToXDF, ImportXDF: now save all stream properties (except
desc) into the XDF<desc><neuropype>section on export and read them back on import. - Resample: now supports resampling in realtime on streaming data.
- RewriteMarkers: now drops event markers that are rewritten to an empty string.
- SelectInstances: added support for wiring in a selection predicate as a graph (new
predinput port). - SetMembership: fixed the result being written to the wrong output field.
- ShiftTimestamps: now warns if all timestamps fall outside the
timestamp_pairsrange. - SignalToNoise: now checks that the data contains marker targets (required for the SNR computation).
- SignalWhitening: added the ability to apply a loaded whitening model to all streams; added basic support for segmented data.
- SplitStreams: can now also return the remaining (unselected) streams as a list.
- SystemInformation: added options to query available system memory and CUDA device memory.
- TimeSeriesPlot: added a stacked mode (default on) so channels can be stacked or superimposed on a shared Y axis; added a
y_rangeproperty for unstacked mode; added avaluedata port (withvalue_label/value_decimals) to overlay a scalar value on the plot; more robust NaN handling, with anans_as_zerooption. - TopoPlotViewer: added a
title_font_sizeproperty; can now output a figure for use with PlotDashboard; faster real-time redraws via blit (only electrodes redrawn each tick when not interpolating/NIRS); fixed the color array when plotting NIRS data. - TTest:
groupingis now a regular (non-expert) parameter, and the grouping-deprecation warning has been removed.
New Engine Features:
- New YAML-based pipeline file format (
.pyp):Graph.load()reads XML or YAML with content-based auto-detection, andGraph.save()can write either format. - YAML parameter-override files: per-node property values can be applied to an already-loaded graph, matched by node UUID.
- Pipelines can now carry and round-trip a description block (
name,description,version,status,license,url) plus a free-formmetadatadictionary. - Graceful compute-backend fallback: if a preferred backend (e.g., JAX) is not installed, nodes fall back to a configurable backend (default numpy) with a one-time warning instead of failing on import.
- JAX 64-bit support is now enabled by default.
- Upgraded to NumPy 2.x.
- multiprocessing/loky now use the
spawn()start method on all operating systems (previously the default only on Windows). - Many engine settings are now user-configurable via
config.ini/ CLI, including: a shorter default node-UID format, axis-tuning settings, LSL multicast scope settings (limit scope to the local segment, disable IPv6, specify known peers; written tolsl_api.cfg, now located in~/.neuropype), a--skip-version-checkflag, a tracemalloc toggle, warning-suppression toggles, and Linux display-server settings (force XWayland on Wayland). All CLI arguments are now mirrored by config variables settable in the.ini. - On startup, the engine now prints which config file was loaded.
New API Features:
- New
/inputsand/outputsendpoints that return the file paths imported/exported during an Execution. /actions/configurenow accepts afileparameter, so a set of parameters can be loaded from a (YAML, or XML) pipeline file in addition to the inline{'what': 'parameters', 'data': <dict>}form./actions/loadand/actions/saveunderstand the new YAML pipeline format (load auto-detects XML vs. YAML; save can target YAML)./statenow returnserror_codeanderror_message, giving more detail thanhad_errorsalone.- The number of REST API worker threads is now configurable (
config.api_server_threads, default 4), as is the listen-socket backlog (config.api_server_listen_backlog). config.cpe_api_portrenamed toport(matching the CLI argument), and it is updated after launch so the Control Panel can pick up the actual port if it changed via CLI or auto-port discovery.
New / Improved Resources
- The bundled example pipelines have been converted to the new YAML format.
- The NeuroPype Control Panel can now load one or more
.json/.yamlparameter files and apply them (parameter ports only) to a pipeline when loading it.