Repository navigation
Guides User Inbox
One place for the messages that reach Kanna from outside — webhooks and MCP sources — read first by an agent, answered by you, with every other event browsable as activity.
The Inbox is where messages from outside Kanna land: a webhook delivery, or a message from an MCP source such as a Zalo conversation. Open Inbox in the sidebar. The badge beside it counts what needs you.
- The message becomes a thread. Messages from the same source and the same
conversation (a Zalo
threadId, or whatever the source's thread key names) stack into one thread, so a chatty contact is one row, not twenty. - If the source's handler mode is New chat or Run in chat, an agent
reads the message first in that thread's own chat. For New chat the chat
is created on the first message, titled
<source> · <sender>, and reused for every later message in the thread, so the agent keeps the conversation context. - The agent reports a verdict — needs you, FYI or handled — with a short summary and, for a needs you thread where a reply makes sense, a draft or a proposal to send. The agent never sends anything to the sender on its own: when it proposes a send, Kanna decides what happens (see Autonomy).
- Only a needs you thread interrupts you: a toast (unless you are already on the Inbox), the sidebar badge, the window title count, and a push notification if you have those enabled. FYI threads sit in the Inbox quietly; handled threads appear in Activity only.
If the agent's turn ends without a report, the thread is shown as needs you with the raw message, so nothing is lost silently. A source with the Notify handler mode skips the agent and goes straight to needs you.
| Tab | Shows |
|---|---|
| Inbox | Threads that are new, need you, or are FYI, unread first, grouped by day — plus attention items: a failed turn, a tool call waiting for your approval (until it is answered), a failed cron, subagent or loop run. Tool calls your permission policy approves or denies on its own never appear here. |
| Activity | Every event the server records — chats, turns, queue, tasks, cron, loops, subagents, webhooks, MCP messages — newest first, with filters by source, project, chat and needs attention, and Load older for history. |
Opening a thread marks it read. Mark all read clears the whole Inbox tab.
Mark unread in a thread's header (or U) turns it unread again, and it
stays unread while you keep it open; opening it again later marks it read. The
same control reads Mark read while the thread is unread.
Hover a thread (or tab to it) and tick the checkbox that replaces its avatar, or
press X on the open thread. On a touch screen every row shows its checkbox
beside the avatar instead. Once any thread is ticked, the quick filters give
way to a bar showing N selected with Mark read, Mark unread,
Snooze, Archive and Clear; Esc clears the selection before it closes the open
thread. Only threads can be selected, not Activity items, and a thread that
leaves the list (a search or filter hides it, or it gets archived) drops out of
the selection.
Snooze (or H on the open thread) takes a thread out of the Inbox until a
time you pick: Later today (three hours from now), Tomorrow (9:00 the
next morning), Next week (9:00 next Monday) or Pick a time, which takes
any date and time in the future. The thread closes, and a toast says Snoozed
until … with Undo. The same menu is in the bulk bar, so you can snooze
several selected threads at once.
A snoozed thread is hidden from All, Needs you, FYI and Unread and does not count toward the unread badge. The Snoozed quick filter lists only snoozed threads, each marked Until its wake time. Open one to see Snoozed until … with Unsnooze, which brings it back at once.
A snoozed thread returns when:
- the time passes: it comes back unread, and a thread that needs you raises the same toast and push notification as any other thread that needs you. This also holds after Kanna restarts: a snooze that came due while Kanna was off wakes when it starts, and the others keep waiting;
- a new message arrives in that conversation: it comes back at once, unread;
- you Unsnooze it or press Undo on the toast.
Archiving or replying to a snoozed thread ends its snooze. Only threads that are new, need you or are FYI can be snoozed; an archived thread cannot. If the agent reports on a thread while it is snoozed, the thread keeps sleeping and no notification is sent until it wakes.
Open a thread to see its messages (Show raw reveals the exact payload), the agent's read, and a reply box seeded with the draft. What you sent appears in the thread between the messages that arrived, ordered by time.
-
Send sends the text in the box to the sender. Press Enter to send and
Shift+Enter for a new line; Enter does nothing while an input method is
still composing text.
- When the thread's MCP source has a Reply tool, Kanna calls that tool itself, with no agent turn. This works in every action, Notify included, and the button reads Send. The thread moves to Replied and leaves the Inbox tab once the tool reports success.
- Otherwise, when the thread has a handler chat, the button reads Agent will send: Kanna asks the chat to send exactly that text through the source's own tools and to confirm what it sent, and the thread moves to Replied as soon as that request is queued.
-
Ask agent asks the thread's agent to write or rewrite a reply. The text in
the box is the instruction, and the answer always comes back as a new draft in
the box. The agent never sends it to the sender, and the thread stays in the
Inbox. Three ways to ask:
- press ⌘↵ (Ctrl+↵ on Windows and Linux), which asks and never sends;
- press the Ask agent button;
- start the text with
/and press Enter:/shorter pleaseasks the agent for "shorter please", with the/removed. Without a handler chat a leading/is just text and Enter sends it.
- Quick prompts under the box rewrite the draft already in it with one click: Shorter, More polite, Translate and Reply in sender's language. With an empty box they ask for a fresh draft in that style.
-
Draft chips above the box keep the last five drafts the agent wrote for the
thread, newest first, labelled by where they came from (
v3 · ask: Shorter,v1 · triage). Click one to load it into the box. They survive a reload, and a new message in the conversation keeps them. - Discard draft clears the box without sending anything. It does not bring the same draft back; a newer draft from the agent fills the box again.
- Archive hides the thread from the Inbox tab. A new message in that conversation brings it back as unread. A toast says Archived (or Archived N threads) with Undo, which puts each thread back in the state and read status it had before: needs you, FYI, handled, replied or new.
- Open chat jumps to the thread's chat to read the full transcript or talk to the agent directly.
Ask agent needs a handler chat (Run in chat or New chat), so it and the quick prompts are unavailable in Notify mode and on an archived thread. Send is unavailable only when the source has neither a reply tool nor a handler chat; the thread still shows what arrived.
Mute sender in a thread stops Kanna from handling that sender's messages on that source. The messages are still saved in their thread, so you can read them later, but no handler turn runs, no card is added to a chat, nothing escalates to Needs you or sends a push, and the thread leaves the Inbox tab and the unread count. It shows as Muted in the thread list. Other senders on the same source are not affected. If the agent had already proposed a reply on a muted thread, it is not sent automatically.
A sender is matched by the display name the source reports, together with the source. Two different people who share a display name on the same source are muted together, and one person who appears under two names must be muted under each.
Unmute sender resumes normal handling for messages that arrive afterwards. Messages received while the sender was muted are not replayed, so the agent never sees them unless you ask it about the thread yourself.
The agent can ask to send a reply, but it never sends by itself. In the thread
it calls propose_send with the text, a confidence between 0 and 1 and a reason,
and Kanna decides, in the server, what to do with it. How far that goes is the
autonomy level, set per MCP source and
overridable per thread:
| Level | What a proposal becomes |
|---|---|
| Off | A draft in the reply box, like any other draft. |
| Suggest (default) | A draft, labelled proposal in the draft chips. |
| Approve | An approval card above the reply box: Send, Edit or Reject. Nothing goes out until you press Send. |
| Auto | The reply is sent by the agent after a short delay (30 seconds by default), unless a guardrail stops it. Until then the card reads Sending in 0:24 with Undo. |
Pick the level for one thread with the Autonomy menu in its header: Source default (…), Off, Suggest, Approve or Auto. Approve and Auto are greyed out, with the reason beside the menu, when the source has no Reply tool. Auto is also greyed out when the source's handler runs a Codex model: only Claude handler turns can be stopped from sending on their own, so Codex is capped at Approve.
Auto sends only when every guardrail passes. Otherwise the proposal becomes an approval card that says why, naming the first rule that failed, checked in this order:
- the handler is a Claude model;
- the contact is on the source's Auto allowlist (the thread header offers Allow auto for this contact when Auto applies and the contact is not on it);
- the agent's confidence is at least the source's threshold;
- the thread has not reached its auto-sends per hour;
- the source has not reached its auto-sends per day;
- it is outside the source's quiet hours;
- the text has no link, markdown image or link, or HTML (unless the source allows links) and is within the character limit.
The hourly and daily caps count the agent's recent messages that Kanna still holds, so they can undercount after an old thread is trimmed. A new message from the sender expires a waiting proposal, because it answered an older message.
- Undo on a counting-down card cancels the send. If the send has already started, Undo is refused.
- When you send a reply yourself, or approve a card, the agent is paused on that thread for 30 minutes: it can still read and report, but its proposals become drafts. The header shows Agent paused · Resume; press Resume to hand the thread back. Typing in the box does not pause anything.
- Edit on a card puts its text in the reply box. Send it with Enter as your own reply, which also rejects the card.
- If Kanna restarts while an auto-send is counting down, it is never sent afterwards: the card comes back as an approval card saying Kanna restarted before the auto-send.
- In a triage or ask turn the agent cannot run shell commands or call the reply tool's server at all; it can only report and propose. That is enforced for Claude turns. Codex has no such guard, which is why Auto is not offered for it.
Each message you see in the thread is labelled by who sent it: You, You · approved (an agent proposal you approved) or Agent · auto. Hover an agent or approved label to see the confidence and reason. In Activity, the Sent by agent filter lists the threads the agent has sent on.
Each message sent directly shows a status under it:
| Status | Meaning |
|---|---|
| Sending… | The tool call is in progress. |
| Sent | The tool reported success. |
| Failed: reason | Nothing was delivered: the source, server or arguments were unusable, or the tool rejected the call. Retry sends the same text again as a new message. |
| Not confirmed | The request may have reached the sender, for example the connection dropped or Kanna restarted before it finished. Kanna never resends on its own. Retry first warns that the message may be delivered twice and sends only after you press Send again. |
The thread becomes Replied only after a message reaches Sent.
A thread that needs you, and an agent proposal waiting for your approval, send a push notification when the source's Send a push notification switch is on. Two more switches per source are off until you turn them on, because a notification travels through your browser vendor's push service and shows on your lock screen:
- Show a preview of the message in the notification (the source's form) puts the latest message, or the proposed reply, in the notification body, cut to 140 characters. Without it the notification names only the sender and the source, and an approval card reads "Agent wants to reply".
- Add a Send button to the notification of an approval card (the source's Autonomy section) lets you send the proposed text from the notification without opening Kanna.
The Send button posts to Kanna with your signed-in browser session. If anything goes wrong, such as no connection, a session that has expired or a proposal that is no longer waiting, Kanna does not retry: tapping Send opens the thread so you can decide there. Only the thread and proposal ids are in the notification, never a token or a password.
These work while the Inbox is open and you are not typing in a box. They are single keys, so a shortcut never fires while the reply box or any other input has focus.
| Key | Does |
|---|---|
J |
Open the next thread in the list |
K |
Open the previous thread |
R |
Put the cursor in the reply box of the open thread |
E |
Archive the open thread |
U |
Mark the open thread unread, or read again |
X |
Add the open thread to the selection, or remove it |
H |
Open the Snooze menu for the open thread |
A |
Send the open thread's approval card; nothing happens when there is none |
Esc |
Clear the selection, or close the open thread when nothing is selected |
/ |
Put the cursor in the search box |
? |
Show the list of Inbox shortcuts |
With no thread open, J opens the first one and K the last one. Rebind any of
them under Settings → Keybindings, where they are listed as "Inbox: …".
⌘↵ in the reply box still asks the agent and never sends.
The Inbox keeps the last 2,000 threads and activity records in
inbox.jsonl under the data directory. Unread threads younger than seven days
are always kept. Inbox threads and cards are private: they are never included
in a share link.
- Inbound webhooks — HTTP deliveries that land here.
- MCP sources — conversations from an MCP server, such as Zalo, that land here.
- Push notifications — get a needs you thread on your phone.
This wiki is generated from wiki/src/content/docs in cuongtranba/kanna.
Edit the docs there: changes made on this wiki are overwritten on the next sync.
The same docs are published at https://kanna-wiki.lowbit.link.
Getting Started
Features
- Providers & Models
- Chat & Transcript
- Generative UI
- Projects & Sessions
- Boards
- Multi-repo Stacks
- Slash Commands
- Cron Jobs
- Loops
- Beacons
- Kanna Plugins
- Package Auto-Update
- Advanced
- Security
Guides
- User Guide
- Contributing
- Ops & Self-Host
Sharing
Reference