babyphone-cam

The baby monitor that lives only in your home network.

An old phone or tablet becomes the camera next to your child, any other device becomes the parent unit. Everything runs in the browser through your own Docker container – no app, no account, no cloud.

Install View on GitHub 🧸 Donate

  • Open source (AGPL-3.0)
  • LAN or WireGuard VPN
  • Nothing is recorded
Parent view with three children: Mia with a green frame on sound, Leo and Noah quiet. The children are illustrations.

Features

Everything a baby monitor needs day to day – right in the browser.

  • Child and parent devices

    Each device picks its role: child or parent, each with its own PIN. Settings are protected by a separate admin PIN.

  • Camera or phone

    Mode “Camera” (video and sound) or “Phone” (sound only). Name from a list or free. Front or rear camera, switchable from the parent device too.

  • Dark screen

    The child device goes dark and still stays active (wake lock). A double tap shows the menu.

  • All children at a glance

    Parents see all active children at once in a dynamic grid without scrolling. Any tile can be enlarged.

  • Green frame on activity

    On sound or motion the tile lights up green. Sound and motion thresholds per child, set right from the parent device.

  • Listen and talk

    Hear all children at the same time, volume per child, push-to-talk per child.

  • Auto focus

    On sound, the newest up to four active children move to the front for about five seconds.

  • Alarm when a child device drops out

    If a child device goes offline, the parent devices sound an alarm that must be acknowledged. Plus webhooks (GET, POST, PUT), for example to Gotify, Slack or Bark.

  • HTTPS right in the container

    Certificate from a folder (e.g. Nginx Proxy Manager / Let's Encrypt), via the Cert Warden API, or self-signed as a fallback. No reverse proxy needed.

How it works

Video and sound go from the child device to your own Docker container and from there to the parent devices. The container forwards the media (mediasoup SFU) – live, without recording.

Flow: child device, Docker server in your LAN, parent devicesThe child device sends video and sound over HTTPS and WebRTC to the babyphone-cam container in your LAN. The container forwards it live to the parent devices. Everything stays in your LAN or WireGuard VPN, no cloud, no recording. Your LAN or WireGuard VPN no cloud Child device browser, camera + mic Docker server babyphone-cam HTTPS · PIN loginmediasoup SFUlive only Parent devices any number of browsers video + sound live talk, thresholds, camera Flow: child device, Docker server in your LAN, parent devicesThe child device sends video and sound over HTTPS and WebRTC to the babyphone-cam container in your LAN. The container forwards it live to the parent devices. Everything stays in your LAN or WireGuard VPN, no cloud, no recording. Your LAN or WireGuard VPN Child device browser, camera + mic video + sound Docker server babyphone-cam HTTPS · PIN loginmediasoup SFUlive only live Parent devices any number of browsers no cloud

Screenshots

Real screenshots of the app with test PINs. The children in the camera image are illustrations.

Parent view with three tiles. Mia (camera) has a green frame, Leo (camera) and Noah (sound only) are quiet. Below each tile: volume, sound and motion threshold, Talk and Switch camera.
Parent view: three children, Mia with a green frame
Enlarged view of Mia showing an illustrated sleeping baby in a crib, with sliders and the Talk button below.
Enlarged view of one child
Setup wizard step 1 of 8: Language with the options Automatic, Deutsch, English, Italiano and Français.
Setup wizard on first start
Settings page: admin PIN, parent PIN and child PIN, each showing where its value comes from.
Settings behind the admin PIN
Parent view on a phone: three children stacked without scrolling, Mia with a green frame.
Parent view on a phone
Start page on a phone with the logo, the buttons Child and Parents, and Settings.
Start page: pick a role
Child device on a phone: name Mia selected, mode Camera, front camera, Start button.
Child device: name, mode, camera
Running child device: black screen with the menu at the bottom showing Connected, Switch camera and Stop.
Child device running: screen dark

Privacy and security

  • No cloud, no account

    No vendor server, no sign-up, no app. The container runs at your place.

  • LAN or VPN only

    Made for the home network or a WireGuard VPN. By default only devices from private networks are allowed (IP allowlist).

  • Nothing is recorded

    Video and sound end at the container and are only forwarded live. There are no recordings.

  • Protected PINs

    Separate PINs for child, parents and admin. PIN login is rate-limited against guessing.

  • Open source

    Source code under AGPL-3.0 on GitHub. The image is rebuilt automatically every week to pick up security updates.

Installation

  1. Take compose.yaml and .env.example from the repository; set at least the container IP (BABYPHONE_IP) and the certificate folder (CERTS_DIR).
  2. Start the container, e.g. with docker compose up -d or as a new stack in Unraid's Compose Manager.
  3. Open https://<IP or name>/ in a browser. The setup wizard asks for language, PINs, child names, HTTPS, alarms and webhooks.
  4. Pick “Child” on the child device and “Parents” on the parent device – each with its PIN.

Requirements

  • A Docker host in your home network, for example Unraid.
  • An HTTPS certificate for a name that points to the container in your LAN. Browsers only allow camera and microphone over HTTPS. Without one, the container uses a self-signed certificate (browser warning).
  • LAN or WireGuard VPN (the VPN subnet must be routed to the LAN).
  • Ports 443/tcp (web, WebSocket), 80/tcp (redirect to HTTPS) and 40000/udp + tcp (media).
  • Designed for current browsers (Chrome, Firefox, Safari, Edge) with camera or microphone access.

Shortened example from compose/compose.yaml (Unraid, network br0 with its own IP). The complete, hardened file and .env.example are in the repository.

# compose.yaml
services:
  babyphone:
    image: ghcr.io/helmi1987/babyphone-cam:latest
    container_name: babyphone
    restart: unless-stopped
    environment:
      - TZ=Europe/Zurich
      - CERTS_DIR=/certs
      - ANNOUNCED_IP=192.168.1.30
    volumes:
      - /mnt/user/appdata/babyphone:/data
      - /mnt/user/appdata/Nginx-Proxy-Manager-Official/letsencrypt:/certs:ro
    networks:
      br0:
        ipv4_address: 192.168.1.30

networks:
  br0:
    external: true

Full compose.yaml on GitHub

FAQ

Do I need an app?

No. Child and parent devices only use the browser.

Does it work when I'm away?

Only through a VPN such as WireGuard that is routed into your home network. There is deliberately no cloud access.

Is anything stored or recorded?

No. Video and sound are only forwarded live. Settings are stored, PINs only as hashes.

What should I watch out for on the child device?

Keep the page in the foreground, the screen unlocked and the device on power. Locking or switching apps stops camera and microphone (iOS, Android). LCD screens keep their backlight; only OLED goes truly dark.

Which devices has it been tested on?

The app is designed for current browsers (Chrome, Firefox, Safari, Edge). Tested on a real iPhone (Safari). Android: no known issues.

Which languages does the app support?

German, English, Italian and French. Set it in the setup wizard or under Settings; “Automatic” uses the browser language, otherwise English.

What does it cost?

Nothing. babyphone-cam is open source under the AGPL-3.0 licence.