Skip to main content
Kener’s notification system has two layers that work together:
  1. Triggers — reusable delivery channels (email, Slack, Discord, or a custom webhook). Each trigger stores where to send a notification and how to format it.
  2. Alert configs — rules that watch a monitor (or several monitors) and fire when a condition is met. Each alert config references one or more triggers.
This separation lets you define a “Slack #ops” channel once as a trigger, then attach it to as many alert configs as you like.

How it works

Monitor check runs


Alert config evaluates condition
  (STATUS DOWN, LATENCY > Nms, UPTIME < X%)

       ├─ failure_threshold consecutive failures → TRIGGERED
       │         │
       │         ▼
       │   Sends notification via attached triggers

       └─ success_threshold consecutive successes → RESOLVED


           Sends resolution via attached triggers
When an alert config transitions from TRIGGERED to RESOLVED, Kener fires another round of notifications so you know the issue cleared.

Alert types

Each alert config monitors one of three things:
alert_foralert_valueFires when
STATUSDOWN or DEGRADEDMonitor reaches that status
LATENCYNumber (milliseconds)Response latency exceeds the value
UPTIMENumber (0–100, percentage)Uptime drops below the value

Thresholds

Two thresholds control noise:
FieldTypeDescription
failure_thresholdInteger ≥ 1Consecutive failures required before firing the alert
success_thresholdInteger ≥ 1Consecutive successes required before resolving the alert
Setting failure_threshold to 3 means a single blip won’t page you — the monitor must fail three times in a row.

Severity

Alert configs have a severity of either WARNING or CRITICAL. Severity is included in every notification payload so downstream tools (PagerDuty, Opsgenie, custom scripts) can route accordingly.

Automatic incident creation

Set Create Incident to YES on an alert config to automatically open an incident when the alert fires. The incident ID and URL are included in the notification payload.

Notification channels

Email

Send alerts via SMTP or Resend API to one or more recipients

Slack

Post rich Block Kit messages to a Slack channel via incoming webhook

Discord

Post embed messages to a Discord channel via webhook URL

Webhook

HTTP POST to any URL with a customizable JSON payload and headers

Variable reference

Every notification template (for all channel types) receives the following Mustache variables at render time:
VariableTypeDescription
alert_idnumberUnique ID of this alert record
alert_namestringHuman-readable alert label
alert_forstringSTATUS, LATENCY, or UPTIME
alert_valuestringThreshold value (e.g. DOWN, 1000, 99)
alert_statusstringTRIGGERED or RESOLVED
alert_severitystringWARNING or CRITICAL
alert_messagestringAlert description from the config
alert_sourcestringSource identifier (alert)
alert_timestampstringISO 8601 timestamp
alert_cta_urlstringLink to the monitor page
alert_cta_textstringLabel for the CTA link
alert_incident_idnumber | nullIncident ID if one was created
alert_incident_urlstring | nullDirect URL to the incident
alert_failure_thresholdnumberConfigured failure threshold
alert_success_thresholdnumberConfigured success threshold
is_resolvedbooleantrue when the alert cleared
is_triggeredbooleantrue when the alert fired
site_urlstringPublic URL of the Kener instance
site_namestringDisplay name of the Kener site
site_logo_urlstringAbsolute URL to the site logo
colors_upstringHex color for UP status
colors_downstringHex color for DOWN status
colors_degradedstringHex color for DEGRADED status
colors_maintenancestringHex color for MAINTENANCE status
Mustache conditional blocks work as expected:
{{#is_triggered}}🚨 Alert fired{{/is_triggered}}
{{#is_resolved}}✅ Issue resolved{{/is_resolved}}
{{#alert_incident_url}}<{{alert_incident_url}}|View Incident>{{/alert_incident_url}}

Next steps

Alert triggers

Create and configure delivery channels

Email setup

Configure SMTP or Resend for email alerts

Build docs developers (and LLMs) love