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 support@involvex.dev.
MIT License. See LICENSE for details.