Up to 55% of the ~21,000 annual US stillbirths are preceded by one sign: the baby moved less. The instrument currently aimed at that signal is a woman lying in the dark at 3am trying to remember whether last Tuesday felt like this.

She usually knows. She just can't prove it. "He's been quieter lately" is not a measurement, and it does not survive the drive to the hospital.

Preggo Pillow puts the instrument inside the pillow she was already sleeping on.


Inspiration

A failing placenta doesn't announce itself. It delivers less oxygen, and the baby does the only thing it can — it conserves, and it moves less.

That slowdown is the earliest warning anyone gets. It's why RCOG Green-top Guideline No. 57 treats reduced fetal movement as a red flag, and why it explicitly refuses to set a universal kick count. What matters is a change from that baby's own pattern.

So the device can't measure one baby against a population. It has to measure one baby against itself, every night, for weeks.

What it does

Records fetal movement all night. Learns the baseline for one specific baby. Tells the mother when tonight breaks that pattern.

Two consecutive nights more than 25% below her own baseline, and it:

  1. Places a real phone call to her emergency contact
  2. Prints the page she hands her midwife — fourteen nights of counts, her baseline, exactly what changed, and the guideline it was assessed against

It will never tell her the baby is fine.

False reassurance is the documented failure mode of home fetal monitoring — it delays women from seeking care. So the system is architecturally permitted exactly one clinical sentence:

This is different. Be seen today.

How we built it

The hardware is the whole idea

Every part of this was chosen to solve one problem: a single sensor on a belly cannot tell a kick from a woman rolling over. Both are just acceleration. Published work puts one abdominal accelerometer near 50% detection, drowned by breathing and coughing.

Three accelerometers, two modalities, one reference node.

Node Placement Role
A1 Upper abdomen Signal
A2 Lower abdomen Signal
REF Lumbar / back Common-mode reference

Everything she does — breathing, coughing, rolling — reaches all three at once. Subtract the reference node on her back and maternal motion cancels. What survives happened at the abdomen only. That's the baby.

Per axis:

$$ s(t) = \text{HPF}\big(a_{1}\big) + \text{HPF}\big(a_{2}\big) - 2\,\text{HPF}\big(a_{\text{ref}}\big) $$

Then magnitude → adaptive threshold → refractory gate.

Fail-closed. With no reference node reporting, the detector refuses to count at all. A missing reference isn't a degraded mode — it's a mode that silently counts the mother as the baby.

Bottle caps as a stethoscope

Movement is one signal. Sound is another, and a bare microphone against fabric is useless — it hears the room, not the abdomen.

So we built an acoustic coupler out of bottle caps: a sealed cap forms a small air chamber over the mic element, the cap face acts as the diaphragm, and the rim presses the seal against the abdomen. Same principle as the bell of a stethoscope — trap a column of air, and body-side sound pressure reaches the element while airborne room noise is rejected by the seal.

Cost: nothing. Effect: a second, physically independent modality that corroborates the accelerometer chain instead of duplicating it. A false positive now has to fool motion and sound.

Shielding and structure

  • Metal enclosure around the battery cell — shielding on the one component sitting closest to the abdomen all night. Nothing about this device gets to be a question mark on a product a pregnant woman sleeps on for fourteen weeks.
  • Range-tested structure. We didn't guess placement. We ran the assembled pod to find the maximum usable range of each sensor — how far from the source a node can sit and still register, and how far apart A1, A2 and REF can be before common-mode subtraction stops cancelling. The pillow geometry is built to that measured envelope, not to what looked reasonable on a table.

Full sensor stack

Sensor Output Why it's there
3× Grove 3-axis accelerometer Raw acceleration, all axes Differential kick detection
Bottle-cap stethoscope mic Chamber-coupled abdominal audio Independent second modality
Grove rotary dial Mother taps each felt kick Human ground truth, same night, same kicks
Grove button Session start / stop No phone needed at 3am
Grove buzzer + LED Local state, silent by default Confirms recording without waking her
Grove temp / humidity Pillow-side environment Rules out thermal drift on the accelerometers
Presage SmartSpectra (FDA-cleared, 510(k) K254169) Maternal pulse + respiration, contactless Control arm — "the baby moved less" means nothing unless she didn't change

Signal path, end to end

Stage Stack Responsibility
Edge Raspberry Pi 5, Grove I²C hat Synchronous sampling, timestamping, offline-safe buffer
Ingest Go, server-sent events Streams frames; survives Wi-Fi loss without losing a night
Detection Go — differential filter + refractory FSM Writes to detections only
Store SQLite (edge) → TigerData 14-night rolling window
Inference Google Cloud Run Baseline, deviation test, two-night confirmation, Gemini clinician summary
Memory Backboard Per-pregnancy state across nights
Escalation Vapi + ElevenLabs Places an actual phone call
Identity Auth0 Mother / partner / clinician scopes
Frontend Vercel Live night view, 14-night chart, printable one-pager

Why the statistics are deliberately conservative

Baseline is the median of prior nights, tonight excluded — a bad night cannot drag down its own reference:

$$ B_n = \text{median}\{\,c_{n-14},\; \dots,\; c_{n-1}\,\} $$

The alarm fires only when this holds on two consecutive nights:

$$ \frac{B_n - c_n}{B_n} > 0.25 $$

Fetal sleep cycles run 20–40 minutes, and roughly 70% of single quiet episodes are completely benign. A one-night alarm is noise, and noise is how a device like this ends up in a drawer.

Accomplishments that we're proud of

  • 29 / 30 delivered kicks detected
  • 0 false positives across 20 deliberate maternal movements — rolling, coughing, sitting up
  • 306 tests, green under the Go race detector

The count on screen reads from the detections table only. It never touches commands, so the detector has no idea a kick was ever ordered. Hand a judge the pod, let them tap it with a finger, and the number still moves.

The demo is not a playback.

Challenges we ran into

Maternal motion is 10–100× the amplitude of a kick and sits in the same frequency band, so filtering alone never worked — the reference node was the only thing that did. Time-aligning three accelerometers tightly enough for common-mode subtraction to actually cancel took most of the night.

Sealing the bottle-cap chamber turned out fiddlier than the DSP. An imperfect rim seal quietly turns the coupler back into an open microphone, and the failure is invisible in the data. Finding the outer range of the accelerometers meant walking the nodes apart until subtraction stopped cancelling, then building the pillow inside that measured limit rather than around it.

The hardest constraint wasn't technical. Building a monitor that is structurally incapable of saying "you're fine" meant deleting the features that felt most reassuring and kept the device most dangerous.

What we learned

Sensor count beats signal processing when the noise is physically co-located with the signal. And a second modality bought us more than a better filter ever did — two cheap, independent physical principles beat one clever algorithm.

In clinical tooling, the artifact the mother hands her midwife matters more than the number on the screen. It has to survive the drive to the hospital.

What's next for Preggo Pillow

  • [ ] IRB-track validation against clinical CTG
  • [ ] Per-baby adaptive thresholds that tighten as the 14-night window fills
  • [ ] Fusing the acoustic channel into the detector as a hard gate, not just corroboration
  • [ ] Control arm expanded from maternal vitals to full overnight actigraphy

Built with

Go · SQLite · server-sent events · Raspberry Pi 5 · Grove sensors · Auth0 · Vapi · ElevenLabs · Presage SmartSpectra · Backboard · TigerData · Gemini · Google Cloud Run · Vercel

Built With

Share this project:

Updates

Submission history