Haven
Free SSH, VNC, RDP & SFTP client for Android
Install / Use
/learn @GlassOnTin/HavenREADME
<p align="center"> <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/2_connections_ssh.png" width="140" /> <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/1_terminal.png" width="140" /> <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/5_desktop.png" width="140" /> <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/4_host_key.png" width="140" /> <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/6_keys.png" width="140" /> <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/3_connections_reticulum.png" width="140" /> <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/7_settings.png" width="140" /> <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/8_toolbar_config.png" width="140" /> </p>
Features
Terminal — VT100/xterm emulator with multi-tab sessions, Mosh (Mobile Shell) for roaming connections and Eternal Terminal (ET) for persistent sessions — both with pure Kotlin protocol implementations (no native binaries), tmux/zellij/screen auto-attach with session restore (remembers previously open sessions and offers to reopen them), tab reordering via long-press menu, color-coded tabs matching connection profiles, mouse mode for TUI apps, configurable keyboard toolbar (Esc, Tab, Ctrl, Alt, AltGr, arrows with key repeat), text selection with copy and Open URL, configurable font size, and six color schemes.
Desktop (VNC) — Remote desktop viewer with RFB 3.8 protocol support. Pinch-to-zoom, two-finger pan and scroll, single-finger drag for window management, soft keyboard with X11 KeySym mapping. Fullscreen mode with NoMachine-style corner hotspot for session controls. Connect directly or tunnel through SSH. Supports Raw, CopyRect, RRE, Hextile, and ZLib encodings. Local Desktop — one-tap desktop running on-device via PRoot, no root required. Choose from Xfce4 or Openbox (X11/Xvnc) or Labwc (Wayland/wayvnc, experimental).
Desktop (RDP) — Remote Desktop Protocol client built on IronRDP via UniFFI Kotlin bindings. Connects to Windows Remote Desktop, xrdp (Linux), and GNOME Remote Desktop. Pinch-to-zoom, pan, keyboard with scancode mapping, mouse input. SSH tunnel support with auto-connect through saved SSH profiles. Saved connection profiles with optional stored password.
Files — Unified file browser with SFTP, SMB, and cloud storage tabs. Browse remote directories, upload files or entire folders, download, delete, create directories, copy path, toggle hidden files, sort by name/size/date. Cross-filesystem copy/move — copy files between any backends (e.g. Google Drive → SFTP server) with clipboard model: long-press → Copy/Cut, switch tab, Paste. Conflict resolution (skip/replace) for existing files. Path preserved when switching between tabs.
Cloud Storage — Browse, upload, download, and manage files on 60+ cloud providers via rclone — Google Drive, Dropbox, OneDrive, Amazon S3, Backblaze B2, and more. OAuth authentication with automatic browser flow. Server-side copy between cloud remotes (no temp file needed).
SSH Keys — Generate Ed25519, RSA, and ECDSA keys on-device. Import keys from file (PEM/OpenSSH/Dropbear format) or paste from clipboard. One-tap public key copy and deploy key dialog for authorized_keys setup. Assign specific keys to individual connections.
SMB — Browse Windows/Samba file shares with optional SSH tunneling for secure access over the internet.
Connections — Saved profiles with transport selection (SSH, Mosh, Eternal Terminal, VNC, RDP, SMB, Cloud Storage, Reticulum), host key TOFU verification, fingerprint change detection, auto-reconnect with backoff, password fallback, local/remote port forwarding (-L/-R), ProxyJump multi-hop tunneling (-J) with tree view, SOCKS5/SOCKS4/HTTP proxy support (Tor .onion compatible), and RDP-over-SSH tunnel profiles.
Local Shell (PRoot) — Run a real Linux terminal directly on your phone, no root required. Select "Local Shell (PRoot)" when creating a connection and Haven downloads a minimal Alpine Linux rootfs (~4 MB) on first use. From there you have a full apk package manager — install Python, Node.js, git, build tools, or anything in Alpine's package repository.
PRoot works by intercepting system calls in userspace (no kernel modifications), so it runs on any unrooted Android device. It does not require or use root access — the name "PRoot" stands for "ptrace-based root", meaning it emulates a root filesystem without actual superuser privileges. Think of it as a lightweight container that runs entirely within Haven's app sandbox.
How it compares to alternatives:
- Rooted phones (Magisk/su): Root gives full system access. PRoot is sandboxed — it can't modify your system, but it also doesn't need root to work.
- Android Terminal VM (Pixel 8+): Google's official Linux VM runs a full kernel via pKVM. It's more capable but only available on Pixel 8 and newer. PRoot runs on any device back to Android 8. Haven can SSH into an Android Terminal VM if you have one — see the connection settings.
- Termux: A standalone terminal emulator with its own package ecosystem. PRoot is lighter (4 MB vs ~100 MB) and integrated into Haven alongside your SSH/cloud sessions.
See PRoot documentation for technical details.
Reticulum — Connect over Reticulum mesh networks via rnsh or Sideband with announce-based destination discovery and hop count.
Security — Biometric app lock with configurable timeout (immediate/30s/1m/5m/never), no telemetry or analytics, local storage only. See PRIVACY_POLICY.md.
<details> <summary><strong>OSC escape sequences</strong></summary>Remote programs can interact with Android through standard terminal escape sequences:
| OSC | Function | Example |
|-----|----------|---------|
| 52 | Set clipboard | printf '\e]52;c;%s\a' "$(echo -n text \| base64)" |
| 8 | Hyperlinks | printf '\e]8;;https://example.com\aClick\e]8;;\a' |
| 9 | Notification | printf '\e]9;Build complete\a' |
| 777 | Notification (with title) | printf '\e]777;notify;CI;Pipeline green\a' |
| 7 | Working directory | printf '\e]7;file:///home/user\a' |
Notifications appear as a toast in the foreground or as an Android notification in the background.
</details>Install
| Channel | | |---|---| | GitHub Releases | Signed APK, all features | | F-Droid | Built from source, all features |
Both builds are identical — SSH, Mosh, Eternal Terminal, VNC, RDP, SFTP, and Cloud Storage. IronRDP (Rust) is built from source via cargo-ndk. rclone (Go) is built from source via gomobile.
Build from source
Requires Rust with Android targets, cargo-ndk, Go 1.26+, and gomobile:
# Rust (for RDP)
rustup target add aarch64-linux-android x86_64-linux-android
cargo install cargo-ndk
# Go (for rclone cloud storage)
go install golang.org/x/mobile/cmd/gomobile@latest
go install golang.org/x/mobile/cmd/gobind@latest
git clone https://github.com/GlassOnTin/Haven.git
cd Haven
./gradlew assembleDebug
Output: app/build/outputs/apk/debug/haven-*-debug.apk
Third-party libraries
| Library | Purpose | License | |---------|---------|---------| | rclone | Cloud storage engine (60+ providers) | MIT | | IronRDP | RDP protocol (Rust/UniFFI) | MIT / Apache-2.0 | | JSch | SSH/SFTP protocol | BSD | | smbj | SMB/CIFS protocol | Apache-2.0 | | ConnectBot termlib | Terminal emulator | Apache-2.0 | | PRoot | Local Linux shell (userspace chroot) | GPL-2.0 | | Jetpack Compose | UI toolkit | Apache-2.0 |
