MuxPod
Your tmux sessions, in your pocket.
A mobile-first tmux client for Android — SSH in, navigate sessions, and stay productive on the go.
🇯🇵 日本語
---
---
## Why MuxPod?
Ever needed to check on a long-running process, restart a service, or peek at logs while away from your desk?
**MuxPod turns your Android phone into a tmux remote control.**
- 🚀 **Zero server setup** — Works with any server running `sshd`. No agents, no daemons, nothing to install.
- 📱 **Built for mobile** — Not a terminal crammed into a phone. A thoughtful UI designed for touch.
- 🔐 **Secure by default** — SSH keys stored in Android Keystore. Your credentials never leave the device.
---
## App Structure
MuxPod uses a 5-tab navigation with Dashboard at the center for quick session access.
| Dashboard | Servers | Alerts | Keys | Settings |
|:---------:|:-------:|:------:|:----:|:--------:|
|
|
|
|
|
|
### 🏠 Dashboard
Your home screen. Recent sessions sorted by last access time with relative timestamps ("Just now", "5 min ago"). **One tap to reconnect** — instantly returns to your last window and pane.
### 📡 Servers
Manage SSH connections. **Tap to expand** a server card and see active tmux sessions with attach/detach status. Create new sessions or jump into existing ones.
### 🔔 Alerts
Monitor tmux window flags across all connections in real-time.
| Flag | Color | Meaning |
|------|-------|---------|
| Bell | 🔴 Red | Window triggered a bell |
| Activity | 🟠 Orange | Content changed in window |
| Silence | ⚫ Gray | No activity for a while |
**Tap any alert** to jump directly to that window and pane. The alert is automatically cleared.
### 🔑 Keys
Generate **Ed25519** (recommended) or **RSA** (2048/3072/4096-bit) keys on-device. Import existing keys. All stored securely with optional passphrase protection. **One-tap copy** public key to clipboard.
### ⚙️ Settings
Customize terminal appearance (fonts, colors), behavior (haptic feedback, keep screen on), and connection settings.
---
## Terminal Experience
The terminal screen is where MuxPod shines — purpose-built for mobile tmux interaction.
### 🗂️ Breadcrumb Navigation
Tap **Session → Window → Pane** in the header to switch contexts instantly. The pane selector shows a **visual layout** of your split panes with accurate proportions.
| Terminal | Pane Selector |
|:--------:|:-------------:|
|
|
|
### 👆 Touch Gestures
| Gesture | Action |
|---------|--------|
| **Hold + Swipe** | Send arrow keys (↑↓←→) — perfect for editors like vim/nano |
| **Pinch** | Zoom in/out (50%–500%) |
| **Tap pane indicator** | Quick pane switcher with visual layout |
### ⌨️ Special Keys Bar
Dedicated buttons for terminal essentials:
```
[ESC] [TAB] [CTRL] [ALT] [SHIFT] [ENTER] [S-RET] [/] [-]
[←] [↑] [↓] [→] [⚡ DirectInput] [Input...]
```
- **Modifier keys toggle** — Tap CTRL, then type 'c' for Ctrl-C
- **S-RET** — Shift+Enter for Claude Code confirmation
- **DirectInput mode** — Real-time keystroke streaming with live indicator
### 📋 Copy/Paste Mode
Toggle **Scroll & Select Mode** to enable text selection. Terminal updates are buffered while you select, so content won't jump. Selected text copies to system clipboard.
### ⚡ Connection Resilience
- **Auto-reconnect** — Up to 5 retries with exponential backoff
- **Input queuing** — Type while disconnected; commands send automatically on reconnect
- **Latency indicator** — Real-time ping display (green < 100ms, red > 500ms)
- **Adaptive polling** — 50ms–500ms based on activity for battery optimization
### Deep Linking
Open MuxPod directly to a specific server, session, window, or pane from external apps using the `muxpod://` URL scheme.
**URL format:**
```
muxpod://connect?server=&session=&window=&pane=
```
| Parameter | Required | Description |
|-----------|----------|-------------|
| `server` | Yes | Matches the connection's **Deep Link ID** first, then falls back to **connection name** (case-insensitive) |
| `session` | No | tmux session name to attach to. If omitted, uses the first available session |
| `window` | No | tmux window name to switch to |
| `pane` | No | Pane index within the window (0-based) |
**Setup:**
1. Open a connection in **Servers** > **Edit**
2. Set a **Deep Link ID** (e.g., `macbook-pro`) — this is a stable identifier you use in URLs
3. Use the same ID in your external scripts/notifications
**Example — Claude Code finish notification with deep link:**
```
muxpod://connect?server=macbook-pro&session=dev&window=claude&pane=0
```
This will: find the server by ID `macbook-pro` → SSH connect → attach to session `dev` → switch to window `claude` → focus pane `0`.
Works on both **Android** (intent filter) and **iOS** (URL type). Supports cold start (app not running) and hot links (app in background).
**Use with [claude-telegram-notify](https://github.com/launch52-ai/claude-telegram-notify)** to get Telegram notifications when Claude Code finishes or needs input, with tappable deep links that open MuxPod directly to the right terminal.
---
## Quick Start
### Install
Download the latest APK from [**Releases**](https://github.com/moezakura/mux-pod/releases).
### Or build from source
```bash
git clone https://github.com/moezakura/mux-pod.git
cd mux-pod
flutter pub get
flutter build apk --release
```
### Connect
1. **Add a server** — Tap + on Servers tab, enter host/port/username
2. **Authenticate** — Choose password or SSH key (generate in Keys tab)
3. **Navigate** — Expand server → select session → tap window → choose pane
4. **Interact** — Use touch gestures, special keys bar, or DirectInput mode
---
## Requirements
| Component | Requirement |
|-----------|-------------|
| **Device** | Android 8.0+ (API 26) |
| **Server** | Any SSH server (OpenSSH, Dropbear, etc.) |
| **tmux** | Any version (tested with 2.9+) |
---
## Tech Stack
| | |
|---|---|
| **Framework** | Flutter 3.24+ / Dart 3.x |
| **SSH** | [dartssh2](https://pub.dev/packages/dartssh2) |
| **Terminal** | [xterm](https://pub.dev/packages/xterm) |
| **State** | [flutter_riverpod](https://pub.dev/packages/flutter_riverpod) |
| **Security** | [flutter_secure_storage](https://pub.dev/packages/flutter_secure_storage) |
Full dependency list
- `cryptography`, `pointycastle` — Key generation
- `flutter_local_notifications` — Alert system
- `flutter_foreground_task` — Background connection
- `wakelock_plus` — Keep screen on
- `shared_preferences` — Settings storage
---
## Development
```bash
# Run in debug mode
flutter run
# Static analysis
flutter analyze
# Run tests
flutter test
```
See [docs/](docs/) for architecture details and coding conventions.
---
## Contributing
Contributions welcome! Feel free to:
- 🐛 Report bugs
- 💡 Suggest features
- 🔧 Submit PRs
---
## License
[Apache License 2.0](LICENSE) © 2025 mox
---
Built with ☕ and Flutter