Inbox
The Inbox brings messages from every channel you’ve connected into one place. As each message arrives, the agent triages it — works out what it is, who it’s from, summarizes it in a sentence, and (when an answer is wanted) drafts a reply for you to approve. Nothing is ever sent without your go-ahead.
!!! note “Looking for contacts?” Managing the people behind your messages now lives on its own page — see Contacts.
Channels
The Inbox is fed by any messaging integration you’ve connected. Out of the box that covers:
| Channel | Notes |
|---|---|
IMAP/SMTP — threads are grouped by the References header |
|
| Zulip | A stream-topic, or a 1:1 / group direct message |
| Matrix | A room |
| Signal | Linked device |
| Linked phone |
A message channel participates automatically — any integration that declares a message-type entity feeds the Inbox and triage, with no per-channel configuration here. Connect or change channels anytime under Settings → Integrations.
A conversation is a thread or room, not a single message: it shows the full exchange — every incoming message with its sender, your own messages, the agent’s sent replies, and any pending draft.
Statuses
Each conversation carries a lifecycle status that survives re-syncing (it lives in the inbox, independent of the underlying message):
| Status | Meaning |
|---|---|
| New | Important, awaiting your attention — no draft staged yet |
| Reply pending | A draft reply is staged, awaiting your approval |
| Answered | Replied (a draft was sent) or marked Done by you |
| Seen | Unimportant — tidied away, hidden from the open list by default |
The flow:
New ──(draft staged)──▶ Reply pending ──(approve & send / mark Done)──▶ Answered
New ──(unimportant)───▶ Seen
Messages that match a drop rule never get a status at all — they are filed away and never shown.
Working the inbox
The list on the left is your triage cockpit. You can:
- Search across summaries, snippets, subjects and senders.
- Filter by status — All, Open, Answered — plus separate toggles for Starred and Snoozed.
- Filter by channel — email, Zulip, Matrix, Signal, WhatsApp, or all.
Each row shows the channel icon, the sender, the agent’s one-line summary, a status badge, and a star if you’ve starred it. A blue dot marks an unread conversation.
Starring
Star any conversation to flag it as a priority (the star button in the thread header, or the bulk action). Starred items get their own filter so you can come back to them.
Snoozing
Snooze a conversation to drop it out of the open list until later — it resurfaces on its own once the time passes (no background job; it’s computed when you next load the inbox). The presets are:
| Option | Resurfaces |
|---|---|
| In 3 hours | 3 hours from now |
| This evening | 18:00 today (or tomorrow if it’s already past) |
| Tomorrow morning | 09:00 the next day |
| Next week | 09:00 in seven days |
Unsnooze brings it straight back.
Resolving without replying
For a message that needs no answer you have two tidy-up actions in the thread header:
- Done — resolve the conversation (you’ve read it, nothing to send) → Answered.
- Mark seen — file it away as unimportant → Seen, hidden from the open list.
Forwarding
Forward sends the conversation’s anchor message on to another recipient (address or handle) via the same account, with an optional note and attachments. This doesn’t change the conversation itself.
Starting a new conversation
The New conversation button (top of the list) opens a compose dialog to start a thread yourself rather than reply to one:
- Direct - a 1:1 with a contact (pick from the people you’ve messaged) or a raw new address. With a contact, only the channels they’re reachable on are offered; with a raw address you also pick the channel.
- Group - create a new group room on a group-capable channel (a Matrix room or a Signal group), give it a name and members, and send the first message.
You pick the channel, the from-account (only shown when a channel has more than one), an optional subject (email only), the body, and any attachments. Like a typed reply, the message is sent immediately - it’s a human action, no approval gate. A raw address is matched to (or filed as) a contact so future replies on any channel merge onto the same person.
Bulk actions
Switch on Select mode (the checklist button) to pick several conversations at once, then apply one action to all of them: Done, Mark seen, Star, or Snooze.
Replying
When a conversation can be replied to, a composer appears at the bottom — styled like the chat composer. The agent’s triage draft is shown as the placeholder:
- Press Enter (or the send button) on an empty field to send the suggested draft as-is.
- Press Tab to pull the suggestion into the field and edit it first.
- Type your own text to replace it entirely.
Your own typed reply is sent immediately — it’s a human action, with no approval gate (unlike the agent’s drafts, below). For email you can toggle Reply all to CC the original recipients, and you can attach files.
!!! note “Drafts survive a page reload” A reply you’ve started typing is saved locally per conversation, so switching conversations or reloading the page won’t lose it. It’s cleared once the message is sent.
On-demand suggestions
The ✨ button asks the agent for a fresh suggestion covering the whole unanswered batch (every incoming message since you last caught up), dropped into the composer for you to review and edit. Nothing is persisted and nothing is sent — it’s just a starting point.
Dismiss (the ✕ in the composer bar) marks the unanswered batch as read without replying, which stops the auto-suggestion for it; the conversation stays open. A newer message later will start a fresh suggestion.
Draft replies (human-in-the-loop)
This is the heart of the assistant: for routine replies you approve rather than write. When triage decides a message warrants an answer, the agent stages a draft — it never sends on its own. A draft card shows the recipient, an optional subject, a short summary, and the proposed text. You can:
| Action | What it does |
|---|---|
| Approve & send | Sends the draft as-is through the linked account, then marks the source message Answered |
| Edit | Change the body, subject or recipient before sending |
| Discard (reject) | Throws the draft away; the source message goes back to New |
A draft is in one of these states:
| State | Meaning |
|---|---|
pending |
Staged, awaiting your approval |
sent |
Approved and delivered |
rejected |
You discarded it |
failed |
Sending failed — the error is shown and the draft stays recoverable |
A draft is also styled for the channel it goes out on: the agent is told how each platform reads, so a Signal or WhatsApp reply comes back short and plain-text while an email can be longer and structured. This happens automatically per channel; an admin can tune or override the per-channel style hints (see below).
!!! warning “Only you can send” The agent has no send tool. Approving a draft is the only path that delivers a proposed reply, and it sends through the same account the message arrived on. If that account isn’t linked, or no longer supports sending, approval fails with a clear error instead of sending silently.
!!! note “Admin: per-channel style hints”
Built-in defaults ship for Email, Signal, WhatsApp, Matrix, Zulip, Telegram and SMS
(short plain-text on Signal/WhatsApp, structured on Email, …), isolated per channel. An
admin can supplement or replace them via the PERSONAL_AGENT__PLATFORM_HINTS setting (a
JSON map keyed by channel; each value is {"append": "…"}, {"replace": "…"}, or a bare
string that appends). A bad entry falls back to the built-in default for that channel
rather than affecting the others.
Keeping the noise out
Three settings shape what reaches you, under Settings → Profile:
| Setting | Effect |
|---|---|
| Priorities | What matters to you (investors, board, key customers, family…). Free text used by triage to judge how important a message is. |
| Inbox rules | Free-text guidance on what should not appear (e.g. “drop advertising, newsletters and automated notifications”). The agent applies your judgement during triage. |
| Drop patterns (exact) | One pattern per line, matched before the AI runs — matching messages are discarded cheaply, without a triage run. |
Drop patterns
Drop patterns are deterministic and run before triage, so obvious junk never costs a model call and never appears in the inbox. Each non-empty line is a case-insensitive substring match. An optional field prefix scopes it; with no prefix it matches against the sender, subject and body combined:
from:newsletter@
subject:[SPAM]
body:unsubscribe
weekly digest
| Prefix | Matches against |
|---|---|
from: (or sender:) |
The sender address/name |
subject: |
The subject |
body: |
The message body |
| (none) | Sender + subject + body combined |
A dropped message is filed away so a later re-sync never re-triages it. Patterns are deliberately plain substrings (no regex) — nuanced judgement stays with the Inbox rules that guide the AI.
Per-account triage toggle
Each connected messaging account has an Inbox triage toggle on the integration (under Settings → Integrations). Turn it off and messages from that account still sync — they just aren’t triaged into the inbox.
How triage works
Triage is a built-in part of the assistant, not something you set up. For each new message the agent runs through a fixed procedure: check it against your drop rules; attribute the sender to a contact (linking the same person across channels); read the prior thread if it’s part of an exchange; judge importance against your priorities and summarize it; draft a reply if one makes sense; and record a commitment if the message carries a deadline or a reply you owe.
!!! note Triaged messages are reflected in the inbox in near real time. A 15-minute background sync is the backstop, so nothing is missed even if a live update is delayed.