Connect a channel
Open Settings > Gateway and choose Connect a channel. Each channel walks you through its own steps. Tokens go to your operating system keychain, never to a file. One bot account runs in one channel. If you try to connect a second channel with a token that is already in use, Kepler refuses and names the channel using it.- Telegram
- Slack
- Discord
- WhatsApp
1
Create a bot
Open Telegram and message @BotFather. Send
/newbot and give it a name.2
Paste the token
BotFather replies with a bot token. Paste it into Kepler as the Bot token.
3
Add yourself
Under Who can message, add your @username or numeric user ID. Telegram never gives a bot your phone number, so a phone number here will not match.

Add a channel
Kepler can talk on more than the four built-in chats. A channel for another platform comes as part of a plugin. Press Add channel on the Gateway page and pick one of three ways in:
Each way ends in the same plugin review, so a channel you make yourself keeps its secrets in the keychain and gets the same row on the Gateway page as a built-in one, tagged with its plugin’s name. Kepler never asks for a token in chat. You enter it when you connect the channel.
You can also start from any session:
/channels on its own lists your channels and what each one is doing.
A channel runs on your machine, so it has to reach out to its platform, by polling an API or holding a connection open. A platform that can only push webhooks to a public address needs a tunnel.
Bind a session to your phone
By default a message from your phone starts or continues a chat in the channel’s default workspace. To drive a specific session you already have open, run this in that session:whatsapp for telegram, slack or discord. Turn it off with:
What you can do from the channel
- Ask anything you would ask at your desk. The session keeps its context, so “and the logs?” means what it would mean in the app.
- Answer approvals. When Kepler is waiting on a command in Assist, the approval reaches the chat the run came from. Reply
yesorno, or/approveor/deny, and it counts the same as pressing the button in the app. A plugin channel that has its own approval buttons shows those instead, and Kepler accepts the answer only for a request it asked, on that same channel. - Run an automation. An automation with a chat trigger is a command in every connected chat:
/triage checkout is throwing 502sruns it with that text, and its answer comes back in the same chat. Your conversation carries on untouched. - Be woken by a watcher. With Reach me when I’m away on under Settings > General > When you’re away, alerts that need action go to a connected channel once your screen is locked or idle. Routine notifications never do.
Which session a message goes to
Each chat talks to one session. Where the platform has threads, such as a Slack thread under an @mention, each thread gets its own session.- While you keep talking, the session stays warm and Kepler remembers what you were doing.
- After six quiet hours, the next message starts a fresh session, so the next morning’s question does not carry yesterday’s incident. Kepler tells you when this happens.
/sessionsand/switchtake you back. - A thread never goes cold. A new thread is a new session, and a reply in it continues that one.
/newalways starts fresh.
Commands in a chat
Send these as a message in any connected chat. They answer at once and never start a model run.Who can reach Kepler
Every message is checked against the channel’s Who can message list before anything else happens. A message from anyone else is dropped with no reply, no read receipt and no typing indicator. A message in a group never adds anyone new to the list. Kepler also tells the model where each message came from and to treat the text as outside input. A message from a chat cannot change the posture, approve anything, or give instructions on your behalf.When Kepler posts first
In Assist and Yolo, Kepler can send a message to a channel on its own, for example to post a summary to#incidents when you ask it to. A message to your own chat, or to a conversation you already approved, goes out at once. Anything else waits for your OK on a card, Yolo included.
If a message cannot be delivered, Kepler tries once more. If it still fails, it lands in the Feed as “Could not deliver”, so it is never lost. A channel whose connection keeps dropping is restarted with a growing wait. After five failures in ten minutes it stops and shows the last error on its row.
Channel options
Each connected channel has its own settings in Settings > Gateway.
Disconnect everything turns off every channel at once. The people you allowed are kept, so reconnecting is quick.
How Kepler signs its replies
Kepler stamps a name and emoji on the replies it sends, so a message from Kepler never reads as one from you. Set them under Signature in Settings > General. On WhatsApp self-chat every reply is signed. On Telegram, Slack and Discord the bot already has its own name, so Sign replies everywhere stays off unless you want it.Build your own channel
A channel is an MCP server that a plugin names underchannels in its .kepler-plugin/plugin.json. The server declares the kepler/channel capability, sends each incoming message as a notifications/kepler/channel notification, and offers a reply tool that takes chat_id and text. It can also relay approvals and show a typing indicator. Kepler never offers a channel’s server to the model as tools.
/channels with a description of the platform. Kepler writes the server against this format and checks it before proposing it. Channel servers written for Claude Code use the same format under claude/ names, and run in Kepler as they are.
Where to go next
Automations
Run an automation from a chat, and post its answer back.
Watchers
The thing most worth being woken for.
Postures
What Observe, Assist and Yolo mean for a channel.
Troubleshooting
Dropped links and silent bots.
Settings reference
The Gateway section in Settings.