Skip to content

Channels overview

A channel lets you talk to your agents from an app you already use, and lets other people reach them too. You connect channels in Settings › Channels. Each one then shows up in the sidebar under Channels, with its contacts and chats.

Settings, Channels section: a connected Telegram bot with its status, who answers, and how it behavesSettings, Channels section: a connected Telegram bot with its status, who answers, and how it behaves
Settings › Channels
  • A channel is an app APX talks through: Telegram, WhatsApp, Discord, Slack, iMessage, Google Chat, SMS and more.
  • A contact is a person on a channel. Each contact has a direct chat with your agent.
  • A room is a shared place many people read, such as a channel on your Discord server.

Every contact chat and every room is kept as an APX conversation, so you can read it, search it and step in from the panel. Agents use the same words: they can list channels and contacts, write to a contact, read a room and post in one by its exact name.

When you write to your agent on a channel, your message goes into Home by default: one conversation with your secretary, whether you write from the panel, the terminal, Telegram or WhatsApp. Pick up on your phone what you started at your desk. Home shows all of it; You in a channel’s list shows only that channel’s part of it: what you wrote there and what was answered there.

If you’d rather keep a channel apart, set Your messages to Own chat in that channel’s settings. Your messages from there then get a chat of their own.

Most of these apps cannot prove who wrote: ntfy knows only a topic, IRC a nick, an SMS number or a mail’s sender can be forged. Telegram, WhatsApp and Signal do prove the account a message comes from, so they act on your word directly. On every other channel, what comes as you first goes to your super-agent, which checks it: when it is unsure it is you, or the request is risky (sending, paying, deleting, a setting), it asks you in the app. Its answer then goes back to that channel’s agent, which does what was decided and answers you there.

Confirmations and questions are answered in the app: the panel, the desktop or your paired phone. On Telegram their buttons still work, except for a change to your settings (a contact, a channel, an MCP server…), which you approve only in the app; on WhatsApp and Signal they come as numbered options you answer with a number. On other channels a card arrives without buttons and says where to answer it.

APX answers you, and the people you approve. Everyone else is a stranger, and you choose what happens when one writes (Strangers in the channel’s settings):

OptionWhat happens
Send a codeThey get a pairing code. Nobody answers them until you approve it, from the channel’s settings or from your notice.
Ask meYou get a notice with who wrote and what they said. Say yes (the notice’s button, or tell your agent) and their message is answered.
AnswerThey’re answered right away as a new contact, in a sealed chat with an hourly limit.
IgnoreNobody answers them and they aren’t listed.

You can also approve from the terminal, or just tell your agent (“let her in”). The agent asks for your OK before it lets anyone in.

❯ apx pairing
482913  telegram  Ana: Hi, is this the store?
Terminal window
apx pairing ok 482913 "Ana" # approve as a contact
apx pairing no 482913 # drop the request
apx pairing me 482913 # this address is mine (yours, the owner's)

An approved person is a contact, with a role: you (owner), contact, or blocked. A contact’s chat is sealed: the agent answers them with no tools and none of your memory, so a stranger’s message can’t make it act for you.

Open a contact from the channel’s screen to set:

  • Who they are, in your words. It reaches only the turns that answer this person.
  • Rules, which go last in the prompt and win over the agent’s caution.
  • What this conversation may do: Take appointment requests, Take requests (each becomes a task for you) and Answer from my notes (your general notes, read only). All off by default.
  • Silence: their messages are kept but never reach a model.
  • Supervise: they aren’t answered on their own; you get the answer the agent would send, to send it, edit it or drop it. See Supervised contacts.

A channel’s Search the web setting opens one thing, and only that, in its sealed chats (a server room, a contact’s chat): searching the web and reading public pages (web_search, web_read). Never your computer, the shell, files, the browser, your memory or your projects.

  • Only you (the default): when you ask in a room (“Roby, look at the open issues on our repo”), or from the app in a contact’s chat.
  • Everyone: anyone it answers there can have it look something up.
  • Off: it only talks.

In a contact’s chat in the panel, Who answers switches between the agent (you tell it what to answer) and I’ll write (your words go out as you typed them).

Terminal window
apx contacts # people and their addresses
apx contacts add Ana Pérez # add one by hand (link addresses with pairing)
apx contacts block <id> # or unblock, rm

While it is working decides what happens if you send another message before the answer is done:

  • Slip in (the default): your message joins the running turn; the agent reads it between steps and keeps going. This works on APX’s own engine; other engines wait.
  • Wait: your new message waits, and is answered when the current one finishes.
  • Interrupt: it stops what it was doing and starts over with your new message.

