The project's README from github.com/TannerMidd/pi-pocket. As one markdown file: README.md.
Your Pi coding agent, in your pocket.
A durable, multiplayer, mobile-first web app for Pi agents, built on Pi Durable.
Runs on your own machine or directly on your phone. No cloud VM.
Website · Quick start · Features · Remote access
Requires Node.js 22.19 or newer. Runs on Linux, macOS, Windows, and Android (Termux); Linux is the most tested. Sign in to a provider with Pi first (pi, then /login), or later from the app's Providers sheet.
git clone https://github.com/TannerMidd/pi-pocket.git
cd pi-pocket
npm install
npm start
The launcher asks how your devices should connect, then prints the address, a sign-in link, and a QR code. Open the link once per browser; the cookie lasts a year. The link is the owner's key, so keep it private. --rotate-token replaces it and signs out every device that used the old link; people you invited stay signed in until you remove them under Menu → People.
While it runs: q quit · r restart server · a change access · o open in browser · s show QR code.
/schedule every weekday 8:00 summarize CI), and /until npm test keeps Pi going until the check passes.localhost included.~/.pi-pocket/extensions/.The full tour is in docs/features.md.
Choose a mode in the launcher, or pass --access:
| Mode | Who can connect | Notes |
|---|---|---|
local |
This machine | Listens on 127.0.0.1 |
lan |
Your local network | All addresses, plain http |
cloudflare |
Anyone with the link | Free quick tunnel with https, no account needed (Cloudflare offers quick tunnels for testing and development). The address changes each time the launcher starts but stays the same across server restarts. |
tailscale |
Your tailnet | Tailscale address only, encrypted by the tailnet |
Cloudflare mode needs cloudflared. On Linux the launcher can download the official release into ~/.pi-pocket/bin. To use another tunnel (ngrok, tailscale serve), choose local and point the tunnel at port 8787.
[!WARNING] Anyone with steering rights can make the agent run commands on this machine, as you. That reaches everything you can: your files, Pi Pocket's own settings and sign-in tokens, and its code. A single-session invite limits what someone sees in the app, not what Pi can reach, and Lancet Guard approvals can come from anyone who can steer, including the person who asked. People who can steer every session can also invite others. Invite only people you would trust at your keyboard. View-only users cannot make Pi act.
pkg update && pkg upgrade
pkg install nodejs git
npm install -g --ignore-scripts @earendil-works/pi-coding-agent
pi # /login, then quit
# copy or clone pi-pocket to the phone, then:
cd pi-pocket && npm install --ignore-scripts && npm start
Open the link in Chrome and choose Add to Home screen. Run termux-wake-lock so Android does not stop Termux.
Lancet Guard needs ONNX Runtime, which may not load on Android. If the guard is on but cannot load, Pi Pocket blocks bash, write, and edit calls (the status line shows "guard failed"). Turn it off in the app (Menu → Extensions), in ~/.pi/lancet-guard.json, or by starting with PI_POCKET_GUARD=off.
| Option | Default | Purpose |
|---|---|---|
--access <mode> |
last choice | Skip the access menu |
-y |
Reuse the last access choice | |
--port |
8787 |
Port to listen on |
--cwd |
current folder | Default folder for new sessions |
--data |
~/.pi-pocket |
Database, settings, uploads, and push keys |
--host |
Listen on a specific address instead of choosing access | |
--rotate-token |
Issue a new owner link and sign out devices that used the old one |
Environment variables: PI_POCKET_ACCESS, PI_POCKET_DIR, PI_POCKET_HOST, PI_POCKET_PORT, PI_POCKET_GUARD=off, PI_POCKET_BROWSER (the browser to run, when Chromium or Chrome is not found by itself), and PI_POCKET_BROWSER_ARGS (extra flags for it, such as --no-sandbox where sandboxes are unavailable). Without a terminal (under systemd, for example), the launcher uses --access or the last choice.
| Path | Role |
|---|---|
bin/pi-pocket.js |
Entry point: checks the Node version, starts the launcher |
src/launcher/ |
Access menu, server supervisor, Cloudflare tunnel, keys, QR code |
src/server/app.ts |
The core: the durable harness over pocket.sqlite, the coordinator every commit goes through, connected tabs, access, and the session list |
src/server/attribution.ts, workspace.ts, transcripts.ts |
Who Pi works for; a conversation's folder and its stored history, as people reach them |
src/server/room.ts |
One conversation's shared live view, sent to every tab watching it |
src/server/commands.ts |
What people ask of Pi: messages, forks, models, plan mode, goals, schedules, worktrees |
src/server/collab.ts |
The people's side: chat, activity lines, reactions, pins, notes, take turns |
src/server/http.ts, http/ |
Web files, JSON API, server-sent events, uploads, artifacts, invites, the Browser panel's frames and input |
src/server/browser.ts, browser/ |
The built-in browser: one headless Chromium over the DevTools protocol, a page per conversation |
src/server/projection.ts |
Turns committed conversation state into compact JSON for browsers |
src/server/docs.ts |
Durable documents: sessions, chat, pins, notes, artifacts, subagents, schedules, goals, spend |
src/server/schedules.ts, goals.ts, spend.ts, changes.ts, branches.ts, worktrees.ts |
One feature each, with its durable tasks or git calls |
src/server/push.ts, alerts.ts |
Dependency-free Web Push (RFC 8291 and RFC 8292), and who gets which notification |
src/server/extensions/ |
Live-reloaded extensions: system prompt, artifacts, browser, subagents, schedules, goals, plan mode, Lancet Guard, codemode |
web/ |
The app: Preact and htm as plain ES modules |
Browsers render only committed state. Each session's Pi Durable view is coalesced and sent as small updates over server-sent events, so a device that reconnects or joins late sees exactly what everyone else sees. The engineering page explains the design; docs/map.md is a short map of the code.
npm run check # type-check
npm test # server tests with a scripted model
npm run format # ESLint's layout fixes, then Prettier
npm run lint # check the layout rules
Changes to web/ reload every open browser. Changes to src/server/extensions/ are reinstalled into the running server. Other server changes need Restart server from the menu, and running work resumes afterward. AGENTS.md covers editing Pi Pocket safely from inside itself, and node test/serve.ts runs a throwaway copy, with its own data and a scripted model, to check a change on.
Pi knows where Pi Pocket's own documentation is: docs/index.md starts it, for agents and people who change how Pi works without code (customizing), write extensions (extensions, with tested examples), or change Pi Pocket itself while it runs (self-editing).
package.json.~/.pi-pocket/extensions/. Pi's prompt templates work as slash commands.localStorage and cookies are unavailable inside them.Inspired by Mario Zechner's demo of his own Pi app. Pi Pocket is an independent project, not affiliated with Earendil. JetBrains Mono is bundled under the SIL Open Font License.
MIT. To report a security problem, see SECURITY.md.