SpikeInterface 0.104.0 release notes

Mar 23rd 2026

Main changes:

  • Added support for Bombcell [Fabre], for unit curation, including new and updated template metrics (#4306)

  • Added LUPIN [Garcia2024] as an internal sorter (#4192)

  • Added support for SLAy [Koukuntla], for automated unit merges (#4190)

  • Added valid_unit_periods postprocessing extension, based on NeuroPyxles [npyx] (#4299, #4302)

  • Added AutoCorrelograms postprocessing extension (#4307)

  • Added support for double-sided probes (#4272)

  • Added SequentialCuration, allowing for chains of curations to be applied to analyzers (#4298)

  • Added support for FigPack, to eventually superseed SortingView (#4364)

  • Major refactor and debugging of the Metrics postprocessing module (#4183, #4362, #4355, #4353, #4342, #4292) (see: Metrics module)

  • Significant speedups in Metrics (#4308, #4363) and SortingComponents (#4402, #4341) modules, and in correlograms (#4305) and template similarity (#4343) computations.

  • API and breaking changes:

    • Specific metrics functions now imported from different sub module (see: Metrics module)

    • snr quality metric calculation now uses median rather than mean (see: Quality Metrics module)

    • Metric name “peak_to_valley” has been renamed to “peak_to_trough_duration” for clarity. This name change will be applied automatically on load of older analzyers. (see: Template Metrics)

    • The function to do UnitRefine curation has been renamed from auto_label_units to unitrefine_label_units (see unitrefine_label_units())

    • Remove support for Python 3.9

core:

  • Fix closest_channels sparsity estimation when n_units > n_channels (#4443)

  • Copy the recording from original sorting during NumpySorting.from_sorting() (#4417)

  • Don’t raise when extension is unknown (#4406)

  • Make NumpySorting.from_unit_dict docs and code consistent (#4382)

  • Improve extension dependency management in SortingAnalyzer (#4321)

  • Implement select_sorting_periods in core (#4316)

  • Implement the cached_lexsorted_spike_vector. (#4315)

  • Move structured dtypes to base (#4314)

  • Implement select_sorting_periods in metrics (#4302)

  • Fix get_probe set_probe annotations propagation (#4300)

  • using spike_vector on core/check_sortings_equal test (#4282)

  • Random spike selection new methods (#4276)

  • Implement the by_side grouping with probes (#4272)

  • Fix gaussian filter with time vector (#4268)

  • Delete some unused references to channel_slice (deprecated in v0.103.0) (#4246)

  • Fix probable sharedmem (#4239)

  • Implement Add/SubtractRecording classes and +- operators (#4238)

  • Warn about non-mergeable units instead of raising an error (#4219)

  • Implementing sparsity for ComputeTemplates (#4212)

extractors:

  • Add XClustSortingExtractor (#4433)

  • Add gain and offset for read_kilosort_as_analyzer (#4428)

  • Fix openephys tests (#4426)

  • Fix Open Ephys probe channel order (#4396)

  • Improve NWB Extractor __del__ method to avoid import errors (#4369)

  • Fix IBL test with probe representation (#4335)

  • Remove check of len(inter_sample_shifts) matching num_readout_channels (#4317)

  • Update to SiNAPS extractor (#4263)

  • Support for using event names as IDs in PL2 files (#4049)

  • Get unit locations from HerdingspikesSortingExtractor (#3525)

preprocessing:

  • Slice epsilons with dead channels to match gains during agc. (#4430)

  • Support time_vector in resample() (#4429)

  • Implementing KNN referencing and a backup referencing mechanism for common_reference (#4412)

  • Use a truncated median filter near edges when detecting bad channels (#4391)

  • Make anyone happy about warnings and margin in filtering. (#4384)

  • Fix bug spatial filter #4175 (#4286)

  • Fix gaussian filter with time vector (#4268)

  • Fixes Issue4180 (#4247)

  • Fix artifact removal padding logic (#4245)

  • Auto-estimate margins based on freq_min/f0+Q for filters (#4227)

  • Fix silence period and job_kwargs (#4071)

  • Remove artefacts based of an envelope (#3715)

sorters:

  • Add the option for clustering methods to return temporal shifts for peaks while clustering (#4401)

  • Add plotting functions for drift and diagnostics to KS4 (#4387)

  • lupin and tdc2 : improvements (#4349)

  • Improve multithreading and multi processing : lock + nogil + mp_context (#4333)

  • Fix typo in lupin/tdc2 (#4284)

  • Make “simple” sorters params simpler. (#4281)

  • Improvements for internal sorters (#4279)

  • kilosort4 may fail due to the undesirable instantiation of logger (#4277)

  • Flatten params for tridesclous2 sorter (#4254)

  • Add isosplit in simple sorter (#4249)

  • Final cleaning of mixtures for lupin/tdc/sc (#4244)

  • Cosmetic logging messages for SC2 (#4242)

  • A new sorter : Lupin sorter (#4192)

postprocessing:

  • Set amplitude scalings equal zero for zero template units (#4455)

  • Add gain and offset for read_kilosort_as_analyzer (#4428)

  • Don’t raise when extension is unknown (#4406)

  • Fix valid period amplitudes (#4361)

  • Patch lag similarities (#4345)

  • Speed up template similarity computing using numba (#4343)

  • Change ComputeSpikeLocations to use only peak_sign (#4330)

  • Ensure compute unit locations respects order of unit ids (#4329)

  • Auto correlograms (#4307)

  • Option to turn on parallel computation for CCG in numba (#4305)

  • Valid unit periods extension (#4299)

  • Add BaseSpikeVectorExtension (#4189)

metrics:

  • Set num_histogram_bins in amplitude_cutoff (back) to 100 (#4415)

  • Fix metrics test for numba correlograms fast_mode (#4377)

  • Remove multiprocessing from NearestNeigbhor metric (#4363)

  • Add peak_sign to sd_ratio (#4362)

  • Improve error message for deprecated metric names (#4358)

  • Correct formula for mad (and std) in drift quality metrics (#4355)

  • Compute missing spikes on the right tail of amplitude distributions (#4353)

  • Improve stability of velocity fits in template metrics (#4342)

  • Timing the computations of quality metrics and some optimizations (#4308)

  • Bombcell integration and template metrics refactoring (#4306)

  • Fix rp violations bug (#4292)

  • Refactor metrics into its own module (#4183)

curation:

  • Improve robustness of model classifier tests (#4447)

  • Rename CurationModel to Curation (#4421)

  • Change ‘min’/’max’ to ‘greater’/’less’ when defining thresholds for threshold_metrics_label_units (#4416)

  • Send peak_sign to get_template_extremum_channel_peak_shift in remove_redundant_units (#4408)

  • Use sorting._recording (if available) in remove_excess_spikes (#4407)

  • Add threshold_metrics curation (#4365)

  • Ensure default supported_versions is a tuple, as in type (#4348)

  • Refactor API for auto_label_units (#4338)

  • Bombcell integration and template metrics refactoring (#4306)

  • Sequential curation (#4298)

  • Fix failing tests due to scikit-learn versions (#4253)

  • Warn about non-mergeable units instead of raising an error (#4219)

  • Add SLAy auto-merge preset (#4190)

widgets:

  • Enlarge channel textbox in plot_traces (#4400)

  • Send a float (rather than 1-element array) to BoundedFloatText (#4399)

  • Figpack integration (replacement of sortingview) (#4364)

  • Remove layer selector from plot_traces ipywidgets backend if single layer (#4325)

  • Fix edges of 2d-histogram in UnitWaveformDensityMapWidget (#4283)

  • Protect unit summary and unit locations plots against NaNs (#4128)

generators:

  • More possibilities for gt generation (#4289)

  • Update generate.py (#4163)

sortingcomponents:

  • Optimizations: faster waveforms/templates and seeding iterative_isosplit properly (#4402)

  • Add the option for clustering methods to return temporal shifts for peaks while clustering (#4401)

  • Make peak detection (locally_exclussive, matched_filtering) faster and more accurate. (#4341)

  • Needed by Olivier to create an analyzer with precomputed data (#4303)

  • Final cleaning of mixtures for lupin/tdc/sc (#4244)

  • Cosmetic logging messages for SC2 (#4242)

  • Update nearest peeler (#4223)

documentation:

  • Add missing API doc entries for save*, dump*, remove_channels, and scale_to_uV (#4451)

  • Extend unsigned to signed docs (#4448)

  • Fix link to LFP docs in error message (#4424)

  • Fix some typos in documentation (#4419)

  • Add a why integrate your software with spikeinterface section (#4393)

  • Add compute_valid_unit_periods to api and add credit in postprocessing module (#4390)

  • Add metric_descriptions and BaseMetricExtension.get_metric_colum_descriptions (#4278)

  • Doc sorters (#4275)

  • Clean auto-release script: use metrics + only print changed modules (#4265)

continuous integration:

  • Update setuptools version for legacy kilosort (#4386)

  • Get rid of pytest-dependency and use fixtures (#4381)

  • Free up space in codecov CI (#4252)

packaging:

  • Update lower bound python support to 3.10 (#4383)

testing:

  • Further Improve robustness of model classifier tests (#4450)

  • Remove n_jobs=-1 from curation tests (#4449)

  • Improve robustness of model classifier tests (#4447)

  • Fix openephys tests (#4426)

  • Rename neurodsp to ibldsp to ensure IBL tests run (#4392)

  • Update setuptools version for legacy kilosort (#4386)

  • Get rid of pytest-dependency and use fixtures (#4381)

  • Test IBL extractors tests failing for PI update (#4285)

  • using spike_vector on core/check_sortings_equal test (#4282)

  • fix tdc2 failing tests (#4271)

  • Fix failing tests due to scikit-learn versions (#4253)

deprecations:

  • Remove deprecations for 0.104.0 (#4425)

  • Make anyone happy about warnings and margin in filtering. (#4384)

  • Improve error message for deprecated metric names (#4358)

  • Binary recording bacward-compatibility (#4357)

Contributors:

  • @CodyCBakerPhD

  • @JoeZiminski

  • @Julie-Fabre

  • @MGAMZ

  • @OleBialas

  • @ShijiMi-Soup

  • @ablot

  • @alejoe91

  • @b-grimaud

  • @chrishalcrow

  • @ecobost

  • @esutlie

  • @grahamfindlay

  • @h-mayorquin

  • @m-beau

  • @mhhennig

  • @oliche

  • @pas-calc

  • @raffaele222

  • @samuelgarcia

  • @tayheau

  • @ueeseer

  • @yger

  • @zzhmark