Notifications

SkillCommunication

Lets your agent send app notifications to users through a bell inbox, webhooks, or Slack.

Use Notifications in Claude, ChatGPT or Ahel Desktop

Free. Sign in, add Notifications and connect your AI. About a minute.

Also: Claude Code · Cursor · Codex

Then ask your AI: use the Notifications skill

Details

Instructions available. Your AI can read the instructions. Execution depends on the setup they require.

Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.

NotificationsStart free
About this skill

In-app notifications primitive with pluggable server-side channels. Use when the agent needs to surface progress, alerts, or completions to the user, both in-app (bell + toast) and out-of-band (webhook, Slack, custom).

What this skill tells your AI

The instructions your AI receives, as published by builderio/agent-native in templates/assets/.agents/skills/notifications/SKILL.md and read by ahel’s review.

notify() is the framework's "tell the user something" primitive. Every call persists a row to the inbox (drives the bell UI) and fans out to any registered server-side channels. Channels follow the same pluggable-provider pattern as tracking — register at startup, notify() fans out, errors are isolated.

Use for: agent progress milestones, automation triggers firing, background job completions, critical errors. Don't use for chat replies — those go through the conversation.

Tools

ToolPurpose
notifySend a notification (severity + title + optional body/metadata/channels)
list-notificationsShow recent notifications for the current user

Sending

notify --severity info --title "Booking confirmed" --body "Jane at 3pm"
SeverityWhen
infoFYI / progress / confirmation
warningSomething to look at soon
criticalNeeds immediate attention

Optional: --metadataJson '{"threadId":"abc"}', --channels inbox,webhook (omit to run all registered).

Delivery

notify() always inserts into the notifications table (unless channels explicitly excludes inbox), then fans out to every registered channel in parallel (best-effort; a failing channel doesn't block others). Finally it emits notification.sent on the event bus so automations can chain — e.g. "when a critical notification fires, also page on-call."

Built-in Channels

ChannelHowRequires
inboxINSERT → drives bell UI(always on)
webhookPOST JSON to NOTIFICATIONS_WEBHOOK_URL (+ optional NOTIFICATIONS_WEBHOOK_AUTH); both support ${keys.NAME} + URL allowlists from the ad-hoc-keys systemenv var set

The webhook channel resolves ${keys.NAME} server-side — the raw value never enters the agent context.

Registering a Custom Channel

// server/plugins/notifications-slack.ts
import { registerNotificationChannel } from "@agent-native/core/notifications";

export default () => {
  registerNotificationChannel({
    name: "slack-ops",
    async deliver(input, meta) {
      await fetch(process.env.OPS_SLACK_WEBHOOK!, {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ text: `*${input.severity}* — ${input.title}`, owner: meta.owner }),
      });
    },
  });
};

Names are unique — re-registering replaces. deliver() must be best-effort; a thrown error is logged and ignored. Do NOT call notify() from inside a channel (recursion).

HTTP API

Mounted at /_agent-native/notifications/* by core-routes-plugin, all session-scoped:

  • GET /notifications?unread=true&limit=50&before=<iso>
  • GET /notifications/count
  • POST /notifications/:id/read
  • POST /notifications/read-all
  • DELETE /notifications/:id

UI

import { NotificationsBell } from "@agent-native/core/client/notifications";

<NotificationsBell browserNotifications />

Bell icon + unread badge + lazy-loaded dropdown. Pass browserNotifications to also fire system new Notification(...) popups for items that arrive after mount (dedups by id, renders an "Enable" prompt until permission is granted, silently no-ops on denied / unsupported). Styled with shadcn tokens — adapts to the host theme.

Related

  • automations — event-triggered bodies can call notify.
  • secrets — ${keys.NAME} substitution + URL allowlists powering the webhook channel.
  • tracking — analytics; separate concern, don't route through notifications.

Signals

GitHub stars
7k
Forks
635
Last commit
Oct 2026
Advanced
Item type
skill
Key
notifications
Source
github.com/builderio/agent-native