Inspiration

Bioreactors are everywhere, from brewing and pharmaceuticals to algae farms and lab-grown food, but most of them are either hand-monitored by a human with a clipboard or locked behind six-figure industrial SCADA systems. We wanted to see if a small team could bridge that gap: a low-cost, camera and sensor-driven reactor that anyone can run from a browser, with an AI copilot watching over it.

What it does

JERM is a smart bioreactor platform that combines live hardware telemetry, computer-vision turbidity analysis, and an AI assistant into a single real-time dashboard.

  • Live sensor monitoring — temperature, humidity, pH, and light stream from an Arduino over serial at 2-second intervals.
  • Camera-based turbidity — the browser's webcam measures sharpness, color, and brightness to estimate how cloudy the culture is, with a one-click calibration baseline.
  • Health scoring — a blended rules + ML model fuses sensor readings and image features into a single health score with trend and anomaly risk.
  • AI assistant (JERM AI) — a Cerebras-powered chat sidebar that has access to the live reactor state, answers questions and suggests parameter adjustments.
  • Remote actuation — toggle the stirrer motor from the dashboard or via a physical button on the device; both stay in sync.
  • Auto-recommendations — the backend generates plain-English nudges ("raise temperature by 0.5 °C", "pH trending low") based on the current component scores.

How we built it

  • Hardware: Arduino with a DS18B20 temperature probe, pH sensor, light/humidity sensors, servo-driven stirrer, and a tactile override button. Firmware speaks a simple line-based protocol over serial.
  • Backend: Python + FastAPI with a WebSocket streaming loop, a StateStore for recent history, a rules-based health model blended 60/40 with a scikit-learn predictor, and dedicated endpoints for the assistant (/api/assistant/chat, /insight, /tts) and camera (/api/camera/turbidity).
  • Frontend: React 19 + Vite + TypeScript + Tailwind. Recharts for trend graphs, a custom WebGL-free camera pipeline for client-side turbidity extraction, and a slide-in AI assistant sidebar with auto-resizing chat input, voice playback, and quick-insight shortcuts.
  • AI stack: Cerebras for low-latency assistant responses, ElevenLabs for natural-sounding speech, with a browser speechSynthesis fallback.

Challenges we ran into

  • Getting consistent turbidity scores from a consumer webcam across different lighting conditions — solved by adding a calibration baseline and blending multiple features (sharpness, saturation, blue/red ratio) instead of relying on brightness alone.
  • Keeping the Arduino physical button and the web UI in sync for the stirrer without race conditions — fixed by having the device echo its state back on every change and letting the backend treat the device as the source of truth.
  • Gracefully degrading when hardware isn't connected — the backend swaps in a MockSerialReader so the whole stack still runs for demos and development.

Accomplishments that we're proud of

  • A full end-to-end pipeline (sensor → serial → backend → WebSocket → UI → AI) that runs live at 2 Hz without glitches.
  • Client-side turbidity that works on any laptop camera — no dedicated optical sensor required.
  • An AI assistant that actually has situational awareness of the reactor, not just a generic chatbot pasted on top.
  • Clean graceful-degradation story: missing camera, missing Arduino, missing API keys all fall back instead of crashing.

What we learned

  • How much of "industrial" monitoring is really just good UX on top of cheap sensors.
  • Blending a hand-written rules model with a small ML model gave us more interpretable recommendations than either alone.
  • WebSockets + a single central StateStore is a dramatically simpler architecture than polling everywhere, and it scales to multiple dashboards
    trivially.
  • Prompt-caching the assistant's system context (reactor state schema + role) noticeably cut latency on repeated questions.

What's next for JERM

  • Closed-loop control — let the AI assistant propose parameter changes and, with user approval, actually push them to the Arduino.
  • Multi-reactor support with per-device dashboards and fleet-level health.
  • Training the ML model on real long-running culture data instead of Scripps dataset.
  • Mobile-friendly layout and push notifications when anomaly risk spikes.
  • Plug-in sensor modules (DO, CO₂, OD₆₀₀) for research-grade use.

Built With

Share this project:

Updates