Topics
Topics bind Telegram forum threads to a project/branch context. Each topic keeps its own session and default engine…
Topics bind Telegram forum threads to a project/branch context. Each topic keeps its own session and default engine, which is ideal for teams or multi-project work.
Workspace workflow
If you chose the workspace workflow during onboarding, topics are already enabled. This guide covers advanced topic configuration and usage.
Why use topics
- Keep each thread tied to a repo + branch
- Avoid context collisions in busy team chats
- Set a default engine per topic with
/agent set
Requirements checklist
- The chat is a forum-enabled supergroup (enable Topics in group settings — this auto-converts to supergroup)
- The bot is an admin in the group
- The bot has Manage Topics permission (
can_manage_topics) — needed for creating/editing topics; without it, the bot logs a warning but can still operate in existing topics - Group privacy is disabled for the bot via @BotFather (
/setprivacy→ Disable) — otherwise the bot only sees commands and @mentions, not plain text messages - After changing privacy, remove and re-add the bot to the group for the change to take effect
- If you want topics in project chats, set
projects.<alias>.chat_id
Setting up workspace from scratch
If you didn’t choose workspace during onboarding and want to enable topics now:
- Create a group and enable topics in group settings
- Add your bot as admin with “Manage Topics” permission
- Update your config to enable topics (see below)
Enable topics
untether config
untether config set transports.telegram.topics.enabled true
untether config set transports.telegram.topics.scope "auto"
toml
[transports.telegram.topics]
enabled = true
scope = "auto" # auto | main | projects | all
Scope explained
auto(default): usesprojectsif any project chats exist, otherwisemainmain: topics only in the mainchat_idprojects: topics only in project chats (projects.<alias>.chat_id)all: topics available in both the main chat and project chats
Create a bound topic
Send this anywhere in the forum group:
/topic <project> @branch
Examples:
- In the main chat:
/topic backend @feat/api - In a project chat:
/topic @feat/api(project is implied)
Untether creates a new topic named after the context, binds it, and posts the binding as the topic’s first message. A branch is required. If a topic for that project and branch already exists, Untether renames it back to the context name and says so instead of creating a second one.
Untether
created topic
backend @feat/api.
To bind the topic you’re already in, use /ctx set <project> @branch inside it (below).
Inspect or change the binding
/ctxshows the current binding/ctx set <project> @branchupdates it/ctx clearremoves it
Note: Outside topics (private chats or main group chats), /ctx binds the chat context instead of a topic.
Reset a topic session
Use /new inside the topic to cancel any running task and clear stored sessions for that thread. Only this topic’s run (and its /loop schedules) is cancelled — other topics keep running. /new or /cancel in General likewise only touches General’s work (#826).
/cancel without a reply follows the same rule: in a topic it stops that topic’s run, or replies “nothing running in this topic.” when only other topics are busy. When nothing is running it also drops the topic’s pending /at runs and loops and says what it dropped (❌ cancelled 1 pending /at run and 1 active loop.); a Claude session that is only idling after its answer is closed rather than counted as a run (nothing running in this topic — closed the idle session.). It always replies (#902). /new cancels runs and loops but leaves pending /at runs alone.
Scheduled runs
Cron and webhook runs have no topic: they run in General, so only
/newor/cancelin General cancels them. An/atrun belongs to the topic it was scheduled from. Claude Code/loopschedules belong to the topic whose run created them, and each loop iteration is posted back in that topic.
Set a default engine per topic
Use /agent set inside the topic:
/agent set claude
Set the follow-up mode per topic
For Claude Code, send /steer (no text) inside a topic to have messages sent there while Claude is working steered into the run, or /queue to go back to waiting for the turn to end. It applies to that topic only. See Steer follow-ups.
Notices about a run — such as 🔄 Restarting — waiting for your run to finish… during a restart — are posted in the topic that owns the run (#665).
State files
Topic bindings and sessions live in:
telegram_topics_state.json
Common issues and fixes
- “topics commands are only available…”
- Your
scopedoes not include this chat. Updatetopics.scope.
- Your
- “chat is not a supergroup” / “topics enabled but chat does not have topics”
- Convert the group to a supergroup and enable topics.
- “topics enabled but bot is not an admin” (startup error)
- Promote the bot to admin and grant Manage Topics. An admin without Manage Topics starts, but logs
topics.manage_topics.missingand can’t create topics.
- Promote the bot to admin and grant Manage Topics. An admin without Manage Topics starts, but logs
- “topics enabled but no project chats are configured” (startup error)
- With
scope = "projects", setprojects.<alias>.chat_idfor your forum chats, or usescope = "main".
- With