Run AI coding agents from your phone. Bridges Claude Code, Codex, OpenCode, and Pi to Telegram with interactive permissions, voice notes, and live progress.
Project description
Telegram bridge for AI coding agents.
Send tasks by voice or text, stream progress live, and approve changes — from your phone, anywhere.
Works with Claude Code · Codex · OpenCode · Pi
Quick Start · Features · Engines · Commands · Contributing
Your AI coding agents need a terminal, but you don't need to sit at one. Untether runs on your machine and connects your agents to a Telegram bot. Send a task from your phone — by voice or text — and watch your agent work in real time. When it needs permission, tap a button. When it's done, read the result. No desk, no SSH, no screen sharing.
⚡ Quick start
uv tool install untether # recommended
# or
pipx install untether # alternative
untether # run setup wizard
The wizard creates a Telegram bot, picks your workflow, and connects your chat. Then send a message to your bot:
fix the failing tests in src/auth
That's it. Your agent runs on your machine, streams progress to Telegram, and you can reply to continue the conversation.
Tip: Already have a bot token? Pass it directly: untether --bot-token YOUR_TOKEN
🔄 Upgrading
uv tool upgrade untether # if installed with uv
# or
pipx upgrade untether # if installed with pipx
Then restart to apply:
/restart # from Telegram (preferred — drains active runs first)
# or
systemctl --user restart untether # from shell (systemd)
🎯 Features
- 📡 Progress streaming — watch your agent work in real time; see tool calls, file changes, and elapsed time as they happen
- 🔐 Interactive permissions — approve plan transitions and clarifying questions with inline buttons; tools auto-execute, with progressive cooldown after "Pause & Outline Plan"
- 📋 Plan mode — toggle per chat with
/planmode; choose full manual approval, auto-approved transitions, or no plan phase - 📁 Projects and worktrees — register repos with
untether init, target with/myproject @feat/thing, run branches in isolated worktrees in parallel - 💰 Cost and usage tracking — per-run and daily budgets, subscription usage in the footer,
/usagefor detailed breakdowns, optional auto-cancel - 🏷 Model and mode metadata — every completed message shows the model and permission mode (e.g.
🏷 sonnet · plan) across all engines - 🎙️ Voice notes — dictate tasks instead of typing; Untether transcribes via a configurable Whisper-compatible endpoint
- 📎 File transfer — upload files to your repo or download results back
- ⏰ Scheduled tasks — cron expressions and webhook triggers
- 💬 Forum topics — map Telegram topics to projects and branches
- 📤 Session export —
/exportfor markdown or JSON transcripts - 🗂️ File browser —
/browseto navigate project files with inline buttons - ⚙️ Inline settings —
/configopens an in-place settings menu; toggle plan mode, verbose, engine, model, reasoning, and trigger with buttons - 🧩 Plugin system — extend with custom engines, transports, and commands
- 💬 Conversation modes — assistant (ongoing chat), workspace (forum topics per project), or handoff (reply-to-continue with terminal resume)
🔌 Supported engines
| Engine | Install | What it's good at |
|---|---|---|
| Claude Code | npm i -g @anthropic-ai/claude-code |
Complex refactors, architecture, long context |
| Codex | npm i -g @openai/codex |
Fast edits, shell commands, quick fixes |
| OpenCode | npm i -g opencode-ai@latest |
75+ providers via Models.dev, local models |
| Pi | npm i -g @mariozechner/pi-coding-agent |
Multi-provider auth, conversational |
Note: Use your existing Claude or ChatGPT subscription — no extra API keys needed (unless you want API billing).
🤖 Commands
| Command | What it does |
|---|---|
/cancel |
Stop the running agent |
/agent |
Show or set the engine for this chat |
/model |
Override the model for an engine |
/planmode |
Toggle plan mode (on/auto/off) |
/usage |
Show API costs for the current session |
/export |
Export session transcript |
/browse |
Browse project files |
/new |
Clear stored sessions |
/file put/get |
Transfer files |
/topic |
Create or bind forum topics |
/restart |
Gracefully restart Untether (drains active runs first) |
/verbose |
Toggle verbose progress mode (show tool details) |
/config |
Interactive settings menu (plan mode, verbose, engine, model, reasoning, trigger) |
/ctx |
Show or update project/branch context |
/reasoning |
Set reasoning level override |
/trigger |
Set group chat trigger mode |
/ping |
Health check / uptime |
Prefix any message with /<engine> to pick an engine for that task, or /<project> to target a repo:
/claude /myproject @feat/auth implement OAuth2
⚙️ Configuration
Untether reads ~/.untether/untether.toml. The setup wizard creates this for you, or configure manually:
default_engine = "codex"
[transports.telegram]
bot_token = "123456789:ABC..."
chat_id = 123456789
session_mode = "chat"
[projects.myapp]
path = "~/dev/myapp"
default_engine = "claude"
[cost_budget]
enabled = true
max_cost_per_run = 2.00
max_cost_per_day = 10.00
See the full configuration reference for all options.
Warning: Never commit your untether.toml — it contains your bot token. The default location (~/.untether/) keeps it outside your repos.
📦 Requirements
- Python 3.12+ —
uv python install 3.14 - uv —
curl -LsSf https://astral.sh/uv/install.sh | sh - At least one agent CLI on PATH:
codex,claude,opencode, orpi
📖 Engine guides
Detailed setup and usage for each engine:
- Claude Code guide — permission modes, plan mode, cost tracking, interactive approvals
- Codex guide — profiles, extra args, exec mode
- OpenCode guide — model selection, 75+ providers, local models
- Pi guide — multi-provider auth, model and provider selection
- Configuration reference — full walkthrough of
untether.toml - Troubleshooting guide — common issues and solutions
📚 Documentation
Full documentation is available in the docs/ directory.
- Install and onboard — setup wizard walkthrough
- First run — send your first task
- Interactive approval — approve and deny tool calls from Telegram
- Plan mode — control plan transitions and progressive cooldown
- Cost budgets — per-run and daily budget limits
- Webhooks and cron — automated runs from external events
- Projects and branches — multi-repo workflows
- Multi-engine workflows — switching between agents
- Inline settings —
/configbutton menu - Verbose progress — tool detail display
- Voice notes — dictate tasks from your phone
- File browser —
/browseinline navigation - Session export — markdown and JSON transcripts
- Group chats — multi-user and trigger modes
- Context binding — per-chat project/branch binding
- Conversation modes — assistant, workspace, and handoff
- Architecture — how the pieces fit together
🤝 Contributing
Found a bug? Got an idea? Open an issue — we'd love to hear from you.
Want to contribute code? See CONTRIBUTING.md for development setup, testing, and guidelines.
🙏 Acknowledgements
Untether is a fork of takopi by @banteg, which provided the original Telegram-to-Codex bridge. Untether extends it with interactive permission control, multi-engine support, plan mode, cost tracking, and many other features.
📄 Licence
MIT — Made by Little Bear Apps 🐶
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file untether-0.27.1.tar.gz.
File metadata
- Download URL: untether-0.27.1.tar.gz
- Upload date:
- Size: 175.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91640354044ad3b3aa176e51c0351fb8282c95e1df2809f1bc09013f4fa60ca9
|
|
| MD5 |
cc0d23c3a03d2c5e1b5debd692f81375
|
|
| BLAKE2b-256 |
c68099cdcab7990d21a9095ab6990fc75c72ed6d0011ae2060e90848db750353
|
Provenance
The following attestation bundles were made for untether-0.27.1.tar.gz:
Publisher:
release.yml on littlebearapps/untether
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
untether-0.27.1.tar.gz -
Subject digest:
91640354044ad3b3aa176e51c0351fb8282c95e1df2809f1bc09013f4fa60ca9 - Sigstore transparency entry: 1008255214
- Sigstore integration time:
-
Permalink:
littlebearapps/untether@b83ca1bcfe43e8d930a01843ca6e7763463c144a -
Branch / Tag:
refs/tags/v0.27.1 - Owner: https://github.com/littlebearapps
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b83ca1bcfe43e8d930a01843ca6e7763463c144a -
Trigger Event:
push
-
Statement type:
File details
Details for the file untether-0.27.1-py3-none-any.whl.
File metadata
- Download URL: untether-0.27.1-py3-none-any.whl
- Upload date:
- Size: 229.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
744218447d2536a7ca6a459a8500a6f21ef6c7ee4d817d18f45f805dd2402d07
|
|
| MD5 |
9f0f6ad93aaa2df3aee6ec3e3826a4b4
|
|
| BLAKE2b-256 |
89290582bad73c6fad40ac21351fff669d63c6f9c93c9ad36743cf1fec0f1f57
|
Provenance
The following attestation bundles were made for untether-0.27.1-py3-none-any.whl:
Publisher:
release.yml on littlebearapps/untether
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
untether-0.27.1-py3-none-any.whl -
Subject digest:
744218447d2536a7ca6a459a8500a6f21ef6c7ee4d817d18f45f805dd2402d07 - Sigstore transparency entry: 1008255216
- Sigstore integration time:
-
Permalink:
littlebearapps/untether@b83ca1bcfe43e8d930a01843ca6e7763463c144a -
Branch / Tag:
refs/tags/v0.27.1 - Owner: https://github.com/littlebearapps
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b83ca1bcfe43e8d930a01843ca6e7763463c144a -
Trigger Event:
push
-
Statement type: