Switchroom mark self-hosted · MIT · Pro or Max

I loved OpenClaw + Telegram.
I wanted my Claude subscription.
And the UX done properly.

See what your agent is actually doing. A live progress card pins to the chat, every Read, Bash, Edit landing in real time. Drives the stock claude CLI on your Pro or Max. No API keys, no second invoice.

Built for my problems. Open-sourced for yours.

switchroom.ai

You want Claude on your phone, remembering last week, showing what it's doing. One agent that knows everything is a demo. A fleet of specialists, each shaped for a part of your life, is a workforce. On the subscription you already pay for.

You can't see what it's doing

Message in, eventually a message out. The middle is a black box. Stuck, working, crashed? No idea until it comes back. If it comes back.

Tethered to the desktop

Claude Code is a terminal app. It sleeps when the laptop sleeps. Mobile Claude is a chat with no files, no shell, no continuity. Your life happens away from the keyboard.

The subscription tap got closed

Anthropic cut third-party tools off Pro and Max. OpenClaw and friends still run, on pay-per-token API keys. Switchroom drives the CLI Anthropic ships. Same OAuth. No second invoice.

A switchboard for your Pro or Max.

Switchroom drives the stock claude CLI. Each persona is a long-running service with its own Telegram bot, joined by IPC. One bot per agent, one topic per agent. Survives reboots, network drops, your laptop closing. You plug the cords. Switchroom holds the panel.

Not a harness. Doesn't patch the CLI, doesn't intercept the protocol, doesn't forge tokens. Scaffolds files, starts processes, routes messages. Gets out of the way.

Per-agent · two units
Telegram long-running service AGENT · klanker switchroom- klanker.service stock claude CLI survives reboots IPC switchroom- klanker-gateway Telegram bot MCP plugin SQLite buffer vault broker unix socket · cgroup id watchdog crash-pane · wake-audit
one bot per agent · one topic per agent · OAuth scoped to CLAUDE_CONFIG_DIR/<agent>

Four outcomes. Everything else is a footnote.

Progress card · anatomy
Anatomy of a Switchroom progress card: pin badge, user prompt, last-5-visible steps, sub-agent indent, in-flight pulse, elapsed timer.
A / KNOW WHAT IT'S DOING

See every step, pinned to the chat.

A progress card pins to the chat when work starts and updates as tools fire. Read, Bash, Edit, Grep, each lands with elapsed time. Sub-agent work gets its own section. Two tasks at once? Cards are labelled (1/N) so you never lose the plot.

👀 Reading MEMORY.md 0.3s
🤔 Checking calendar 1.1s
👨‍💻 Drafting reply 2.4s
🔥 Done · 4 lines 3.0s
B / RUN A FLEET

Specialists, not one generalist.

Morning digest from klanker. Coding buddy for PR triage. Night-shift agent scanning logs. Each has its own voice, memory, topic, tools. Add one the way you add a contact, not like you're migrating a service.

pa
dev
klanker
fin
C / KEEP THE BILL HONEST

Your Pro or Max is the ceiling.

Same OAuth as your desktop Claude Code session. Runs on your plan's quota, resets on Claude's clock. Hit the ceiling, the product says so. No API bill running in the background.

claude quota · today34% used
resets in5h 12m
D / WORK WITHOUT YOU

Your agents clock in while you sleep.

Scheduled tasks that fire across reboots, not a hack. Cron syntax in YAML, per-task model selection, output delivered to Telegram. Morning briefing at 8 AM, weekly review Sunday night, hourly on-call digest. Survives reboots, survives the laptop being shut.

08:00 weekdaymorning briefing
20:00 sunweekly review
hourlyon-call digest
next fires in09:14:27

You approve. The agent waits.

Read-only tools run free. Anything that writes, runs a shell, fetches the web, or touches Drive pauses for a tap.

Switchroom ships an approval kernel. Every gated tool call goes through an IPC broker into a SQLite kernel, the agent pauses, and an inline card lands in your topic with the tool name, the args, and a diff if there is one. ✅ Allow resumes the call. ❌ Deny kills it cleanly. Grants are TTL'd so a one-off Allow doesn't quietly become forever.

Every decision is appended to card-events.jsonl: who approved, when, what tool, what args, what the result was. Forensic replay if you ever need it.

The kernel underwrites Drive too. Drive MCP is opt-in via switchroom drive connect, then every write or destructive call surfaces the same Allow/Deny card with the file in question. No silent fan-out.

