Channels
A channel is one way you talk to Sona. None of them except the terminal is required. sona chat works after sona init with only an LLM key.
Sona starts every channel listed under channels: in ~/.sona/sona.yml at boot. Add one later:
sona channel add telegram|slack|discord|whatsapp|emailShipped
- CLI —
sona chatin this terminal (orsona chat --jsonfor scripts). No bot, no extra account. - Telegram — optional. Long-poll Bot API. Create a bot with BotFather only when you want the phone.
- Email (IMAP/SMTP) — async inbox + SMTP send.
- Slack, Discord, WhatsApp — same
sona channel addflow. Tokens already in the environment are stored as${ENV}refs.
Telegram is not enabled out of the box. Press Enter at the Telegram prompt in sona init to skip it.
How channels compose
Every adapter sits behind the same ChannelAdapter SPI:
- Adapter receives a platform-specific message (stdin line, Telegram update, Slack event, …).
- Adapter translates it into a
UnifiedMessagewith achannelIdand asenderId. - Gateway routes by
(channelId, senderId)to a session; the session runs the agent. - Gateway hands the reply back as a
UnifiedResponse; adapter renders it to the platform.
How It Works traces one message end-to-end. Only the first and last hops change per channel.
Writing your own
The framework Channels reference covers the SPI. Sona auto-discovers ChannelAdapter implementations on the classpath at boot.
To use a custom adapter, drop the JAR into ~/.sona/lib/, restart the daemon, and add its channels: block to sona.yml.
Sona's email channel polls an IMAP inbox for new mail and replies through an SMTP server. It's the right pick when you want Sona reachable from any device a person already uses email on — phones, work laptops, shared accounts — without installing a new app.
Telegram
Telegram is optional. sona init + sona chat work without a bot. Use this page when you want the same assistant on your phone.