Skip to main content
Beyond webhooks, Greenlight can fan job-lifecycle events out to a set of human-facing notification channels. Each driver is optional; enable by setting the relevant environment variables.

Runtime shape

VariableDefaultDescription
NOTIFY_QUEUE_SIZE256Internal bounded buffer; beyond this, events are dropped with a warning log.
NOTIFY_TIMEOUT8sPer-driver request timeout.
NOTIFY_MAX_RETRY4Retry cap.
NOTIFY_RETRY_MIN_WAIT1sInitial back-off.
NOTIFY_RETRY_MAX_WAIT30sMax back-off.

Slack

NOTIFY_SLACK_WEBHOOK_URLS=https://hooks.slack.com/services/T000/B000/xxxx,https://hooks.slack.com/services/T111/B111/yyyy
Comma-separated list. Every URL receives every event.

Microsoft Teams

NOTIFY_TEAMS_WEBHOOK_URLS=https://outlook.office.com/webhook/...

Discord

NOTIFY_DISCORD_WEBHOOK_URLS=https://discord.com/api/webhooks/...

Firebase Cloud Messaging

Mobile push on Android (and iOS if you’ve set up FCM there).
VariableDescription
NOTIFY_FCM_SERVER_KEYFCM legacy server key.
NOTIFY_FCM_DEVICE_TOKENSComma-separated device tokens.

Apple Push Notification service (APNs)

iOS push.
VariableDescription
NOTIFY_APNS_KEY_IDAPNs key id.
NOTIFY_APNS_TEAM_IDApple Developer team id.
NOTIFY_APNS_BUNDLE_IDTopic bundle id.
NOTIFY_APNS_PRIVATE_KEYPEM key inline.
NOTIFY_APNS_PRIVATE_KEY_FILEPEM key file path (alternative to inline).
NOTIFY_APNS_DEVICE_TOKENSComma-separated device tokens.
NOTIFY_APNS_PRODUCTIONtrue for the production APNs environment; false (default) for sandbox.

AWS SNS

Event fan-out to SNS topics.
VariableDescription
NOTIFY_SNS_REGIONAWS region.
NOTIFY_SNS_TOPIC_ARNSComma-separated topic ARNs.

WebPush

Browser push (Chrome, Firefox, Edge, Safari 16+).
VariableDescription
NOTIFY_WEBPUSH_SUBJECTmailto:... or URL the subscriber can contact.
NOTIFY_WEBPUSH_PUBLIC_KEYVAPID public key.
NOTIFY_WEBPUSH_PRIVATE_KEYVAPID private key.
NOTIFY_WEBPUSH_SUBSCRIPTIONS_JSONJSON array of push subscription objects (or a path to a file).

Delivery semantics

  • All drivers are fire-and-forget from the worker’s perspective.
  • A dedicated goroutine pool drains the notification queue.
  • Failures retry up to NOTIFY_MAX_RETRY times with the configured back-off; then they are logged and dropped.
  • No ordering guarantees across drivers — the same event may reach Slack before Teams, or vice versa.