Skip to content

Releases: Pioreactor/pioreactor

25.12.10

11 Dec 01:57

Choose a tag to compare

Enhancements

  • Added a pio jobs command group with running, list, info, and remove subcommands to inspect and tidy job records, including published settings.

Breaking changes

  • pio job-status has been replaced by pio jobs status.
  • changed /unit_api/jobs/stop from using query params to json body.

Bug fixes

  • fix OD blank not being able to be run.
  • OD calibration now clamps out-of-range voltages to the OD values paired with the calibration’s voltage extrema, preventing inverted mappings on non-monotonic curves.
  • Images ship with DAC43608 library (missed the previous OS jump!)
  • Improvements to "Updating your model" on first boot.
  • Fix /pioreactor page crashing if a worker is inactive in the experiment.
  • Fixed clock syncing on the cluster

25.12.9rc0

09 Dec 20:12

Choose a tag to compare

25.12.9rc0 Pre-release
Pre-release

Upcoming

Enhancements

  • Added a pio jobs command group with running, list, info, and remove subcommands to inspect and tidy job records, including published settings.

Breaking changes

  • pio job-status has been replaced by pio jobs status.

Bug fixes

  • fix OD blank not being able to be run.
  • OD calibration now clamps out-of-range voltages to the OD values paired with the calibration’s voltage extrema, preventing inverted mappings on non-monotonic curves.
  • Images ship with DAC43608 library (missed the previous OS jump!)
  • Improvements to "Updating your model" on first boot.
  • Fix /pioreactor page crashing if a worker is inactive in the experiment.

25.11.19

19 Nov 18:56

Choose a tag to compare

25.11.19

