Open source · Self-hosted

Webhooks, caught.

A tiny, self-hosted receiver for Dozzle's Alerts & Webhooks. Point Dozzle's Log, Metric and Event alerts at hook2catch and get a searchable, multi-organization dashboard.

log · metric · event SQLite storage, single file MIT licensed
hook2catch dashboard showing filtered events, a summary chart and noisiest containers

The problem

Dozzle tells you. hook2catch remembers.

Dozzle is a great real-time Docker log viewer, but it doesn't keep history or give you a place to review errors later. hook2catch is a minimal receiver for its three alert types: it stores what Dozzle sends, keeps it for a configurable number of days, and shows it in a small web dashboard — nothing more, nothing less.

Log

A log message matching a pattern

Fires when a container's output matches a rule you set in Dozzle.

e.g. 5xx errors, stack traces
Metric

CPU / memory crossing a threshold

Fires when a container's resource usage passes a limit you define.

e.g. container exceeding 90% CPU
Event

Container lifecycle events from Docker

Fires on state changes Docker itself reports for a container.

e.g. OOM kills, unhealthy containers

What you get

One dashboard, nothing extra

Every part of hook2catch exists to make incoming webhook traffic easier to search and understand — not to become a platform.

Multiple sources

Every event stays correctly tagged per source, even if container names collide across them.

Drill down by container

Pick a source to see its containers with event counts, click one to filter to just its events.

Time range & zoom

Last hour to all time, or a custom window. Click a chart spike to zoom in, step back out with one button.

▁▃▅

Interactive summary chart

Events over time, stacked by level, drawn inline with no charting library. Hover any slice for its breakdown.

Live tail with history

Refreshes every 10s without collapsing expanded rows or losing your scroll position. Page back through older events anytime.

Star events

Pin the one line you'll need to reference later — starring survives retention cleanup.

Saved filters

Build a source/type/level/search combination, name it, and reapply it later with one click.

Optional, simple auth

File-based users with bcrypt hashes and login throttling — or turn it off behind your own auth layer.

Configurable retention

7 days by default, or set it to keep everything forever. Starred events are never swept.

One file, one image

SQLite (WAL mode) for storage, a single Docker image with a built-in health check.

EN

English & Turkish UI

Switchable anytime, remembered per browser.

Manage sources from the UI

Create a source, rotate its token, or delete it (with its events) without touching the server.

Architecture

Three small steps, no moving parts

One Python service, one SQLite file. No queue, no agent watching your Docker socket, nothing else to operate.

1

Dozzle sends an alert

Log, Metric or Event — each posted as JSON to POST /webhook/<source-slug> with a per-source bearer token.

2

hook2catch stores it

Tagged by source in SQLite (WAL mode), kept for RETENTION_DAYS0 to keep forever.

3

You search and understand

Filter by source, container, type, level, time and text. See volume, severity and the noisiest containers at a glance.

Quick start

Running in about five minutes

One Docker command once your secret key and first user are set up.

# 1. clone and configure
git clone https://github.com/erogluefe/hook2catch.git
cd hook2catch
cp .env.example .env
cp data/users.yml.example data/users.yml

# 2. generate a real SECRET_KEY into .env
python3 -c "import secrets; print(secrets.token_urlsafe(32))"

# 3. create a login user
.venv/bin/python scripts/generate_password.py

# 4. start it
docker compose up -d
✓ hook2catch running at http://localhost:8000
Required: hook2catch refuses to start with AUTH_ENABLED=true and no real SECRET_KEY — no forgeable default cookies.
Next: add a source from the dashboard sidebar, copy its token, and point a Dozzle webhook destination at /webhook/<slug>.
Full setup, payload templates for each Dozzle alert type, and every configuration variable are in the project README.

Before you expose it

Careful by default

hook2catch is intentionally small, but it doesn't cut corners on the basics.

No forgeable sessions. Startup fails without a real SECRET_KEY when auth is enabled.

No source enumeration. An unknown slug and a wrong token return the same response, compared in constant time.

No silent registration. The webhook endpoint can never create a source — only an authenticated session can.

Throttled logins. Repeated failures from one IP are locked out for a configurable window.

No markup injection. Payload fields are always rendered as text, never parsed as HTML.

Bounded requests. Body size and field lengths are capped so one oversized alert can't exhaust memory.

Built in the open

MIT licensed and intentionally small. Issues and PRs are welcome — a few directions being explored next:

error grouping threshold notifications shareable filter links CSV/JSON export
See the roadmap

Point your first Dozzle alert at it

Self-hosted, open source, one Docker command away.