Relay
The easiest way to connect your services to PushWard. Point webhooks at relay.pushward.app — no Docker containers, no self-hosting, no per-user configuration needed.
/grafanaSupported Providers
Grafana
/grafanaEvents
- Firing
- Resolved (grouped by alertname)
Public Relay
PushWard hosts a public relay at relay.pushward.app — no deployment required. Just point your services at it with your integration key.
# Grafana Contact Point URL:
https://relay.pushward.app/grafana
# HTTP Header:
Authorization: Bearer hlk_YOUR_INTEGRATION_KEYThe public relay supports all 15 providers listed above. If you prefer to self-host, see the self-hosted setup further down.
How It Works
pushward-relay extracts the hlk_ integration key from each incoming webhook request. One relay instance serves unlimited users simultaneously.
- Receive — external services send webhooks to provider-specific routes
- Authenticate — the integration key is extracted from the
Authorization: Bearer hlk_...header (or Basic Auth password for Radarr/Sonarr/Prowlarr) - Transform — the provider handler maps the webhook payload to a push notification or Live Activity update depending on the event type
- Forward — the request is sent to PushWard using the caller's integration key
Push Notifications vs Live Activities
Each provider delivers events as either a push notification (banner alert) or a Live Activity (Dynamic Island + Lock Screen), depending on the event type:
| Delivery | Providers | Use case |
|---|---|---|
| Notification only | Grafana, Prowlarr | One-shot alerts — firing/resolved, health, grabs |
| Live Activity only | ArgoCD, Jellyfin, Paperless, Uptime Kuma, Backrest, Proxmox, Overseerr, Gatus, Changedetection, Unmanic, Bazarr | Multi-step progress tracking (syncs, downloads, playback) |
| Both | Radarr, Sonarr | Grab/Download → Live Activity; Health, Rename, Add/Delete → notification |
Relay requires PostgreSQL for persistent state (sync tracking, download lifecycle, playback progress across restarts and tenants). Stateless providers (Grafana, Prowlarr, Changedetection, Unmanic) still require a database connection to start.
Setup
1. Get Your Integration Key
Open the PushWard app → Settings → Integration Key to find your default hlk_ key.
To create a dedicated key for this integration:
- Go to Settings → Manage Keys
- Tap +
- Set name (e.g. "Relay"), choose scope, and optionally restrict to
grafana-*, argocd-* - Copy the generated
hlk_key
2. Self-Hosted (Optional)
If you prefer to run your own relay instance:
services:
pushward-relay:
image: ghcr.io/mac-lucky/pushward-relay:latest
ports:
- "8090:8090"
environment:
PUSHWARD_URL: https://api.pushward.app
PUSHWARD_DATABASE_DSN: postgres://user:pass@db:5432/relay?sslmode=disable
restart: unless-stopped
db:
image: postgres:17-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: relay
volumes:
- relay-data:/var/lib/postgresql/data
volumes:
relay-data:For Radarr, Sonarr, and Prowlarr, use Basic Auth with the hlk_ key as the password (username is ignored), since their webhook settings only support Basic Auth.
Authentication
Two patterns depending on the provider:
| Method | Providers | Format |
|---|---|---|
| Bearer token | Most providers | Authorization: Bearer hlk_... |
| Basic Auth | Radarr, Sonarr, Prowlarr | hlk_... as password |
Configuration
| Environment Variable | Description | Default |
|---|---|---|
PUSHWARD_URL | PushWard server URL | -- |
PUSHWARD_DATABASE_DSN | PostgreSQL connection string | -- |
PUSHWARD_SERVER_ADDRESS | HTTP listen address | :8090 |
Each provider can be individually enabled/disabled and configured with its own priority, cleanup delay, and stale timeout via environment variables or YAML config.