Pioreactor Open-Source Bioreactor Cluster
This lab introduces students to automated bioprocess engineering and microbial culturing using the Pioreactor open-source bioreactor cluster. Working with Raspberry Pi single-board computers and dedicated bioreactor HAT hardware, students configure and operate automated 40 mL culture vessels equipped with optical emitters, photodiode sensors, heating jackets, and magnetic stirrers. Students measure optical density to monitor real-time microbial growth kinetics while implementing automated feedback loops for temperature regulation, agitation, and continuous-culture turbidostat dilution. Through this work, students learn core concepts in bioprocess automation, embedded sensor interfacing over I2C and PWM, precision analog-to-digital conversion, and distributed IoT cluster orchestration using MQTT messaging and web interfaces.
Uploaded by demo on 2026-09-03 · ready · Electronics · Original source ↗
Files: Pioreactor_README.md · getting-started.md · requirements_base.txt · requirements_leader.txt · requirements_worker.txt
Readiness checks
-
complete 2026-09-03 03:49 🛡 Cybersecurity: Review before networking · 7 findings 14 searches · 11 pagesview · PDF
Latest report — 2026-09-03 03:49
Readiness: Pioreactor Open-Source Bioreactor Cluster
Verdict: Ready with caveats · 2026-09-03 · est. parts cost $384–$514 per bioreactor unit Cybersecurity — software & network: Review before networking
Every part this lab needs can be bought today. The two ICs the software actually drives are Active and deeply stocked, the Raspberry Pi 4 Model B is on sale at many retailers, and the proprietary 40 mL bioreactor assembly is orderable from the manufacturer at $349.00 with a stated 4-week lead time. Three things keep it from a clean "Ready". The FT232RL-REEL USB-UART bridge is obsolete with zero stock at every authorized distributor checked, and even its manufacturer-recommended successor is backordered everywhere — but the snapshot marks this device optional, so it does not block the core build. The 40 mL assembly is sole-sourced with a 4-week lead, which is a scheduling risk for a term-dated course. And Raspberry Pi listings range from $35 to $165 depending on RAM and kit contents, so budget to the 4GB specification rather than the cheapest headline price. This is the cold check for this lab — there is no previous report, so it establishes the baseline every future check will measure drift against.
Action required
| Part | Problem | Recommended action |
|---|---|---|
| FT232RL-REEL | Obsolete; 0 stock at DigiKey (50-week factory lead), RS (357-day lead) and Mouser (out of stock). ECIA lifecycle and supply-chain risk both High. The whole FT232RL family is affected — FT232RL-TUBE is likewise Obsolete with 0 stock. | Optional part — confirm whether your build uses the auxiliary FTDI serial expansion at all. If it does and you need pyftdi bit-bang modes, order FT232RNL-REEL far ahead (Active, but backordered everywhere). If you only need plain USB-to-serial, CY7C65213-28PVXI is in stock now (16,977 pcs). See Substitutes. |
Cybersecurity — software & network
Review before networking — The pinned frontend carries several fixable high-severity advisories and one Markdown-rendering flaw with no fixed release, the documented broker allows anonymous access, and the build runtime (Node.js 25) is past end of life - all manageable, but they should be addressed before these units go on a shared network.
| Component | Version | How known | Support status |
|---|---|---|---|
| Raspberry Pi OS / Debian (host operating system) | 12 | inferred (Not stated in any fetched source; the snapshot's check plan treats the Raspberry Pi OS base as Debian 12, and the support lookup was run on that basis.) | extended/LTS support only until 2028-06-30 |
| CPython (Python runtime) | 3.13.0 | read from project (fetched/07-getting-started.md pins it exactly: 'pyenv install 3.13.0' and 'pyenv global 3.13.0'.) | supported until 2029-10-31 |
| Node.js (frontend build and dev server runtime) | 25 | inferred (fetched/07-getting-started.md says 'nvm install 25' - a major-line pin only, no exact release.) | unsupported since 2026-06-01 |
| Eclipse Mosquitto (MQTT broker) | not determined | unpinned (fetched/07-getting-started.md installs it via 'apt install mosquitto' / 'brew install mosquitto' with no version.) | — |
| SQLite3 (database engine) | not determined | unpinned (fetched/07-getting-started.md installs it via 'apt install sqlite3' with no version.) | — |
| Flask (backend REST API) | 3.1.3 | read from project (fetched/01-requirements.txt (requirements/requirements.txt) pins Flask==3.1.3.) | — |
| Werkzeug | 3.1.8 | read from project (fetched/01-requirements.txt pins Werkzeug==3.1.8.) | — |
| Jinja2 | 3.1.6 | read from project (fetched/01-requirements.txt pins Jinja2==3.1.6.) | — |
| paho-mqtt (Python MQTT client) | 2.1.0 | read from project (fetched/01-requirements.txt pins paho-mqtt==2.1.0.) | — |
| huey (task consumer) | 3.3.0 | read from project (fetched/01-requirements.txt pins huey==3.3.0.) | — |
| msgspec | 0.21.1 | read from project (fetched/01-requirements.txt pins msgspec==0.21.1.) | — |
| mcp-utils-msgspec (leader node) | 3.0.1 | read from project (fetched/02-requirements_leader.txt pins mcp-utils-msgspec==3.0.1.) | — |
| Adafruit-Blinka (worker hardware layer) | 9.1.0 | read from project (fetched/03-requirements_worker.txt pins Adafruit-Blinka==9.1.0.) | — |
| adafruit-circuitpython-ads1x15 (ADC driver) | 2.2.23 | read from project (fetched/03-requirements_worker.txt pins adafruit-circuitpython-ads1x15==2.2.23.) | — |
| DAC43608 (DAC driver) | 0.2.7 | read from project (fetched/03-requirements_worker.txt pins DAC43608==0.2.7.) | — |
| pyftdi (FTDI serial driver) | 0.57.2 | read from project (fetched/03-requirements_worker.txt pins pyftdi==0.57.2.) | — |
| numpy | 2.3.2 | read from project (fetched/03-requirements_worker.txt pins numpy==2.3.2.) | — |
| PyYAML (base-image preinstalled) | 6.0.2 | inferred (Listed in fetched/01-requirements.txt only as a commented 'preinstalled on base image' line, so the manifest parser does not install it; checked against OSV directly this run.) | — |
| rpi-lgpio (base-image preinstalled) | 0.6 | inferred (Commented 'preinstalled on base image' line in fetched/01-requirements.txt; checked against OSV directly this run.) | — |
| lgpio (base-image preinstalled) | 0.2.2.0 | inferred (Commented 'preinstalled on base image' line in fetched/01-requirements.txt; checked against OSV directly this run.) | — |
| React (web user interface) | 19.2.7 | read from project (fetched/06-package-lock.json resolves react@19.2.7 (frontend/package.json declares the range ^19.2.7).) | — |
| Vite (frontend dev server) | 7.3.6 | read from project (fetched/06-package-lock.json resolves vite@7.3.6.) | — |
| mqtt (browser/JS MQTT client) | 5.15.1 | read from project (fetched/06-package-lock.json resolves mqtt@5.15.1.) | — |
| react-router | 7.17.0 | read from project (fetched/06-package-lock.json resolves react-router@7.17.0.) | — |
| ws (WebSocket library, transitive under mqtt) | 8.18.3 | read from project (fetched/06-package-lock.json resolves ws@8.18.3.) | — |
| ip-address (transitive dependency) | 10.1.0 | read from project (fetched/06-package-lock.json resolves ip-address@10.1.0.) | — |
| showdown (Markdown renderer, transitive under react-showdown) | 1.9.1 | read from project (fetched/06-package-lock.json resolves showdown@1.9.1.) | — |
| Component | Finding | Severity | Fix available? |
|---|---|---|---|
| ip-address (transitive dependency) | An address-parsing helper bundled into the web interface misreads addresses written with leading zeros, which can be used to slip past checks meant to stop the software contacting internal network addresses. — GHSA-mwp4-54f8-5fhr, GHSA-v2v4-37r5-5v8g | high | Yes — update to 10.3.1 |
| react-router | The routing library behind the Pioreactor web interface has five known flaws at the pinned version 7.17.0, including one that lets an unauthenticated visitor stall the interface by requesting awkward URLs, plus cross-site scripting and open-redirect issues. — GHSA-chx6-hx7r-mcp5, GHSA-qwww-vcr4-c8h2, GHSA-h8fp-f39c-q6mh, GHSA-337j-9hxr-rhxg (+1 more) | high | Yes — update to 7.18.2 |
| ws (WebSocket library, transitive under mqtt) | The WebSocket library that carries live bioreactor data to the browser can be driven to exhaust memory by a flood of tiny message fragments, and can leak uninitialised memory contents. — GHSA-96hv-2xvq-fx4p, GHSA-58qx-3vcg-4xpx | high | Yes — update to 8.21.0 |
| showdown (Markdown renderer, transitive under react-showdown) | The Markdown renderer used for text shown in the interface can be tricked into running injected scripts or into a slow parsing loop, and no fixed release of this library exists. — GHSA-22g5-r2x5-97cx, GHSA-cr32-g25g-vxjj, GHSA-rmmh-p597-ppvv | moderate | Mitigation only — no fixed version is published; only render Markdown the class authors, not text supplied by outsiders |
| Eclipse Mosquitto (MQTT broker) | The documented broker configuration sets 'allow_anonymous true', so anything that can reach the message broker can read every measurement and send commands without a password; the same file binds the listeners to 127.0.0.1, which is what currently keeps that off the network. | posture | Mitigation only — keep the broker bound to localhost, and require a username and password before exposing it to a shared or multi-unit network |
| Node.js (frontend build and dev server runtime) | The setup guide installs Node.js 25, a release line that stopped receiving security updates on 2026-06-01, so the machine building and serving the interface runs an unmaintained runtime. | posture | Mitigation only — install a Node.js release line that is still supported instead of 'nvm install 25' |
| React frontend dependencies (frontend/package.json) | dependencies unpinned: 32 of 34 in frontend/package.json - the manifest declares version ranges, so a fresh install can pull newer, unreviewed versions than the ones checked here. | posture | Mitigation only — install from the committed package-lock.json (npm ci) rather than npm install |
What this means for your lab
The Pioreactor's web interface, its message broker and its data are all reachable over the network by design, and as set up in the project's own guide none of them ask for a password - the guide turns anonymous access on for the message broker and relies on keeping everything bound to the machine itself. That is fine on a single unit on a bench. If you put these units on a shared campus or lab network, or run a multi-unit cluster, assume anyone else on that network could read your experiment data and send commands to the hardware - starting or stopping stirring, heating and pumps - unless you add authentication first. The web interface also carries several known flaws at the versions currently pinned, the most serious of which lets an unauthenticated visitor tie the interface up, and it is built and served on a Node.js version that stopped getting security updates in June 2026. Practical steps: keep the units on an isolated network segment or their own VLAN rather than the general campus network, set a username and password on the message broker before any multi-unit or networked use, update the frontend packages that have fixes available, and move the build machine to a supported Node.js version. Talk to campus IT before connecting these to a shared network. Some things could not be checked at all - the broker and database versions are never pinned, and the cluster's remote-login credentials are not documented in the material supplied - so treat those as unknown rather than safe.
Not checked
- Eclipse Mosquitto (MQTT broker): Installed unpinned via apt/brew; no version is stated in any source, so there is no version to check against the advisory databases.
- SQLite3: Installed unpinned via apt; no version is stated in any source.
- Raspberry Pi OS exact release: Not stated in the sources; the support status shown is for Debian 12, the base the snapshot's check plan assumes, not a release read from the project.
- 434 further transitive npm packages in frontend/package-lock.json: Beyond the 500-row automatic advisory check cap; 500 of the 938 locked packages were checked this run.
- Frontend dependencies as actually installed: Versions were checked from the committed package-lock.json; an 'npm install' against the unpinned ranges in package.json may resolve to different versions than those checked.
- Cluster inter-node SSH and remote access credentials: The snapshot records that default SSH credentials, keys and remote port definitions are not stated in the uploaded sources, so nothing could be checked.
- Unpinned build tools (build-essential, curl, git, make, direnv): Installed unpinned via apt/brew; versions come from the operating system and are not stated.
- Python packages installed from the base image (PyYAML, rpi-lgpio, lgpio): Checked against OSV this run and clean at the versions the manifest names in comments, but whether the image actually carries those versions was not verified.
- 434 further dependencies in package-lock.json: beyond the 500-dependency automatic check cap (e.g. @rollup/rollup-linux-ppc64-gnu, @rollup/rollup-linux-ppc64-musl, @rollup/rollup-linux-riscv64-gnu, @rollup/rollup-linux-riscv64-musl, @rollup/rollup-linux-s390x-gnu)
Parts
Host Platform and Processing Hardware
| Part | Spec/Package | Status | Stock | Price | Source |
|---|---|---|---|---|---|
| Raspberry Pi 4 Model B | 85 mm × 56 mm SBC, 40-pin GPIO header (2.54 mm pitch), 5.0 V DC ≥ 3.0 A, 3.3 V GPIO logic | Readily available | Multiple retailers | $35.00 – $165.00 | Seeed Studio ($35.00, RAM size not stated in listing); Vilros 4GB bulk $100.00; PiShop USA desktop kit ($165.00) |
The vendor's own product page notes one Raspberry Pi is needed per Pioreactor, and that the microSD card and power supply are not included in the kit.
Integrated Circuits and Sensor Interfaces
| Part | Spec/Package | Status | Stock | Price | Source |
|---|---|---|---|---|---|
| ADS1115IDGSR | VSSOP-10 (DGS), 16-bit 4-ch I2C ADC, supply 2.0–5.5 V | Readily available | 42,250 | $5.28 | DigiKey (Texas Instruments, Active) |
| DAC43608RTER | 16-WFQFN exposed pad, 16-WQFN (3×3), supply 1.8–5.5 V | Readily available | 3,547 | $5.61 | DigiKey (Active); also Spirit Electronics 3,000 @ $4.69, Mouser 1,652 @ $5.39 |
| FT232RL-REEL | 28-SSOP (0.209", 5.30 mm width), supply 3.3–5.25 V | Obsolete — unobtainable | 0 (DigiKey, RS, Mouser) | $4.80 last catalog price | DigiKey (Obsolete); ECIA lifecycle risk High. Optional part per the snapshot |
System Electromechanical & Assemblies
| Part | Spec/Package | Status | Stock | Price | Source |
|---|---|---|---|---|---|
Pioreactor 40 mL Bioreactor Assembly (model pioreactor_40ml v1.5, HW rev 1.2, FW rev 1.1) |
Custom vial holder, Eye-Spy optics, magnetic stirring base, heating jacket, 40 ml borosilicate vial, Vial Cap S | Available — sole-source, 4-week lead time | Made to order | from $349.00 | Pioreactor (SKU 1041), kit or pre-assembled |
Spare and repair parts priced on the vendor's catalog page this run: Pioreactor HAT PCB (SKU 2032) $99.68 · Eye-Spy PCB (SKU 2070) $19.60 · Heating PCB and accessories (SKU 2014) $44.74 · 40 ml glass vial (SKU 2056) $5.04 · 15×6 mm PTFE stir bar (SKU 2046) $2.24 · Vial Cap S (SKU 2059) $14.00 · Raspberry Pi 27 W PSU (SKU 2073) $16.74.
Substitutes
| For part | Substitute | Differences | Verified | Judgment |
|---|---|---|---|---|
| FT232RL-REEL | FT232RNL-REEL — FTDI, $4.80, Active | Same package/case (28-SSOP, 0.209" / 5.30 mm width), same supply range 3.3–5.25 V, same 15 mA supply current, same −40 °C to 85 °C range. Genuine FTDI silicon, so pyftdi bit-bang modes still work. DigiKey lists it as the manufacturer-recommended replacement. But: 0 stock everywhere checked — DigiKey 50-week factory lead, Mouser 384,761 on order, RS 84-day lead. |
verified: package/case + body width (DigiKey parametrics on both parts), supply range (DigiKey parametrics on both), FTDI silicon (manufacturer field). not verified: pin-for-pin pinout equivalence — ftdichip.com could not be fetched this run; lead pitch not given in DigiKey parametrics for either part | Correct long-term replacement, but not a near-term fix — order well ahead or design around it |
| FT232RL-REEL | CY7C65213-28PVXI — Infineon, $4.54, Active, 16,977 in stock | Same package/case (28-SSOP, 0.209" / 5.30 mm width). Supply range 1.71–5.5 V is wider than the original's 3.3–5.25 V and covers the lab's 3.3 V and 5.0 V rails — exceeds the requirement, acceptable. Supply current 20 mA vs 15 mA, negligible on a USB rail. Not FTDI silicon: the snapshot requires genuine FTDI parts for pyftdi bit-bang modes, though it allows generic bridges (CH340, CP2102) for ordinary serial. |
verified: package/case + body width (DigiKey parametrics on both parts), supply range (DigiKey parametrics on both — superset covering the lab's rails), stock and price (DigiKey + ECIA this run). not verified: pinout equivalence. Known mismatch, not an unknown: not FTDI silicon | Acceptable for plain USB-to-serial only; not acceptable anywhere pyftdi bit-bang is used |
FT231XS-U, which DigiKey suggests against FT232RL-TUBE, was rejected: it is a 20-SSOP part against the required 28-SSOP — a different package and pin count, which is a hard stop.
Verify any substitute against its datasheet before ordering — particularly the pinout claims marked unverified above.
Other dependencies
- PCB fabrication specifications — not checked. No Gerbers, schematics, KiCad/Eagle board files or mechanical CAD were included in the upload, so layer count, board dimensions, copper weight, surface finish, trace/space clearances and drill sizes are stated nowhere in the sources. In practice this blocks nothing: the HAT is bought assembled inside the kit, or separately as SKU 2032 ($99.68).
- Vendor storefront (pioreactor.com) — live. The product page and full catalog page were both fetched successfully this run.
- Documentation hub (docs.pioreactor.com) — not checked. Not fetched this run.
- Vendor shipping terms and current lead time — not checked. The fetched pages gave price and a 4-week estimated lead time but carried no retrievable statement about shipping destinations or order restrictions. Confirm both with the vendor before committing to a course schedule.
- Missing internal repository assets listed in the snapshot (
config.dev.ini,packaging/shared-assets/**,create_tables.sql,create_triggers.sql) were absent from the uploaded bundle, not from the project —config.dev.iniis present in the upstream repository root as listed this run. This is an upload-completeness gap, not a dependency failure. The individualpackaging/shared-assetspaths were not checked.
Watch list
- FT232RL-REEL and its successor FT232RNL-REEL — the original is obsolete and gone; the successor is Active but backordered at every authorized distributor (50-week DigiKey lead, 384,761 on order at Mouser). If FTDI supply has not recovered by the next check, anyone who genuinely needs FTDI silicon will be waiting quarters, not weeks.
- Pioreactor 40 mL assembly — sole-sourced from one manufacturer with a 4-week lead time and no substitute of any kind. Any vendor disruption, price change or model revision (v1.5 today, with an XR upgrade path already on sale) directly threatens the lab. Re-check price and lead time before each term.
- Raspberry Pi 4 Model B pricing — a 3x spread across listings today, and the Pi 4 is an older generation still widely stocked. Watch for the bare-board price drifting up or listings thinning as the Pi 5 line matures; the codebase pins Blinka to
RASPBERRY_PI_4B, so moving generations is not free. - DAC43608RTER — healthy today, but it is a single-manufacturer part with one driver package pinned against it (
DAC43608==0.2.7). Worth watching for lifecycle changes, since substitution latitude is essentially nil.
Snapshot What the lab depended on when it was uploaded — the baseline the readiness checks research against.
This document provides a temporal and hardware analysis for the Pioreactor Open-Source Bioreactor Cluster, an automated turbidostat and bioreactor platform for culturing and monitoring microorganisms. The platform is architected around a Raspberry Pi 4 Model B single-board computer acting as the local compute node, interfacing with a custom Pioreactor HAT/expansion board designed for 40 mL bioreactor vessels (Model pioreactor_40ml version 1.5, hardware revision 1.2, firmware revision 1.1). The system operates on a primary 5.0 V DC power rail supplying the Raspberry Pi host via USB-C or HAT header pins, with digital signaling and I2C/PWM buses running at 3.3 V logic levels dictated by the Broadcom BCM2711 GPIO interface. Peripheral hardware interfaces specifically driven by the system include Texas Instruments precision analog-to-digital converters (ADS1015/ADS1115), Texas Instruments multi-channel digital-to-analog converters (DAC43608), hardware PWM drivers for stirrers and heaters, and UART/FTDI serial expansion buses.
Bill of Materials
Note: PCB design archives (Gerbers, schematics, KiCad, or Eagle board files) were omitted from the source upload. The bill of materials below captures all physical computing hardware, integrated circuit controllers, and system modules specifically required and identified by the codebase configuration targets (getting-started.md) and worker hardware driver manifests (requirements_worker.txt).
Host Platform and Processing Hardware
- Host Single-Board Computer (SBC)
- Identity: Raspberry Pi 4 Model B (Broadcom BCM2711 quad-core Cortex-A72, targeted via configuration environment variables
BLINKA_FORCEBOARD=RASPBERRY_PI_4BandBLINKA_FORCECHIP=BCM2XXX) - Quantity: 1 per bioreactor unit
- Footprint/package: Raspberry Pi 4 Model B standard form factor (85 mm × 56 mm) with standard 40-pin GPIO male header (2.54 mm pitch)
- Electrical constraints: 5.0 V DC input rail (minimum 3.0 A recommended via USB-C or GPIO pins 2/4); all GPIO pins operate strictly at 3.3 V logic levels (non-5V tolerant)
- Substitution latitude: The codebase explicitly pins Blinka environment drivers to
RASPBERRY_PI_4BandBCM2XXX. While other Raspberry Pi models (e.g., Pi 3B+ or Pi 5) share the 40-pin header layout, substitution requires verifying compatibility with therpi_hardware_pwmandlgpio/rpi-lgpiolow-level register abstractions. - Operator control: None (embedded host computer)
- Sourcing plan: retail shopping search: Raspberry Pi 4 Model B 2GB or 4GB
- Identity: Raspberry Pi 4 Model B (Broadcom BCM2711 quad-core Cortex-A72, targeted via configuration environment variables
Integrated Circuits and Sensor Interfaces
Analog-to-Digital Converter (ADC) IC
- Identity: Texas Instruments ADS1015 (12-bit) or ADS1115 (16-bit) 4-channel I2C ADC (directly driven by
adafruit-circuitpython-ads1x15) - Quantity: 1 (minimum; used for photodiode optical density measurement)
- Footprint/package: VSSOP-10 (DGS) or X2QFN-10 (RUG)
- Electrical constraints: Supply voltage 2.0 V to 5.5 V (operates on the system 3.3 V or 5.0 V rail); I2C bus interface at 3.3 V logic levels; integrated programmable gain amplifier (PGA) and precision voltage reference
- Substitution latitude: Must remain an ADS1015 or ADS1115 variant because
adafruit-circuitpython-ads1x15hardcodes register maps, conversions, and I2C command structures specific to this Texas Instruments family. - Operator control: None
- Sourcing plan: distributor lookup: ADS1115IDGSR
- Identity: Texas Instruments ADS1015 (12-bit) or ADS1115 (16-bit) 4-channel I2C ADC (directly driven by
Digital-to-Analog Converter (DAC) IC
- Identity: Texas Instruments DAC43608 8-channel 10-bit I2C DAC (specifically required by driver package
DAC43608==0.2.7) - Quantity: 1 (used for fine optical emitter current control and analog reference setpoints)
- Footprint/package: WQFN-16 (RTE, 3 mm × 3 mm) or DSBGA-16 (YZF)
- Electrical constraints: Operating voltage 1.8 V to 5.5 V (configured for 3.3 V or 5.0 V system rails); I2C addressable bus at 3.3 V; integrated 2.5 V internal reference
- Substitution latitude: Must be exactly Texas Instruments DAC43608 (or pin/register-compatible 12-bit variant DAC53608 if driver supports it) due to register-level drivers pinned in
requirements_worker.txt. - Operator control: None
- Sourcing plan: distributor lookup: DAC43608RTER
- Identity: Texas Instruments DAC43608 8-channel 10-bit I2C DAC (specifically required by driver package
USB-to-UART / Serial Engine Interface
- Identity: FTDI USB-UART/FIFO interface bridge (driven by
pyftdi==0.57.2andpyserial==3.5) - Quantity: 1 (optional depending on auxiliary peripheral hardware expansion)
- Footprint/package: Typically FT232R (SSOP-28) or FT2232H (LQFP-64 / QFN-64)
- Electrical constraints: 5.0 V USB VBUS input; 3.3 V / 5.0 V selectable UART logic levels
- Substitution latitude: Generic USB-to-serial bridges (CH340, CP2102) work for general serial communications, but any feature relying on low-level FTDI bit-bang modes via
pyftdistrictly requires genuine FTDI silicon (FT232R, FT232H, FT2232H, or FT4232H). - Operator control: None
- Sourcing plan: distributor lookup (representative example — sources give spec only): FT232RL-REEL
- Identity: FTDI USB-UART/FIFO interface bridge (driven by
System Electromechanical & Assemblies
- Bioreactor Chamber Hardware Module
- Identity: Pioreactor 40 mL Bioreactor Assembly (target model
pioreactor_40mlv1.5, hardware rev 1.2, firmware rev 1.1) - Quantity: 1 per node
- Footprint/package: Custom 40 mL vial holder assembly, optical sleeve with photodiode/LED pockets, magnetic stirring base, and heating jacket
- Electrical constraints: Interfaces with Raspberry Pi GPIO for PWM-driven magnetic stirring, heating elements, and peristaltic pumps
- Substitution latitude: Custom electromechanical assembly proprietary to the Pioreactor ecosystem.
- Operator control: Vial insertion, optical cap locking, fluidic tubing connections
- Sourcing plan: retail shopping search: Pioreactor 40ml Bioreactor Kit
- Identity: Pioreactor 40 mL Bioreactor Assembly (target model
Software and network dependencies
Operating System: Raspberry Pi OS (Debian-based, targeted at Raspberry Pi 4B) or Ubuntu Linux (via WSL2 or native POSIX for development). Repository/Origin: Raspberry Pi Foundation / Canonical. Version: not stated.
- Version source: not stated in manifests.
- Pinning status: Unpinned.
- Manifest location: None (referenced in
getting-started.md). - Check plan: support-status lookup: debian 12
Python Runtime: CPython. Repository/Origin: https://www.python.org/. Version: 3.13.0.
- Version source: pinned in getting-started.md (
pyenv install 3.13.0and Homebrewpython@3.13). - Pinning status: Pinned to minor/patch version in dev documentation.
- Manifest location:
getting-started.md. - Check plan: support-status lookup: python 3.13.0
- Version source: pinned in getting-started.md (
Node.js Runtime: Node.js. Repository/Origin: https://nodejs.org/. Version: 25.
- Version source: pinned in getting-started.md (
nvm install 25). - Pinning status: Pinned to major version 25.
- Manifest location:
getting-started.md. - Check plan: support-status lookup: nodejs 25
- Version source: pinned in getting-started.md (
MQTT Broker: Eclipse Mosquitto. Repository/Origin: https://mosquitto.org/. Version: not stated.
- Version source: not stated in documentation (installed via
apt install mosquittoorbrew install mosquitto). - Pinning status: Unpinned.
- Manifest location:
getting-started.md. - Check plan: not checkable: version not stated
- Version source: not stated in documentation (installed via
Database Engine: SQLite3. Repository/Origin: https://sqlite.org/. Version: not stated.
- Version source: not stated in documentation (installed via
apt install sqlite3). - Pinning status: Unpinned.
- Manifest location:
getting-started.md. - Check plan: not checkable: version not stated
- Version source: not stated in documentation (installed via
Core Python Base Packages (Manifest:
requirements_base.txt):click: Version 8.4.1. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: click / pypi / 8.4.1paho-mqtt: Version 2.1.0. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: paho-mqtt / pypi / 2.1.0colorlog: Version 6.10.1. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: colorlog / pypi / 6.10.1msgspec: Version 0.21.1. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: msgspec / pypi / 0.21.1crudini: Version 0.9.6. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: crudini / pypi / 0.9.6iniparse: Version 0.5. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: iniparse / pypi / 0.5packaging: Version 26.2. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: packaging / pypi / 26.2Flask: Version 3.1.3. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: Flask / pypi / 3.1.3Jinja2: Version 3.1.6. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: Jinja2 / pypi / 3.1.6MarkupSafe: Version 3.0.3. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: MarkupSafe / pypi / 3.0.3flup6: Version 1.1.1. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: flup6 / pypi / 1.1.1huey: Version 3.3.0. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: huey / pypi / 3.3.0python-dotenv: Version 1.2.2. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: python-dotenv / pypi / 1.2.2Werkzeug: Version 3.1.8. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: Werkzeug / pypi / 3.1.8itsdangerous: Version 2.2.0. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: itsdangerous / pypi / 2.2.0blinker: Version 1.9.0. Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: blinker / pypi / 1.9.0pyyaml: Version 6.0.2 (noted as base-image preinstalled). Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: pyyaml / pypi / 6.0.2rpi-lgpio: Version 0.6 (noted as base-image preinstalled). Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: rpi-lgpio / pypi / 0.6lgpio: Version 0.2.2.0 (noted as base-image preinstalled). Version source: pinned in requirements_base.txt. Check plan: vulnerability lookup: lgpio / pypi / 0.2.2.0
Leader Node Python Packages (Manifest:
requirements_leader.txt):mcp-utils-msgspec: Version 3.0.1. Version source: pinned in requirements_leader.txt. Check plan: vulnerability lookup: mcp-utils-msgspec / pypi / 3.0.1- Missing recursive manifest reference:
requirements_leader.txtcontains an unresolvable reference-r requirements.txt(the root filerequirements.txtwas not included in the source files).
Worker Hardware Control Python Packages (Manifest:
requirements_worker.txt):Adafruit-Blinka: Version 9.1.0. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: Adafruit-Blinka / pypi / 9.1.0adafruit-circuitpython-ads1x15: Version 2.2.23. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: adafruit-circuitpython-ads1x15 / pypi / 2.2.23adafruit-circuitpython-busdevice: Version 5.2.9. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: adafruit-circuitpython-busdevice / pypi / 5.2.9adafruit-circuitpython-connectionmanager: Version 3.1.1. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: adafruit-circuitpython-connectionmanager / pypi / 3.1.1adafruit-circuitpython-requests: Version 4.1.3. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: adafruit-circuitpython-requests / pypi / 4.1.3adafruit-circuitpython-typing: Version 1.10.3. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: adafruit-circuitpython-typing / pypi / 1.10.3Adafruit-PlatformDetect: Version 3.89.1. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: Adafruit-PlatformDetect / pypi / 3.89.1Adafruit-PureIO: Version 1.1.11. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: Adafruit-PureIO / pypi / 1.1.11plotext: Version 5.2.8. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: plotext / pypi / 5.2.8pyftdi: Version 0.57.2. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: pyftdi / pypi / 0.57.2pyserial: Version 3.5. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: pyserial / pypi / 3.5pyusb: Version 1.3.1. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: pyusb / pypi / 1.3.1rpi_hardware_pwm: Version 0.3.1. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: rpi_hardware_pwm / pypi / 0.3.1grpredict: Version 26.4.7. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: grpredict / pypi / 26.4.7smbus2: Version 0.5.0. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: smbus2 / pypi / 0.5.0numpy: Version 2.3.2. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: numpy / pypi / 2.3.2DAC43608: Version 0.2.7. Version source: pinned in requirements_worker.txt. Check plan: vulnerability lookup: DAC43608 / pypi / 0.2.7- Missing recursive manifest reference:
requirements_worker.txtcontains-r requirements.txt(the root filerequirements.txtis missing from the repository root).
Unpinned Build and Environment Tools:
- In
getting-started.md, the dependenciesbuild-essential,curl,git,make, anddirenvare installed viaaptorbrewwithout version pinning. - Node frontend dependencies installed via
make frontend-installare unpinned in the documentation; package.json was not included in the upload.
- In
Network Exposure:
- Backend REST API (Flask): Listens on HTTP TCP port 4999 bound to localhost (
http://127.0.0.1:4999). Cited ingetting-started.mdunder section 7. - Frontend Web Interface (React/Vite dev server): Listens on HTTP TCP port 3000 (
http://localhost:3000) and internally proxies API traffic to port 4999. Cited ingetting-started.mdunder section 7. - MQTT Message Broker (Mosquitto):
- TCP standard MQTT port 1883 bound to localhost (
listener 1883 127.0.0.1). Cited ingetting-started.mdunder section 6. - WebSockets port 9001 bound to localhost (
listener 9001 127.0.0.1, protocol websockets). Cited ingetting-started.mdunder section 6. - Authentication: Configured with
allow_anonymous truefor local development. Cited ingetting-started.md.
- TCP standard MQTT port 1883 bound to localhost (
- Cluster Inter-Node Communication: Orchestration commands (
pios) control remote worker nodes (pio). While standard Pioreactor cluster deployments communicate via network MQTT and SSH across units, explicit default SSH credentials, keys, or remote port definitions are not stated in the uploaded excerpts.
- Backend REST API (Flask): Listens on HTTP TCP port 4999 bound to localhost (
Remaining Temporal Dependencies
External Web Downloads & URLs
The build and setup process requires fetching resources from external web endpoints:
- Git Repository:
https://github.com/Pioreactor/pioreactor.git(cited ingetting-started.md) - nvm Installation Script:
https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh(cited ingetting-started.md) - pyenv Installer:
https://pyenv.run(cited ingetting-started.md) - Documentation Hub:
https://docs.pioreactor.com/(cited inPioreactor_README.md) - Project Website:
https://pioreactor.com/(cited inPioreactor_README.md)
Missing Internal Repository Assets:
- Setup instructions in
getting-started.mddepend on files not included in the uploaded file bundle:config.dev.inipackaging/shared-assets/pioreactor/ui/packaging/shared-assets/pioreactor/camera/packaging/shared-assets/pioreactor/exportable_datasets/packaging/shared-assets/pioreactor/experiment_profiles/packaging/shared-assets/sql/create_tables.sqlpackaging/shared-assets/sql/create_triggers.sql
PCB Fabrication Specifications
No raw PCB layout files, Gerber archives, or mechanical CAD files (STEP/STL) were included in this upload. Consequently, PCB layer count, board dimensions, finished copper weight, surface finish, minimum trace/space clearances, drill sizes, and enclosure mounting hole coordinates are not stated in the sources. The only hardware metadata provided specifies the Pioreactor target as Model pioreactor_40ml version 1.5, Hardware revision 1.2, and Firmware revision 1.1 designed to mate with a Raspberry Pi 4B.