this is a fun release! We are fixing some fundamental problems that have confused users for a while now. I’ll make some highlights, and then full changelog below:
- Plugins installed on a worker now show up in the UI on their Pioreactor card. This was always confusing previously: “I installed a plugin on worker X, why isn’t it appearing in the UI”. The problem was that the UI’s data was purely provided by the leader, so any plugins had to be installed on the leader to show up in the UI. Now, each Pioreactor card is populated by the respective Pioreactor.
- Workers now control their own configuration via a local unit_config.ini . The “shared”
config.inilives on the leader, and the leader shares that with the workers, but each worker now has their ownunit_config.inithat can override the globalconfig.ini. In the Edit Config page, you are now editing the config directly on the worker. - New caches on the leader to make providing data from workers faster. This makes both the above faster, and lots of pages in the UI (plugins, calibrations, etc) are now faster to display too.
Download here: release_26.4.1.zip
26.4.0
Breaking changes
- Unit-specific configuration is now owned by each worker’s local
unit_config.ini. The filename-based config editor APIs (/api/config/files*) have been removed; use/api/config/shared,/api/config/units/<unit>/specific, and/api/config/units/<unit>instead. pios sync-configs --specificnow refreshes leader-side snapshots from each worker’sunit_config.iniinstead of pushing leader-localconfig_<unit>.inifiles to workers.- Renamed the shared bioreactor volume setting
max_working_volume_mltoefflux_tube_volume_ml, including the UI label (Efflux tube level), MQTT/API state, and device config/cache migration during update. - Job and Automation controls now use worker-provided descriptors for individual Pioreactors, so worker-only plugin jobs automations appear in per-unit UI even if the leader doesn’t have that plugin installed. Bulk “Control All Pioreactors” automation flows remain leader-driven. A update script will attempt to add the necessary UI files to workers.
growth_rate_calculatingnow assumes the newgrpredicthidden-state filter and warmup-based initialization. It no longer supports--ignore-cache, cached growth-rate/filtered-OD startup state, orod_blankcorrection in this job. The parameters in[growth_rate_kalman]are no longer used.od_blankcorrection is now applied upstream inod_readingon a per-experiment basis before readings reachgrowth_rate_calculating. If a blank exists for the experiment,od_readingnow refuses to start with OD calibrations or fused estimators enabled, instead raising aValueError.- new version of
grpredictthat has significant changes to the responsiveness of the growth-rate model.
Enhancements
- Updated the config editor and worker-add flow for worker-owned unit configuration. The UI now edits shared cluster config separately from per-unit
unit_config.ini, and existing leaders update their add-worker helper so new workers receive shared config without overwriting their unit-specific config. - Added
pio config get <section> <parameter>andpio config set <section> <parameter> <value>for single-entry config access from the CLI.getdefaults to the effective merged value and also supports--shared/--specificfor file-specific reads.setuses--shared/--specificto targetconfig.iniorunit_config.ini. - Added short-lived leader-side caching for several fan-out metadata APIs, reducing repeated worker fetches and improving UI load times for calibrations, protocols, estimators, automations, jobs, and installed plugins.
- New growth-rate algorithm: designed the growth-rate EKF around a log-OD state model. You should see much faster convergence and better behaviour.
- Added
pio run stirring --measure-rpm-onlyto hold a fixed duty cycle while still measuring and publishingmeasured_rpm, making it easier to inspect fan RPM at settings like--duty-cycle 100.
Bug fixes
- Fixed
dosing_automationsubdosing to emit only the top-levelDosingStartedandDosingStoppedevents, avoiding duplicate nested dosing events during recursive IO actions. - Fixed repeated in-process actions such as dosing/pump runs to clean up MQTT listeners, signal handlers, and short-lived MQTT clients more reliably, preventing runaway socket/file-descriptor growth in long-lived jobs.
- Fixed
fed_batchdosing to skip additions that would push the vial past the configured hard-stop safety volume, pausing the automation instead of risking overflow. - Fixed non-interactive SSH and
nohupcommand execution forpioandpiosby installing/usr/local/binwrappers that source/etc/pioreactor.envbefore execing the Pioreactor virtualenv binaries. - Fixed pump calibration
dosing_eventsfrom changing retained bioreactor state such as vial volume and alt-media fraction. - Fixed overview chart legends so relabelled aliases are truncated consistently and still hide/show the correct series when clicked.
- Fixed
pio update appdefault release installs to download and apply the singlerelease_<version>.ziparchive, reusing the same archive update path as uploaded release bundles instead of fetching individual release assets.