A mobile client for OpenCode — control your AI coding agent from your phone or tablet.
Not affiliated with OpenCode. Desk Escape is an independent, community-built client. You run your own OpenCode server; the app is a thin client that never proxies your traffic or API keys through our servers.
Desk Escape connects remotely to an OpenCode server over HTTP (LAN, Tailscale, or self-hosted tunnel) and gives you a native mobile workspace: agent chat with real-time streaming, a full terminal, file browser, diff viewer, and session management.
The easiest way to get Desk Escape is a prebuilt APK from GitHub Releases — no Play Store account required.
- APK (Android): https://github.com/involvex/Desk-Escape/releases/latest
- Build from source:
git clone https://github.com/involvex/Desk-Escape.git && cd Desk-Escape && bun install && bun run android
Want the simplest setup? Install the companion
@involvex/opencode-autoweb-pluginfirst — it automatically startsopencode webfor you, so Desk Escape always connects to a healthy server.
- Start your OpenCode server:
OPENCODE_SERVER_PASSWORD=yourpassword opencode serve --hostname 0.0.0.0 --port 4096
- Install Desk Escape — download the latest APK from GitHub Releases.
- Connect:
- Enter the server address (e.g.
http://100.x.x.x:4096for Tailscale, orhttp://192.168.1.100:4096on your local network). - Optionally enter your
OPENCODE_SERVER_PASSWORD. - Tap Test Connection, then Connect.
- Enter the server address (e.g.
Recommended: @involvex/opencode-autoweb-plugin (click to expand)
Install in your global OpenCode config (~/.config/opencode/opencode.json):
{
"plugin": ["@involvex/opencode-autoweb-plugin@latest"]
}This automatically launches opencode web on startup so you never need to
run it manually. Then point Desk Escape at http://<your-ip>:5000.
See docs/PLUGINS.md for full instructions.
- Agent Chat — Send prompts, receive responses in real-time via SSE streaming. Supports slash commands, context attachments, and offline queuing.
- Terminal — Full-screen PTY terminal powered by xterm.js in a WebView. Connects to the server's shell over WebSocket.
- File Browser — Browse the remote workspace, view file status (modified/added/deleted), and open unified diffs.
- Session & Project Management — Switch between sessions and projects. Create, delete, and navigate across workspaces.
- 7 Themes — OLED Black, Dev Dark, Dev Light, Midnight Purple, Solarized Dark, Nord, and High Contrast. Sync with system dark/light mode.
- Biometric Lock — Optional Face ID / fingerprint authentication before revealing workspace content.
- Offline Queue — Prompts are buffered when disconnected and sent automatically on reconnection.
- Auto-Reconnect — Exponential backoff reconnection with visual status indicators.
- Landscape Split-View — On tablets in landscape, a file rail appears alongside the agent chat.
- Command Palette — Quick access to sessions, projects, slash commands, and app actions.
- Message Search — Full-text search across the current session's chat history.
- Multi-Server Profiles — Save and switch between multiple OpenCode server connections.
- Node.js (LTS recommended)
- Bun >= 1.3.0
- Expo CLI (
bunx expo) - Android Studio (for Android builds) or Xcode (for iOS builds)
- A running OpenCode server
git clone https://github.com/involvex/Desk-Escape.git
cd Desk-Escape
bun installThe postinstall script automatically builds the terminal shell HTML asset.
# Android
bun run android
# iOS
bun run ios
# Web
bun run web- Start your OpenCode server (default port:
4096) - Open Desk Escape on your device
- Enter the server address (e.g.,
http://100.x.x.x:4096for Tailscale, orhttp://localhost:4096for local) - Optionally enable authentication and enter credentials
- Tap Test Connection, then Connect
Desk-Escape/
├── App.tsx # Root component with provider hierarchy
├── app.json # Expo configuration
├── index.ts # Entry point
├── src/
│ ├── api/ # OpenCode SDK client, hooks, event bus, PTY, reconnection
│ ├── assets/ # Generated terminal shell HTML
│ ├── components/ # UI components (AgentChat, TerminalPanel, FileDrawer, etc.)
│ ├── context/ # React contexts (Connection, Theme, Orientation, Biometric, etc.)
│ ├── hooks/ # Custom hooks
│ ├── navigation/ # React Navigation stack (RootNavigator)
│ ├── screens/ # Screen components (Connection, Workspace, Settings, Plugins)
│ ├── services/ # Notification service
│ ├── types/ # TypeScript type definitions
│ └── utils/ # Utility functions
├── plugins/ # Expo config plugins (cleartext network)
├── scripts/ # Build scripts (terminal shell, validation)
├── docs/ # Architecture documentation
└── android/ # Generated Android native project
| Command | Description |
|---|---|
bun run start |
Start Expo dev server |
bun run android |
Build and run on Android |
bun run ios |
Build and run on iOS |
bun run web |
Start web version |
bun run check |
Run lint, format, typecheck, and dependency check |
bun run lint |
Run ESLint |
bun run lint:fix |
Run ESLint with auto-fix |
bun run format |
Run Prettier |
bun run typecheck |
Run TypeScript type checking |
bun run doctor |
Run Expo doctor diagnostics |
bun run android:clean |
Clean Android build artifacts |
- Architecture Guide — Deep-dive into the project structure, data flow, and component design
- Plugins & Companion Tools — Setting up the autoweb plugin and other helper tools
- Contributing Guide — Development setup, code style, and contribution workflow
- Feature Suggestions — Planned features and improvements
- Changelog — Release history
Desk Escape is free and open-source under the MIT license — no subscription,
no ads, no feature gates. If the app saves you time, consider
sponsoring the project on GitHub Sponsors.
Your name will be added to SUPPORTERS.md.
Questions? File an issue or
reach out at [email protected].
MIT License. See LICENSE for details.