RISER-01
Fermentation instrument
Proof of concept · unvalidated

Product requirements · Draft 0.3

RISER-01

A white-PLA box beside a starter jar watches the dough climb, and the phone on the same Wi-Fi tells the baker when it has doubled, proven in one real, unplugged, eight-hour session.

Neil (owner) · agent-drafted · 2026-10-17 · proof of concept · every requirement cites a source or says "proposed"; priorities are proposals

Source labels: Neil 17:18Z = Neil's own words (UTC, Codex session) · Codex = a Codex proposal Neil accepted by moving on · Print notes, Expert review, Eng set = files under source/ · Proposed = new in this draft

Timing a starter means watching a jar

A home baker feeds a sourdough starter and has to catch it near its peak before mixing dough. The rise takes hours and the peak moves with room temperature and humidity, so the baker keeps coming back to look.

For this proof of concept the baker is Neil. "A chargeable device that watches your sourdough rise, tracks ambient temperature and moisture, and connects to an app on your phone over wifi — thinking very low cost, esp32." Neil 17:18Z

Current workaround. Checking the jar by eye. The sources don't record this, so it is proposed and tested by H6.

Why now. On 2026-10-17 Neil committed to a physical first build: "I'm going to be doing this first with a single white color PLA … on an ender 2 pro" Neil 20:13Z, and set the goal: "I want to see how far I can push the first prototype" Neil 17:30Z. The concept, renders, CAD and site exist; nothing has been printed, wired or measured. Print notes · Expert review, follow-up 3

Six weeks from concept to one measured session

The time is fixed and the scope fits it. Six weeks is a proposed appetite (D-11). The milestone is one working prototype that passes the acceptance session in §5. It is not a product, a production PCB, a cost-down, or a reliable unattended alert on every phone state.

Sat 10-17 · doneConcept, CAD Rev C, white-PLA study, PRD 0.2Neil, Codex agents
Sat 11-07Bench device sends JPEG + temp/RH to the phone; video set labelledNeil
Sat 11-28Acceptance session: 8 h unplugged, battery trace, doubling alertNeil · the §4 review

After the milestone: read the session log (lost frames, reconnects, alert latency per phone state, battery headroom), then decide battery capacity (D-03), cost target (D-04) and whether iPhone needs a backend (revisit D-07).

One person, two roles

NeilOwner
P-MMaker · builds R-01
P-BBaker · uses R-01
Other bakersNot users in the PoC

No reporting line: whoever holds the phone on the same Wi-Fi sees everything.

P-M

Maker (Neil)

Prints, wires, flashes and measures the prototype; owns the training set and model

"I want to see how far I can push the first prototype, this is the AI age, brother." Neil 17:30Z

Cadence
Evening and weekend build sessions
Opens to
Session log and battery trace
Week
Prints coupons, solders the power path, records footage, labels frames, retrains, runs a session overnight, reads the log
Sees
Every frame, flag, raw value and log line; nothing hidden
P-B

Baker (Neil, feeding a starter)

Feeds the starter, sets the jar beside R-01, waits for the alert

"…a chargeable device that watches your sourdough rise, tracks ambient temperature and moisture, and connects to an app on your phone over wifi." Neil 17:18Z

Cadence
One session per feeding, about daily; 4–12 h (proposed)
Opens to
Rise curve, latest frame, temp and RH
Week
Feeds, marks the baseline, walks away, gets the alert, glances at the curve, mixes dough
Sees
Rise %, curve, frame, temp/RH, battery, flagged gaps; not raw model scores (proposed)

What the acceptance session has to answer

Hypotheses replace success metrics. All are open at Draft 0.3; the 11-28 session is the review.

H1Open

The side camera sees the dough line through the glass. P-B, P-M

Question: what share of frames over 8 h were flagged unmeasurable (residue, condensation, light changes), and why?

Neil 17:23Z (faces the jar) · Codex (glass and residue risk)

H2Open

A model trained on Neil's videos measures rise on the phone. P-M

Question: mean height error on held-out sessions as a share of jar fill height, and inference time per frame on the chosen phone.

Neil 17:27Z, 17:28Z

H3Open

Eight hours unplugged is reachable with a cell that fits the shell. P-B

Question: measured average current with capture every 30–60 s and batched Wi-Fi; what capacity gives 8 h plus warning headroom; does it fit?

Neil 17:22Z · Codex (16 h aspiration) · Eng set (Rev C 1,000 mAh illustrative; Rev D models the 103450 cell)

H4Open

Room readings stay honest inside a warm box. P-B

Question: temperature and RH offset against a reference after 60 min, plugged and unplugged.

