Manage Claude Code sessions from your phone over a secure Tailscale VPN connection.
Expo App (Phone) --> Tailscale VPN --> Mac --> CCR Server --> Claude Code CLI
- Session management — Create, stream, pause, archive, and delete Claude Code sessions
- Live streaming — Watch Claude's responses in real-time via WebSocket
- Tool approval — Approve or deny dangerous tool calls (Write, Edit, Bash) from your phone
- Slash commands —
/commit,/review-pr,/simplify,/compact,/clear,/cost - Session info — Model name, context window %, git branch, cumulative cost
- Push notifications — Get notified on approvals, completions, and errors
- Dark mode — System-matching light/dark theme
- Templates — Reusable session configurations
- Project browser — Scan and register project directories
- OTA updates — Channel-based over-the-air updates via EAS Update (preview → production)
| Light | Dark |
|---|---|
| coming soon | coming soon |
- Claude Code Remote server running on your Mac
- Tailscale installed on both Mac and phone, signed into the same account
- iOS device (Android untested)
pip install -e ".[dev]"
ccr install # Register approval hook
ccr start # Binds to Tailscale IP on port 8080git clone https://github.com/gldc/claude-code-remote-app.git
cd claude-code-remote-app
npm install
npx expo run:ios # Requires dev client (not Expo Go) for push notificationsOpen the app → Settings tab → enter your Mac's Tailscale IP (e.g., 100.x.y.z) and port (8080).
| Layer | Technology |
|---|---|
| Framework | Expo ~55 + React Native 0.83 |
| Routing | Expo Router (file-based) |
| Server state | TanStack React Query |
| Local state | Zustand + AsyncStorage |
| Real-time | WebSocket |
| UI | Bottom Sheet, Reanimated, Gesture Handler |
| Markdown | react-native-marked |
| Notifications | Expo Notifications |
| OTA Updates | EAS Update with channel-based deployment |
app/
├── _layout.tsx Root layout (providers, StatusBar)
├── index.tsx Redirect to /sessions
└── (tabs)/
├── _layout.tsx Tab navigator
├── sessions/ Session list, detail, create
├── projects/ Project list, detail
└── settings/ Server config, push settings, templates
components/ Shared UI (MessageCard, ApprovalCard, InputBar, etc.)
constants/
├── theme.ts Color palettes, spacing, font tokens, hooks
└── commands.ts Slash command registry
lib/
├── api.ts React Query hooks for REST API
├── websocket.ts WebSocket hook for live streaming
├── store.ts Zustand store (host config, messages)
├── types.ts TypeScript interfaces
└── notifications.ts Push notification setup
This app connects to the Claude Code Remote server. Key endpoints used:
| Endpoint | Purpose |
|---|---|
GET /api/sessions |
List sessions |
POST /api/sessions |
Create session |
POST /api/sessions/{id}/send |
Send prompt |
POST /api/sessions/{id}/approve |
Approve tool use |
POST /api/sessions/{id}/deny |
Deny tool use |
WS /ws/sessions/{id} |
Live message stream |
GET /api/projects |
List projects |
GET/POST /api/templates |
Template CRUD |
POST /api/push/register |
Register push token |
All traffic travels over Tailscale's WireGuard-encrypted tunnel. The app uses http:// and ws:// protocols — encryption is handled at the network layer by Tailscale. The server authenticates requests via tailscale whois.
See docs/reviews/app-security-review.md for known security findings and recommendations.
The app itself is free. The only cost is your Claude Code API usage (usage-based) and Tailscale (free for personal use).
MIT