A professional, open-source SSH client for macOS, Windows, and Linux built with Flutter. Designed for developers and sysadmins who want a fast, keyboard-friendly terminal experience with built-in SFTP, port forwarding, and secure credential management — all in a clean dark UI.
Get the latest release from the Releases page.
YourSSH also checks for new releases on launch and from Settings → Updates; when a newer version is available it shows a banner and can download the right build for your OS and open the installer for you. Because the app is not code-signed, this is an assisted flow (it never silently replaces itself); if no matching build exists for your platform it opens the Releases page instead.
| Platform | File |
|---|---|
| macOS (Apple Silicon & Intel) | YourSSH-x.x.x-macOS-universal.dmg |
| Windows (x64) | YourSSH.Setup.x.x.x-Windows-x64.exe |
| Windows (ARM64 — Surface, Snapdragon) | YourSSH.Setup.x.x.x-Windows-arm64.exe |
| Linux (Debian/Ubuntu — x86_64) | yourssh_x.x.x_amd64.deb |
| Linux (Debian/Ubuntu — ARM64) | yourssh_x.x.x_arm64.deb |
macOS may block the app on first open because it is not yet notarized with Apple. To open it:
- Right-click (or Control-click) the app → Open
- Click Open in the dialog that appears
You only need to do this once. After that, the app opens normally.
Alternatively, run this in Terminal:
xattr -dr com.apple.quarantine /Applications/YourSSH.appRun the .exe installer and follow the setup wizard. The installer adds YourSSH to the Start menu and optionally the desktop.
Windows SmartScreen may warn on first run because the app is not yet code-signed. Click More info → Run anyway to proceed.
If you prefer a portable version (no installation required), download YourSSH-x.x.x-Windows-x64-portable.zip (or -arm64-portable.zip for ARM64), extract it anywhere, and run yourssh.exe from the extracted folder.
Debian / Ubuntu (recommended):
sudo dpkg -i yourssh_x.x.x_amd64.deb # x86_64
sudo dpkg -i yourssh_x.x.x_arm64.deb # ARM64 (Raspberry Pi 4/5, Apple M1 Linux, etc.)After install, launch from your application menu or run yourssh in a terminal.
Requires Ubuntu 22.04+ / Debian 12+ (glibc ≥ 2.35) on both x86_64 and ARM64.
Uninstall:
sudo dpkg -r yoursshMinimum requirement: GTK3 runtime (pre-installed on Ubuntu 20.04+, Debian 11+, and most modern distros).
- In-app RDP client — connect to Windows, xrdp, and any RDP-compatible server directly from a tab alongside your SSH sessions; supports NLA, TLS, and auto security modes; optional SSH tunnel via a saved jump host; server-certificate TOFU with pre-auth pin enforcement (a changed certificate aborts before your credentials are sent); fullscreen mode with an mstsc-style hover bar at the top edge; full keyboard and mouse support (including Ctrl+Alt+Del); bidirectional clipboard; RDP tabs excluded from terminal-only features (recording, split view, input bar, snippets)
- Multi-tab SSH sessions with named tabs, per-tab connection state, distro icons (detected via
/etc/os-release), and middle-click to close - Terminal sharing (multiplayer) — share a live SSH session with a session code; guests join via the Command Palette and watch or interact in real time; built on Supabase Realtime
- Split terminal view — horizontal/vertical pane splitting within a session
- Search-in-scrollback (Cmd/Ctrl+F) — regex-powered search across the full terminal buffer; highlights all matches, navigate with Enter / Shift+Enter
- Copy & paste that just works —
Ctrl+Ccopies when text is selected and stays SIGINT otherwise (Windows Terminal behavior);Cmd+C/Von macOS,Ctrl(+Shift)+Vto paste, right-click Copy/Paste/Select All menu, and middle-click paste - Shell integration (bash/zsh) — injected OSC 7/133 prompt hooks surface the working directory on the session tab, a per-command status gutter (green = ok, red = failed), jump-to-prompt (Cmd/Ctrl+↑/↓), and cwd-aware path completion in the input bar; auto-on with per-host / global opt-out; the setup script is delivered invisibly (never echoed into your terminal or recordings)
- Port forwarding — local, remote, and dynamic SOCKS5 tunnels with start/stop per rule, auto-start on launch, live connection counters, auto-reconnect with backoff when the SSH link drops (no terminal tab required — tunnels dial the host with stored credentials), and a right-click menu to duplicate rules
- Jump host / bastion proxy — connect to internal servers via a bastion host; select any saved host as the jump hop in the host detail panel
- SSH agent forwarding — per-host toggle (like
ssh -A) to hop between servers with the keys on your local machine; serves your system agent, falling back to app-Keychain keys when no agent is running — private keys never leave your machine; a status line in the host panel and a per-session key icon show whether forwarding is ready, active, on Keychain fallback, or refused by the server - Local shell — spawn native macOS/Windows/Linux shell alongside SSH sessions
- Keyword highlighting — user-defined regex rules tint matching terminal output; ships with Error/Warning/Fail defaults (red/yellow/cyan); toggle, rule list, add/edit dialog, and per-rule color picker in Settings → Terminal and the terminal config side panel
- xterm-256color terminal emulation with full PTY support
- Dual-panel SFTP — browse local and remote filesystems side-by-side
- Upload, download, rename, delete files and directories with transfer progress
- Unified right-click menu on both panels — Open, Open with…, View, Edit, Copy to target directory (greyed out with a reason when it can't run), Refresh, New folder, Permissions, Rename, Delete
- Edit Permissions (chmod) — rwx checkbox grid synced with a validated octal field, recursive apply for directories (symlink-safe, never silently applies an unknown mode); works on remote hosts and the local panel (macOS/Linux)
- Sudo SFTP (root file transfers) — per-host SFTP mode that runs the whole SFTP session as root through
sudo(WinSCP-style), with distro auto-detection and clear error guidance - View & Open with… — read-only file preview, plus a hover submenu listing every installed app that can open the file's type; external edits are watched and auto-uploaded back to the server
- Breadcrumb navigation and file type icons
- 4 auth methods: password, SSH private key, SSH certificate (CA-signed), SSH agent (
SSH_AUTH_SOCKon macOS/Linux;\\.\pipe\openssh-ssh-agenton Windows 10+) - OS-level secure storage: credentials encrypted in macOS Keychain / Windows Credential Manager via
flutter_secure_storage - Known hosts verification: interactive fingerprint trust dialog on first connect; persistent known-hosts database
- Zero-knowledge cloud sync: host configs encrypted client-side (AES-256-GCM) with a 12-character sync code that never leaves your devices — the Supabase anon key alone cannot decrypt anything
- P2P QR sync: transfer all hosts and passwords to another device via QR code over LAN or Tailscale — no cloud required
- Command Palette (Cmd/Ctrl+K) — fuzzy-search all hosts, navigation sections, snippets, and app actions from a single keyboard shortcut
- Workspace persistence — open SSH tabs, layout, and active session automatically restored on relaunch; no need to reconnect after restart
- Command snippets — save and inject reusable command templates; a collapsible snippets panel inside the terminal lets you browse, search, copy, and run them against the active pane
- Command history — searchable history per session
- Hotkeys — customizable global keyboard shortcuts
- Host groups — organize connection profiles into logical folders
- Bulk actions — select multiple hosts on the dashboard and connect to all, run one command on every host in parallel (per-host results plus a diff view that groups identical outputs), or push files to the same path everywhere
- Dashboard grid & list view — switch between host cards and a compact list, with persistent sorting (name, creation date, or hostname)
- Broadcast mode — send the same input to multiple sessions at once
- Code editor — edit remote files inline with a Monaco-powered editor
- Session recording — record terminal output to Asciinema v2 (
.cast) files; per-host auto-record setting; manual start/stop from the toolbar; Recording Library with in-app playback (play/pause, speed control 0.5×–5×) - Notification bell — a bell in the top tab bar collects in-app notifications (new release available with a one-click Update button, sessions that dropped unexpectedly) behind an unread badge; opening the panel marks them read, items can be dismissed individually or cleared all at once
- Dark-only interface with a cohesive green-accent palette
- 44 terminal color themes with a visual picker (Dracula, Solarized, Gruvbox, One Dark, Nord, Kanagawa, Tokyo Night, Flexoki, and more)
- 7 bundled monospace fonts: 6 Powerline-compatible (DejaVu, Inconsolata, Meslo LGS, Source Code Pro, Ubuntu Mono, Roboto Mono) + MesloLGS NF (Nerd Font)
- Network stats overlay — real-time traffic counter widget per session
- Minimum window size enforced (800×600); fully resizable
- Containers (Docker / Kubernetes) — list running containers (
docker ps) and pods (kubectl get pods) on the active SSH session, then Exec into any of them in a new terminal tab; namespace filter + all-namespaces toggle for Kubernetes, and an install/permission hint when the runtime is missing - Network Tools — ping, cURL, DNS lookup, traceroute, port scan, whois, netstat, disk usage, memory info, HTTP headers, SSL certificate inspection — all run on the active SSH session
- Cloudflare Tunnel manager — start/stop quick tunnels via
cloudflaredon the remote host; public URL displayed instantly - LAN Share — serve any local file over HTTP for one-click download on the same network
- Mail Catcher — spin up a local SMTP capture server via SSH; inspect emails in a built-in two-panel viewer
- MCP Server Gateway — run an MCP server on a remote host and forward it locally for AI tool access
- S3 Browser — browse, upload, and delete objects in any S3-compatible bucket (AWS, MinIO, Cloudflare R2, etc.)
- AI Chat Sidebar — toggle an AI assistant sidebar for command help and debugging; supports Anthropic Claude, OpenAI, and Google Gemini with configurable model selection
- Plugin API (
yourssh_plugin_api) — stable Dart interface for compiled (Dart) plugins; exposes SSH session proxy, secure prefs, navigation slots, and config UI hooks - Script Engine (
yourssh_script_engine) — disk-based JS plugin runtime via QuickJS (Dart FFI); plugins live in a directory asplugin.json+ JS files; hot-reload on file change; no app rebuild required - HookBus — typed event bus that routes
terminal.output,terminal.input, and session lifecycle events to registered JS hooks (transform, intercept, observe) - Bridges — JS plugins call
ssh.*,sftp.*,storage.*, andui.*APIs bridged to native Dart - PermissionGuard + circuit breaker — plugins must declare permissions in manifest; error circuit-breaker auto-disables misbehaving plugins
- Plugin Manager & Console — in-app screen to enable/disable JS plugins, reload them, and inspect their
console.logoutput - YourSSH DevOps plugin (
yourssh_devops) — reference Dart plugin bundling S3 Browser and LAN Share as plugin-provided nav sections
Hosts Dashboard![]() |
New Host Panel (SSH)![]() |
SSH Terminal with AI Assistant![]() |
Dashboard — RDP Host Badges![]() |
Dual-Panel SFTP Browser![]() |
Port Forward Rules![]() |
SSH Keychain![]() |
Known Hosts![]() |
Connection & Terminal![]() |
Terminal Themes![]() |
Sync![]() |
P2P QR Sync — Export via QR![]() |
Updates![]() |
Plugin Manager![]() |
DevOps Hub — Network Tools![]() |
Web Tools — HTTP Client![]() |
Snippets![]() |
Host Editor — RDP Form![]() |
Server Certificate — TOFU Dialog![]() |
RDP Workspace — Connected![]() |
Fullscreen with Hover Pill![]() |
Fullscreen — Clean View![]() |
Hover Reveal — Exit Bar![]() |
Back to Windowed Mode![]() |
Audit Log![]() |
Recording Library![]() |
Session Recording & Playback![]() |
Terminal Sharing (Multiplayer)![]() |
| Layer | Technology |
|---|---|
| UI Framework | Flutter (Material 3, dark theme) |
| State Management | provider (ChangeNotifier) |
| SSH / SFTP / Port Forwarding | dartssh2 (local fork with signAsync) |
| Terminal Emulation | xterm (local fork — Windows text-input viewId fix) |
| Local PTY | flutter_pty (local fork — Windows command-line fix) |
| Secure Storage | flutter_secure_storage |
| Cloud Sync Backend | supabase_flutter |
| Encryption | cryptography (AES-GCM, HKDF), crypto (AWS Sig V4) |
| Code Editor | Monaco editor via webview_flutter |
| Window Control | window_manager, hotkey_manager |
| Local Persistence | shared_preferences, file_picker |
| HTTP Server | shelf (LAN Share) |
| Network Info | network_info_plus |
| Markdown Rendering | flutter_markdown (AI chat) |
| S3 XML Parsing | xml |
| QR Code | qr_flutter, mobile_scanner (P2P sync) |
| JS Plugin Runtime | QuickJS via Dart FFI (yourssh_script_engine) |
| Platform | Minimum Version |
|---|---|
| macOS | 10.14 Mojave |
| Windows | Windows 10 (64-bit) |
| Linux | Ubuntu 20.04+ / any GTK3-compatible distro |
| Flutter SDK | 3.12.0+ |
| Dart SDK | 3.12.0+ |
git clone https://github.com/YoursshLabs/yourssh.git
cd yoursshcd app
flutter pub get# macOS
flutter run -d macos
# Windows
flutter run -d windows
# Linux
flutter run -d linux# macOS
flutter build macos
# Windows
flutter build windows
# Linux
flutter build linuxflutter analyzeflutter test
# Single file
flutter test test/widget_test.dartyourssh/
├── app/ # Flutter application (active codebase)
│ ├── lib/
│ │ ├── main.dart # Entry point — bootstraps all providers
│ │ ├── models/ # Plain data classes
│ │ ├── providers/ # ChangeNotifier state managers
│ │ ├── services/ # Business logic & external integrations
│ │ ├── screens/ # Top-level screen (main_screen.dart)
│ │ ├── plugins/ # Plugin registry and context implementation
│ │ ├── widgets/ # UI components
│ │ │ └── web_tools/ # Embedded browser, HTTP client, utility tools
│ │ └── theme/ # Dark theme definition (app_theme.dart)
│ ├── assets/
│ │ ├── monaco_editor.html # Bundled Monaco editor for remote file editing
│ │ ├── app_icon.png
│ │ └── fonts/
│ │ ├── powerline/ # 6 Powerline-compatible monospace fonts
│ │ └── nerd/ # MesloLGS NF (Nerd Font, 4 variants)
│ ├── macos/ # Flutter macOS runner (Xcode entitlements, Info.plist)
│ ├── windows/ # Flutter Windows build configuration
│ ├── linux/ # Flutter Linux build configuration (CMake)
│ └── pubspec.yaml
│
├── packages/
│ ├── yourssh_plugin_api/ # Plugin interface package (stable public API)
│ ├── yourssh_script_engine/ # JS plugin runtime (QuickJS FFI, HookBus, bridges)
│ ├── yourssh_devops/ # DevOps plugin (S3, LAN Share)
│ ├── dartssh2/ # Local fork — signAsync() agent auth + agent-forwarding channels
│ ├── flutter_pty/ # Local fork — Windows argv[0] duplication fix (local terminal input)
│ └── xterm/ # Local fork — passes viewId to TextInput (Windows typing fix)
├── macos/ # Xcode project files (xcodegen — project.yml)
├── supabase/migrations/ # Database schema migrations
├── scripts/ # Build and release automation
├── Makefile # Xcode project generation targets
└── CLAUDE.md # AI assistant context for this repo
Flutter UI (widgets / screens)
└── Providers (ChangeNotifier via provider package)
└── Services (business logic)
└── dartssh2 — SSH, SFTP, port forwarding
└── flutter_pty — local PTY shell
└── flutter_secure_storage — OS credential vault
└── shared_preferences — host list, app settings
└── supabase_flutter — optional encrypted sync
└── shelf — local HTTP server (LAN Share)
| Provider | Responsibility |
|---|---|
HostProvider |
CRUD for saved SSH connection profiles, persisted via StorageService |
SessionProvider |
Lifecycle of active SshSession objects; auto-reconnect logic |
LocalSessionProvider |
Lifecycle of local PTY shell sessions |
KeyProvider |
SSH key entries (path + passphrase + optional CA certificate) |
KnownHostsProvider |
Host fingerprint trust database |
PortForwardProvider |
Tunnel configuration and active forward tracking |
TunnelProvider |
Cloudflare and MCP gateway tunnel state |
SnippetProvider |
Reusable command snippets |
CommandHistoryProvider |
Per-session command history |
SettingsProvider |
App-wide config (tmux, auto-reconnect, hotkeys, theme) |
SyncProvider |
Cloud sync state; delegates to SyncService |
SftpPanelProvider |
SFTP panel state (current path, selection, loading) |
SftpTransferProvider |
Active transfer queue and progress tracking |
LocalFilePanelProvider |
Local filesystem panel state for dual-panel SFTP |
TerminalLayoutProvider |
Split-terminal layout (horizontal/vertical panes) |
AiChatProvider |
AI chat sidebar — multi-provider (Anthropic, OpenAI, Gemini) |
PluginProvider |
Installed plugins, enable/disable state, config slot wiring |
UpdateProvider |
In-app update check (GitHub releases) + download/install orchestration; drives the banner and Settings section |
NotificationCenterProvider |
In-memory store behind the notification bell (update available, unexpected session drops); unread badge, dedupe, cap at 50 |
| Service | Responsibility |
|---|---|
SshService |
Owns SSHClient and SSHSession maps; connect, exec, shell, SFTP, disconnect |
StorageService |
Hosts as JSON in SharedPreferences; passwords/passphrases in secure storage |
SyncService |
Encrypts host list and pushes/pulls from Supabase |
SyncEncryption |
AES-GCM encrypt/decrypt for sync data |
SupabaseService |
Supabase HTTP wrapper (upsert/fetch/delete in sync_data table) |
LocalShellService |
Spawns native PTY sessions on macOS/Windows/Linux |
PtyRunner |
Low-level PTY wrapper used by LocalShellService |
SftpFileOpsService |
SFTP file operations (rename, delete, mkdir, chmod with recursive walk) |
SftpTransferService |
Chunked SFTP upload/download with progress callbacks |
CloudflareTunnelService |
Start/stop cloudflared quick tunnels on the remote host |
LanShareService |
HTTP file server on LAN via shelf |
MailCatcherService |
Local SMTP capture server via SSH port forward |
McpGatewayService |
Forward MCP server from remote host to local port |
S3Service |
S3-compatible bucket operations with AWS Signature V4 |
NetworkStatsService |
Real-time network traffic stats for the overlay widget |
WebToolsService |
Runs network diagnostic commands on the active SSH session |
HotkeyService |
Register and dispatch global keyboard shortcuts |
SystemAgentProxy |
SSH agent bridge: Unix socket (SSH_AUTH_SOCK) on macOS/Linux, named pipe (\\.\pipe\openssh-ssh-agent) on Windows |
CertificateKeyPair |
OpenSSH CA-signed certificate auth (id_rsa-cert.pub) |
P2PSyncService |
One-shot LAN HTTP server + client for QR-based P2P host transfer |
P2PSyncEncryption |
AES-256-GCM encrypt/decrypt with raw random key (no PBKDF2) for P2P sync |
UpdateService |
Checks GitHub releases/latest, compares semver, picks the OS/arch artifact, downloads with progress, launches the OS installer |
Two plugin types coexist:
Dart plugins (compiled-in): implement YourSSHPlugin from packages/yourssh_plugin_api; registered in app/lib/plugins/plugin_registry.dart at build time. PluginProvider manages enable/disable. YourSSHDevOpsPlugin is the reference implementation.
JS plugins (disk-based, runtime): powered by packages/yourssh_script_engine. A plugin is a directory containing plugin.json (manifest with name, permissions, hook declarations) + one or more .js files. ScriptEngineService loads them via QuickJsRuntime (Dart FFI → QuickJS C engine) — no rebuild required. PluginLoader watches the directory for changes and hot-reloads modified plugins. PluginEngineProvider surfaces the loaded plugins to the UI.
YourSSH supports two ways to sync hosts between devices:
Continuous sync via a Supabase backend. All data is encrypted client-side before leaving your machine.
- Create a free project at supabase.com.
- Run the migrations in
supabase/migrations/against your project. - Add your Supabase URL and anon key in Settings → Sync inside the app.
- Generate a sync code on your first device, then enter the same code on your other devices. The code is the encryption key — without it the synced data cannot be read.
One-time transfer from one device to another over LAN or Tailscale:
- On Device A: open Settings → Sync → Show QR Code (or click the QR icon in the host list).
- Select your network interface (WiFi, Tailscale, Ethernet).
- On Device B: open Settings → Sync → Scan QR Code and point the camera at the code.
- All hosts and passwords are transferred, encrypted end-to-end with AES-256-GCM.
Both sync methods are fully optional. The app works entirely offline without either.
Contributions are welcome. Here's the recommended workflow:
git checkout -b feat/your-feature-name- Models in
app/lib/models/— immutable data classes withcopyWith. - Providers in
app/lib/providers/— extendChangeNotifier, delegate I/O to services. - Services in
app/lib/services/— pure logic, no Flutter widget dependencies. - Widgets in
app/lib/widgets/— stateless where possible; useConsumer/context.watchto bind to providers. - Plugins in
packages/— implementYourSSHPlugin; usePluginContextfor SSH and storage access.
- Run
flutter analyze— zero warnings expected before submitting. - Keep comments minimal; prefer self-documenting names.
- Avoid adding dependencies unless essential.
flutter test
flutter analyzeInclude a short description of what changed and why. Screenshots for UI changes are appreciated.
- Custom terminal color themes (44 presets)
- SSH certificate authentication (CA-signed certs)
- SSH agent authentication (
SSH_AUTH_SOCK) - Linux desktop target
- Plugin / extension system
- Multi-provider AI assistant (Claude, OpenAI, Gemini)
- P2P host sync via QR code (LAN / Tailscale, AES-256-GCM encrypted)
- Script Engine — disk-based JS plugins via QuickJS FFI; HookBus; SSH/SFTP/Storage/UI bridges; hot-reload; permission guard + circuit breaker; consent dialog, manager screen, console log viewer
- SSH config import — paste
~/.ssh/configor JSON to bulk-import hosts - Host import from CSV — bulk import connection profiles from a spreadsheet
- Command finish notification — system alert when a long-running command completes while the window is not focused
- Jump host / bastion proxy —
ProxyJumpsupport for multi-hop connections - TOTP / keyboard-interactive 2FA — OTP prompt for servers that require it after password
- Windows SSH agent (Pageant) — named-pipe agent support alongside
SSH_AUTH_SOCK - SSH agent forwarding —
ssh -A-style per-host toggle with system agent + app-Keychain fallback (#49)
- Session recording — save terminal sessions to file (asciinema format) with playback
- Multi-host scripting — run a script or command across multiple selected hosts in parallel
- Smarter tab completion — history-aware suggestions + remote filesystem path completion
- Vault — encrypted local store for API keys, tokens, and secrets with biometric unlock
- Docker / Kubernetes exec — list containers/pods on the remote host and exec into them directly
- Remote process manager —
htop-style process list with kill support - Log tail viewer — real-time
tail -fpanel with regex filter and highlight
- iOS / iPadOS target (experimental)
- Android target (experimental)
This project is licensed under the MIT License — see LICENSE for details.
- dartssh2 — SSH protocol implementation for Dart
- xterm.dart — Terminal emulator widget
- flutter_pty — PTY support for local shell
- Supabase — Open-source Firebase alternative used for sync backend




























