SpanHost is an open-source desktop SSH client (Windows packages today; macOS / Linux from source). Security: credentials in the OS keyring only; host keys verified; port forwards bind to loopback by default. SSH runs in Rust — stack and data flow in docs/ARCHITECTURE.md (中文).
Built with Tauri 2 + React + russh. sessions.jsonnever holds plaintext passwords. Windows installers are available today; macOS / Linux can be built from source, with no official packages yet.
- Sessions — group, search, test connection; password-free JSON import/export (no credentials). Imported forward rules do not keep non-local listen addresses; open listening must be confirmed again on this machine.
- Security & trust — password and private key in the OS keyring; prompt when credentials are missing; host key confirm / reject
- Tabs & tunnels — multi-tab (background tabs stay connected); tunnels-only mode; Local / Remote port forwarding; listens on loopback by default; expanding the bind scope requires confirmation
- Terminal — appearance and terminal scrollback buffer;
Zmodem in-terminal transfers (remote needs
lrzsz; coexist with SFTP; download names are sanitized against path traversal) - SFTP — same-connection directory browse and upload/download (including folders); side panel next to the terminal
- Shell extras — host status bar, system tray, diagnostics log, 10 UI languages
| Terminal + SFTP | Session management |
|---|---|
![]() | ![]() |
| Port forwarding | Appearance & settings |
|---|---|
![]() | ![]() |
| Welcome |
|---|
![]() |
| Platform | Official packages | Notes |
|---|---|---|
| Windows | Yes — NSIS / MSI / portable zip on Releases | Primary deliverable today |
| macOS | No | Build from source with Tauri; no official installer or support commitment |
| Linux | No | Same as macOS; distro/desktop differences are best-effort |
Bug reports should include OS, SpanHost version (or commit), and steps to reproduce.
Windows: download the latest installer or portable build from Releases.
macOS / Linux: build from source (see below). There are no official prebuilt packages.
Suggested environment:
- Node.js LTS (≥ 20) and pnpm
- Rust stable via
rustup, meeting Tauri 2 prerequisites - Platform system dependencies on the same page (Windows also needs MSVC / WebView2, etc.)
pnpm install
pnpm tauri dev # development (Tauri CLI)
pnpm tauri build # production build (Tauri CLI)For Windows packaging, use this repo’s custom package.json scripts (not native Tauri commands):
pnpm build:windows # NSIS / MSI / zip (x64)
pnpm build:portable # portable zip onlyOptional checks for contributors:
pnpm check # Biome + TypeScript- Antivirus flags the installer? Common for desktop SSH clients; prefer official GitHub Releases builds, add a trust exception, or use the portable package.
- App refuses to start? Startup is refused when the OS keyring is unavailable (credentials cannot be stored safely).
- Zmodem does not transfer files?
The remote needs
lrzsz. Zmodem is the in-terminal protocol path; for panel browse/upload/download use SFTP (same SSH connection). Download filenames are sanitized (basename only, illegal characters replaced, etc.). - Port forward will not bind a LAN address?
Default is
127.0.0.1only; non-local listen addresses require explicit confirmation when saving or adding.
Welcome (focused PRs) — UI / copy / i18n, docs and screenshots, Windows polish and reproducible bugfixes, small non-sensitive features (open an issue first when unsure).
Discuss before a large PR — SSH auth, credential / session persistence, connection concurrency and tunnels, port-forward security, packaging / signing, host-key trust. Details: CONTRIBUTING.md.
Not in scope for drive-by PRs (for now)
- Official macOS / Linux installers (source-build feedback welcome; no package commitment)
- ProxyJump (deferred)
- Samples or fixtures with real hosts, credentials, or personal data
See CONTRIBUTING.md for issues, PRs, pnpm check, i18n (10 locales), and sensitive-change guidance. Chinese: CONTRIBUTING.zh-CN.md.
Report security issues privately via SECURITY.md. Do not post exploit details in public issues.
Licensed under the Apache License 2.0.





