Privacy-first baby monitor that works entirely in the browser.
What It Is
- Progressive Web App (PWA) that turns existing devices into baby monitors.
- Requires at least two devices: one Baby Station and one Parent Station.
- Supports multiple Baby Stations and multiple Parent Stations.
How It Works
- Baby Stations capture audio (required) and camera video (optional) and expose a WebRTC media stream.
- Parent Stations initiate WebRTC connections to Baby Stations and display the stream.
- Signaling is handled by a backend over WebSockets.
- Media flows peer-to-peer; the backend is only for connection setup.
Why It Matters
- Reuse phones, tablets, or laptops you already own.
- No dedicated hardware required.
- Privacy-first design: no cloud video storage.
- Audio/video never leave the home network; the backend never sees or relays media.
Quick Start (Users)
- Open BeddyBytes in a modern browser on two devices.
- Choose Baby Station on the device in the nursery.
- Choose Parent Station on the device you want to monitor from.
- Pair and start streaming.
- Video walkthrough: https://www.youtube.com/watch?v=uQHlMu7m5us
Repository Map
frontend/- PWA user interface and WebRTC client logic.golang/- Backend services (signaling, accounts, licensing).marketing/- Public website and landing pages.integration_tests/- End-to-end test scenarios.cloudformation/,traefik/,grafana/,influxdb/- Infrastructure and observability.
Local Dev TLS Setup
- Install
mkcerton your machine. ./run_local_stack.shcalls./setup_local_stack.shbefore starting Compose.- The setup script checks the local certificate and private key.
- When either file is missing, invalid, expired, or mismatched, the script runs
mkcert -installand generates a fresh pair. - Setup is skipped when the existing certificate and private key are usable.
- The generated
beddybytes.local.crtandbeddybytes.local.keyare leaf certs signed by that trusted local CA, so browsers on the same machine will trust them automatically. - If you work across multiple repos on the same machine, each repo can generate its own leaf certs with
mkcertand they will all chain back to the same trusted local CA.
The app and marketing containers install their locked JavaScript dependencies before starting their development servers. Their node_modules directories live in Docker volumes rather than the host checkout.
Local Secrets with SOPS
Local runtime secrets are stored in config/local.sops.env using SOPS and age. The encrypted file travels with the repository. The private age identity stays outside the repository.
One person must initialize the encrypted file:
-
Create an age identity outside the repository if you do not already have one:
mkdir -p ~/.config/sops/age age-keygen -o ~/.config/sops/age/keys.txt age-keygen -y ~/.config/sops/age/keys.txt
-
Replace
age1REPLACE_WITH_YOUR_AGE_RECIPIENTin.sops.yamlwith the public recipient printed by the last command. -
Create the encrypted configuration and open it in the SOPS editor:
cp .env.example config/local.sops.env sops encrypt --in-place config/local.sops.env sops config/local.sops.env
-
Replace every placeholder in the editor.
TINYANALYTICS_WRITE_TOKENmust be signed byJWT_SIGNING_KEY. -
Commit
.sops.yamlandconfig/local.sops.env. Never commit the age identity or a decrypted.envfile.
After cloning, an authorized developer installs the matching age identity at ~/.config/sops/age/keys.txt or sets SOPS_AGE_KEY_FILE to its location. Start the local stack with:
./run_local_stack.shThe script uses sops exec-env to pass decrypted values to Docker Compose without writing a plaintext .env file. Set BEDDYBYTES_SOPS_ENV_FILE to use a different encrypted environment file.
Marketing Build and Deployment with SOPS
The marketing build and deployment scripts read config/marketing.sops.env through sops exec-env. The file carries the TinyAnalytics build values and the AWS deployment destination. Create it with:
cp config/marketing.env.example config/marketing.sops.env
sops encrypt --in-place config/marketing.sops.env
sops config/marketing.sops.envReplace every placeholder in the SOPS editor. Then build and deploy with:
./scripts/marketing/build.sh
./scripts/marketing/push.shThe decrypted values remain in the child process environment. No plaintext environment file is written during the build or deployment. Set BEDDYBYTES_MARKETING_SOPS_ENV_FILE to use a different encrypted file.
License (Open Source)
- BeddyBytes is open-source software under the GNU General Public License, version 2 or (at your option) any later version (
GPL-2.0-or-later). - You may run, study, modify, and redistribute BeddyBytes under those terms.
- See
LICENSE.mdfor the full license text.
LLM Context
- Product goal: private, browser-based baby monitoring with minimal infrastructure.
- Network model: WebRTC peer connections; signaling via WebSockets; parents initiate.
- Media plane: local-network only; no STUN/TURN servers; ICE candidates are local.
- Roles: Baby Station accepts connections; Parent Station controls session setup.
- Multi-station support: multiple parents and multiple babies can be active.
- Privacy stance: no media storage on servers; signaling only; backend never handles media.
- Internet requirement: currently required for accounts and signaling, even though media stays local.
Links
Website: https://beddybytes.com
YouTube: https://www.youtube.com/@BeddyBytes
Getting started video: https://www.youtube.com/watch?v=uQHlMu7m5us