Skip to content
Novu logoNovu

Changelog

Product updates, improvements, and fixes

Follow us on X

All changelog posts

  • Agent Inbox: give your AI agent a way to reach you

    Agent Inbox is now available. Give your AI agent its own email address, Telegram bot and Slack app, set it up in one command, and connect it over CLI or MCP.

    Authors:
    Dima GrossmanPaweł TymczukNikita GrossmanVictor Yakubu
    Dima G., Paweł T., Nikita G., Victor Y.
    Cover image for Agent Inbox: give your AI agent a way to reach you

    Give your agent its own name, email address and contact card, plus its own Telegram bot and Slack app, so it can reach people and people can reach it.

    Agent Inbox is now available. It works with the agent you already run, whether that's Claude Code, Codex, Cursor, ChatGPT, OpenClaw, Hermes, or anything that can run a CLI or connect to MCP.

    Your agent can ask a question, request an approval or offer a choice, then wait for the answer and carry on. People and services can write to it directly, so verification codes, receipts and replies reach the agent instead of your inbox.

    Create an inbox in one command

    Run the setup command, choose a name for your agent and pick its address. Availability is checked as you type, and --agent-handle sets the address up front in scripts.

    npx @agentinbox/cli setup

    You don't need an account to start. The inbox receives email straight away and works as a free demo until you claim it with login. If setup stops partway, your inbox is kept, and running it again picks up where it left off. The email you sign up with on the dashboard counts as confirmed, so you're only asked to confirm the addresses that need it.

    Connect the agent you already run

    Onboarding gives each way to connect its own tab. It recognizes agents you've already connected, opens desktop apps when they're installed, and moves on by itself once the connection works.

    Claude, ChatGPT, Cursor and Hermes connect over MCP at https://mcp.agentinbox.md, with guided sign-in. Coding agents like Claude Code and Codex use the CLI, plus skills that teach them when to reach you and when to just ask in the chat. To use the same agent on another computer, connect it with a one-time code from the dashboard.

    Ask, approve and choose, then carry on

    Your agent can involve a person in four ways: ask a free-text question, request an approval, offer a choice of up to 10 options, or send an update that needs no reply. Conversation commands run directly, without an inbox group:

    npx @agentinbox/cli send approve "Deploy v2.4.1 to production?" --ttl 2h
    npx @agentinbox/cli send choose "Pick a rollout" --option canary --option blue-green
    npx @agentinbox/cli list --filter unread
    npx @agentinbox/cli reply conv_123 "Yes, it's live."

    Every answer comes back with who gave it and when. Exit codes tell your script what happened (0 approved, 10 denied, 11 still waiting, 12 expired), so the same command can gate a deploy step in CI. You can rename the Approve and Deny buttons, add extra buttons, and add a subtitle and body to give the person context. show, read and resolve work the same way as the commands above.

    Start Claude Code when a message arrives

    Coding agents only read their inbox while someone is running them. Run listen in a project folder, and a message from you, or from a contact you choose, starts Claude Code there to handle the conversation and reply in it.

    npx @agentinbox/cli listen claude-code

    You approve listening before it starts, and strangers' messages never start a run. Anything outside the project, like a command its settings don't allow or messaging someone else, asks you first on your phone. listen runs in the background and starts again after a restart. Check it with listen status and turn it off with listen stop.

    Reach the right person

    Questions go to you by default. Invite a teammate with a link, and they connect the channel they prefer. Then send a question with --to to reach them, or to several people at once, where the first valid answer wins.

    Reach people on Telegram and Slack

    Email works as soon as the inbox exists. Apps connected over MCP can add Telegram and Slack themselves, and setup links open the Agent Inbox connection page for your site, including custom and self-hosted addresses. Every agent gets a default avatar on Telegram and Slack, so it's recognizable from the first message.

    Decide who can reach your agent

    Choose whether anyone can write to your agent or only your contacts. Messages from people who aren't contacts are labelled as strangers. Your agent can reply to them but never message them first, and it treats what they write as information, never as instructions. You can pause the agent at any time: it stops reading and sending, and messages wait until you resume.

    Share your agent with a card

    Each agent and contact has a card with a scannable QR code that opens the public card, so people find every way to reach your agent in one place.

    Get started with the Agent Inbox quickstart, or run npx @agentinbox/cli setup.

  • Web Chat for in-app agent conversations

    Embed a Novu Connect agent in your React application while Novu handles live delivery, history, approvals, and conversation state.

    Authors:
    Adam ChmaraVictor Yakubu
    Adam C., Victor Y.
    Cover image for Web Chat for in-app agent conversations

    Web Chat is now available in open beta on Novu Connect. It gives your agent an in-app channel, so users can start and continue a conversation inside your product instead of moving to Slack, Microsoft Teams, WhatsApp, Telegram, or email.

    The React client is headless. You build the message list, composer, and layout that fit your product. Novu manages the live connection, conversation history, agent-run state, tool approvals, and activity visible in the Dashboard.

    Build the interface your product needs

    Install @novu/react, place NovuProvider above your chat, and call useWebChat with the agent's public identifier:

    import { useWebChat } from '@novu/react';
    
    const {
      messages,
      sendMessage,
      isRunning,
      isLoading,
      typing,
      error,
    } = useWebChat({
      agentId: 'support-bot',
    });

    There is no prebuilt Web Chat component. Render the conversation with your own React components, or connect the hook to a chat UI library. An official assistant-ui recipe is available if you want a component-based starting point.

    useWebChat exposes the ordered message timeline and the state needed to build the experience around it. Disable the composer while history loads or the agent is running, show failures in the interface, and let subscribers retry messages that did not send.

    Show each turn as it happens

    Web Chat delivers updates over a live socket connection. While the agent works, you can show its current typing status and render thinking parts as they arrive instead of leaving the user at an indefinite loading state.

    The conversation persists beyond the current page view. You can resume an existing conversation by its ID, load older messages, reconnect after an interruption, and retry a failed message through the same client.

    Keep approvals, tools, and Cards in the conversation

    Agent interactions work inside Web Chat as part of the message timeline:

    • Render tool calls and their results.
    • Ask the subscriber to approve or deny a gated tool call, then resume the agent turn with the decision.
    • Open an authorization flow when an MCP server needs to be connected.
    • Render Cards and send button actions back to the conversation.
    • Display custom interfaces from data emitted by a custom code agent.

    The hook exposes each interaction as structured data, so you decide how it looks while Novu maintains the underlying conversation state.

    Use one agent across in-app and external channels

    Web Chat uses the same Novu Connect agent as your other agent channels. The agent's behavior, tools, and conversation logic do not need a separate in-app implementation. Connect the channels your users prefer, then give them a product-native option when they are already inside your application.

    Each Web Chat conversation is also visible in Agent Conversations in the Novu Dashboard, where your team can inspect its state, message history, metadata, and channel activity.

    Before releasing Web Chat to your users, enable HMAC authentication for the subscriber and agent identifiers. This prevents someone from impersonating another subscriber or connecting to an agent they should not access.

    Follow the Web Chat quickstart, or run the following command to scaffold a complete example with messages, Cards, approvals, and a conversation sidebar:

    npx novu connect --channel web-chat

  • Manage agents and conversations through the Novu MCP server

    Create and update agents, connect channels, and inspect conversation activity from any MCP-compatible AI tool.

    Authors:
    Nikita GrossmanVictor Yakubu
    Nikita G., Victor Y.
    Novu MCP Server

    Agent and conversation tools are now available on the Novu MCP server. You can manage the conversational side of Novu from the same AI tool you use to create workflows, inspect subscribers, and troubleshoot notification delivery.

    Ask your assistant to create or update an agent, connect a channel, list recent conversations, or inspect the activity timeline for a specific thread. Together with the existing workflow tools, you can also assign agents to existing workflows without switching between your editor and the Novu Dashboard.

    Create and configure agents from a prompt

    The new agent tools cover the core setup and management flow:

    ToolWhat it does
    create_agentCreates a Novu agent.
    get_agentsLists agents with cursor-based pagination.
    get_agentRetrieves one agent by its public identifier.
    update_agentUpdates an agent's name, status, bridge URL, or behavior.
    connect_agentConnects a channel to an existing agent.

    For example, you can ask:

    Create a managed Novu agent called Support Bot that answers product questions briefly, then connect Slack to it.

    Your AI tool discovers the required Novu operations and calls them in sequence. Agent tools use the agent's public identifier, such as support-bot, rather than its internal database ID.

    Inspect conversations where you build

    Two conversation tools bring agent debugging into the same workflow:

    • get_conversations lists agent conversations and supports optional filters.
    • get_conversation_activities returns the activity timeline for a conversation.

    You can move from an agent to its latest conversation and inspect the full thread activity with one prompt:

    Show recent conversations for the support-bot agent, then inspect the activity timeline for the latest one.

    This makes it easier to investigate a failed turn, review what happened around a tool approval, or trace a conversation back to its channel without starting in the Dashboard.

    Use the tools in the right environment

    OAuth connections default to the Development environment. Ask the assistant to list your environments, then pass the target environment when you need to work in Production or another environment. API keys remain scoped to the environment they belong to.

    The account-management MCP server is available for Novu Cloud at:

    • US: https://mcp.novu.co/
    • EU: https://eu.mcp.novu.co/

    OAuth is the recommended authentication method for interactive clients. A Novu Cloud API key is available as a fallback for clients that do not support OAuth.

    The hosted endpoints do not connect to self-hosted Novu installations. The conversation tools also require Novu Cloud with Conversations enabled.

    Connect the Novu MCP server to Cursor, Claude Code, ChatGPT, VS Code, Codex, or another MCP-compatible tool to get started.

  • Agent-Assigned Workflows

    Turn a workflow notification into the first turn of an agent conversation, with the original message and trigger payload already in context.

    Authors:
    Nikita GrossmanVictor Yakubu
    Nikita G., Victor Y.
    Cover image for Agent-Assigned Workflows

    You can now assign an agent to a workflow from the Novu Dashboard. Workflow messages are sent through the agent's connected channels, and when a subscriber replies, Novu routes the reply to that agent with the originating workflow, message, and trigger payload already in context.

    This closes the gap between notifications and conversations. A workflow can send “Your order has shipped,” the subscriber can reply “Can I change the delivery address?”, and the agent receives the order data from the original trigger without a separate correlation layer in your application.

    Turn a notification into a conversation

    Enable Send & reply via agent in the workflow editor and select the agent that should handle replies. Novu associates the outgoing workflow message with that agent and delivers it through the agent's applicable channel connection.

    When the subscriber replies, Novu maps the response back to the sent notification. Depending on the channel, this uses the email reply token, the Slack thread, a quoted message on WhatsApp, Telegram, or Microsoft Teams, or the existing one-to-one conversation history on iMessage.

    The original workflow context is attached when the conversation starts. Later replies reuse that context, so your application does not need to reload and attach the same notification data on every turn.

    For example, an order-support workflow could provide the agent with the rendered shipping message and a payload containing the order ID, tracking number, and delivery address. The agent can then use those values when it handles a follow-up question.

    Send through the agent's connected channels

    An assigned workflow can send through agent-linked Slack, Microsoft Teams DM, WhatsApp, Telegram, iMessage through Sendblue, and email integrations when the subscriber is reachable on that connection.

    Email can use an agent-specific sender and optional reply-to address, so replies return to the agent instead of a no-reply inbox.

    If the selected agent does not have an applicable channel connection, Novu falls back to the provider integration configured in the environment and adds a warning to the step. The assignment does not silently drop the delivery. A Chat step is skipped only when the subscriber has no reachable Chat channel, which matches the existing delivery behavior.

    Give custom code and managed agents the workflow context

    Custom code agents receive a typed ctx.notification field when a conversation starts from an assigned workflow:

    import { isFromWorkflow } from '@novu/framework';
    import { orderShipped } from './workflows/order-shipped';
    
    if (isFromWorkflow(ctx.notification, orderShipped)) {
      const { orderId, trackingNumber } = ctx.notification.payload;
    }

    When the workflow defines a payload schema, ctx.notification.payload uses that schema for type inference. The field is null when the conversation started with an inbound message instead of a workflow notification.

    Managed agents receive the same originating workflow and payload data automatically as conversation context. Novu adds a short assistant message that identifies the workflow, followed by the payload as JSON. There is no handler to update.

    The Agent Conversations timeline in the Dashboard also shows the originating workflow notification, so you can trace how the conversation started alongside the replies that followed.

    Override the assigned agent for one trigger

    The workflow assignment is the default. You can route a single execution to another agent by passing its public identifier as agentId:

    await novu.trigger({
      workflowId: 'order-shipped',
      to: 'subscriber-123',
      payload: {
        orderId: 'order-456',
        trackingNumber: '1Z999AA10123456784',
      },
      agentId: 'order-support-agent',
    });

    Omit agentId to use the agent assigned in the workflow. Pass agentId: null when that execution should send without agent reply routing.

    Open a workflow in the Dashboard and enable Send & reply via agent to get started. See the AI SDK quickstart, Trigger event API, and Agent Conversations documentation for the related APIs and runtime behavior.

  • Provider content overrides in the Dashboard

    Save provider-native JSON on Chat and Tool workflow steps, then version and promote it with the rest of the workflow.

    Authors:
    George DjabarovVictor Yakubu
    George D., Victor Y.
    Provider content overrides in the dashboard

    Provider content overrides can now be configured directly in the Novu Dashboard. Use them when a workflow needs fields from a provider's native API that the shared step editor does not expose, such as Slack Block Kit, WhatsApp templates, or PagerDuty incident fields.

    Previously, these payloads had to be added to every trigger() call in application code. You can now save the JSON once on the workflow step. It applies to every trigger and moves from development to production with the workflow.

    Keep provider-native content with the workflow

    Open a Chat or Tool step and select a connected provider from the content source dropdown. Provider tabs only appear when that provider has an active integration in the current environment.

    The override is stored as a JSON object on the step. It supports Liquid variables, so the payload can still use workflow and subscriber data:

    {
      "blocks": [
        {
          "type": "section",
          "text": {
            "type": "mrkdwn",
            "text": "Deploy *{{payload.status}}* for {{subscriber.firstName}}"
          }
        },
        {
          "type": "actions",
          "elements": [
            {
              "type": "button",
              "text": { "type": "plain_text", "text": "View run" },
              "url": "{{payload.runUrl}}"
            }
          ]
        }
      ]
    }

    The Dashboard also shows a preview of the merged payload before you save the workflow.

    Get validation where a provider schema is available

    Schema-backed editors help you catch malformed provider payloads before delivery. Slack overrides include autocomplete and validation against supported chat.postMessage fields, including nested Block Kit elements. The editor also links to Slack's Block Kit Builder.

    WhatsApp Business overrides provide autocomplete and validation for message shapes such as templates, interactive messages, media, and text. The same override interface is available for Tool providers, including PagerDuty, Opsgenie, Grafana, and Tool Webhook.

    When a provider does not have a schema-backed editor, the Dashboard provides a free-form JSON field with a warning and a link to the provider's documentation. Novu passes that object to the provider, so test the workflow with a real trigger before relying on it.

    Combine default content and overrides predictably

    The shared step body remains the default content. Novu merges the saved override into the provider request. If the override omits the provider's primary content field, such as text for Slack or text.body for WhatsApp, Novu fills it from the rendered step body.

    Overrides follow this precedence order:

    1. Dashboard override saved on the step.
    2. Workflow-level provider override passed at trigger time.
    3. Step-level provider override passed at trigger time.

    The higher-priority value wins when the same field appears at multiple levels. Arrays replace the lower-priority array as a whole. They are not merged by index.

    Some Slack chat.postMessage fields do not apply when the integration delivers through an incoming webhook. Check the Slack setup guide before relying on fields such as thread or sender metadata.

    Use Rich Chat for shared content and overrides for provider-specific fields

    The Rich Chat editor and provider content overrides work together. Use the block editor when you want to create one structured message and let Novu render it for each connected chat provider. Use an override when one provider needs its own JSON format or a field outside the shared card model.

    Provider content overrides are available for Tool steps and are rolling out gradually for Chat steps. If the provider dropdown does not appear on a Chat step yet, trigger-time provider overrides continue to work.

    Read the Chat provider content overrides overview, configure Slack overrides in the Dashboard, or review the provider override precedence rules.

  • Rich chat editor for workflow Chat steps

    Build structured chat notifications with text, images, lists, link buttons, variables, and provider-aware previews from the workflow editor.

    Authors:
    Paweł TymczukVictor Yakubu
    Paweł T., Victor Y.
    Rich chat editor for workflow Chat steps

    Workflow Chat steps now include a visual block editor. Instead of limiting every workflow-sent chat notification to one text body, you can compose structured messages for approvals, reports, summaries, prompts, and calls to action from the Dashboard.

    Novu converts the shared message into a provider-specific format at delivery time. You author the content once, then inspect how it may appear on each chat provider connected to the environment.

    Rich chat editor

    Build structured Chat steps visually

    Type / or use the add control to insert blocks into a Chat step. The first release supports:

    • Text and images.
    • Dividers, blockquotes, hard breaks, and numbered or bulleted lists.
    • Link buttons with variable-backed labels and redirect URLs.
    • Repeat and Digest blocks for content produced by earlier workflow steps.

    Dashboard buttons open a URL. They do not route a reply to an agent or call back into your application.

    Preview each provider before publishing

    The preview panel uses the same shared card model as delivery. Switch between providers configured in the current environment to inspect an approximate rendering for each one.

    Novu maps the card into provider-specific formats for Slack, Microsoft Teams, Telegram, and WhatsApp. Providers without a matching rich layout receive a compatible Markdown or text representation. When a provider cannot represent a block or button fully, the preview shows a compatibility warning so you can simplify the message or add a provider content override.

    Provider previews are approximate. The delivered message can still differ because each platform controls its own spacing, layout, and supported features.

    Existing text workflows keep their behavior

    Existing Chat steps that use plain text or Liquid continue to use the Text editor and deliver as before. New empty Chat steps open in the Block editor by default.

    You can switch between the Block and Text editors, but changing modes replaces the content stored for the current mode. Copy any content you need before switching while editing an existing workflow.

    Liquid variables and translations continue to work. Use the Text editor for templates that depend heavily on Liquid conditions or loops. Use the Block editor when the message benefits from a structured layout that can be shared across providers.

    Return the same card model from Framework

    Code-first workflows can return a card from step.chat() instead of a text-only body:

    Return the same card model from Framework
    import { Actions, Card, CardText, Divider } from '@novu/framework';
    
    await step.chat('deploy-complete', async () => ({
      card: Card({
        title: 'Deploy complete',
        children: [
          CardText('All checks passed.'),
          Divider(),
          Actions([
            {
              type: 'link-button',
              id: 'view-deploy',
              label: 'View deploy',
              url: 'https://example.com/deploys/123',
            },
          ]),
        ],
      }),
    }));

    Existing body returns remain valid. When a Chat step returns both body and card, Novu uses the card.

    Add provider-native JSON when the shared card is not enough

    The block editor covers shared rich content. Provider content overrides remain available beside Default content when you need exact provider JSON, such as a full Slack Block Kit payload or a WhatsApp template.

    Read how to write Chat templates in the Dashboard or see the Framework Chat step for code-first workflows.

Free to start, ready to scale

10K events/month free forever. From weekend projects to enterprise scale, we've got you covered.