Honest comparison
Novu is an open-source notification platform that grew a platform for agents. In a Novu chat, tool calls can carry approve and deny cards, and its human CLI can ask over Telegram, Slack or email. With Pushary, your agent calls decisions.ask(), your user answers on their phone, and your code gets the answer. If nobody answers in time, the action does not run.
Novu has two ways to ask a person. In a Novu chat on Slack, Teams, WhatsApp or Telegram, approval cards gate an agent's tools. Outside a chat, its human CLI sends the question to Telegram, Slack or email and waits for the answer. Pushary sends the question to your user's lock screen, treats no answer as no, and keeps every decision where your API can look it up by id.
Novu's own docs describe it: requesting tool approval posts the card and ends the turn, and the decision arrives later in a separate handler. That fits a chat runtime. Code in the middle of a workflow wants the opposite. decisions.ask() waits where it is called and returns the answer, so the next line of your function acts on it. For a longer wait, Pushary keeps the request, and your code picks the run back up when the answer arrives by webhook or polling.
In Novu's documented model, a pending approval is denied when the user sends a new message. No expiry or reminder policy is documented for a card that simply goes unanswered. When its human CLI times out, the request stays pending and the command exits with code 11. Pushary puts silence on a clock you set. When the time runs out, the request closes as not approved, your agent is told, and the expiry is saved with the question.
Novu's tool approval cards carry two buttons. Real oversight often needs more: pick which environment to roll back, choose a refund amount, type the sentence the agent should send. Pushary asks a yes/no question, a choice from a list, or for a typed answer. Yes/no questions are answered right on the lock screen. A choice or a typed answer opens the Pushary app, on a phone your user connected once with your link.
Novu's notification core is open source with a large community, self-hosting is real, and the in-app Inbox component is the fastest way to ship a notification center. Novu Connect solves hard plumbing for chat agents: webhook ingestion, identity resolution, and one thread across channels. Its human CLI lets any agent ask a person over Telegram, Slack or email. If your agent is a chat participant, or open source is a must, give Novu a serious look. Pushary puts the question on your user's lock screen, and no answer means no.
| Feature | Pushary | Novu |
|---|---|---|
| Returns the person's answer to the code that is waitingCORE | ||
| Approve or Deny on the phone's lock screen | ||
| No answer means no, by default | ||
| Yes/no, a choice from a list, or a typed answer | ||
| Your users connect their phone with a linkCONNECT | ||
| Look up any decision by id in the API | ||
| Approve/deny cards on agent tool calls | ||
| Two-way agent conversations in Slack, Teams, WhatsApp, Telegram | ||
| Embeddable in-app notification inbox | ||
| Open-source notification core, self-hostable | ||
| Pricing | Partner $99/mo, public and self-serve | Free tier, paid plans from $30/mo |
Competitor rows reflect Novu's public docs and pricing pages as of October 2026. Their agent platform is new and moving fast, so check their docs for current state.
Yes, and it is real. Inside a Novu-run agent conversation, setting needsApproval on a tool (or calling ctx.toolApproval.request in a custom-code agent) posts an approve/deny card into the user's channel and pauses the agent's turn. The decision then arrives in a separate handler call. That is a turn-based pause inside Novu's conversation runtime. Outside a chat, Novu's human CLI sends the question to Telegram, Slack or email and waits for the answer. Pushary's decisions.ask() also waits and returns the answer, and the question goes to your user's lock screen.
Novu's tool approval card is approve or deny. Its ask and choose flows, and its human CLI, can also collect a choice or a typed answer. Pushary asks your user a yes/no question, a choice from a list, or for a typed answer, and returns the answer to the code that asked.
In Pushary, the action does not run. When the time you set runs out, the request closes as not approved and the expiry is saved. Novu's tool-approval docs show no timeout, reminder or expiry policy for a pending card. A new user message in the conversation auto-denies pending approvals, so the outcome depends on chat activity rather than a clock you set. When Novu's human CLI times out, the request stays pending and the command exits with code 11.
In Novu, they live in the conversation context (ctx.history). Its dashboard shows conversation history and tool activity, and its REST API reference documents no decisions resource to query. Pushary saves every question and answer. You can read any decision by id through the API. Add a callback URL and each answer is sent to your server as a signed webhook.
In two clear cases. If you want open-source notifications (multi-channel workflows, digest and delay steps, an embeddable inbox) and might self-host, Novu is a strong pick. And if you are building a chat agent that lives in Slack, Teams, WhatsApp or Telegram, Novu Connect solves the channel plumbing, identity resolution and threading, with approval cards included. Its human CLI also lets any agent ask a person over Telegram, Slack or email. Pick Pushary when an agent must stop, reach a specific user on their phone's lock screen, and treat no answer as no.
Connect each user once with a link. Then ask before the risky step, and your code waits for the answer. No answer means no, and every answer is saved. Works with the Vercel AI SDK, LangGraph, CrewAI, Mastra, the OpenAI Agents SDK, Eve, Hermes and MCP.
Start free