New Pioreactor software release: 26.5.x

:wave: This update changes how turbidostats, chemostats, and other automations are implemented. Plugin authors should find this new automation design better.

We’ve also added agent skills that can be used to assist in plugin creation.

:arrow_down: Download release_26.5.0.zip

26.5.0

Highlights

  • More reliable data exports. The Export Data page now exports one experiment at a time and starts exports as async tasks, so the UI can wait for large exports instead of tying up a web request. Exports now write directly into the zip file, clean up stale partial artifacts, and stop early if disk space, memory, or SQLite WAL growth gets too close to unsafe limits.

  • Automation schedules now live with the automation. Automations can choose the right trigger for their behavior: fixed timers, biomass updates, phase boundaries, or manual execution. For example, turbidostat now reacts to fresh biomass readings instead of polling every few seconds, while light_dark_cycle schedules exact light/dark phase boundaries.

  • New repair workflow. Added pio repair, richer pio status --json checks, and a UI Repair system action under Inventory for fixing common local ownership, permission, and runtime-storage issues without rebooting or stopping running jobs.

    pio status --json
    pio repair
    

Breaking changes

  • Removed the old dosing_automation/media_throughput and dosing_automation/alt_media_throughput MQTT variables. Use the retained bioreactor cumulative dosing variables instead:

    pioreactor/<unit>/<experiment>/bioreactor/cumulative_media_added_ml
    pioreactor/<unit>/<experiment>/bioreactor/cumulative_alt_media_added_ml
    pioreactor/<unit>/<experiment>/bioreactor/cumulative_waste_removed_ml
    
  • Removed the shared --duration and --skip-first-run CLI flags from pio run dosing_automation and pio run led_automation. Timer-based automations now expose their own fields instead. For example:

    pio run dosing_automation --automation-name chemostat --duration 20 --skip-first-run 1
    pio run led_automation --automation-name light_dark_cycle --light-duration-minutes 12.5 --dark-duration-minutes 12.5
    
  • Removed the old pio update ... and pios update ... aliases. Use the explicit subcommand:

    pio update app --version <version>
    pios update app --version <version>
    
  • Moved passive Pioreactor card setting descriptors out of ui/jobs/ and into the new ui/settings/ descriptor directory. Plugin and custom UI descriptors for fields such as LED intensity, PWM intensity, and bioreactor state should now live under ~/.pioreactor/plugins/ui/settings/. The old /api/bioreactor/descriptors endpoint has been replaced by /api/settings/descriptors and /api/workers/<unit>/settings/descriptors.

Enhancements

  • Added retained bioreactor variables for cumulative dosing totals: cumulative_media_added_ml, cumulative_alt_media_added_ml, and cumulative_waste_removed_ml. These are updated from dosing events and can be used for media-use, alt-media-use, and waste-removal alerts.
  • Added YAML-backed UI settings descriptors, allowing built-in, plugin, and custom fields to control whether passive Pioreactor card fields are shown and how they appear in Manage / Settings.
  • Improved automation start forms so each automation can define its own fields, including boolean options like skip_first_run, and required fields now block Start until valid.
  • Improved the Light/Dark Cycle LED automation to support fractional-minute light and dark phases and reschedule immediately when phase durations change.
  • Added per-Pioreactor Stop all actions on Pioreactor cards, so a single unit can be stopped without broadcasting to every assigned unit.
  • Added YAML download buttons for individual calibrations and estimators, alongside the existing source preview.
  • Improved frontend load performance by lazily loading route-level UI pages.

Bug fixes

  • Fixed large exports that could exhaust memory or leave incomplete CSV/tmp files behind after interruption.
  • Fixed experiment profile save and delete requests so the API waits for the underlying file operation and reports failures instead of returning success too early.
  • Fixed experiment profile start errors so the UI keeps the dialog open and shows the backend error.
  • Fixed Advanced Config dialogs to refresh config from the selected worker when opened, avoiding stale values after jobs persist updated settings.
  • Fixed cluster fan-out reads so offline or slow workers resolve to per-unit failures instead of turning the whole request into a ResultTimeout.
  • Fixed plugin pages for worker-specific views so offline workers show a clear Could not reach this Pioreactor. error, and Install across cluster is shown only when there is more than one unit.
  • Fixed model-hardware checks to apply to HAT v1.x hardware generally, not just model version 1.5.
  • Fixed dosing automations to check required pump calibrations and PWM assignments before starting, so missing media or waste pump setup is reported immediately.
1 Like

26.5.1

:arrow_down: Download release_26.5.1.zip

Enhancements

  • More useful error and log messages in the UI

Bug fixes

  • Fix pio workers add failing with a config bug due to a environment issue.
  • Deleting experiments is now async, and no longer blocks the web worker.
  • Fixed the Pioreactors page on leader-only installs so settings descriptors load even when the leader itself is not assigned a Pioreactor model.
1 Like

:wave: this minor update has improved support for USBs (the Pi is a computer, let’s treat it like one), and security improvements.

:arrow_down: Download release_26.5.2.zip

26.5.2

Enhancements

  • Added signed manifest verification for uploaded and downloaded release_*.zip software update archives. Official release archives now include a signed manifest, and Pioreactors verify the manifest and bundled files before running update scripts.

  • Added USB drive support in the UI and CLI. The Leader page now shows detected USB drives, can mount or eject supported drives, and the top navigation shows when a USB drive is present. The new pio usb command can list, mount, scan, print the active path for, and eject Pioreactor-managed USB drives.

  • Added Export to USB on the Export Data page. When a writable USB drive is mounted, exports can be saved directly to pioreactor/exports/ on the drive instead of downloaded through the browser.

  • Added Update from USB on the Updates page. Release archives named like release_26.5.0.zip on a mounted USB drive can now be selected and installed on one Pioreactor or across the cluster.

  • Added plugin installation from USB. The Plugins page can scan mounted USB drives for .whl plugin files and install them on one Pioreactor or across the cluster.

  • Updated pios cp so a copied file can be staged at a different path on workers, for example:

    pios cp /run/pioreactor/usb/plugin.whl /tmp/plugin.whl --units worker1
    
  • Moved Cluster clocks from the Leader page into Inventory’s Manage inventory menu as Sync clocks.

  • Added a Leader System space card that shows available disk space and memory, with warning-colored progress bars when available space is below 20%.

Bug fixes

  • Fixed release-archive updates for non-leader workers so archives are copied to /tmp before running the worker update. This makes cluster updates work when the source archive is on the leader’s mounted USB drive.
  • Fixed update-from-zip uploads so browser-renamed downloads like release_26.5.0 (1).zip are accepted after signature verification instead of requiring the filename itself to encode the release version.
1 Like