Skip to main content

blinkvault

Local motion capture and livestreaming for Blink cameras — no subscription required.

blinkvault keeps a continuous live stream from your Blink camera in memory, detects motion locally using frame differencing, and saves MP4 clips that include up to 30 seconds of footage before the motion event. It uses blinkpy by Kevin Fronczak only to authenticate and open the livestream — all motion detection, buffering, and clip storage happen on your own machine. No Blink subscription required, no cloud clip storage, no always-on disk writes.


Why this is different

Every other Blink integration works the same way: poll Blink's cloud API every 30 seconds, wait for a new clip to appear, download it. This means you need a paid Blink subscription, you get ~30 second delays, and you only see footage after motion triggers — never before.

blinkvault takes a different approach:

blinkvault blinkbridge / HA integration
Blink subscription required No Yes (for clip history)
Motion detection Local, frame-by-frame Cloud polling
Pre-roll footage Up to 30 seconds None
Latency Real-time 30+ second delay
Disk I/O at rest None (RAM buffer) Constant segment writes
Setup complexity Single Python script Docker / Home Assistant

How it works

Live stream via the IMMI protocol

Blink cameras do not expose RTSP. blinkvault uses blinkpy's BlinkLiveStream class to speak Blink's proprietary IMMI protocol — a TLS-wrapped binary protocol that delivers a real MPEG-TS stream. We patch two bugs in blinkpy's implementation (partial reads in recv() and over-eager poll termination) to keep the stream stable.

In-memory rolling buffer

A dedicated ffmpeg process reads raw MPEG-TS data from the local proxy and feeds it into a Python collections.deque — a rolling ~45 MB window of timestamped byte chunks. Nothing is written to disk while the camera is idle.

Local motion detection

A second ffmpeg process decodes the stream at 2 fps and downscales to 320×180 grayscale. Python computes the mean absolute pixel difference between consecutive frames using numpy. When the difference exceeds a configurable threshold, motion is declared. No cloud, no ML model, no subscription.

Pre-roll clips

When motion fires, the in-memory buffer already contains the last 30 seconds of footage. blinkvault slices the relevant byte range, writes a single temporary .ts file, and converts it to a clean MP4 with ffmpeg. The resulting clip starts before the motion event — you see the person walking up to the door, not just the moment they arrived.

Auto-reconnect

Blink sessions time out after approximately 5 minutes. blinkvault detects stream termination and reconnects automatically, maintaining continuous monitoring.


Requirements

  • Python 3.11+
  • ffmpeg (must be on $PATH)
  • A Blink account with a compatible camera (tested on Blink Video Doorbell)

Installation

From PyPI:

pip install blinkvault

From source:

git clone https://github.com/karl-dykema/blinkvault
cd blinkvault
python3 -m venv venv
source venv/bin/activate
pip install -e .

Requires ffmpeg on your $PATH. macOS: brew install ffmpeg


Web interface

blinkvault

Or if running from source:

python app.py

Open http://localhost:8080 in your browser.

On first run you will be prompted for your Blink email, password, and a two-factor authentication code. Credentials are saved to creds.json (gitignored) and reused on subsequent runs.

Features

  • Start / Stop the monitoring daemon
  • Record Now — grab a clip on demand without waiting for motion
  • Motion sensitivity — tune the frame-diff threshold (lower = more sensitive)
  • Cooldown — minimum seconds between consecutive motion triggers
  • Clip duration — how many seconds of post-motion footage to include
  • Clip browser — collapsible list with formatted timestamps, file sizes, inline playback and download

CLI livestream

# Watch live in a player
blinkvault-stream --output - | ffplay -

# Record to file
blinkvault-stream --output recording.mp4

# Stream to UDP (e.g. for VLC or Frigate)
blinkvault-stream --output udp://127.0.0.1:1234

# Pick a specific camera by name
blinkvault-stream --camera "Front Door" --output recording.mp4

Configuration

Settings are saved to capture_config.json (gitignored) via the web UI, or you can edit the file directly:

{
  "clip_duration": 30,
  "camera_name": "",
  "motion_threshold": 10,
  "cooldown": 60
}
Key Default Description
clip_duration 30 Seconds of post-motion footage per clip
camera_name "" Camera name as shown in the Blink app. Leave blank to use the first camera found.
motion_threshold 10 Mean pixel difference to declare motion (1–50). Lower is more sensitive.
cooldown 60 Minimum seconds between motion triggers

Privacy note

creds.json contains your Blink access token. It is gitignored and never leaves your machine. Clips and config are also gitignored.


Acknowledgements

  • blinkpy by Kevin Fronczak — Python API library for Blink cameras. blinkvault is built on top of blinkpy for authentication, camera discovery, and the BlinkLiveStream IMMI protocol implementation.
  • FFmpeg — used for stream demuxing, grayscale frame extraction, motion analysis, and MP4 encoding.
  • FastAPI — web framework powering the local UI.
  • numpy — frame differencing for local motion detection.

License

GPL-3.0 — see LICENSE

Metadata

Release files for blinkvault 0.1.14

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for blinkvault 0.1.14
File Size Uploaded
blinkvault-0.1.14.tar.gz 56.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for blinkvault 0.1.14
File Interpreter ABI Platform
blinkvault-0.1.14-py3-none-any.whl Python 3 none any Details

Total release size: 99.2 kB

Release files / blinkvault-0.1.14.tar.gz

Download URL blinkvault-0.1.14.tar.gz
Size 56.5 kB
Tags Source
SHA-256 checksum
How to use checksums
858653404dc9ba68b607d59e678d3b8408e29a548d731edc4ac16014eef19842
BLAKE2b-256 checksum
How to use checksums
e0b41a77a48a3011d7ee8bb36e2c3c240a88f73d2ec0661988bfee5c4d929a32
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 15, 2026.

Transparency log

Release files / blinkvault-0.1.14-py3-none-any.whl

Download URL blinkvault-0.1.14-py3-none-any.whl
Size 42.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
04f8064a913605dccae0fdb927ffc74641ff0eb90482efd0053f48da7b4bf8e2
BLAKE2b-256 checksum
How to use checksums
8120e3361e0f514023a7f338515976e875708abc456eb16d944ab9a1d4fa02c6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 15, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.14 This release

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page