{# Channels list page — Settings › Channels. Renders inside the shared /settings/_base.html shell (owned by Agent C). Uses the shell's shared ``.card`` / ``.btn`` / ``.data-table`` classes from /static/settings.css; anything channel-specific is inline here. #} {% extends "settings/_base.html" %} {% from "_macros.html" import confirm_dialog %} {% block section_header %}

Channels

Where Agent Drop sends push notifications. Add one or more channels and mark one as the default; every drop uses that channel unless a routing rule picks a different one.

{% endblock %} {% block settings_content %} {# Flash messages. ``notice`` is driven by the ?notice= query param and is intentionally denylisted: we only render known values so an attacker can't inject arbitrary strings via the query. #} {% if notice == "sent-ok" %}
Test notification sent.
{% elif notice == "failed" %}
Test notification failed.{% if detail %} {{ detail }}{% endif %}
{% elif notice == "created" %}
Channel created.
{% elif notice == "updated" %}
Channel updated.
{% elif notice == "deleted" %}
Channel deleted.
{% elif notice == "default-set" %}
Default channel updated.
{% elif notice == "not-found" %}
Channel not found.
{% endif %}
+ New channel
{% if channels %}
{% for c in channels %} {% endfor %}
Name Driver Default Created Actions
{{ c.name }} {{ c.driver }} {% if c.is_default %} default {% else %} {% endif %} {{ c.created_at.strftime("%Y-%m-%d") }} Edit
{% if not c.is_default %}
{% endif %}
{{ confirm_dialog( form_id="delete-channel-" ~ c.id, title="Delete channel?", message="Delete channel " ~ c.name ~ "? This cannot be undone.", confirm_text="Delete channel", danger=True, ) }}
{% else %}
No channels yet.

The recommended default is Web Push — set the AGENTDROP_VAPID_* env vars and restart, and a default web_push channel is created for you. Alternatively, add a Pushover / ntfy / Apprise / webhook channel above. Until a channel exists, every drop's POST response carries a "no channel configured" warning.

{% endif %} {% endblock %}