Whatever the setting, a short “stop” (“stop”, “pará”, “basta”, “cancelá”) while it works stops the turn: you get “Done, I stopped.” and nothing else.

On Telegram and WhatsApp, Messages that need no answer chooses what an “ok”, a thanks or a goodbye gets: Silence or React (an emoji), with no model call either way.

A channel answers contacts at any hour until you turn on Attention hours in its settings: the days it answers and from when to when, in the time zone of your account (Settings › Account). Hours that end after midnight belong to the day they start on (Friday 20:00–02:00 covers the first hours of Saturday).

  • Outside them, a contact’s message is kept in their chat, unread for you, with no model call: nothing goes back.
  • When the hours begin, each chat that waited gets one answer to everything that person sent meanwhile. Chats are answered a few at a time, the longest waiting first. A supervised contact gets its draft then.
  • If they write again once the hours have begun, that message is answered with the earlier ones in view, and only once.
  • You are always answered, on any channel. A contact with Answer at any hour (in their card) is too.
  • In rooms, outside the hours only you are answered, and nothing said meanwhile is answered later.

You can also ask your super-agent in chat (“answer WhatsApp Monday to Friday 9 to 18, and my dad at any hour”): it sets a channel’s hours and who is answered at any hour, each change once you approve it. Other agents cannot.

Everything APX sends goes through a durable outbox: a message survives a restart and is retried, and each one ends as sent, maybe sent or failed. The channel’s settings list what was Recently sent; the terminal shows more:

❯ apx channels outbox
10-08T09:14  sent      telegram  reply   Your order shipped this morning…
10-08T09:02  sent      telegram  notice  Morning brief: 3 tasks due today…

Under Notices for you, Confirmations follow you sends a question an agent asked in the app to your channel if nobody answered it (after 1, 2 or 10 minutes, or never), with buttons on Telegram; elsewhere it reminds you to answer it in the app (which channels act on your word). Quiet hours and the daily cap live in Settings › Interruptions.

Voice notes you send on Telegram or WhatsApp are transcribed and answered as text. Transcription uses the engines in Settings › Voices (local whisper.cpp included). Ask the agent to answer you with voice and it turns spoken answers on for that chat; that needs a voice in Settings › Voices too.

ChannelStateHow it connects
TelegramCompleteA bot you create with BotFather
WhatsAppCompleteA linked device, by QR
DiscordCompleteA bot: direct messages and server rooms
SlackCompleteAn app in Socket Mode: direct messages
iMessageUnverifiedOn a Mac: tools agents use, and (optional) answering the people you approve
Matrix, Mattermost, SignalUnverifiedIn the panel, not yet tested against a real server
EmailUnverifiedA mailbox over IMAP and SMTP (an app password); tested only against a fake server
Google ChatUnverifiedA Chat app over Cloud Pub/Sub (no public address): direct messages and the spaces you list
SMSUnverifiedA Twilio number, checked every few seconds (no webhook)
ntfyUnverifiedPush notifications to your phone, and your replies from the ntfy app; only you
Nextcloud Talk, IRC, TwitchUnverifiedA bot user (Nextcloud), a nick (IRC) or a bot account (Twitch chat); their rooms are listed like Telegram groups
Microsoft Teams, LINEUnverifiedA bot (Azure Bot, LINE Messaging API) that delivers to a public address

Teams and LINE don’t let a bot fetch its messages: they send each one to a web address. APX only listens on your computer, so these two need a public address, set in their screen under Settings › Channels. It publishes only a separate door for webhooks (…/hooks/<channel>), never the panel or the API, and each message is checked against the platform’s signature before anything reads it.

HowWhat you needThe address
TailscaleTailscale connected, and Funnel allowed for this device in your tailnetFixed: https://<this computer>.ts.net:8443
ngrokngrok installed and signed in once (ngrok config add-authtoken …)Usually the same one each time (a free account keeps one); the panel tells you if it changes
My ownAn https address of yours that forwards to the webhook port on this computerYours

Copy This channel’s address into the platform (Teams’ messaging endpoint, LINE’s webhook URL). APX remembers the last address ngrok gave: if a restart brings a different one, the panel says so, and you paste the new one.

❯ apx channels
telegram       telegram  running   @acme_store_bot    agent nova
whatsapp       whatsapp  running   +1 555 0100        agent nova