GitHunt
HA

HarryR/nomadcam

Turn any Android tablet into a portable security system you control via Telegram.

NomadCam

Turn any Android tablet into a portable security system you control from anywhere.

Demo video

Why

Whether you're staying in Airbnbs, vans, hotels, or short-term rentals, your stuff sits unattended in places you don't control. You can't install permanent systems, cloud cameras want monthly subscriptions, and most security apps only work on local WiFi or need a hosted server.

NomadCam is a motion-detecting security camera that alerts you via Telegram. It runs on hardware you already own, works over WiFi or cellular data, and doesn't phone home to anyone's servers. Point a tablet at the door, scan a QR code to link your Telegram account, and you're set.

If you carry a Google Find Hub compatible Bluetooth tracker, NomadCam can use it to auto-arm when you leave. No buttons, one less thing to remember, just peace of mind when you walk out the door.

Features

  • Telegram control: Arm, disarm, capture images, and receive motion alerts from anywhere in the world
  • Works on existing devices: Any Android tablet or phone with a camera
  • WiFi or cellular: Works wherever your device has internet
  • No cloud, no subscriptions: Runs entirely on-device, you own the data
  • Tunable motion detection: GPU-accelerated with calibration for different environments
  • Auto arm/disarm: Optional BLE presence detection using FMDN trackers (Pixel Buds, Chipolo, etc.)
  • Portable: No special hardware, no permanent setup, pack it and go

Building

Requires JDK 17 and Android SDK. Then:

git clone <repo-url>
cd nomadcam
make bootstrap   # First time: downloads Gradle (SHA256 verified)
make             # Build, install, and launch on connected device

See CI.md for release builds and CI/CD setup.

Telegram

Control your camera from anywhere in the world through a Telegram bot.

Telegram Bot Screenshot

Setup

  1. Create a bot via @BotFather on Telegram
  2. Expand the "Telegram" settings section
  3. Paste the bot token
  4. Press the "Link Telegram Account" button
  5. Scan the QR code on another device to link it

Commands

Command Description
/start Show welcome message and controls
/arm Arm the security system
/disarm Disarm the security system
/status Report current system status
/imgcap Capture and send current frame
/vidcap Capture and send video clip
/gifcap Capture and send animated GIF

When motion is detected while armed, you'll receive an alert with a captured GIF showing what triggered it.

Find My Device Presence Detection

The app can detect when your Find My Device Network (FMDN) tracker is nearby and automatically arm/disarm the system. This works with Pixel Buds, Chipolo tags, Pebblebee devices, and other FMDN-compatible trackers (sorry Apple, but you won't allow me to export the keys).

How It Works

FMDN trackers broadcast rotating Ephemeral Identifiers (EIDs) that can only be decoded if you have the tracker's identity key. NomadCam scans for these broadcasts and matches them against your key to determine presence.

When your tracker leaves Bluetooth range, the system arms after a configurable delay. When you return, it disarms automatically—no interaction needed.

Extracting Your Identity Key

You'll need to extract the identity key and pairing date from your Google account:

  1. Use GoogleFindMyTools to export your tracker data
  2. Follow this guide for extracting the identity key and pairing offset
  3. The identity key is a 64-character hex string (32 bytes)

Configure in App

  1. Enable BLE presence detection in settings
  2. Enter the identity key
  3. Set the pair date offset
  4. Adjust thresholds as needed, in the advanced options:
    • RSSI threshold: Signal strength cutoff (-70 dBm default)
    • Absence timeout: Seconds before considering tracker gone (30s default)
    • Auto-arm delay: Grace period before arming (30s default)

Motion Detection

GPU-accelerated frame differencing with a dual-threshold system:

  • Instant threshold: Triggers on sudden large movements
  • Accumulated threshold: Triggers on sustained smaller movements over a time window

Calibration

The environment affects what counts as "motion" (lighting changes, camera noise, etc.). Use the calibration feature to measure your noise floor-point, the camera at the scene with no actual motion and tap Calibrate. The thresholds will adjust automatically.