An Android SSH client powered by iroh for peer-to-peer connections.
![]() |
![]() |
![]() |
iroh-ssh lets you open SSH sessions to remote hosts over the iroh peer-to-peer network. Instead of requiring a routable IP address or VPN, it uses iroh's relay-assisted NAT traversal so you can reach machines behind firewalls or dynamic IPs — as long as both sides run an iroh-ssh endpoint.
The app is built with Flutter and bridges to a Rust core (iroh-ssh) via flutter_rust_bridge.
- P2P SSH connections — connect using
user@<endpoint-id>without a public IP - Direct SSH connections — connect to any host directly via
user@hostoruser@host:port - Local shell — open a local terminal session on the device
- Multiple sessions — manage several concurrent sessions in tabs
- Terminal emulator — full xterm-compatible terminal with configurable font size and colour theme
- SSH key management — generate Ed25519 keys, import existing keys (PEM), copy/export public keys, and export private keys (protected by biometric authentication on Android)
- QR code scanning — on Android, scan a connection target from a QR code; import a private key from a QR code on all platforms
- Saved connections — quickly reconnect to previously used hosts
- Background sessions — on Android, sessions run in a foreground service so they survive app backgrounding
- Configurable relay servers — use iroh's default relays, add custom relay URLs, or disable relays entirely
- Cross-platform — primarily Android; also runs on Linux and macOS (no foreground service)
- On the server side, expose an SSH server through iroh-ssh and note the endpoint ID it prints.
- Open the app, select the Iroh tab, and type (or scan on Android) the connection target in the form
user@<endpoint-id>. - Tap Connect.
The app will establish a peer-to-peer tunnel and open an interactive terminal session.
- Select the SSH tab and enter a target in the form
user@hostoruser@host:port. - Tap Connect.
Select the Local tab and tap Open Shell to start a local terminal session on the device.
Prerequisites:
- Flutter (see
.fvmrcfor the Flutter channel tracked via fvm) - Rust with the Android NDK targets (for Android builds)
- flutter_rust_bridge_codegen for regenerating the FFI bindings
# Install Flutter dependencies
flutter pub get
# Build and run (Android)
flutter run| Path | Description |
|---|---|
lib/ |
Flutter/Dart application code |
lib/models/ |
Data models (session info, connection types) |
lib/screens/ |
UI screens (connect, sessions, settings, QR scanner) |
lib/services/ |
Storage, SSH session management, foreground service IPC |
lib/widgets/ |
Reusable UI widgets |
rust/ |
Rust crate — thin FFI bridge to iroh-ssh |
rust_builder/ |
Flutter plugin that compiles the Rust crate |
android/ |
Android-specific configuration |



