v0.7.20Telegram remote control for Claude Code

Claude Code,
in your pocket.

aipager mirrors your Claude Code sessions to Telegram — watch progress live, approve permissions, send the next prompt from anywhere. It runs on your machine. Nothing else in the middle.

$curl -fsSL aipager.run/install | sh
MIT licensedPython 3.10+Your bot, your machine
21:07
aipagerbot
Today
Message
Questions

When Claude asks, you tap.

Claude Code's multiple-choice questions land in Telegram as real buttons — one per option, checkboxes where the question allows several. Decisions stop waiting for you to get back to the desk.

Permission modes

Your leash, your length.

aipagerbot
🔐 api — Bash
pnpm prisma migrate dev --name add_users
✅ Allow❌ Deny🟢 Allow always⏹ Stop

Every risky tool call waits for your tap — nothing runs behind your back.

Switch per session, any time — /perms in chat or one tap in the Mini App.

Sessions & the Mini App

Run a fleet, not a window.

Sessions are first-class: each has its own status, model, working directory and cost. Start one in chat with /new, or from the Mini App dashboard the daemon serves right inside Telegram — same actions in both.

In the chat
aipagerbot
/new api
New session — pick a mode:
then model → folder, two taps more
🔐 Ask⚡ Auto
✅ api created · sonnet · ~/work/api
/status/resume/rename/diff/kill
In the Mini App
Sessions+ New
jimbusy
Editing src/server/handlers.ts
⏹
apiidle
42/42 tests green
🔄
docswaiting
❓ Which database should…
💬
SessionsDiffSettings

On by default (aipager miniapp status) — every request verified against Telegram's initData signature.

Everything else

Small daemon, deep toolbox.

Keep talking — it queues

Messages reach Claude immediately, mid-turn included — exactly like typing into the terminal. Send five; each gets picked up at a natural boundary.

also bump the deps 👍
and write a changelog entry 👀
👀 sent to the session · 👍 Claude picked it up

Voice notes work

Transcribed locally with Whisper and injected as your next prompt. Audio never leaves the machine.

Review the diff

src/auth/session.ts
- if (exp < now())
+ if (exp < now_ms())

/diffin chat, or the Mini App's viewer for every Write and Edit.

Drop files in

Send a file to the chat — it lands in the session's workspace and Claude gets the path. Screenshots, logs, CSVs.

Make the keyboard yours

Deploy stagingWrite testsExplain plan
/compact/clear/model opus

Templates, commands and model switches — override any of it withkeyboard.json.

Bring the team

owneradminuserread_only

Group mode with per-user roles: every message runs with its sender's permissions, never whoever drove last. Denied tools are auto-rejected, and every decision is audited:

✅ [jim] · Allowed by @alice · Bash: ls -la /tmp

Tune the feed

/settings — message layout, formatting and language. Stall warnings and context alerts nudge you before a session needs rescuing.

How it works

A small daemon. No cloud.

Hooks, not scraping

Claude Code fires a hook at every step — a prompt picked up, a tool about to run, a turn finished. aipager listens on a local socket and turns each one into a Telegram update, live.

UserPromptSubmitPreToolUseMessageDisplayStop

Sessions that survive

Every session runs under dtach, a tiny terminal multiplexer. Close the laptop, lose SSH — the session keeps working, and Telegram keeps you attached to it.

dtach/resume/status

Nothing in the middle

The daemon talks straight to the Telegram Bot API with your own bot token. Code and prompts never touch a third-party server, and every approval lands in a local audit log.

your tokenaudit logMIT

Want the deep dive? Architecture, the full hook reference, and the security model are in the docs →

Install

Three commands. That's the setup.

01

Install

$curl -fsSL aipager.run/install | sh

Detects your platform and picks the best installer (uv → pipx → brew). Pulls dtach if it's missing.

02

Configure

$aipager config

A wizard asks for a bot token (one @BotFather chat away) and your Telegram chat, then wires the Claude Code hooks for you.

03

Start

$aipager start

Message your bot on Telegram. You're live — create a session and walk away from the desk.

Prefer your own package manager?uv tool install aipagerpipx install aipagerbrew install dev-aly3n/aipager/aipager
FAQ

Common questions.

How is this different from Claude's mobile apps?

Claude's apps talk to Anthropic's hosted assistant. aipager mirrors a Claude Code session running on your own machine — your repo, your tools, your environment. It's not a chat client; it's a remote control for the CLI.

Does my code leave my machine?

No. The daemon runs locally and talks directly to the Telegram Bot API with your own bot token. Prompts, file contents, and outputs only go to the chats you configure — there is no aipager server in the middle.

What's dtach and why do I need it?

A ~30 KB terminal multiplexer. It keeps Claude Code alive after your terminal closes or SSH drops, so an approval you send an hour later still reaches a live session. The installer fetches it if you don't have it.

Can my team use it?

Yes — team mode puts the bot in a group chat with per-user roles (owner, admin, user, read-only). Every message runs with its sender's permissions, rule-denied tools are auto-rejected, and every Allow or Deny is audited in-chat and on disk.

What if Claude goes off the rails while I'm away?

Permission prompts land as inline Allow / Deny buttons, /stop interrupts the current turn (and discards anything queued), and /kill ends a session outright. Buttons from an already-finished task refuse politely instead of hitting whatever runs now.

Stop babysitting the terminal.

Two minutes from install to your first session mirrored in Telegram.

$curl -fsSL aipager.run/install | sh
Star it on GitHub