OxideTerm is a local-first SSH client designed to simplify remote server management by integrating terminals, SFTP, port forwarding, and lightweight editing into one workspace. Built with Tauri and React, it uses Pure Rust SSH to deliver a secure and efficient experience without relying on Electron or OpenSSL.
Key Features:
Zero Electron, zero OpenSSL, and zero telemetry for a lightweight, privacy-focused workflow.
BYOK (Bring Your Own Key) support for OxideSens AI, enabling users to leverage their preferred AI providers like OpenAI or DeepSeek.
Local-first SSH workflows that work offline, with optional cloud sync via plugins.
Audience & Benefit:
Ideal for developers and system administrators who prioritize privacy and security in their remote work. OxideTerm eliminates the need for accounts or subscriptions, allowing users to maintain control over their data while enjoying powerful features like SFTP file management, port forwarding, and AI-powered insights directly within the workspace.
README
⚡ OxideTerm
AI-Powered SSH Client and Remote Operations Workspace
SSH, Telnet, Serial, RDP/VNC, SFTP, port forwarding, and lightweight editing in one native workspace.
GPU-rendered. Free. No account needed.
No Electron. No bundled WebView. No telemetry. No subscription. BYOK-first. Pure-Rust SSH without OpenSSL/libssh2.
Open-source, local-first, and GPU-rendered with GPUI.
OxideTerm is an open-source, local-first workspace for connecting to servers and working across terminals, files, forwarding, host tools, and remote desktops.
What you can do:
Manage SSH, Telnet, Serial, RDP/VNC, SFTP, port forwards, local shells, and lightweight editing in one native workspace
Keep remote work alive through network hiccups with Grace Period reconnect
Ask OxideSens AI to inspect live sessions and perform approved workspace actions through your own AI provider
Load bounded Agent Skills and use the advanced terminal command sender for scheduled, repeatable, multi-target input
Your connections and operational data stay under your control. OxideTerm requires no account, uses your own AI provider when OxideSens is enabled, and keeps the desktop experience free of Electron and bundled browser runtimes.
Why OxideTerm?
If you care about...
OxideTerm gives you...
One remote node, many tools
Terminal, SFTP, port forwarding, RDP/VNC, trzsz, native IDE, monitoring, and OxideSens AI stay attached to the same workspace
A desktop app without Electron or a bundled WebView
GPUI draws the interface directly on a GPU surface, without shipping a browser runtime
Local-first operations workflows
SSH, Telnet, SFTP, forwarding, RDP/VNC, local shell, serial terminals, and config work without signup
BYOK OxideSens AI instead of platform credits
OxideSens uses your OpenAI/Anthropic/Gemini/Ollama/OpenAI-compatible endpoint with MCP, RAG, provider-aware reasoning controls, and approved workspace actions
Reconnect stability
Grace Period probes the old connection for 30s before replacing it, so TUI apps can survive short network drops
Pure-Rust SSH and credential safety
The SSH stack uses russh + ring without OpenSSL/libssh2; stored credentials use the OS keychain, and .oxide bundles use ChaCha20-Poly1305 + Argon2id
Screenshots
The screenshots below show the OxideTerm workspace across terminal, file, editing, and forwarding workflows.
SSH Terminal + OxideSens AISFTP File Manager
Built-in IDESmart Port Forwarding
Built for Remote Operations
OxideTerm keeps terminal rendering, connection state, reconnect orchestration, files, forwarding, automation, and AI context inside one Rust application. The result is a workspace in which tools share the same server identity and session lifecycle instead of behaving like disconnected utilities.
Aspect
Bundled browser approach
OxideTerm
Rendering
Browser engine and web layout
GPUI on a GPU surface
Terminal data flow
WebSocket → JS event loop → xterm.js
Rust input → TerminalState mutation → GPUI render
Connection lifecycle
Split across frontend and backend layers
One in-process connection and reconnect pipeline
AI context
Copied through an application bridge
Built from the active workspace with user approval
Plugin runtime
Browser scripting environment
Manifest-only, capability-scoped WASM, and trusted process runtimes
CLI
Requires the desktop app running
Standalone binary, direct crate linkage
Runtime boundary
Desktop wrapper plus browser runtime
Native process with no bundled browser runtime
Feature Overview
Category
Features
Terminal & Connections
Local shells, SSH, Telnet, serial, split panes, Free Type Mode, shell integration, command marks, recording, trzsz transfers, terminal graphics, advanced multi-target command sending, multi-hop routes, host-key verification, Agent forwarding, 2FA, and Grace Period reconnect
Files & Remote Editing
SFTP browsing, transfer queues, speed limits, progress and ETA, bookmarks, safe writes, local file management, remote project trees, multi-tab editing, conflict handling, and workspace restore
Forwarding & Networking
Local, remote, and dynamic SOCKS5 forwarding, saved rules, reconnect-aware restore, remote port detection, connection topology, and ad-hoc socket debugging
BYOK providers, MCP, local RAG, Agent Skills, approved workspace actions, command policy, chat history, encrypted cloud sync, portable .oxide bundles, and a standalone CLI for automation and diagnostics
Extensions & Personalization
Manifest-only, capability-scoped WASM, and process plugins, custom tabs and settings, Quick Commands, themes, background images, configurable shortcuts, and 11 interface languages
Watch OxideSens follow a user request and open a terminal inside OxideTerm.
Under the Hood
OxideTerm keeps terminal, SSH, Telnet, RDP, VNC, SFTP, forwarding, editing, AI, plugins, and CLI in one Rust architecture. The implementation notes below are for readers who want the engineering details.
Architecture, SSH internals, GPUI shell, reconnect, AI, plugins, and more
Architecture — In-Process Core, No WebView Bridge
GPUI and the terminal/SSH backend share one Rust process; optional remote agents and platform helpers remain outside this boundary:
There is no serialization boundary between the UI and the SSH/terminal backend. Terminal bytes mutate TerminalState directly — no JSON, no WebSocket, no Base64, no xterm.js parse pass. GPUI reads the state and emits GPU draw calls.
🔩 Pure Rust SSH — russh (ring)
The desktop app links the russh stack directly:
No OpenSSL/libssh2 in the SSH stack — SSH cryptography is provided through ring
Full SSH2: key exchange, channels, SFTP subsystem, port forwarding
ChaCha20-Poly1305 and AES-GCM, Ed25519/RSA/ECDSA keys
SSH Agent: Unix (SSH_AUTH_SOCK) and Windows (\\.\pipe\openssh-ssh-agent)
Custom AgentSigner for russh Signer trait compatibility across .await bounds
Multi-hop proxy chains with per-hop independent auth
SshConnectionRegistry is backed by DashMap; the workspace uses it through NodeRouter and runtime entities:
Default shared connection: terminal panes, SFTP, port forwards, and IDE can share one physical SSH connection
Optional dedicated terminal: a terminal policy can create its own registry key and physical connection without changing the shared node connection
State machine per connection: connecting → active → idle → link_down → reconnecting
Node-first addressing: everything is resolved by nodeId → connectionId by NodeRouter
NodeRuntimeStore: in-process node runtime and serializable topology snapshot; WorkspaceApp helpers persist the snapshot to session_tree.json, while live handles are rebuilt on startup
ConnectionRegistry owns physical connections, health state, consumers, and idle cleanup. WorkspaceRuntimeEntity schedules probes and reconnect jobs. AI and plugins use capability handles, host snapshots, or terminal hooks rather than registering as physical connection consumers.
🤖 OxideSens AI
OxideSens is BYOK-first, with context building performed in-process:
Providers: OpenAI, Anthropic (Claude), Google Gemini, Ollama/any OpenAI-compatible endpoint
MCP: stdio + SSE transports, full tool discovery and invocation
Context boundary: provider-bound messages pass through credential-pattern redaction, while the user controls which workspace context and actions are approved
API keys: stored in the OS keychain and deliberately excluded from structured logs and desktop-core message payloads
🎨 GPUI Desktop Shell
The entire UI is written in Rust using GPUI (Zed's GPU-backed UI framework):
No CSS, no DOM, no JavaScript in the rendering pipeline
Workspace tab types: local terminal, SSH, Telnet, Serial, RDP, VNC, SFTP, IDE, port forwards, session manager, cloud sync, settings, plugins, topology, monitoring, file manager, launcher, graphics, and custom plugin tabs
Split pane system: binary pane tree, draggable dividers, up to 4 panes per terminal tab
Command palette, global key bindings, sidebar panels — all GPUI primitives
Immediate-mode rendering: UI reflects Rust state changes without a serialization round-trip
🧱 Terminal State and Rendering
Terminal rendering is modeled as Rust state first, then drawn by GPUI:
PTY output lands in TerminalState; scrollback, cursor, selection, marks, and search state stay in Rust
Rendering policy can shift between Boost, Normal, and Idle without asking a browser event loop to cooperate
Sixel and Kitty graphics are tracked as terminal-owned assets instead of DOM nodes or canvas overlays
Split panes share the same workspace state model, so tab restore and reconnect can snapshot terminal topology together
🗂️ SFTP and IDE Workspace
Remote files are part of the same node workspace rather than a separate disconnected feature:
SFTP sessions are resolved through NodeRouter and carry a connection generation; reconnect reacquires an eligible session, but an old-generation operation is never silently replaced by a new connection
Transfer queues track direction, progress, retry state, and speed limits independently from the visible file panes
IDE tabs keep dirty buffers, remote paths, conflict state, and restore metadata together
Remote writes use staged/atomic behavior where the backend supports it, keeping partial writes out of normal edit flows
🧩 Plugins, CLI, and Diagnostics
Extension and support surfaces stay inside explicit Rust-owned boundaries:
Plugins support manifest-only, WASM, and ordinary process paths. WASM uses Wasmtime/WASI or a sidecar with controlled host calls; process plugins are local processes without an OS sandbox. Legacy Tauri ESM plugins may be shown but are not executed by Native.
The CLI links directly to domain crates for settings, connections, forwards, plugins, quick commands, secrets, portable bundles, diagnostics, reports, batch plans, backups, and cloud sync
Diagnostics prefer counts, paths, feature flags, and redacted hints over raw secret-bearing payloads
Mutating CLI flows use dry-run plans, --yes guards, and rollback backups where applicable
🔀 Port Forwarding — Lock-Free I/O
Forwarding is implemented as a standalone Rust crate:
Local (-L), Remote (-R), Dynamic SOCKS5 (-D)
Message-passing architecture: SSH Channel owned by single ssh_io task — no Arc>
Auto-restore on reconnect, death reporting, idle timeout
📦 trzsz — In-Band File Transfer
The in-band protocol is integrated directly with native file dialogs:
Upload/download through the existing terminal stream — no extra ports or agents
Works through ProxyJump chains
Native file pickers (no browser memory constraints)
Dry-run plans, --yes guards, rollback backups for state-changing commands
Host keys
TOFU with ~/.ssh/known_hosts, rejects unexpected changes
Plugin boundary
Manifest-only, controlled WASM host API, or trusted local process
Lawful Use Notice
OxideTerm is licensed under GPL-3.0-only without additional license restrictions. When using it, access only systems, networks, and devices that you own or are explicitly authorized to access, and comply with applicable law. Do not use OxideTerm for unauthorized access, service disruption, or bypassing access controls.
Contributing
Contributions are welcome across Rust code, documentation, translations, plugins, testing, and issue reproduction. Open an issue to discuss larger changes or well-scoped fixes.
Bug reports are most useful with a redacted CLI bundle:
cargo run -p oxideterm-cli -- report --bundle ./oxideterm-report.zip
Support and Maintenance
Reproducible bug reports and regressions with redacted diagnostics are prioritized. Feature requests are reviewed based on scope, safety, and alignment with OxideTerm's remote-server workspace direction.
If OxideTerm helps your workflow, a GitHub star, issue reproduction, translation fix, or plugin all make the project easier to keep moving.
License
GPL-3.0-only. Detailed dependency attribution is recorded in THIRD_PARTY_NOTICES.md, with additional notices in NOTICE.