Codex · Eng set sheet 05 (keep heat away from RH sensor)

H5Open

The phone delivers the alert in time. P-B

Question: alert latency after a verified doubling in each phone state (foreground + plugged, locked, backgrounded, Wi-Fi dropped). Which states fail outright on the D-01 platform?

Neil 17:28Z, 17:30Z · Codex

H6Open

A curve and an alert beat checking the jar. P-B

Question: across PoC sessions, did Neil stop checking the jar between feeding and alert? If not, what was he checking for?

Proposed

H7Open

The enclosure prints in white PLA on the Ender-2 Pro without roof supports. P-M

Question: do the split trays, face insert and base print, dry-fit, hold the camera on axis and clear the USB-C plug?

Neil 20:13Z · Print notes

Requirements by persona

P0 milestone fails without it P1 planned for the milestone P2 if time allows Not done nothing built yet

P-B · Baker

Per feeding
RISE-B-01P0Not done

Mark the jar once, then leave it

The baker sets a clear, straight-sided jar on the marked spot of the base and marks jar bottom and starting level on the first frame. Rise is reported as % of that baseline.

Check
Calibration takes under 2 min; a static jar reads 0 ± 3 % rise for 30 min.
Beat
After feeding
Source
Codex 17:24Z (placement, marked baseline) · thresholds proposed
RISE-B-02P0Not done

Rise curve on the phone

The app shows rise % against elapsed time, the latest frame, air temperature and RH, updating while the session runs.

Check
A captured frame appears as a curve point within 2 min of capture.
Beat
Glance at the curve
Source
Neil 17:18Z · Codex (curve, latest frame, elapsed time)
RISE-B-03P0Not done

Doubling alert

The baker sets a rise threshold (default 2×). The phone posts a local notification when measured rise crosses it.

Check
App foregrounded, phone plugged in: the alert fires within 5 min of a manually verified doubling (tape mark on the jar, timestamped).
Beat
Alert → mix dough
Source
Codex (threshold alert, 5-min check) · trigger is D-05
RISE-B-04P1Not done

Peak alert

The phone also flags the peak: rise has stopped climbing or started to fall for a set window.

Check
On 3 recorded sessions the flagged peak is within 15 min of the peak Neil marks by hand on the curve.
Beat
Alert → mix dough
Source
Proposed · trigger is D-05
RISE-B-05P0Not done

Air temperature and humidity

R-01 reports room air temperature and relative humidity with each frame. RH describes room air, not dough hydration.

Check
After 60 min of operation, within ±1 °C and ±5 %RH of a reference hygrometer beside the device (H4).
Beat
Glance at the curve
Source
Neil 17:18Z, 17:22Z ("air humidity") · tolerances proposed
RISE-B-06P0Not done

Runs a full session unplugged

R-01 runs a capture session on battery for at least 8 h.

Check
One 8 h unplugged session with capture, Wi-Fi delivery and a logged battery trace; record remaining capacity at hour 8 as headroom.
Beat
Set and walk away
Source
Neil 17:22Z ("it just needs to last ~8hrs") · Codex (check) · target is D-02
RISE-B-07P0Not done

Low-battery light

An amber light turns on when forecast remaining runtime falls below a threshold. The forecast uses measured load, not a fixed battery voltage.

Check
On a full discharge trace, the light turns on at the D-02 threshold and the device then runs at least that long (±15 %).
Beat
Glance at the device
Source
Neil 17:22Z ("<8hours left") · Codex (forecast, not voltage) · conflict is D-02
RISE-B-08P0Not done

Always pluggable over USB-C

R-01 can stay on a USB-C wall adapter indefinitely and charges while it runs. Plugging or unplugging does not interrupt the session.

Check
Plug and unplug 10 times mid-session: no reboot, no gap longer than one capture interval.
Beat
Set and walk away
Source
Neil 17:22Z ("always be plugged straight into the wall") · Neil 19:40Z ("make it usb-c") · Codex (power path)
RISE-B-09P0Not done

Phone finds R-01 on local Wi-Fi

R-01 and the phone talk over the home network with no cloud service.

Check
On the same network, the app finds R-01 and shows a live frame within 30 s of opening.
Beat
Start session
Source
Neil 17:18Z · Codex (local only) · provisioning is D-12
RISE-B-10P1Not done

Gaps and bad frames are shown, not smoothed

Frames the model cannot measure are flagged; the curve shows a gap instead of an invented point.

Check
Cover the jar for 5 min mid-session: the curve shows a flagged gap and no points in that window.
Beat
Glance at the curve
Source
Codex
RISE-B-11P1Not done

