Skip to main content

Pluggable async home security camera pipeline with detection, VLM analysis, and alerts.

Project description

HomeSec

PyPI License: Apache 2.0 Python: 3.10+ Typing: Typed codecov

HomeSec is a self-hosted, extensible video pipeline for home security cameras. You can connect cameras directly via RTSP, receive clips over FTP, or implement your own ClipSource. From there, the pipeline filters events with AI and sends smart notifications. Your footage stays private and off third-party clouds.

Design Principles

  • Local-Only Data Processing: Video footage remains on the local network by default. Cloud usage (Storage, VLM/OpenAI) is strictly opt-in.
  • Modular Architecture: All major components (sources, filters, analyzers, notifiers) are decoupled plugins defined by strict interfaces. If you want to use a different AI model or storage backend, you can swap it out with a few lines of Python.
  • Resilience: The primary resilience feature is backing up clips to storage. The pipeline handles intermittent stream failures and network instability without crashing or stalling.

Pipeline at a glance

graph TD
    %% Layout Wrapper for horizontal alignment
    subgraph Wrapper [" "]
        direction LR
        style Wrapper fill:none,stroke:none
        
        S[Clip Source]
        
        subgraph Pipeline [Media Processing Pipeline]
            direction TB
            C(Clip File) --> U([Upload to Storage])
            C --> F([Detect objects: YOLO])
            F -->|Detected objects| AI{Trigger classes filter}
            AI -->|Yes| V([VLM Analysis])
            AI -->|No| D([Discard])
            V -->|Risk level, detected objects| P{Alert Policy filter}
            P -->|No| D
            P -->|YES| N[Notifiers]
        end
        
        S -->|New Clip File| Pipeline
        
        PG[(Postgres)]
        Pipeline -.->|State & Events| PG
    end
  • Parallel Processing: Upload and filter run in parallel.
  • Resilience: Upload failures do not block alerts; filter failures stop expensive VLM calls.
  • State: Metadata is stored in Postgres (clip_states + clip_events) for full observability.

Table of Contents

Highlights

  • Multiple pluggable video clip sources: RTSP motion detection, FTP uploads, or a watched folder
  • Parallel upload + filter (YOLO) with frame sampling and early exit
  • OpenAI-compatible VLM analysis with structured output
  • Policy-driven alerts with per-camera overrides
  • Fan-out notifiers (MQTT for Home Assistant, SendGrid email)
  • Postgres-backed state + events with graceful degradation
  • Health endpoint plus optional Postgres telemetry logging

Quickstart

Docker

Use the included docker-compose.yml (HomeSec + Postgres, pulls leva/homesec:latest).

Configure your own config.yaml and .env files as described in Manual Setup.

Manual Setup

For standard production usage without Docker Compose:

  1. Prerequisites:

    • Python 3.10+
    • ffmpeg
    • PostgreSQL (running and accessible)
  2. Install

    pip install homesec
    
  3. Configure

    # Download example config & env
    curl -O https://raw.githubusercontent.com/lan17/homesec/main/config/example.yaml
    mv example.yaml config.yaml
    
    curl -O https://raw.githubusercontent.com/lan17/homesec/main/.env.example
    mv .env.example .env
    
    # Setup environment (DB_DSN is required)
    # Edit .env to set your secrets!
    export DB_DSN="postgresql://user:pass@localhost/homesec"
    
  4. Run

    homesec run --config config.yaml
    

Developer Setup

If you are contributing or running from source:

  1. Install dependencies

    uv sync
    
  2. Start Infrastructure

    make db  # Starts just Postgres in Docker
    
  3. Run

    uv run python -m homesec.cli run --config config/config.yaml
    

Configuration

Configuration is YAML-based and strictly validated. Secrets (API keys, passwords) should always be loaded from environment variables (_env suffix).

Configuration Examples

1. The "Power User" (Robust RTSP)

Best for real-world setups with flaky cameras.

cameras:
  - name: driveway
    source:
      backend: rtsp
      config:
        rtsp_url_env: DRIVEWAY_RTSP_URL
        output_dir: "./recordings"
        stream:
          # Critical for camera compatibility:
          ffmpeg_flags: ["-rtsp_transport", "tcp", "-vsync", "0"]
        reconnect:
          backoff_s: 5

filter:
  backend: yolo
  config:
    classes: ["person", "car"]
    min_confidence: 0.6

In your .env:

DRIVEWAY_RTSP_URL="rtsp://user:pass@192.168.1.100:554/stream"

2. The "Cloud Storage" (Dropbox)

Uploads to Cloud but keeps analysis local.

storage:
  backend: dropbox
  config:
    token_env: DROPBOX_TOKEN
    root: "/SecurityCam"

notifiers:
    - backend: sendgrid_email
      config:
        api_key_env: SENDGRID_API_KEY
        to_emails: ["me@example.com"]

In your .env:

