Your coding agents. On your phone. From anywhere.
Claude Code, Codex, Gemini and about ten others already run on your computer. They just can't leave the room. pew2 puts them in your pocket.
Your computer keeps doing the work. Your phone becomes the way you talk to it. Kick something off from the couch, check on it from the train, approve a file write while you're getting coffee.
Nothing runs in the cloud. No API keys leave your machine. The agent is the one you already installed, running on your own hardware, on your own files.
Two things: the app on your phone, and a small program on your computer.
Coming to TestFlight. Android APK builds are in Releases.
Open Terminal (macOS) or PowerShell (Windows) and paste one line.
macOS and Linux
curl -fsSL https://raw.githubusercontent.com/KenKaiii/pew2/main/install.sh | shWindows
irm https://raw.githubusercontent.com/KenKaiii/pew2/main/install.ps1 | iexThen:
pew2 setupThat looks at your computer, finds the coding agents you already have, gets everything running in the background, and shows you a QR code. Scan it with the app. Done.
You do not need Node, Bun, Docker, a GitHub account or a copy of this repo. It is one file that runs on its own.
On macOS it also sets itself to start again after a reboot. On Windows and Linux that part is not built yet, so you start it yourself after restarting. Everything else is identical.
Want to read the script before you run it? Sensible. install.sh and install.ps1 are short on purpose.
pew2 does not include an AI. It drives the agents already installed on your machine, so you keep your own subscription, your own keys, your own limits.
| Agent | Get it | Notes |
|---|---|---|
| Claude Code | claude.ai/code | Works out of the box |
| Codex | OpenAI Codex CLI | Works out of the box |
| GG Coder | gg-framework | Mine. Obviously it works |
| Gemini CLI | npm i -g @google/gemini-cli |
Needs a GEMINI_API_KEY |
| OpenCode | npm i -g opencode-ai |
Works out of the box |
| GitHub Copilot | npm i -g @github/copilot |
Needs a Copilot subscription |
| Cline | npm i -g cline |
Works out of the box |
| Qwen Code | npm i -g @qwen-code/qwen-code |
Run qwen once to log in first |
| goose | block.github.io/goose | Works out of the box |
| Cursor Agent | cursor.com/cli | Works out of the box |
| Hermes | pip install 'hermes-agent[acp]' |
Nous Research |
| OpenClaw | npm i -g openclaw |
Needs a Gateway running |
Do not have any of them? pew2 setup tells you what is missing and where to get
it. You only need one.
Anything that speaks ACP works, and adding one is a single JSON file. There are 40-odd more in the public registry:
pew2 registry syncEvery conversation lives on your computer, not the phone. Start on your laptop, carry on from your phone, go back to the laptop. Same thread, nothing lost.
Sonnet to Opus, standard thinking to extended, without leaving the chat. The app reads what your agent actually offers, so you get its real options rather than a guess.
When an agent wants to write a file or run a command, the request comes to your phone. Approve or deny with a thumb.
It finds your git repos on its own and lists them newest first. Pick one and start. Never worked in it before? Browse straight to it from the phone.
Hold the mic, say what you want. Phone keyboards are miserable for prompts.
Send a screenshot of a bug, a design, a whiteboard. Straight into the conversation.
Push notification the moment a long run finishes, so you can put the phone down and get on with your life.
Your machine, your agents, your files. pew2 runs no AI and has no server that sees your work.
Traffic is end-to-end encrypted. The phone and your computer share a key that travels by QR code, and nothing in between can read the messages. Not even the relay that connects them, which only ever sees ciphertext.
The relay is yours too. Off your home Wi-Fi, the connection goes through a small Cloudflare Worker you deploy to your own account. No shared server, no signup. The free tier is plenty.
npm run relay:deploy
pew2 relay wss://your-worker.workers.devStraight about the limits: your pairing key never expires, which is what lets
your phone reconnect after a reboot without scanning anything. It admits one
device β the first to use it β so a code caught in a screenshot or a video is
worthless once your phone has paired. Until then it is a bearer secret: anyone
holding it can drive the agents on your machine. Run pew2 pair --rotate if a
code ends up somewhere it should not be, and rotate rather than re-scan when it
leaked before you first used it. Full detail in SECURITY.md.
pew2 setup # find agents, start the service, show the QR
pew2 pair # pair another phone (unpairs the current one)
pew2 doctor # what is broken, and how to fix it
pew2 providers list # what is installed and what is missing
pew2 registry sync # add every agent in the public ACP registryThree pieces, and only one of them is doing anything clever.
| Piece | What it does |
|---|---|
| Daemon | Runs on your computer. Owns the agents, the sessions and the history. |
| App | Runs on your phone. A remote control, not a client. |
| Relay | Optional. A dumb pipe on Cloudflare for when you are not home. |
The daemon holds the state, so both ends can drop off the network and pick up again without losing a conversation. Agents are spoken to over ACP, which is why adding one is a JSON manifest and no code.
Everything above is the shipped path. If you want to hack on it:
git clone https://github.com/KenKaiii/pew2.git
cd pew2
bun install
cd packages/daemon && bun link # puts `pew2` on your PATHThen the app:
cd packages/app
# The npm package is `eas-cli`. A bare `npx eas` is an unrelated package
# and fails with "could not determine executable to run".
npx eas-cli@latest init # links YOUR Expo account
npx eas-cli@latest build --profile apk --platform android # APK, install it, done
npx eas-cli@latest build --profile device --platform ios # signed for your own device
npx eas-cli@latest build --profile simulator --platform ios # no signing, no accountBuilds run on Expo's machines, so no local Xcode or NDK needed. eas init comes
first because nobody's Expo account is committed here. Put what it gives you in
packages/app/eas-project.json, which is gitignored:
{ "owner": "your-expo-username", "projectId": "the-uuid-from-eas-init" }On iOS signing: you do not need the $99 Apple Developer Program to run this on your own phone. The free tier gives you a 7-day signature and caps you at 3 sideloaded apps. That is Apple policy, not a pew2 thing. AltStore or SideStore re-sign in the background on a schedule, which normally needs a computer awake on your network at the right moment. pew2 already requires exactly that.
Android needs no developer account, ever. A signed APK installs once and keeps working.
| Path | What |
|---|---|
packages/protocol |
Manifest + wire schemas (zod) |
packages/daemon |
Provider registry, ACP client, session log, CLI |
packages/relay |
Cloudflare Worker + Durable Object |
packages/app |
Expo app (iOS + Android) |
providers/ |
One JSON manifest per agent |
npm run typecheck # daemon + protocol + relay + app
npm test # daemon pipeline against the local echo agent
npm run providers:validate # every manifest parses and validatesAdding an agent is one JSON file and no code. See docs/ADDING_A_PROVIDER.md.
Being straight with you:
- No forward secrecy, no per-device revocation. One key lasts the life of a pairing, so a key leaked tomorrow decrypts traffic captured today, and removing one device means re-pairing all of them.
- Autostart is macOS only. On Windows and Linux the daemon does not come back by itself after a reboot yet.
ptytransport is reserved but unimplemented.verifyskips it.
- YouTube @kenkaidoesai, tutorials and demos
- Skool community, come hang out
AGPL-3.0. Use it, change it, run it for yourself. If you run a modified version as a service other people use, share your changes.
Your agents already work. Now they follow you around.