Survives a Wi-Fi drop

During an outage R-01 keeps capturing and delivers buffered frames when the network returns, as far as storage allows; anything lost shows as a gap.

Check
Turn the access point off for 5 min: frames are backfilled or the gap is flagged; no session restart.
Beat
Set and walk away
Source
Codex (buffering depends on storage)

P-M · Maker

Build sessions
RISE-M-01P0Not done

Prints in white PLA on the Ender-2 Pro

All printed parts are one white PLA, sliced for a stock Ender-2 Pro (165 × 165 × 180 mm, 0.4 mm nozzle). The shell splits into front and rear trays printed on their outer faces, plus a flat face insert and base, so the roof needs no supports. No paint, colour or lettering.

Check
Every part slices inside the build volume with no roof supports; parts print and dry-fit; the aperture lines up with the camera; the USB-C plug clears.
Beat
Build
Source
Neil 20:13Z · Print notes (roof bridging, split, settings) · split modelled in Rev D, concept, unprinted
RISE-M-02P0Not done

Camera faces the jar from the side

An ESP32-S3 with PSRAM drives a camera that looks at the jar from beside it, at a distance fixed by the base mark.

Check
With the jar on the mark, the frame covers jar bottom to the top of a doubled starter and the dough line is in focus.
Beat
Build
Source
Neil 17:23Z ("placed facing the jar"), 17:18Z (esp32) · Codex (ESP32-S3, camera) · OV2640 on the Freenove board (D-06)
RISE-M-03P0Not done

Frame and reading on a fixed cadence

R-01 captures a JPEG every 30–60 s with a same-timestamp SHTC3 reading and sends them to the phone in batches.

Check
Over the 8 h session at least 95 % of expected frames reach the phone; the rest are logged as lost.
Beat
Session runs
Source
Codex (cadence, batching, SHTC3) · 95 % proposed
RISE-M-04P0Not done

Power path holds under camera and Wi-Fi bursts

USB-C 5 V sink, power-path charger, protected one-cell LiPo and 3.3 V rail: no brownout when camera and Wi-Fi run together, and no more USB current than the source allows.

Check
No brownout reset in the 8 h session or in 100 back-to-back capture-and-send cycles at the lowest battery voltage reached; USB input current on a meter stays within the source's advertised current.
Beat
Build
Source
Eng set (sheet 04, electrical-sources.md) · Codex · modules for the PoC (D-06); run-while-charging unverified
RISE-M-05P0Not done

Training set from Neil's videos

Neil's fermentation videos become a labelled set: selected frames, draft auto-labels reviewed by hand; labels for jar region, dough boundary, measurable flag, jar bottom and initial level. Train/eval split by recording session, never by random frame.

Check
A manifest lists each frame's session; no session is in both train and eval.
Beat
Build
Source
Neil 17:27Z ("could you generate a training set?") · Codex (labels, split)
RISE-M-06P0Not done

Rise model runs on the phone

Segmentation runs in the app, not on the ESP32 or a server, and turns each frame into a height and a measurable flag.

Check
Held-out sessions: mean absolute height error ≤ 5 % of jar fill height; inference ≤ 2 s per frame on the D-01 phone.
Beat
Session runs
Source
Neil 17:28Z ("what if the model ran in the app?") · thresholds proposed
RISE-M-07P1Not done

Session log

Each session logs frames captured, delivered and lost, reconnects, flagged frames, alert time and phone state, and the battery voltage/current trace.

Check
The acceptance session yields one exportable log that answers H1, H3 and H5 without extra instruments.
Beat
Review
Source
Codex · Neil 17:30Z ("measure where it breaks")
RISE-M-08P1Not done

Alert delivery measured per phone state

The doubling alert is tested in foreground + plugged, locked, backgrounded and Wi-Fi-dropped states. Results are recorded, not promised.

Check
A table of latency or failure per state on the D-01 platform, at least one session each.
Beat
Review
Source
Neil 17:28Z (users enable permissions) · Codex (no iOS always-run; Android foreground service)
RISE-M-09P1Not done

Device footage joins the training set

Sessions recorded through R-01's own camera are labelled and added, since they match deployment better than other videos.

Check
At least 3 full R-01 sessions labelled and the model retrained; held-out error reported before and after.
Beat
Build
Source
Codex
RISE-M-10P2Not done

One button starts and stops a session

A single top button starts or ends a session without the phone.

Check
Press starts capture within 5 s; long press ends it; both appear in the log.
Beat
Start session
Source
Codex (S1 session button, sheet 05) · behaviour proposed

Mentioned, explicitly not built

No-gos and rabbit holes

