a pretty big release, with lots of bug improvements, and initial support for an onboard camera - more details later.
26.8.0
Breaking changes
- Removed the deprecated
pioreactor.whoami.get_latest_experiment_name()helper. Useget_assigned_experiment_name(get_unit_name())instead.
Enhancements
-
Lots of minor performance improvements
-
Added experimental camera support for Raspberry Pi and V4L2/USB cameras. The UI can take manual or scheduled snapshots, show live snapshot status, browse, download, and delete experiment history, toggle automatic captures per Pioreactor, and guide users through manual focus. Manual captures are also available with
pio run camera_snapshot. Camera pages are disabled by default; enable and configure them in the sharedconfig.ini:[camera] enabled=1 snapshot_interval_minutes=5 keep_camera_active=0 ir_led_intensity=25 capture_backend=rpicam camera_index=0 device_path=/dev/video0 -
Updated MCP support to the 2026-07-28 specification.
-
Improved calibration sessions with action-specific button labels, protocol images and guidance, progress tables, and direct links to completed calibrations and estimators.
-
Reduced duplicate browser and leader requests on Inventory, Pioreactors, Export Data, calibration, estimator, experiment-creation, and automation screens by reusing loaded data and batching Pioreactor configuration reads.
-
Added clearer author, version, and package-type metadata to installed, suggested, and USB plugins.
-
Software updates now set
gpu_mem=32in the Raspberry Pi boot configuration on every Pioreactor.
Bug fixes
- Added automatic recovery for Raspberry Pi Wi-Fi SDIO failures that previously left a Pioreactor powered on but unreachable until rebooted.
- Prevented the Blanks UI from starting a per-experiment OD blank while an OD calibration or fused OD estimator is active, avoiding an incompatible setup that blocks OD reading. Existing blanks can still be cleared.
- Prevented OD reading from publishing a negative signal when the stored blank is higher than the measured signal, and added guidance to clear or recreate the blank.
- Enforced the advertised minimum of four standards before fitting a fused OD calibration.
- Made worker registration and experiment assignment retries idempotent, stopped jobs from the previous experiment during reassignment, and deleted stored camera snapshots from every Pioreactor that had been assigned when deleting an experiment.
- Fixed adding a Pioreactor from a previous cluster by removing stale leader topology overrides from its
unit_config.inibefore syncing the new cluster configuration. - Fixed experiment-profile stop actions so they can terminate matching jobs that finish starting after the stop action begins.
- Made bioreactor dosing-state updates atomic and normalized dosing-event database timestamps to UTC, preventing concurrent events from losing cumulative volumes and keeping recent media-rate calculations consistent.
- Rejected invalid boolean MQTT job-setting payloads instead of silently treating them as
false. - Fixed packaged plugins so
ui.*settings, such as Overview chart visibility, are installed into the leader’s shared configuration instead of a Pioreactor’sunit_config.ini. Existing misplaced settings are migrated automatically during upgrade without overriding operator choices. - Fixed packaged plugins with different distribution and Python package names so their bundled install hooks, configuration, UI assets, and exportable datasets are discovered and applied correctly, with debug logging for hook execution.
- Fixed plugin uninstall requests for packages that are already absent so they report the missing package cleanly instead of failing during asset cleanup.
- Fixed “duplicate setting” in 50_self_test.yaml.