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:
- Places a real phone call to her emergency contact
- 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,A2andREFcan 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
- arduino
- auth0
- backboard
- docker
- elevenlabs
- go
- google-cloud-run
- google-compute-engine
- google-gemini
- html5
- i2c
- javascript
- next.js
- openid-connect
- postgresql
- presage-smartspectra
- raspberry-pi
- server-sent-events
- sqlite
- tigerdata
- timescaledb
- vapi
- vercel
- vertex-ai

Log in or sign up for Devpost to join the conversation.