Kernel · grant flow
Approval grant flow: agent pauses, kernel asks phone, you tap allow, agent resumes.

Built for how you actually use this.

Top row earns the visibility. Bottom row runs the fleet.

A · F / SURVIVE REBOOTS

Comes back after real life.

Each agent is a long-running service. Box reboots, the fleet comes back. A crash auto-recovers with an audit trail, not silence. Context exhaustion is a named event. Scheduled work fires across reboots. Ask "is everything healthy" and get a real answer.

A · G / SAFE BY DEFAULT

You approve, not the agent.

Permission prompts come through Telegram as ✅ Allow / ❌ Deny buttons. Read-only tools are pre-approved. Bash, Edit, Write, WebFetch gate through you. PI-safe envelopes sanitize inbound untrusted text.

A · E / STEER OR QUEUE

Course-correct mid-flight.

A follow-up while a task runs amends in place. Prefix with /queue to file a new task instead, cleanly, no bleed. The agent tells you which it did so you can correct if it picked wrong.

B · D / REMEMBER

Remembers across sessions.

Hindsight semantic memory per agent. Knowledge graph built from daily notes, directives, and mental models, surfaced at the right moment. You tell klanker something Tuesday, it comes back next Tuesday. MEMORY.md and workspace file search handle the rest.

B · H / TALK FROM ANYWHERE

Phone-first, laptop-friendly.

Telegram is the surface. Start a task walking to the shops, pick up the reply at dinner. Attachments are real input, not stripped. Notifications fire on the bit that mattered, not every edit.

B · I / EXTEND WITHOUT FORKING

Config, not a code change.

Add an agent by editing YAML. Graft a skill onto an existing one without touching its core. MIT-licensed TypeScript. Profiles and skills are plain files you fork in your own repo. No framework to learn.

B · J / GOOGLE DRIVE, GATED

Drive in the loop, kernel on the door.

Opt in with switchroom drive connect <agent>. Desktop-loopback OAuth, no service-account JSON. Reads run free, every write hits the approval kernel as an inline card with the file and the change. Configure scope and defaults in the drive: block.

Five moving parts. All files you can read.

