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
- arduino
- cerebras
- elevenlabs
- fastapi
- opencv
- python
- react
- recharts
- scikit-learn
- tailwindcss
- typescript
- vite
- websockets
Log in or sign up for Devpost to join the conversation.