Enhancements

  • Added pio job-status for a quick view of running jobs.

  • Easier time syntax for experiment profiles!

    1. Use the t field to specify times using suffixes, like 15s, 1m, 2.5h
    2. In repeat blocks, every replaces repeat_every_hours, and max_time replaces max_hours. Both the same time syntax above.
    3. In when blocks, wait_until replaces condition.
    experiment_profile_name: demo_stirring_repeat
    
    metadata:
      author: Cam Davidson-Pilon
      description: A simple profile that starts stirring, increases it every 5min, and stops when the RPM exceeds 2000.
    
    common:
      jobs:
        stirring:
          actions:
            - type: start
              t: 0
            - type: repeat
              t: 5m
              every: 5m
              actions:
                - type: update
                  t: 0.0s
                  options:
                    target_rpm: ${{::stirring:target_rpm + 100}}
            - type: when
              t: 0s
              wait_until: ${{::stirring:target_rpm > 2000}}
              actions:
                 - type: stop
                   t: 0s
    

    This is now the preferred way (though the old syntax isn't going away), and docs will be updated to reflect this.

Bug fixes

  • Cluster CLI commands now use click.Abort() (instead of bare sys.exit) so failed prompts, copy/install operations, and OD blanking exit cleanly with Click’s messaging.
  • Background jobs now only clear MQTT/db cache entries for attributes that were actually set, preventing accidental removal of unset metadata.
  • Dodging jobs keep their OD-reading interval topic published even if a second OD reader attempts to start and fails, so dodging continues uninterrupted.
  • Fix pios update ... breaking the web server from starting. (pio update is fine)

25.11.18rc0

18 Nov 20:19

Choose a tag to compare

25.11.18rc0 Pre-release
Pre-release
bump rc version

25.11.12

13 Nov 00:33

Choose a tag to compare

25.11.12

👋 Hi, just note you can't upgrade to this release via our usual manner - you need to do a full rewrite of your SD card.

Highlights

  • Added support for Pioreactor v1.5.
  • Upgrade to Trixie Debian 13!
  • New Pioreactor architecture:
    • New environment variable file /etc/pioreactor.env
    • The old pioreactorui Python package is now part of the pioreactor Python package, under pioreactor.web
    • Moved temporary files from /tmp to /run/pioreactor/
    • New pioreactor-web.service to handle both huey.service and lighttpd.service

Enhancements

  • pioreactor.hardware: reworked GPIO, PWM, and I2C configuration to load from layered YAML mods so new HAT+model combinations can be described without code changes. See new ~/.pioreactor/hardware directories.
  • pioreactor.hardware: constants are now resolved lazily through accessor functions (e.g., determine_gpiochip(), get_pwm_to_pin_map()); direct module constants remain but are deprecated shims that emit warnings.
  • Export images (PNGs and SVGs) of the Overview's and Calibrations' charts.
  • MCP server: added tools for creating experiments and managing worker assignments.
  • Show and hide calibration curves in Calibrations page by clicking the dot beside the calibration (similar to the Overview page).
  • Adding pio workers update-model <unit> -m <name> -v <version> to leader's CLI.
  • Added time-window and time-format options to the individual Pioreactors pages.
  • New workflow to set your Pioreactor leader-worker model on first load of the UI.
  • Add new APIs and MCP tools via plugins. Example: drop the following in your ~/.pioreactor/plugins folder:
# -*- coding: utf-8 -*-
from __future__ import annotations
from pioreactor.plugin_management import get_plugins
from pioreactor.web.plugin_registry import register_mcp_tool

__plugin_name__ = "mcp-plugins"
__plugin_version__ = "0.1.0"
__plugin_summary__ = "Adds convenience MCP utilities for Pioreactor plugin introspection."
__plugin_author__ = "Cam DP"


@register_mcp_tool()
def list_installed_plugins():
    """
    Return metadata for installed Pioreactor plugins registered with the system.
    """
    plugins = get_plugins()
    details = [
            {
            "name": name,
            "version": plugin.version,
            "summary": plugin.description,
            "author": plugin.author,
         } for name, plugin in plugins.items()
    ]
    return {"plugins": details}
  • New import of system files (the ~/.pioreactor directory) into Pioreactors. This means that it's easy to "back up" a pioreactor (leader or worker), and then reupload this to a (new) pioreactor in your cluster via the import system. This is available on the Inventory page.
  • support for up to four PDs.

Breaking changes

  • Changed start_od_reading API. It now accepts a dict instead of args for each PD position.
  • Generally lots of files moved around. See docs here on locations.

25.11.10rc0

10 Nov 15:00

Choose a tag to compare

25.11.10rc0 Pre-release
Pre-release
bump rc version

25.9.18

18 Sep 19:12

Choose a tag to compare

25.9.18

  • Experiment profile editor: added a searchable capabilities browser. You can now search across available jobs, automations, actions, and options directly in the editor. This should make building and editing profiles faster and reduce syntax errors.
  • Experiment Overview charts: no longer hide older data on long experiments. Instead, each series is downsampled on the client to a maximum of 720 points while preserving trends, regardless of experiment length. For very large clusters this may increase initial load time — narrowing the time range or hiding unused series can help if you notice slowness.
  • Eye-spy optics: initial support is included. If detected, the OD reading job can use it via the existing interfaces. Nothing changes if you don’t have this hardware connected; more documentation will follow.
  • Inventory export: from the Inventory page, you can export a worker’s ~/.pioreactor directory as a zip. The Leader page also includes an export for the leader’s ~/.pioreactor. This is useful for backups, support, or migration. Review the archive before sharing — it may contain configuration and credentials.
  • Pump scripting: pio run pumps ... now accepts a sleep step to pause between actions. Example: pio run pumps --media 2 --sleep 1 --waste 1.5 runs media for 2 mL, waits 1 s, then runs waste for 1.5 mL. In experiment profiles, you can repeat actions by suffixing keys with _, for example:
    jobs:
      pumps:
        actions:
          - type: start
            options:
              media: 2
              sleep: 1
              waste: 1.5
              sleep_: 2   # repeat keys by adding underscores
              waste_: 0.5
  • Advanced config for automations: the UI’s “Advanced” menu (temporary config overrides at start) is now available when launching automations, not just individual jobs. The options shown come from the [<job_name>.config] section.
  • CLI: added leader-only experiment management commands — pio experiments create <NAME>, pio experiments list, and pio experiments delete <NAME>.

Bug fixes

  • Restored live updates in real‑time charts in the UI (regression fixed).
  • Corrected timestamps on exported dataset folders in the archive.
  • Removed cases of duplicate log lines shown in the UI.
  • MCP now correctly respects configured notification methods.
  • Fixed model selection in the “Add a new Pioreactor worker” dialog in Inventory.
  • For leader-only Pioreactors, fixed leaders not showing up in "Cluster clocks" (and likely other places)

Breaking changes

  • Turbidostat now enforces duration = 0.25s for its frequent checks. The UI already used this value; CLI runs will now match it for more consistent behavior.

25.9.17rc0

17 Sep 18:30

Choose a tag to compare

25.9.17rc0 Pre-release
Pre-release

Testing custopizer@latest

25.9.15rc0

16 Sep 00:26

Choose a tag to compare

25.9.15rc0 Pre-release
Pre-release

Upcoming

  • Experiment profile editor: added a searchable capabilities browser. You can now search across available jobs, automations, actions, and options directly in the editor. This should make building and editing profiles faster and reduce syntax errors.
  • Experiment Overview charts: no longer hide older data on long experiments. Instead, each series is downsampled on the client to a maximum of 720 points while preserving trends, regardless of experiment length. For very large clusters this may increase initial load time — narrowing the time range or hiding unused series can help if you notice slowness.
  • Eye-spy optics: initial support is included. If detected, the OD reading job can use it via the existing interfaces. Nothing changes if you don’t have this hardware connected; more documentation will follow.
  • Inventory export: from the Inventory page, you can export a worker’s ~/.pioreactor directory as a zip. The Leader page also includes an export for the leader’s ~/.pioreactor. This is useful for backups, support, or migration. Review the archive before sharing — it may contain configuration and credentials.
  • Pump scripting: pio run pumps ... now accepts a sleep step to pause between actions. Example: pio run pumps --media 2 --sleep 1 --waste 1.5 runs media for 2 mL, waits 1 s, then runs waste for 1.5 mL. In experiment profiles, you can repeat actions by suffixing keys with _, for example:
    jobs:
      pumps:
        actions:
          - type: start
            options:
              media: 2
              sleep: 1
              waste: 1.5
              sleep_: 2   # repeat keys by adding underscores
              waste_: 0.5
  • Advanced config for automations: the UI’s “Advanced” menu (temporary config overrides at start) is now available when launching automations, not just individual jobs. The options shown come from the [<job_name>.config] section.
  • CLI: added leader-only experiment management commands — pio experiment create <NAME>, pio experiment list, and pio experiment delete <NAME>.

Bug fixes

  • Restored live updates in real‑time charts in the UI (regression fixed).
  • Corrected timestamps on exported dataset folders in the archive.
  • Removed cases of duplicate log lines shown in the UI.
  • MCP now correctly respects configured notification methods.
  • Fixed model selection in the “Add a new Pioreactor worker” dialog in Inventory.

Breaking changes

  • Turbidostat now enforces duration = 0.25s for its frequent checks. The UI already used this value; CLI runs will now match it for more consistent behavior.

25.9.12rc1

12 Sep 14:26

Choose a tag to compare

25.9.12rc1 Pre-release
Pre-release
bump rc version