A virtual remote desktop and graphical server management toolkit
ShellDesk is built with Tauri 2, Rust, React 19, TypeScript, russh, and xterm.js.
It combines SSH and local host management, a native dual-pane SFTP workspace, SD-Agent, databases, VNC/RDP, private-network browsing, and 44 built-in remote desktop apps in one local-first operations workspace.
English | 简体中文
- Table of Contents
- At a Glance
- Purpose
- Feature Overview
- Data and Security
- Architecture
- Compatibility Notes
- Quick Start
- Scripts
- FAQ
- Project Structure
- License
- Acknowledgments
| Current capability | |
|---|---|
| 44 built-in apps | Terminal, files, code, AI, data, VNC/RDP, network, security, web-service, container, Kubernetes, and virtual-machine tools |
| 6 database engines | MySQL, PostgreSQL, ClickHouse, MongoDB, Redis, and SQLite |
| Native SSH + SFTP | Rust russh / russh-sftp; no client-side OpenSSH, sshpass, or ssh-keyscan dependency |
| 3 desktop platforms | Windows, macOS, and Linux packages, with a shared React interface and Rust backend |
| Local-first data | Local Vault, system-backed secret protection where available, import/export, WebDAV sync, and a loopback-only MCP service |
ShellDesk is designed for developers, operations engineers, and anyone who maintains multiple servers over time. It is not just a terminal replacement; it is a desktop-style workspace centered on an SSH or local connection. After connecting, you can open terminals, file management, code editing, databases, VNC, private-network browser access, system monitoring, logs, service management, network diagnostics, security auditing, AI assistance, and more in one window.
ShellDesk is useful for:
- Maintaining an SSH host library with card/list views, availability filters, groups, tags, notes, system detection, and authentication settings
- Opening the same workspace against the local machine when you need local-mode tools without creating an SSH loopback host
- Opening multiple remote tools side by side inside one connection window, or launching the dedicated SFTP transfer workspace directly from a host
- Handling common server operations through a graphical interface while keeping a full terminal available as the fallback
- Letting SD-Agent work across saved hosts and exposing controlled remote-host tools to other local AI clients through the optional MCP service
- Storing hosts, keys, app settings, bookmarks, and logs in a local Vault, with import/export and WebDAV sync for backup and migration
- Create, edit, delete, search, group, tag, annotate, and detect system types for SSH hosts
- Switch between card and table views, filter hosts by connection state, sort recent activity, paginate and keyboard-navigate large inventories, and inspect connection/system details without leaving the list
- Migrate MobaXterm bookmarks, Xshell sessions, SecureCRT sessions, or CSV inventories through a preview-first wizard with validation, duplicate policies, secret opt-in, and a guarded one-step undo
- Supports saved password, private-key, or system SSH Agent login, proxy/jump-host settings, local mode, and credential prompts before connecting; Agent profiles do not persist password or key material
- Settings provide a global 3–120 second SSH connection timeout, with an optional per-host override for slow or unreliable networks
- Quick connect parses inputs such as
ssh user@example.com -p 2222 - The Keys page can import key pairs, generate RSA keys, copy public keys, and search by name, algorithm, or fingerprint
- Settings control whether SSH passwords and key passphrases are saved by default, and known-hosts trust decisions are handled by the Rust backend through russh
- Each SSH or local connection opens in an independent connection window with the current host and local SOCKS port in the title bar when available
- Built-in SOCKS proxy, Tauri-backed browser proxy, and noVNC viewer cover remote web and desktop access through Rust-side SSH tunnels
- Remote desktop windows support drag, resize, maximize, minimize, z-order management, and a Dock
- The 44-app catalog is grouped in Launchpad; File Manager, Terminal, and Browser are pinned by default while Dock position, size, auto-hide, and pinned apps are configurable
- Desktop icons support custom layout, folders, sorting modes, catalog migration, and custom wallpaper
- xterm.js terminal supports multiple sessions, title synchronization, scrollback, copy/paste, and theme presets
- Remote terminal sessions use russh PTY channels for shell/exec startup, resize, initial command, working directory, and auto-sudo flows
- Local terminal sessions stay on a separate local-shell path and do not require an SSH loopback host
- Terminal font family, size, weight, ligatures, line height, cursor, scrolling behavior, and contrast are configurable
- Terminal windows can tile right or down as an independent-session workspace; optional host-scoped restore persists metadata only and always requires a manual reconnect from a disconnected placeholder
- Font selection reads the local system font list instead of bundling font files
- SFTP file manager supports browsing, upload, download, transfer cancellation, create, delete, rename, compress, extract, permission edits, protected-write fallbacks, and copy path
- A dedicated native dual-pane SFTP workspace opens directly from a host and adds local/remote trees, process-owned queued transfers that survive closing the SFTP window, fingerprint-checked resumable staging with atomic final replacement, adaptive pipelined or conservative compatibility transfer profiles, pause/retry/cancel, recursive comparison, one-way sync, conflict handling, streamed
russh-sftptransfers, and a persistent global transfer center shared by every app window - Remote Notepad supports tabs, remote read/write, find, go to line, syntax highlighting, language modes, and unsaved-change prompts
- Notepad uses a binary extension blacklist to avoid opening images, archives, databases, executables, and other binary files by mistake
- Code Editor adds a remote project tree, multi-tab editing, remote-change detection, embedded project terminals, and SD-Agent
- MySQL, PostgreSQL, ClickHouse, MongoDB, Redis, and SQLite tools cover connection, browsing, querying, and common editing actions where the backend supports them
- Database access uses Rust-side SSH tunnels with request timeouts, cleanup for orphaned tunnels, bounded result previews, and sensitive-value redaction in diagnostic paths
- Elasticsearch / OpenSearch panel shows cluster health, indices, shards, and basic
_searchresults - RabbitMQ / Kafka panel shows queues, topics, consumer group lag, and raw diagnostic output
- System Monitor keeps live and SQLite-backed history; Process Manager, Service Manager, Supervisor Manager, Container Manager, Kubernetes Manager, Virtual Machine Manager, Port Listener with saved local/remote/SOCKS5 SSH forwarding, and Disk Analyzer cover daily checks
- Kubernetes Manager covers contexts, namespaces, workloads, pods, logs, exec, YAML, and nodes; Virtual Machine Manager uses remote
virshfor lifecycle, create/clone/edit/delete, device attachment, migration, snapshots, networks, storage pools, serial console, and VNC handoff - Disk Manager shows physical disks, partitions, and mounts, with mount/unmount, format, partition maintenance, and Linux LVM configuration
- Git Repository Manager shows remote branch trees, remote branches, changed files, diffs, recent commits, branch create/delete/track, stage/unstage, commit, fetch, pull, push, and checkout
- Nginx Manager, Caddy Manager, and Apache Manager are separate apps for site discovery, templates, config editing, config test, reload, and restart flows
- Certificate Manager discovers TLS certificates, checks expiry, manages Certbot renewal state, and handles trusted root certificates
- MinIO / S3 Browser uses remote
mcorawsCLI to browse buckets, prefixes, objects, delete objects, copy object URLs, and download to a remote directory - Backup Manager creates and validates file or database backups, downloads or uploads them to S3 / MinIO, restores confirmed archives, and creates Unix or Windows schedules without persisting typed database passwords
- FRP Client and FRP Server managers cover frpc/frps detection, installation, TOML config editing, service control, logs, autostart, and runtime status
- Firewall, iptables, Network Diagnostics, Package Manager, Scheduled Tasks, users/groups, Login Sessions, and Security Audit support operations troubleshooting
- System Settings provides views for system information, network interfaces, DNS, mirrors, updates, Hosts, routes, disks, and mounts
- Log Viewer supports journalctl,
/var/log, Windows Event Log, and related sources - API Debugger sends HTTP requests from the remote host, which is useful for validating private-network services
- AI Assistant uses the configured provider and model to help with remote server management, code analysis, and component handoffs
- Supports dark, light, and system themes
- Supports accent color, system fonts, default host view, desktop wallpaper, and remote desktop layout
- Supports AI provider, API format, base URL, API key, and model discovery settings for the AI Assistant and Code Editor
- SD-Agent also has a main-window workspace for tasks that span saved hosts, with a searchable virtualized host picker, reusable host context, and direct handoff into built-in tools
- Can expose saved remote hosts to other local AI clients through a loopback-only MCP service, with a credential-free Skill ZIP export and built-in call examples
- UI language supports English and Simplified Chinese; first launch follows the system language
- Logs record connection, host, key, config, and system operations with search, filters, and clearing
- Config import/export covers hosts, keys, settings, and browser bookmarks
- WebDAV sync can back up and restore the local vault across machines; uploads are read back and checksum-verified before the local sync baseline advances, while strict format/version invariants prevent ambiguous migrations. The updater checks GitHub releases through Tauri's update flow
ShellDesk stores local data in the Tauri app data directory. The Settings page shows the config path and vault path.
- Hosts, keys, app settings, and browser bookmarks are stored in the local vault
- Sensitive data is encrypted with system credentials when platform support is available
- When system encryption is unavailable, the vault falls back to local file-permission protection
- Logs are stored separately in the user data directory
- Exported config JSON may include hosts, passwords, private keys, and key passphrases, so it should only be stored in trusted locations
- The React renderer accesses controlled backend APIs through the
window.guiSSHTauri bridge - The optional MCP service listens only on
127.0.0.1while ShellDesk is running; exported Skill ZIPs contain instructions and a client helper, never vault credentials - Native dialog limitations around
prompt,confirm, andalertare handled with custom modals - SSH protocol operations are implemented in Rust with
russh; ShellDesk does not requireopenssh-client,sshpass,ssh-keyscan,ssh-keygen, orportable-ptyon the client machine
ShellDesk keeps the renderer and privileged operations behind a typed Tauri boundary:
flowchart LR
UI["React 19 UI<br/>host library · SD-Agent · desktop apps · SFTP workspace"]
Bridge["window.guiSSH<br/>typed Tauri bridge"]
IPC["Rust IPC dispatcher"]
Core["Connection core<br/>russh client · host keys · PTY · SFTP"]
Tunnel["Tunnel services<br/>direct-tcpip · browser · VNC · HTTP · databases"]
Data["Local services<br/>Vault · logs · settings · WebDAV · updater · MCP"]
Target["SSH hosts / local machine / private services"]
UI --> Bridge --> IPC
IPC --> Core --> Target
IPC --> Tunnel --> Target
IPC --> Data
src/tauriBridge.tsexposes the typedwindow.guiSSHAPI; React components do not call Node, Tauri internals, or system SSH tools directlyipc.rsand theipc/channel modules validate and route frontend requests into focused Rust handlersrussh_client.rs,connection/host_keys.rs,terminal.rs, andremote_fs/sftp.rsown authentication, trust, PTY, command, and native SFTP pathsssh_tunnel.rs,browser_proxy.rs,http_tunnel.rs,vnc.rs, anddatabase/reuse Rustdirect-tcpiptransport for private servicesvault/,vault_storage.rs,sync_backend.rs, SQLite logs/monitoring, the updater, and the optional loopback-only MCP server stay on the backend side of the bridge
See SSH Architecture, SFTP Transfer Workspace, Local MCP Service, and the 41-app catalog for detailed boundaries.
See Compatibility Matrix for tested systems and per-environment reports.
Requirements: Node.js 20+, pnpm 11+ (the repo pins pnpm@11.8.0), Rust stable, and the Tauri 2 platform prerequisites for your OS. ShellDesk does not require a system OpenSSH client for its SSH protocol paths.
pnpm install
pnpm devpnpm install configures local Git hooks through prepare. pnpm dev starts Vite on 127.0.0.1:5173 and opens the Tauri development window.
If Vite remains on port 5173 after exit, stop only the PID occupying that port:
netstat -ano | findstr :5173
Stop-Process -Id <PID>| Command | Description |
|---|---|
pnpm dev |
Starts the Tauri development window with Vite |
pnpm typecheck |
Runs TypeScript type checking |
pnpm build |
Runs tsc --noEmit and then the Vite production build |
pnpm test |
Runs contract checks, frontend unit tests and build, Playwright UI smoke tests, Rust fmt/clippy/tests, and cargo check |
pnpm check:contracts |
Runs IPC, desktop app, i18n, runtime-boundary, Tauri, default-settings, and release-script contract checks |
pnpm check:unit |
Type-checks and runs browser-free TypeScript unit tests |
pnpm check:ui |
Type-checks and runs Playwright UI smoke tests |
pnpm check:rust |
Runs Rust format checks, clippy with -D warnings, and tests |
pnpm check:rust:coverage |
Runs the Rust coverage summary and minimum-threshold gate |
pnpm preview |
Previews the Vite frontend build without Tauri backend capabilities |
pnpm release |
Builds installer |
More platform packaging scripts are available in package.json. See docs/testing.md for the testing layers and optional live smoke checks.
Since ShellDesk packages are unsigned / unnotarized, macOS Gatekeeper may block the application and display a warning like "ShellDesk is damaged and cannot be opened."
If you see this message, run the following command in Terminal to remove Apple's quarantine attribute:
sudo xattr -rd com.apple.quarantine /Applications/ShellDesk.appAfter that, open ShellDesk again — it should launch normally.
Yes. Releases provide both macos-x64.dmg (Intel) and macos-arm64.dmg (Apple Silicon). Intel Mac users should download the x64 package, and Apple Silicon users should download the arm64 package.
ShellDesk/
├── src-tauri/
│ ├── tauri.conf.json # Tauri app, bundle, icon, and updater artifact config
│ ├── Cargo.toml # Rust backend dependencies
│ └── src/
│ ├── main.rs # Thin Rust entrypoint
│ ├── bootstrap.rs # Tauri builder, state, updater plugin, and command registration
│ ├── ipc.rs + ipc/ # Channel dispatcher and focused channel routers
│ ├── state.rs # Shared application state, active sessions, and UI prompt channels
│ ├── connection.rs # SSH/local connection lifecycle and profile normalization
│ ├── connection/host_keys.rs # Host-key scanning, classification, trust, and known_hosts sync
│ ├── russh_client.rs # Pure Rust SSH client, auth, host-key verification, exec, jump/proxy transport
│ ├── ssh_transport.rs # High-level runCommand wrapper, privilege handling, retry, host-key refresh
│ ├── ssh_tunnel.rs # russh direct-tcpip tunnels for DB, browser, VNC, and HTTP tools
│ ├── terminal.rs # Remote russh PTY terminal and local shell terminal lifecycle
│ ├── remote_fs.rs + remote_fs/ # Remote commands plus native russh-sftp operations
│ ├── local_fs.rs # Local side of the dual-pane transfer workspace
│ ├── database/ # Six database backends and tunnel lifecycle
│ ├── browser_proxy.rs # Remote browser URL parsing and local reverse proxy
│ ├── http_tunnel.rs # Remote HTTP request tunnel over SSH forwarding
│ ├── vnc.rs # VNC probing, russh tunnel, and noVNC WebSocket proxy
│ ├── ui_prompts.rs # Window-backed keyboard-interactive prompt routing
│ ├── system.rs # System fonts and known_hosts helpers
│ ├── vault.rs # Local vault, settings, bookmarks, and import/export normalization
│ ├── vault_storage.rs # Split config/secrets storage and platform secret protection
│ ├── vault/normalize.rs # Vault settings, host, key, proxy, and known_hosts normalization
│ ├── sync_backend.rs # WebDAV sync backend
│ └── updater.rs # GitHub release checks and Tauri updater install path
├── src/
│ ├── App.tsx # Host library, SD-Agent, settings, connection and SFTP entrypoints
│ ├── RemoteDesktopShell.tsx # Remote desktop, multi-window manager, Dock, layout
│ ├── i18n.ts # UI language selection and translation helpers
│ ├── components/
│ │ ├── navigation/ # Main navigation icons
│ │ ├── remote-desktop/ # 44 built-in remote desktop apps
│ │ └── sftp-transfer/ # Native dual-pane SFTP workspace
│ ├── pages/
│ │ ├── KeysPage.tsx # SSH key management
│ │ ├── LogsPage.tsx # Logs page
│ │ └── SettingsPage.tsx # App settings
│ ├── styles/
│ │ ├── index.scss # Global style entry
│ │ ├── _tokens.scss # Fonts, CSS variables, and theme tokens
│ │ ├── foundations/ # Reset, base elements, global behavior
│ │ ├── layout/ # App shell, title bar, side navigation
│ │ ├── pages/ # Hosts, keys, logs, settings styles
│ │ ├── remote-desktop/ # Remote desktop and built-in app styles
│ │ └── themes/ # Light theme overrides
│ └── vite-env.d.ts # window.guiSSH and global type definitions
├── docs/
│ ├── local-mcp-service.md # Local MCP service, tools, and Skill export
│ ├── sftp-transfer-window.md # Dual-pane SFTP behavior and backend boundary
│ ├── remote-desktop-component-roadmap.md # Remote desktop app catalog and docs index
│ └── remote-desktop-components/ # Per-component design and implementation notes
├── index.html
├── package.json
├── src-tauri/tauri.conf.json
├── tsconfig.json
└── vite.config.ts
This project is released under the GNU General Public License v3.0 (GPLv3). See LICENSE for the full license text.
- binaricat/Netcatty — SSH workspace, SFTP, and terminals in one. Some features and UI design were referenced from this project.
A comfortable desktop workspace for everyday remote server maintenance.


