One assistant. Every subscription.

Talk to one assistant in Telegram. Bring the Claude, Grok, Codex, and Antigravity subscriptions you already pay for. Self-hosted, MIT.

Synthetic demonstration — not a production screenshot.

One DM is the assistant.

Plain text in the bot’s 1:1 chat is a turn of the orchestrator. It has a 60-second cap; longer work becomes a session. If the cap fires and the orchestrator has not spawned, ccc starts the session itself. /session skips the orchestrator.

Workers report only to the orchestrator. You get a short summary in the DM, not the transcript. If the orchestrator cannot post it, listen posts a short fallback — never only session done.

Decisions go through ask_owner. Sessions must not ask in chat prose.

The ping is the answer.

Silent progress

While the orchestrator runs, one progress message is edited in place with notifications off. When the turn ends, that message is deleted and the reply is the ping you get.

Owner vault

/secret add captures the next DM before any session sees it. Values never come back. Sessions inject via env or stdin; there is no secrets_get.

Watches cost nothing until they fire

A watch re-runs a command and wakes the session only when stdout changes. Polling with a wakeup is a full turn every time; don’t.

Every subscription. One place.

Add the Claude, Grok, Antigravity, and Codex accounts you already pay for. A session’s turns pick a healthy account of that engine. Failover stays inside the engine.

Headless bootstrap.

BotFather token, your Telegram user id, then install. ccc never opens a browser on the machine. Login URLs go to Telegram.

install
ccc config set bot_token  <from @BotFather>
ccc config set chat_id    <your Telegram user id>
ccc install

DM the bot. That chat is the orchestrator. Full path in the README.

Your machine. Your token. MIT.

View on GitHub