AI-Powered SSH Client for Remote Servers — Tauri Desktop App
SSH terminals, SFTP, port forwarding, serial terminals, in-terminal transfers, local shells, and lightweight editing in one workspace.
Built with Tauri & React, powered by Pure Rust SSH. Free. No account needed.
Zero Electron. Zero OpenSSL. Zero Telemetry. Zero Subscription. BYOK-first. Pure Rust SSH.
🌐 oxideterm.app — Documentation & website
English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Français | Deutsch | Español | Italiano | Português | Tiếng Việt
Watch OxideSens follow a user request and open a terminal inside OxideTerm.
OxideTerm is a local-first AI workspace for remote servers — an open-source alternative to Termius, SecureCRT & Tabby.
What you can do:
It is not a hosted cloud agent platform or a benchmark-only terminal renderer. The product direction is narrower: make remote work feel like one local workspace, without requiring an OxideTerm account.
| If you care about... | OxideTerm gives you... |
|---|---|
| One remote node, many tools | Terminal, SFTP, port forwarding, trzsz, lightweight editor, monitoring, and OxideSens AI stay attached to the same SSH workspace |
| Local-first SSH workflows | SSH, SFTP, forwarding, local shell, and config work without signup; cloud sync is opt-in via official plugin |
| BYOK OxideSens AI instead of platform credits | OxideSens uses your OpenAI/Ollama/DeepSeek/OpenAI-compatible endpoint with MCP, RAG, and approved workspace actions |
| Reconnect stability | Grace Period probes the old connection for 30s before replacing it, so vim/htop/yazi can survive short network drops |
| Pure Rust, native app | Tauri 2.0 native app, russh 0.59 compiled against ring, no Electron, no OpenSSL/libssh2 dependency |
| Credential safety | Passwords and API keys stay in OS keychain, saved connection metadata is sealed locally, and .oxide files use ChaCha20-Poly1305 + Argon2id encryption |
SSH Terminal + OxideSens AI
![]() |
SFTP File Manager
![]() |
Built-in IDE (CodeMirror 6)
![]() |
Smart Port Forwarding
![]() |
Download the latest release from GitHub Releases.
macOS users can also install from the OxideTerm Homebrew tap:
brew install --cask AnalyseDeCircuit/tap/oxideterm
Arch Linux users can install the community-maintained AUR package:
yay -S oxideterm-bin
| Category | Features |
|---|---|
| Terminal | Local PTY (zsh/bash/fish/pwsh/WSL2), SSH remote, local serial terminals, split panes, broadcast input, session recording/playback (asciicast v2), WebGL rendering, 30+ themes + custom editor, command palette (⌘K), zen mode, trzsz in-band file transfer |
| SSH & Auth | Connection pooling & multiplexing, ProxyJump (unlimited hops) with topology graph, auto-reconnect with Grace Period, Agent Forwarding. Auth: password, SSH key (RSA/Ed25519/ECDSA), SSH Agent, certificates, keyboard-interactive 2FA, Known Hosts TOFU |
| SFTP | Dual-pane browser, drag-and-drop, smart preview (images/video/audio/code/PDF/hex/fonts), transfer queue with progress & ETA, bookmarks, archive extraction |
| IDE Mode | CodeMirror 6 with 24 languages, file tree + Git status, multi-tab, conflict resolution, integrated terminal. Optional remote agent for Linux; unsupported architectures can self-build and upload |
| Port Forwarding | Local (-L), Remote (-R), Dynamic SOCKS5 (-D), lock-free message-passing I/O, auto-restore on reconnect, death reporting, idle timeout |
| AI (OxideSens) | Target-first assistant for saved connections, live SSH sessions, terminal buffers, SFTP paths, settings, and knowledge base entries; can diagnose remote output, run approved commands, inspect files, and explain failures without an OxideTerm account |
| Plugins | Runtime ESM loading, 18 API namespaces, 24 UI Kit components, frozen API + Proxy ACL, circuit breaker, auto-disable on errors |
| CLI | oxt companion: JSON-RPC 2.0 over Unix Socket / Named Pipe, status/health/list/session inspect/forward/config/connect/focus/attach/SFTP/import/AI, human + JSON output |
| Security | .oxide encrypted export (ChaCha20-Poly1305 + Argon2id 256 MB), encrypted local config at rest, OS keychain, Touch ID (macOS), portable encrypted keystore, host key TOFU, zeroize memory clearing |
| i18n | 11 languages: EN, 简体中文, 繁體中文, 日本語, 한국어, FR, DE, ES, IT, PT-BR, VI |
OxideTerm keeps the product surface local-first, but the internals are built for SSH-heavy work. The full implementation notes are preserved below for readers who want the engineering details.
Architecture, SSH internals, reconnect, AI, forwarding, plugins, and more
OxideTerm separates terminal data from control commands into two independent planes:
┌─────────────────────────────────────┐
│ Frontend (React 19) │
│ xterm.js 6 (WebGL) + 19 stores │
└──────────┬──────────────┬───────────┘
│ Tauri IPC │ WebSocket (binary)
│ (JSON) │ per-session port
┌──────────▼──────────────▼───────────┐
│ Backend (Rust) │
│ NodeRouter → SshConnectionRegistry │
│ Wire Protocol v1 │
│ [Type:1][Length:4][Payload:n] │
└─────────────────────────────────────┘
sessionId or connectionId. Everything is addressed by nodeId, resolved atomically server-side by the NodeRouter. SSH reconnect changes the underlying connectionId — but SFTP, IDE, and forwards are completely unaffected.The entire SSH stack is russh 0.59 compiled against the ring crypto backend:
AgentSigner: wraps system SSH Agent and satisfies russh's Signer trait, solving RPITIT Send bound issues by cloning &AgentIdentity to an owned value before crossing .awaitpub struct AgentSigner { /* wraps system SSH Agent */ }
impl Signer for AgentSigner { /* challenge-response via Agent IPC */ }
SSH_AUTH_SOCK), Windows (\\.\pipe\openssh-ssh-agent)AuthMethod::Agent replayed automaticallyMost SSH clients kill everything on disconnect and start fresh. OxideTerm's reconnect orchestrator takes a fundamentally different approach:
visibilitychange + online events trigger proactive SSH keepalive (~2s detection vs 15-30s passive timeout)Pipeline: queued → snapshot → grace-period → ssh-connect → await-terminal → restore-forwards → resume-transfers → restore-ide → verify → done
All logic runs through a dedicated ReconnectOrchestratorStore — zero reconnect code scattered in hooks or components.
Reference-counted SshConnectionRegistry backed by DashMap for lock-free concurrent access:
connecting → active → idle → link_down → reconnectinglink_down with status syncconnection_status_changed to frontend (not just internal node:state), preventing UI desyncPrivacy-first AI assistant with dual interaction modes:
⌘I): quick terminal commands, output injected via bracketed paste/v1/chat/completions endpointLAContext — no entitlements or code-signing required, cached after first auth per sessionFull local (-L), remote (-R), and dynamic SOCKS5 (-D) forwarding:
ssh_io task — no Arc<Mutex<Channel>>, eliminating mutex contention entirelySuspended forwards automatically resume on reconnect without user interventionFORWARD_IDLE_TIMEOUT (300s) prevents zombie connections from accumulatingUpload and download files directly through the SSH terminal session — no SFTP connection required:
$ claude mcp add oxideterm \
-- python -m otcore.mcp_server <graph>