No-gos

  • No cloud service or server inference (Codex, accepted; D-08).
  • No USB Power Delivery; 5 V sink only (Eng set).
  • No claim that rise means ready; no dough hydration measurement (Codex · Expert review).
  • No paint, colour, lettering or finishing on the first print (Neil 20:13Z · Print notes).
  • No cost, runtime or tolerance claims before measurement or quotes (Eng set).
  • No production PCB, fab BOM or released STL/G-code as a milestone deliverable (Eng set).

Rabbit holes

  • Making the upright roof bridge; split the shell instead (Print notes).
  • Tuning the model on other footage before R-01's camera has any (Codex).
  • Coaxing iOS into background execution; measure it instead (Codex).
  • Building a fuel gauge; forecast from the measured discharge trace (proposed).
  • Polishing renders, film or site while nothing is printed (proposed; Neil 20:13Z "scale back the quality").
  • Chasing lab-grade RH; the reading only has to be honest about room air (proposed).

Conflicts and decisions

IDQuestionOptionsOwnerNeeded byStatus
D-01Which phone platform first?iPhone · AndroidNeil10-24Decided (default, delegated 10-17; reversible): iPhone first (Neil works on macOS; Core ML on-device); Android later
D-02Runtime target and light threshold. Neil said ~8 h runtime and a light at <8 h left; these conflict.8 h total, light at a small margin (e.g. <1 h) · ~16 h new, light at <8 h (Codex)Neil11-07Decided (default, delegated 10-17; reversible): ~16 h on a fresh charge; low-battery light when <8 h remain (satisfies both stated requirements)
D-03Battery capacity and cellSize from measured current (H3); the Rev D model carries a 103450 cell (10 × 34 × 50 mm)Neil11-07Decided (default, delegated 10-17; reversible): 2,000 mAh 1S Li-Po (103450-class), resized after measured current (H3)
D-04Cost target for "very low cost"BOM ceiling in $ · no target for the PoCNeilafter 11-28Decided (default, delegated 10-17; reversible): PoC BOM ceiling US$45 excluding phone and filament; production target revisited after 11-28
D-05What triggers the alert?Rise threshold (2×) · peak detection · bothNeil11-07Decided (default, delegated 10-17; reversible): Both: rise threshold (default 2×) is P0; peak detection stays P1
D-06Electronics path for the PoC (architectural)Custom board per sheets 04/05 · off-the-shelf ESP32-S3 camera board with charger and sensor modulesNeil10-24Decided (default, delegated 10-17; reversible): Off-the-shelf for the PoC: Freenove ESP32-S3-WROOM CAM board (OV2640) + Adafruit SHTC3 breakout + 5 V 1 A USB-C charge/discharge module; custom board (sheets 04/05) deferred post-PoC. 10-18: board changed from the Seeed XIAO ESP32S3 Sense to the Freenove board (Neil); enclosure internals refitted in Rev D
D-07Unattended alertsForeground first, measure the rest · backend push nowNeil10-17Decided: foreground first (Neil 17:30Z)
D-08Cloud in the PoCNone · backendNeil10-17Decided: none (Codex, accepted)
D-09Charging and wall-power connectorUSB-C · otherNeil10-17Decided: USB-C (Neil 19:40Z)
D-10How to measure riseTop-down ToF · side camera · optical stripNeil10-17Decided: side camera (Neil 17:23Z); ToF rejected
D-11AppetiteSix weeks to 11-28 (proposed) · otherNeil10-24Decided (default, delegated 10-17; reversible): Six weeks to 11-28 accepted
D-12Wi-Fi credentials for the PoCCompiled in · SoftAP or BLE provisioningNeil11-07Decided (default, delegated 10-17; reversible): Compiled-in credentials for the PoC; provisioning post-PoC
D-13Supported jarNeil's own jar only · a size rangeNeil10-24Decided (default, delegated 10-17; reversible): Neil's own jar only
D-14Brand palette (chosen by Codex, not stated by Neil)Keep · changeNeilafter 11-28Decided (default, delegated 10-17; reversible): Keep the palette

Build spec and sources

Not in this PRD

Architecture lives in the engineering set and first-print notes.

source/engineering/rise-r01-engineering-set.pdf (sheets 01–03 mechanical, 04–05 electrical) · electrical-sources.md · README.txt · source/first-print-notes.txt

The electrical review's D1 polarity finding appears fixed: source/engineering/source/electrical.py line 33 draws the clamp cathode toward VBUS; confirm on the built board. This draft was reconciled in one author pass, without separate researcher or expert agents and without a web market check; a review pass is still owed.