تخطٍّ إلى المحتوى

Relay

وجّه الـ webhooks الخاصة بخدماتك إلى relay.pushward.app واحصل على إشعارات دفع من دون Docker أو استضافة ذاتية أو تهيئة لكل مستخدم.

Supported Providers

Grafana

POST /grafana
notification

الأحداث

  • 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. It supports every provider listed above; if you prefer to self-host, see the self-hosted setup further down.

مثال: webhook من Grafana
# Grafana Contact Point URL:
https://relay.pushward.app/grafana

# HTTP Header:
Authorization: Bearer hlk_YOUR_INTEGRATION_KEY

One URL for any service

You can also post any webhook to the relay root, https://relay.pushward.app/. Payloads from the providers above are recognised and handled exactly as on their own route, except TrueNAS and Gitea or Forgejo events other than Actions runs, which need their own route. Anything else goes to the universal webhook, which maps the payloads of dozens of known services through presets (some open an alert or progress card) and sends any other JSON as one plain notification. Where a service lets you set the path, its own route is still the better choice.

How It Works

  1. Receive — external services send webhooks to provider-specific routes
  2. Authenticate — the integration key is extracted from the Authorization: Bearer hlk_... header (or Basic Auth password for Radarr/Sonarr/Prowlarr/Bazarr/Komodo, or GenieKey for TrueNAS)
  3. Transform — the provider handler maps the webhook payload to a push notification or Live Activity update depending on the event type
  4. Forward — the request is sent to PushWard using the caller's integration key

Per-user usage is bounded by your account's plan (free tier monthly quotas; unlimited on paid).

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:

DeliveryProvidersUse case
Notification onlyGrafana, Prowlarr, BazarrOne-shot alerts — firing/resolved, health, grabs, subtitle downloads
Live Activity onlyArgoCD, Uptime Kuma, Backrest, Proxmox, Overseerr, Gatus, Changedetection, Paperless, Unmanic, Gitea, ForgejoMulti-step progress tracking (syncs, downloads, backups)
BothRadarr, Sonarr, Jellyfin, Komodo, TrueNASRadarr/Sonarr: Grab/Download → Live Activity; Health/Rename/Add/Delete → notification. Jellyfin: playback → Live Activity; library adds, scheduled tasks, auth failures → notification. Komodo: resolvable server conditions (CPU, memory, disk, unreachable, version mismatch, swarm) → Live Activity plus a companion notification; container state, build failed, image update → notification only. TrueNAS: each alert → Live Activity plus a companion notification
ℹ معلومة

Relay requires PostgreSQL for persistent state (sync tracking, download lifecycle, playback progress across restarts and tenants). Stateless providers (Bazarr, Changedetection, Unmanic) still require a database connection to start.

قادم في إصدار التطبيق 1.17.0

يصف هذا القسم ميزة في تحديث للتطبيق قيد مراجعة App Store. يُفتح هنا تلقائيًا بمجرد أن يصبح التحديث متاحًا.

قادم في إصدار التطبيق 1.7.0

يصف هذا القسم ميزة في تحديث للتطبيق قيد مراجعة App Store. يُفتح هنا تلقائيًا بمجرد أن يصبح التحديث متاحًا.

Per-request overrides

Append query parameters to any provider webhook URL to override that provider's delivery behavior for a single request. An explicit parameter always wins over the provider-computed value and your static config; omitting a parameter leaves today's behavior unchanged.

ParameterValuesEffect
channelsComma-separated: activity, notificationRestricts which delivery surfaces this request may use. channels=notification suppresses Live Activities and only sends push notifications; channels=activity does the reverse. Must list at least one valid surface.
priorityInteger 0-10Sets the eviction / relevance priority for any Live Activity the request creates.
levelpassive, active, time-sensitive, criticalSets the notification interruption level for any push notification the request sends.
قادم في إصدار التطبيق 1.17.0
Force a Grafana alert to a time-sensitive notification only
https://relay.pushward.app/grafana?channels=notification&level=time-sensitive
⚠ تحذير

An invalid value is rejected with 400 before the webhook is processed — an unknown channels surface, a priority that isn't an integer 0-10, or a level outside the four allowed values. Fix the URL rather than retrying.

قادم في إصدار التطبيق 1.17.0

يصف هذا القسم ميزة في تحديث للتطبيق قيد مراجعة App Store. يُفتح هنا تلقائيًا بمجرد أن يصبح التحديث متاحًا.

Setup

1. Get Your Integration Key

استخدم مفتاح التكامل الافتراضي من تطبيق PushWard ضمن الإعدادات → مفتاح التكامل، أو أنشئ مفتاحًا محدود النطاق لهذا التكامل.

2. Self-Hosted (Optional)

If you prefer to run your own relay instance:

docker-compose.yml
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:

Authentication

Three patterns depending on the provider:

MethodProvidersFormat
Bearer tokenMost providersAuthorization: Bearer hlk_...
Basic AuthRadarr, Sonarr, Prowlarr, Bazarr, Komodo (their webhook settings only support Basic Auth)hlk_... as password, username ignored
GenieKeyTrueNASAuthorization: GenieKey hlk_...

Configuration

متغيّر البيئةالوصفالافتراضي
PUSHWARD_URLPushWard server URL--
PUSHWARD_DATABASE_DSNPostgreSQL connection string--
PUSHWARD_SERVER_ADDRESSHTTP 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.