Scaffolds files. Starts processes. Routes messages.

  1. 1
    One long-running service per agent

    Each agent runs the stock claude CLI as a long-running service alongside its own gateway (Telegram bot, MCP plugin, SQLite buffer). They talk over IPC. Manage either with switchroom agent start|stop|restart. Per-agent logs you can grep.

  2. 2
    OAuth, not API. Per-agent slot pool.

    Each agent has its own pool of Claude OAuth slots, scoped to its own CLAUDE_CONFIG_DIR. switchroom auth login <agent> for the first slot, switchroom auth add <agent> for fallbacks. Hit the active slot's quota, the next one in the pool takes over.

  3. 3
    Telegram as the surface

    One bot per agent, one topic per agent. Inline approvals, slash commands, handoff briefings on restart.

  4. 4
    Claude Code's native sub-agents

    Switchroom scaffolds .claude/agents/*.md. Sub-agents delegate through Claude Code's built-in machinery. Not a reimplementation.

  5. 5
    Workspace bootstrap

    Every agent gets AGENTS.md, SOUL.md, USER.md, MEMORY.md, daily notes, and an optional HEARTBEAT.md. Injected into the system prompt. Budgeted.

~/.switchroom/switchroom.yaml
# One file. The whole fleet.
switchroom:
  version: 1

telegram:
  # Per-agent bot token. DM-only by default.
  bot_token: "vault:telegram-bot-token"

defaults:
  model: opus
  tools: { allow: [all] }
  subagents:
    worker:
      description: "Implementation tasks"
      model: sonnet
      background: true
      isolation: worktree

agents:
  assistant:
    topic_name: "General"
    extends: executive-assistant

  klanker:
    topic_name: "Klanker"
    extends: coding
    schedule:
      - cron: "0 8 * * 1-5"
        prompt: "Morning briefing"

Built for people who already run things themselves.

Solo devs

You pay for Pro or Max. You want Claude in Telegram, remembering your projects, available from the couch. No second bill.

USES · dev-helper · code-review-bot · rubber-duck

Home-lab hosts

Pi or mini-PC humming in a closet. You'd rather edit YAML than sign up for a SaaS.

USES · nightly-digest · home-ops · finance-watch

Founder-operators

You want an assistant that knows your docs, your calendar, your vibe. And a coding buddy. And a digest bot. Different personas, one panel.

USES · assistant · klanker · investor-relations

Three commands. One cup of coffee.

A box you already have, 4GB RAM, Docker. A Pro or Max subscription. A Telegram bot token from @BotFather per persona. That's the lot.

req · Linux + Docker (Ubuntu 24.04 LTS canonical) req · active Claude Pro or Max subscription opt · one Telegram bot per persona
bash · ~/panel copy
# 1. Drop the static switchroom binary on your box. $ curl -fsSL https://github.com/switchroom/switchroom/raw/main/install.sh | sh ✓ installed /usr/local/bin/switchroom # 2. Interactive setup. Telegram token, vault, first agent. DM-only by default. $ switchroom setup ✓ ready # 3. Apply config + bring the fleet up. Pulls 5 GHCR images on first run. $ switchroom apply && docker compose -p switchroom \ -f ~/.switchroom/compose/docker-compose.yml pull && \ docker compose -p switchroom \ -f ~/.switchroom/compose/docker-compose.yml up -d --remove-orphans ● switchroom-klanker — running (healthy) │ listening on @klanker_bot

Questions that keep coming up.

+ Do I need a Claude API key?
No. Switchroom uses your Pro or Max OAuth token, the same session Claude Code desktop uses. No ANTHROPIC_API_KEY anywhere in the stack.
+ Does this really use my Claude Pro / Max subscription?
Yes. It drives the official claude CLI, same binary as Claude Code. Your subscription covers it the way it covers desktop usage.
+ What about rate limits?
Same limits as the desktop app. Pin ten agents on one subscription and you'll feel it. Most solo-dev fleets (2–4 agents) are fine.
+ Can I run multiple agents at once?
Yes, that's the point. One long-running service per agent, one bot per agent, one topic per agent. Each with its own workspace, memory, persona.
+ What do I need to run it?
A Linux box you already have with Docker and 4GB RAM, plus an active Claude Pro or Max subscription. The supported runtime is Linux + Docker (Ubuntu 24.04 LTS canonical; other distros work). macOS via Docker Desktop runs the same compose file but isn't release-validated yet. A cheap VPS (~$6/mo on Hetzner or DigitalOcean) is plenty.
+ Why not just use Claude Code?
Use both. Claude Code is the live session at your desk. Switchroom is everything around it: a fleet of personas instead of one generalist, a real progress card so you can see what's happening from your phone, scheduled work that fires while you sleep, and an approval kernel so destructive tools wait for a tap before they run. Same claude binary underneath. Switchroom is the panel.
+ What happens when an agent crashes?
A watchdog babysits every agent. If the agent hangs or the gateway disconnects, the watchdog logs a reason, captures a crash-pane snapshot for forensics, and auto-recovers the agent. On the next boot the agent runs a wake audit: any user message you sent that never got a reply, any sub-agent killed mid-flight, any in-progress todo, surfaces as an explicit ⚠ Issue reply in the topic. No silent dropped work.
+ Can it touch my Google Drive?
Yes, opt-in. switchroom drive connect <agent> wires up the Drive MCP via desktop-loopback OAuth (no service-account JSON). Reads are free; every write or destructive action goes through the approval kernel as an inline ✅ Allow / ❌ Deny card in Telegram, with the file and the diff. Disconnect any time with switchroom drive disconnect.
+ Is this like OpenClaw?
Same UX goal, different billing model. OpenClaw runs on Anthropic's public API and charges per token. Switchroom drives the stock claude CLI under your Pro or Max OAuth, so the subscription you already pay for is the ceiling. Both are legitimate. Depends whether you want integrated billing or fine-grained pay-as-you-go.
+ Is this against Anthropic's terms of service?
No. Switchroom drives the official claude binary with the official OAuth flow. No credential interception, no API key routing, no forked runtime. Full analysis in the compliance attestation.
+ Does Switchroom collect any telemetry?
Anonymous usage events and errors go to PostHog so regressions get caught early. No personal data, code, or message content leaves your machine. The anonymous ID at ~/.switchroom/analytics-id is a random UUID, not tied to username, email, IP, or machine. Opt out any time with export SWITCHROOM_TELEMETRY_DISABLED=1. Full event catalogue in the posthog docs.