A modern, cross-platform SSH client and remote management tool.
Built for engineers who got tired of PuTTY and wanted something that just works.
Documentation · Download · Report a Bug
Most SSH tools feel like they were designed in 2005, because they were. MobaXterm is Windows-only and bloated, PuTTY hasn't changed in decades, and Termius wants a subscription for basic features.
Reach is what happens when you build an SSH client from scratch with a native UI, proper encryption, and the kind of workflow you'd actually want to use every day. No Electron. No monthly fee. Just a fast, clean tool that runs everywhere.
- SSH Terminal · Full interactive shell with WebGL rendering. Tabs, split views, and resize that actually works.
- SFTP File Explorer · Browse remote filesystems, drag-and-drop transfers, inline editing. Feels like a local file manager.
- Session Manager · Save connections with folders and tags. Credentials are encrypted at rest, not stored in plaintext configs.
- Jump Host (ProxyJump) · Connect through bastion servers with multi-hop SSH tunneling. Import hosts directly from
~/.ssh/config.
- Port Tunneling · Local, remote, and dynamic SOCKS forwarding. Set it up once, save it with the session.
- Multi-Exec · Broadcast the same command to 10 servers at once. Handy for fleet updates.
- System Monitoring · Live CPU, memory, and disk stats from connected hosts without installing agents.
- Ansible · Manage playbooks, inventories, roles, and collections. Run playbooks and ad-hoc commands with streaming output. Encrypts/decrypts files with ansible-vault. On Windows, automatically runs through WSL.
- OpenTofu · Plan, apply, and destroy infrastructure. Browse state, manage providers and modules. Full workspace with file editor and streaming command output.
- Serial Console · Talk to routers, switches, and embedded devices over COM/TTY.
- AI Assistant · Optional AI integration for command suggestions and troubleshooting (bring your own API key).
- Encrypted Vault · Store secrets, credentials, and SSH keys in an encrypted vault with cloud sync support.
- Lua Plugins · Extend Reach with sandboxed Lua scripts. Access SSH, storage, and UI hooks through the host API.
- Auto-Updates · The app checks for updates on startup and periodically while running. No manual downloads.
Reach is a Tauri v2 app with a Rust backend and Svelte 5 frontend. The entire SSH stack runs natively in Rust through russh, with no OpenSSH dependency. The UI is rendered in a system webview (not bundled Chromium), so the final binary is small and memory usage stays low.
| Backend | Rust, Tokio, russh |
| Frontend | Svelte 5, SvelteKit, TypeScript |
| Styling | Tailwind CSS v4 |
| Terminal | xterm.js with WebGL addon |
| Crypto | XChaCha20-Poly1305, Argon2id, X25519 |
| Platforms | Windows, macOS, Linux, Android |
Grab the latest release from the Releases page. Installers are available for Windows (NSIS), macOS (.dmg), Linux (.deb, .AppImage, .rpm), and Android (.apk).
You'll need Rust, Node.js 22+, and the Tauri prerequisites for your OS.
git clone https://github.com/alexandrosnt/Reach.git
cd Reach
npm install
npm run tauri devFor a production build:
npm run tauri buildgraph LR
root["🗂 Reach"]
root --> src["📁 src · Svelte frontend"]
root --> tauri["📁 src-tauri · Rust backend"]
root --> gh["📁 .github/workflows · CI/CD"]
src --> routes["📄 routes"]
src --> lib["📁 lib"]
lib --> components["📁 components"]
lib --> state["📄 state · Reactive .svelte.ts modules"]
lib --> ipc["📄 ipc · Tauri command wrappers"]
lib --> i18n["📄 i18n · Internationalization"]
components --> layout["📄 layout · AppShell, TitleBar, Sidebar"]
components --> terminal["📄 terminal · SSH terminal, multi-exec"]
components --> explorer["📄 explorer · SFTP file browser"]
components --> sessions["📄 sessions · Connection manager"]
components --> tunnel["📄 tunnel · Port forwarding UI"]
components --> vault["📄 vault · Encrypted secrets"]
components --> ai["📄 ai · AI assistant panel"]
components --> ansible["📄 ansible · Ansible automation"]
components --> tofu["📄 tofu · OpenTofu IaC"]
components --> settings["📄 settings · App preferences"]
components --> shared["📄 shared · Button, Modal, Toast"]
tauri --> taurisrc["📁 src"]
taurisrc --> ssh["📄 ssh · SSH client via russh"]
taurisrc --> sftp["📄 sftp · File transfers"]
taurisrc --> tvault["📄 vault · Encrypted storage, crypto"]
taurisrc --> ttunnel["📄 tunnel · Port forwarding engine"]
taurisrc --> pty["📄 pty · Local terminal (desktop)"]
taurisrc --> serial["📄 serial · Serial port (desktop)"]
taurisrc --> monitoring["📄 monitoring · Remote system stats"]
taurisrc --> ansible["📄 ansible · Ansible project & runner"]
taurisrc --> tofu["📄 tofu · OpenTofu project & runner"]
taurisrc --> tipc["📄 ipc · Tauri command handlers"]
- Ctrl + Mouse Wheel zoom — Change terminal font size with Ctrl + Scroll in any terminal tab. Saves automatically, persists across restarts.
- Removed font size slider — No separate "console text size" setting. Terminal sizing is Ctrl+Wheel only, keeping UI and terminal scaling independent.
- Font family via Settings only — Google Fonts picker stays in Appearance for choosing terminal font family, font size is controlled naturally in the terminal itself.
- Proxy support (SOCKS5/SOCKS4/HTTP) — Connect to SSH servers through proxies. Supports Tor (SOCKS5 on 127.0.0.1:9050), corporate HTTP CONNECT proxies, and any SOCKS4/5 proxy with optional authentication. Configured per session in the session editor.
- Vault-scoped folders — Folders now belong to the vault where they were created. A folder in "DevOps Team" vault won't appear in "Private" or other vaults.
- Clean toolchain check — Ansible and OpenTofu panels show a spinner while checking installation status instead of raw terminal commands
- Zero svelte-check warnings — Fixed all 17 accessibility warnings (form labels, ARIA roles, unused CSS) across Ansible, Tofu, and Vault components
- Google Fonts integration — Searchable font picker in Settings → Appearance with 24+ monospace fonts from Google Fonts, each rendered in its own typeface
- Live font preview — Real-time preview in Appearance settings shows selected font and size with terminal-style output
- Live terminal font & size updates — Changing font family or size in settings updates all open terminals instantly
- Font persistence — Selected Google Font loads on app startup so terminals use the saved font immediately
- Fix session/folder data collision — Sessions and folders in unified vaults no longer cross-contaminate (SecretCategory filtering)
- Folder delete confirmation — Double-click to delete: first click shows "Confirm", second click deletes
- Drag & drop sessions into folders — Grab the grip handle to drag sessions between folders (pointer events, works on Windows WebView2)
- Folder collapse persistence — Expanded/collapsed state saved to localStorage across view switches and restarts
- Right-click improvements — No browser default context menu, full-height clickable area, folder creation on empty vaults
- Connection folders — Organize sessions into folders via right-click → Move to Folder. Create, collapse, and delete folders. Deleting a folder safely unassigns sessions back to ungrouped.
- Connection search — Real-time search bar filters sessions by name, host, username, or tags
- File explorer search — Filter files and folders by name in the current directory
- File preview — Right-click a file → Preview to view contents in a read-only overlay
- CD here — Right-click a folder in the file explorer → CD here to send
cd /pathto the SSH terminal - Copy path / filename — Right-click any file or folder to copy its full path or filename to clipboard
- One-click download — Download button appears on hover for each file in the explorer
- Direct path navigation — Double-click the breadcrumb bar to type a path directly
- Folder selector in session editor — Assign sessions to folders when creating or editing
- SSH host key verification (TOFU) — Saves host key fingerprints on first connection, rejects changed keys to prevent MITM attacks, stores
known_hosts.jsonunder the app data directory
- Fix editor white screen on reopen —
WebviewWindow.as_ref()resolved to&Webviewinstead of&Window, causinghide()to blank the webview content while leaving the OS window frame visible. All window operations now callWebviewWindowmethods directly. - Fix editor window not hiding on close — Added
on_window_eventhandler to interceptCloseRequestedfor editor windows withapi.prevent_close()+hide(), preventing WebView2 destruction - Force WebView2 repaint — Added 1px size nudge after
show()to force WebView2 rendering pipeline restart (workaround for Microsoft WebView2Feedback #1077) - Editor tabs now persist across hide/show cycles instead of being cleared on close
- Fix editor window reopen — Editor now hides instead of closing to avoid WebView2 crash on Windows; reopens instantly when editing another file
- Fix editor initial load — Files are delivered via Rust backend message queue instead of unreliable cross-window events
- Editor tabs — Multiple files open as tabs in a single editor window with dirty-state indicators
- Close tab shortcut — Changed from Ctrl+W to Ctrl+Shift+W to avoid browser conflicts
- Fixed corrupted i18n locale files, added
editor.openingkey to all 6 locales
- Ansible integration — Full Ansible UI with project management, playbook execution, inventory editor, roles/collections management, ad-hoc commands, and vault encrypt/decrypt
- OpenTofu integration — Infrastructure-as-Code workspace with project management, plan/apply/destroy, state inspection, and provider/module management
- WSL auto-detection — On Windows, Ansible commands automatically route through WSL with two-step status checks (WSL available + Ansible installed)
- Toolchain installer — One-click install for Ansible (via pip/pipx, or through WSL on Windows) and OpenTofu (direct binary download)
- Streaming command output with color-coded stdout/stderr for both Ansible and OpenTofu operations
- Vault-backed project storage — all IaC projects are encrypted at rest alongside sessions and credentials
- Fixed app failing to launch on Linux Wayland (Error 71 Protocol error) by disabling the WebKitGTK DMA-BUF renderer. Affects KDE Plasma, GNOME, Sway, especially with NVIDIA drivers.
- Fixed plugin button actions (e.g. Refresh) failing when calling async host API functions like
reach.ssh.exec() - Fixed plugin hooks not awaiting async Lua calls, causing
reach.ssh.exec()to silently return errors - Plugins now auto-load on app startup instead of requiring manual activation via Settings > Plugins
- Fixed SFTP upload/download completion hooks not awaiting async plugin dispatch
- Jump host (ProxyJump) support — connect through bastion servers with multi-hop SSH tunneling via russh direct-tcpip channels
- SSH config import — parse and import hosts from
~/.ssh/configwith automatic ProxyJump chain resolution (cross-platform) - Lua plugin system (beta) — sandboxed Lua VMs with host API for SSH commands, storage, and UI hooks
- Session editor and Quick Connect now support jump host configuration with per-hop auth settings
- New Plugins tab in Settings for managing Lua plugins
- 19 new i18n keys across all 6 locales
- Fixed drag-and-drop file uploads stacking and freezing — uploads now run sequentially instead of flooding the SSH connection
- Fixed silent upload failures — errors now show a toast notification instead of being swallowed
- Added feedback when dragging files from browsers or apps that don't provide file paths
- Added copy button to every AI chat message (appears on hover)
- Updated docs and removed snippets page
- Updated app preloader to use the actual app icon
- Added Bulgarian language
- 6 languages supported now: English, German, French, Greek, Italian, Bulgarian
- Single-instance mode, reopening the app focuses the existing window instead of opening a new one
- Fixed the auto-updater so it actually generates update artifacts and signatures
- Fixed release workflow for all platforms
- Welcome wizard on first run with language selection and optional Turso cloud sync setup
- Added German, French, Greek and Italian translations
- Language selector in Settings > General
- Language picker with flag icons during setup
Thanks to those who have contributed to Reach:
![]() ddwnbot SSH host key verification (TOFU) |
Contributions are welcome. Bug reports, feature ideas, and pull requests all help. If you're picking up a larger feature, open an issue first so we can talk about the approach.
This project is free software: you are allowed to use, modify, and redistribute it for personal, academic, or commercial purposes under the terms of the MIT license. See the LICENSE file for full details.