DROPBOX_TOKEN="sl.Al..."
SENDGRID_API_KEY="SG.xyz..."

See config/example.yaml for a complete reference of all options.

Tips

  • Secrets: Never put secrets in YAML. Use env vars (*_env) and set them in your shell or .env.
  • Notifiers: At least one notifier (mqtt/email) must be enabled unless alert_policy.enabled is false.
  • YOLO Classes: Built-in classes include person, car, truck, motorcycle, bicycle, dog, cat, bird, backpack, handbag, suitcase.

After installation, the homesec command is available:

homesec --help

Commands

Run the pipeline:

homesec run --config config.yaml

Validate config:

homesec validate --config config.yaml

Cleanup old clips (reanalyze and optionally delete empty clips):

homesec cleanup --config config.yaml --older_than_days 7 --dry_run=False

Use homesec <command> --help for detailed options on each command.

Plugins

Extensible by design

We designed HomeSec to be modular. Each major capability is an interface (ClipSource, StorageBackend, ObjectFilter, VLMAnalyzer, AlertPolicy, Notifier) defined in src/homesec/interfaces.py. This means you can swap out components (like replacing YOLO with a different detector) without changing the core pipeline.

HomeSec uses a plugin architecture where every component is discovered at runtime via entry points.

Built-in plugins

Type Plugins
Sources rtsp, ftp, local_folder
Filters yolo
Storage dropbox, local
VLM analyzers openai
Notifiers mqtt, sendgrid_email
Alert policies default, noop

Plugin interfaces

All interfaces are defined in src/homesec/interfaces.py.

Type Interface Decorator
Sources ClipSource @source_plugin
Filters ObjectFilter @filter_plugin
Storage StorageBackend @storage_plugin
VLM analyzers VLMAnalyzer @vlm_plugin
Notifiers Notifier @notifier_plugin
Alert policies AlertPolicy @alert_policy_plugin

Writing a custom plugin

Extending HomeSec is designed to be easy. You can write custom sources, filters, storage backends, and more.

👉 See PLUGIN_DEVELOPMENT.md for a complete guide.

Observability

  • Health endpoint: GET /health (configurable via health.host/health.port in config)
  • Telemetry logs to Postgres when DB_DSN is set

Development

Setup

  1. Clone the repository
  2. Install uv for dependency management
  3. uv sync to install dependencies
  4. make db to start Postgres locally

Commands

  • Run tests: make test
  • Run type checking (strict): make typecheck
  • Run both: make check
  • Run the pipeline: make run

Notes

  • Tests must include Given/When/Then comments
  • Architecture notes: DESIGN.md

Contributing

Contributions are welcome! Here's how to get started:

  1. Fork and clone the repository
  2. Create a branch for your feature or fix: git checkout -b my-feature
  3. Install dependencies: uv sync
  4. Make your changes and ensure tests pass: make check
  5. Submit a pull request with a clear description of your changes

Guidelines

  • All code must pass CI checks: make check
  • Tests should include Given/When/Then comments explaining the test scenario
  • New plugins should follow the existing patterns in src/homesec/plugins/
  • Keep PRs focused on a single change for easier review

Reporting Issues

Found a bug or have a feature request? Please open an issue with:

  • A clear description of the problem or suggestion
  • Steps to reproduce (for bugs)
  • Your environment (OS, Python version, HomeSec version)

License

Apache 2.0. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

homesec-1.2.3.tar.gz (445.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

homesec-1.2.3-py3-none-any.whl (120.9 kB view details)

Uploaded Python 3

File details

Details for the file homesec-1.2.3.tar.gz.

File metadata

  • Download URL: homesec-1.2.3.tar.gz
  • Upload date:
  • Size: 445.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for homesec-1.2.3.tar.gz
Algorithm Hash digest
SHA256 839980f60445918d325c50755f529b5acd497155d6fa2a2e6c7111d6bd5f1f04
MD5 3f048c572bfe1c6060a9a1371a3530c8
BLAKE2b-256 1aa95d24ec0a39ff73d822a447cb8a7ec329ed39f04478071ba15715db92aa4f

See more details on using hashes here.

Provenance

The following attestation bundles were made for homesec-1.2.3.tar.gz:

Publisher: release.yaml on lan17/homesec

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file homesec-1.2.3-py3-none-any.whl.

File metadata

  • Download URL: homesec-1.2.3-py3-none-any.whl
  • Upload date:
  • Size: 120.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for homesec-1.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 22b9f06d2cadd00f38dc3b8804498d708faa19487a1bfd2e4b36c325104d440b
MD5 b111740a8d8fafab1ccfa1cf08b98c4e
BLAKE2b-256 2a0587f1d1f50413a8236b23fdb26a5be3525d606f8e2ee3427e508acc144547

See more details on using hashes here.

Provenance

The following attestation bundles were made for homesec-1.2.3-py3-none-any.whl:

Publisher: release.yaml on lan17/homesec

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page