Drive a terminal from a zwip room
Run a program like Claude Code in a terminal and control it from a zwip room in any browser — type to send input, tap buttons to answer prompts, watch its output stream back. It's a small, dependency-free reference bridge you can read in full before running.
Not just your phone: it's for anywhere you don't have an SSH client — a locked-down work laptop, a borrowed or public computer, a Chromebook or tablet, a network that blocks SSH. If it can open a web page, it can drive your terminal.
- Always password-protect the room and treat the password like an SSH key — the room code alone isn't enough for this.
- Know the blast radius. The program can do anything your shell can. Running an agent in an auto-accept mode means a message can trigger actions with no confirmation — only do that in a throwaway VM/container.
- Never run code you haven't read. The full source is below, served straight from this instance. Read it first.
How it works
You type and tap in a normal zwip room in any browser — phone, tablet, or a locked-down laptop with no SSH. Nothing to install on that device.
A ~400-line Python script on your machine. Reads the room, injects keystrokes, posts output back.
Your program (e.g. claude) runs in a tmux window the bridge drives.
Your messages become keystrokes; the program's output is posted back to the room.
Numbered menus and permission prompts are relayed as tappable
[[1]] / [[2]] quick-replies. It's the same idea as
ccbot (which does this over
Telegram), rebuilt on zwip's plain HTTP API — no accounts, no bot token.
See it in action
Set it up in a terminal on your machine (left), then drive it from the room in your browser (right) — including tapping a quick-reply. Looping demo.
Quick start
Get the code
The bridge, the demo, and the zwip.py
CLI live in the open-source zwip-bridge repo. Requirements:
Python 3 and tmux. Nothing to
pip install — it's all standard library.
git clone https://github.com/rcs1000/zwip-bridge.git cd zwip-bridge
Run every command below from this directory. (Every file is also viewable straight from this site — see “Examine the code” further down.)
Create a room and lock it
# point at this instance (or your own)
export ZWIP_BASE=https://zwip.chat
python3 zwip.py create-room --name "session: demo"
python3 zwip.py password --room <CODE> --token <ADMIN> --password <PW>
create-room prints the
code and a one-time admin_token
— save the token; it's what authorises password /
extend / destroy.
Try it safely first — bridge the demo assistant
No agent, no risk. Proves the loop before you point it at anything real.
python3 zwip_cc_bridge.py --room <CODE> --password <PW> \
--cmd 'python3 demo_assistant.py'
Open the room URL, say hello, then type menu
to get tappable choices.
…then drive a real Claude Code session
python3 zwip_cc_bridge.py --room <CODE> --password <PW> \
--cmd claude --output claude
--output claude reads Claude's session
transcript for clean output (assistant text, tool summaries, questions as
quick-replies) and relays permission prompts so you can approve them by tapping.
Examine the code before running it
The bridge and the demo are shown below, served straight from this instance — the same
bytes you'd run. Read them here or open the raw file. The full repo (including the
zwip.py CLI) is on GitHub:
github.com/rcs1000/zwip-bridge.
Don't run code you haven't looked at.
Loading…
Learn more
Full usage, the flag reference and the command contract are in the
zwip-bridge README.
The underlying HTTP API and the zwip.py CLI it composes are
documented on the API page.