- onChange({ ...channel, id: v })}
- helper="Unique identifier for this channel"
- info="Used to reference this channel in notification rules. Use lowercase with hyphens (e.g., 'mesh-main', 'email-admin')."
- />
- onChange({ ...channel, type: v })}
- options={typeOptions}
- info={typeDescriptions[channel.type] || 'Select a channel type'}
- />
-
- onChange({ ...channel, enabled: v })}
- helper="Disable to temporarily stop alerts on this channel"
- />
-
- {/* Mesh Broadcast fields */}
- {channel.type === 'mesh_broadcast' && (
- onChange({ ...channel, channel_index: v })}
- min={0}
- max={7}
- helper="Mesh channel number (0-7)"
- info="The mesh channel to broadcast alerts on. Channel 0 is typically the default channel."
- />
- )}
-
- {/* Mesh DM fields */}
- {channel.type === 'mesh_dm' && (
- onChange({ ...channel, node_ids: v })}
- helper="Node IDs to receive DM alerts"
- info="Node IDs that receive direct message alerts. Enter the full node ID (e.g., '!a1b2c3d4') for each recipient."
- />
- )}
-
- {/* Email fields */}
- {channel.type === 'email' && (
- <>
-
- onChange({ ...channel, smtp_host: v })}
- placeholder="smtp.gmail.com"
- helper="SMTP server hostname"
- info="The SMTP server for sending emails. Gmail: smtp.gmail.com, Outlook: smtp.office365.com"
- />
- onChange({ ...channel, smtp_port: v })}
- min={1}
- max={65535}
- helper="587 (TLS) or 465 (SSL)"
- info="SMTP port. Use 587 for TLS (recommended) or 465 for SSL."
- />
-
-
- onChange({ ...channel, smtp_user: v })}
- placeholder="you@gmail.com"
- helper="Login username"
- />
- onChange({ ...channel, smtp_password: v })}
- type="password"
- helper="App password recommended"
- info="SMTP server for sending alert emails. Gmail users: use an App Password, not your regular password. Generate one at myaccount.google.com/apppasswords"
- />
-
- onChange({ ...channel, smtp_tls: v })}
- helper="Encrypt SMTP connection"
- info="Enable TLS encryption for the SMTP connection. Required for most modern email servers."
- />
- onChange({ ...channel, from_address: v })}
- placeholder="alerts@yourdomain.com"
- helper="Sender email address"
- info="The email address that appears as the sender. Some servers require this to match your login."
- />
- onChange({ ...channel, recipients: v })}
- helper="Email addresses to receive alerts"
- info="List of email addresses that will receive alerts from this channel."
- />
- >
- )}
-
- {/* Webhook fields */}
- {channel.type === 'webhook' && (
- <>
- onChange({ ...channel, url: v })}
- placeholder="https://discord.com/api/webhooks/..."
- helper="POST endpoint for alerts"
- info="POST alert JSON to any URL. Works with Discord webhooks, ntfy.sh, Pushover, Slack, Home Assistant, or any service that accepts HTTP POST."
- />
-
-
-
- Custom headers can be configured in the YAML config file
-
- onChange({ ...rule, name: v })}
- helper="Human-readable name for this rule"
- info="A descriptive name to identify this rule. Example: 'Emergency Alerts', 'Fire Notifications', 'Infrastructure Warnings'"
- />
-
- onChange({ ...rule, min_severity: v })}
- options={severityOptions}
- helper="Only alerts at or above this severity"
- info="Only alerts at this severity or above will trigger this rule. 'warning' is recommended for most channels. Use 'info' to receive all alerts."
- />
-
-
-
-
- onChange({ ...data, enabled: v })}
- helper="Master switch for all notification delivery"
- info="When disabled, no alerts will be delivered through any channel. The alert engine still runs and records alerts to history."
- />
-
- {testResult && (
-
- Suppress non-emergency alerts during sleeping hours. Emergency and critical alerts always get through.
-
-
- onChange({ ...data, quiet_hours_start: v })}
- placeholder="22:00"
- helper="When quiet hours begin"
- info="Time in 24-hour format (HH:MM) when quiet hours start. Alerts below emergency severity will be held until quiet hours end."
- />
- onChange({ ...data, quiet_hours_end: v })}
- placeholder="06:00"
- helper="When quiet hours end"
- info="Time in 24-hour format (HH:MM) when quiet hours end. Held alerts will be delivered at this time."
- />
-
-
-
- {/* Dedup Section */}
-
-
- onChange({ ...data, dedup_seconds: v })}
- min={0}
- max={86400}
- helper="Don't re-send the same alert within this window"
- info="Prevents alert spam. If the same condition fires multiple times within this window, only the first one is delivered. Default is 600 seconds (10 minutes)."
- />
-
+ onChange({ ...channel, id: v })}
+ helper="Unique identifier for this channel"
+ info="Used to reference this channel in notification rules. Use lowercase with hyphens (e.g., 'mesh-main', 'email-admin')."
+ />
+ onChange({ ...channel, type: v })}
+ options={typeOptions}
+ info={typeDescriptions[channel.type] || 'Select a channel type'}
+ />
+
+ onChange({ ...channel, enabled: v })}
+ helper="Disable to temporarily stop alerts on this channel"
+ />
+
+ {channel.type === 'mesh_broadcast' && (
+ onChange({ ...channel, channel_index: v })}
+ min={0}
+ max={7}
+ helper="Mesh channel number (0-7)"
+ info="The mesh channel to broadcast alerts on. Channel 0 is typically the default channel."
+ />
+ )}
+
+ {channel.type === 'mesh_dm' && (
+ onChange({ ...channel, node_ids: v })}
+ helper="Node IDs to receive DM alerts"
+ info="Node IDs that receive direct message alerts. Enter the full node ID (e.g., '!a1b2c3d4') for each recipient."
+ />
+ )}
+
+ {channel.type === 'email' && (
+ <>
+
+ onChange({ ...channel, smtp_host: v })}
+ placeholder="smtp.gmail.com"
+ helper="SMTP server hostname"
+ info="The SMTP server for sending emails. Gmail: smtp.gmail.com, Outlook: smtp.office365.com"
+ />
+ onChange({ ...channel, smtp_port: v })}
+ min={1}
+ max={65535}
+ helper="587 (TLS) or 465 (SSL)"
+ info="SMTP port. Use 587 for TLS (recommended) or 465 for SSL."
+ />
+
+
+ onChange({ ...channel, smtp_user: v })}
+ placeholder="you@gmail.com"
+ helper="Login username"
+ />
+ onChange({ ...channel, smtp_password: v })}
+ type="password"
+ helper="App password recommended"
+ info="Gmail users: use an App Password, not your regular password. Generate one at myaccount.google.com/apppasswords"
+ />
+
+ onChange({ ...channel, smtp_tls: v })}
+ helper="Encrypt SMTP connection"
+ info="Enable TLS encryption for the SMTP connection. Required for most modern email servers."
+ />
+ onChange({ ...channel, from_address: v })}
+ placeholder="alerts@yourdomain.com"
+ helper="Sender email address"
+ info="The email address that appears as the sender. Some servers require this to match your login."
+ />
+ onChange({ ...channel, recipients: v })}
+ helper="Email addresses to receive alerts"
+ info="List of email addresses that will receive alerts from this channel."
+ />
+ >
+ )}
+
+ {channel.type === 'webhook' && (
+ <>
+ onChange({ ...channel, url: v })}
+ placeholder="https://discord.com/api/webhooks/..."
+ helper="POST endpoint for alerts"
+ info="POST alert JSON to any URL. Works with Discord webhooks, ntfy.sh, Pushover, Slack, Home Assistant, or any service that accepts HTTP POST."
+ />
+
+
+
+ Custom headers can be configured in the YAML config file
+
+ onChange({ ...rule, name: v })}
+ helper="Human-readable name for this rule"
+ info="A descriptive name to identify this rule. Example: 'Emergency Alerts', 'Fire Notifications', 'Infrastructure Warnings'"
+ />
+
+ onChange({ ...rule, min_severity: v })}
+ options={severityOptions}
+ helper="Only alerts at or above this severity"
+ info="Only alerts at this severity or above will trigger this rule. 'warning' is recommended for most channels. Use 'info' to receive all alerts."
+ />
+
+
+ setConfig({ ...config, enabled: v })}
+ helper="Master switch for all notification delivery"
+ info="When disabled, no alerts will be delivered through any channel. The alert engine still runs and records alerts to history."
+ />
+
+ {config.enabled && (
+ <>
+ {/* Channels Section */}
+
+
+
+
+
+ Where alerts get delivered. Add channels for each destination you want to receive alerts.
+
+ Suppress non-emergency alerts during sleeping hours. Emergency and critical alerts always get through.
+
+
+ setConfig({ ...config, quiet_hours_start: v })}
+ placeholder="22:00"
+ helper="When quiet hours begin"
+ info="Time in 24-hour format (HH:MM) when quiet hours start. Alerts below emergency severity will be held until quiet hours end."
+ />
+ setConfig({ ...config, quiet_hours_end: v })}
+ placeholder="06:00"
+ helper="When quiet hours end"
+ info="Time in 24-hour format (HH:MM) when quiet hours end. Held alerts will be delivered at this time."
+ />
+
+
+
+ {/* Dedup Section */}
+
+
+ setConfig({ ...config, dedup_seconds: v })}
+ min={0}
+ max={86400}
+ helper="Don't re-send the same alert within this window"
+ info="Prevents alert spam. If the same condition fires multiple times within this window, only the first one is delivered. Default is 600 seconds (10 minutes)."
+ />
+