What it does
Cribby has all the features of a regular baby monitor, but it can also read vitals. A webcam in the nursery watches the crib, and Presage estimates your baby's breathing rate and heart rate from that video, so nothing ever touches the baby. The dashboard shows whether your baby is asleep, drowsy, restless, awake, or if the signal is unclear, along with live breathing and heart rate charts.
Cribby also has auto-soothe. If your baby stays restless for 4 seconds, a soft lullaby starts playing on its own. Once they settle, the music fades out over 8 seconds and you get a notification telling you what happened. It can only run once every 10 minutes so it never loops, and there is a mute button if you want it off.
In the morning, every real reading is saved in Tiger Data and Gemini writes a short three-bullet recap of the night. We don't record any video. Cribby is an informational wellness monitor, not a medical device, and so far we have only tested it on adults.
How we built it
The nursery unit is a Raspberry Pi 4 with a USB webcam, connected by an Ethernet cable to a Mac. The Pi stays small and always on, and the Mac does the heavy lifting. A FastAPI program on the Mac reads the Pi's video stream and runs Presage through a small C++ bridge. We only run Presage while a face is in view, so it doesn't use up credits on an empty crib.
The sleep state comes from a simple classifier. Awake is the default. To count as asleep, your baby needs infant-range breathing (22 to 40 breaths a minute) and calm movement for 20 seconds in a row. We also use Presage's face data to check whether their eyes are open, so a baby who is lying still but wide awake doesn't read as drifting off.
The dashboard is built with Next.js and Tailwind and is mobile-first. It shows the live feed, the sleep state, the charts, the soothe controls and the alerts. Every five seconds a worker saves the readings to Tiger Data, and it skips anything that comes from our simulated demo mode. Gemini writes the recap from the night's totals.
All four of us built against one shared message format that we only ever added to, so we could work at the same time without breaking each other's code. Tailscale gives the whole team one secure link to the dashboard. For the demo, a "trigger test restlessness" button runs through the real state machine, since we can't bring a sleeping baby on stage.
Challenges we ran into
The Pi was too slow for Presage. It needs 25 frames per second and the Pi only managed 20 to 25, so the Pi stays the camera and a Mac runs Presage instead.
Wi-Fi made 30 frames per second look like 20. The frames arrived in bursts, and our own throttle threw away every other one. We wrote a small frame pacer that gives Presage a steady 30 frames per second. After that the frame rate errors went away and Presage held full confidence for minutes at a time.
Bluetooth took the Pi offline. On a Pi 4, Wi-Fi and Bluetooth share one antenna. Pairing a speaker lagged the feed, and then the Pi dropped off Wi-Fi. We debugged it over an Ethernet cable and moved the audio to the Mac's speakers.
We ran out of Presage credits while building. The app kept saying "hold still," and it took a trip through the logs to find kCreditExhausted. Next time we will show the real error on screen.
The feed froze whenever the Pi restarted, so we added automatic reconnecting. It now comes back a few seconds after the Pi does.
What we learned
Measure first. Most of our hardest bugs only went away once we started counting frames and timing the gaps between them. Contactless vitals do work, but they are picky about framing, lighting and a steady frame rate. We also learned that hardware shapes the product. We wanted everything on a single Pi, and the numbers told us it needed a camera and a separate hub. And because Cribby sits close to health, we were careful with our wording. It describes what the camera saw, not what it might mean.
What's next for Cribby
We would like to run everything on a single Pi 5, though we haven't tested that yet. We would also add cry detection so Cribby can tell distress from background noise, and let other caregivers view the dashboard without being able to change anything. Push-to-talk currently plays through the laptop's speakers, so we would like a proper speaker in the nursery that doesn't interfere with the Pi's Wi-Fi. We also haven't tested with infants or in low light yet, so those would come next.
Built With
- c++
- computer-vision
- docker
- elevenlabs
- fastapi
- gemini
- iot
- nextjs
- opencv
- postgresql
- presage
- python
- raspberry-pi
- smartspectra
- tailscale
- tiger-data
- tigerdata
- typescript
- websockets



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