Docker image update notifier with ntfy alerts
  • Python 99.2%
  • Dockerfile 0.8%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Vela 5d1863d5a1
All checks were successful
CI / test (push) Successful in 9s
Send ntfy title as query param; non-ASCII header broke every alert
http.client encodes headers as latin-1, so the em dash in
'Drift — Image Update' raised before any request was sent. Drift has
never delivered a notification. The new regression test goes through
a real local HTTP server instead of a mocked urlopen.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-20 15:34:37 -03:00
.forgejo/workflows Add Forgejo CI workflow 2026-08-16 20:53:14 -04:00
.github/workflows Initial release — Docker image update notifier with ntfy alerts 2026-08-16 19:20:45 -04:00
.gitignore Initial release — Docker image update notifier with ntfy alerts 2026-08-16 19:20:45 -04:00
docker-compose.yml Initial release — Docker image update notifier with ntfy alerts 2026-08-16 19:20:45 -04:00
Dockerfile Initial release — Docker image update notifier with ntfy alerts 2026-08-16 19:20:45 -04:00
drift.py Send ntfy title as query param; non-ASCII header broke every alert 2026-10-20 15:34:37 -03:00
LICENSE Initial release — Docker image update notifier with ntfy alerts 2026-08-16 19:20:45 -04:00
README.md Add suite listing with all 5 tools 2026-08-16 19:47:49 -04:00
test_drift.py Send ntfy title as query param; non-ASCII header broke every alert 2026-10-20 15:34:37 -03:00

Drift

CI Release Container

Docker image update notifier with ntfy alerts. Checks your running containers against upstream registries and notifies you when newer images are available.

Notify, don't auto-update. Unlike Watchtower, Drift only tells you about updates — you decide when and how to apply them.

Part of the Docker monitoring suite: Lookout (container lifecycle) · Beacon (status page) · Bosun (log alerts) · Sextant (certificate expiry) · Drift (image updates)

Zero dependencies. Single Python file. Docker-native.

Quick Start

services:
  drift:
    image: ghcr.io/agent-cyanez/drift:latest
    container_name: drift
    restart: unless-stopped
    network_mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - NTFY_URL=http://your-ntfy:8888
      - NTFY_TOPIC=updates

How It Works

  1. Lists all running Docker containers
  2. Skips locally-built images (compose builds, no registry reference)
  3. For each registry image, compares the local digest with the remote digest
  4. If they differ, sends an ntfy notification
  5. Repeats on a configurable interval (default: 6 hours)

Supports Docker Hub, ghcr.io, and any registry implementing the OCI Distribution Spec (Forgejo, GitLab, Codeberg, etc.).

Configuration

Variable Default Description
NTFY_URL http://127.0.0.1:8888 ntfy server URL
NTFY_TOPIC vela ntfy topic for notifications
INTERVAL 21600 Check interval in seconds (default: 6 hours)
COOLDOWN 86400 Per-image notification cooldown in seconds (default: 24 hours)
TIMEOUT 30 Registry request timeout in seconds
IMAGES (empty — all) Comma-separated image filter patterns (glob, ! to exclude)

Image Filtering

# Only check specific registries
IMAGES=ghcr.io/*,docker.io/*

# Exclude specific images
IMAGES=!*test*,!*dev*

# Mix positive and negative patterns
IMAGES=ghcr.io/*,!ghcr.io/internal/*

Part of the Monitoring Suite

Tool Purpose
Lookout Container lifecycle alerts
Beacon Service status page
Bosun Container log pattern alerts
Sextant TLS certificate expiry monitor
Drift Image update notifier

License

MIT