MCPcopy Index your code
hub / github.com/AnalyseDeCircuit/oxideterm

github.com/AnalyseDeCircuit/oxideterm @v1.6.12

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.6.12 ↗ · + Follow
8,834 symbols 27,654 edges 816 files 1,452 documented · 16%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

OxideTerm

⚡ OxideTerm

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.

Version Platform License Rust Tauri Total Downloads

Download Latest Release Download Latest Beta

🌐 oxideterm.app — Documentation & website

English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Français | Deutsch | Español | Italiano | Português | Tiếng Việt

OxideTerm AI opening a terminal demo

Watch OxideSens follow a user request and open a terminal inside OxideTerm.


What OxideTerm Is

OxideTerm is a local-first AI workspace for remote servers — an open-source alternative to Termius, SecureCRT & Tabby.

What you can do:

  • Manage SSH terminals, SFTP, port forwards, in-terminal transfers, and local shells side by side
  • Keep working through network hiccups with Grace Period reconnect
  • Ask OxideSens AI to inspect live sessions and perform approved workspace actions through your own AI provider

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.


Why OxideTerm?

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

Screenshots

SSH Terminal + OxideSens AI SSH Terminal with OxideSens AI SFTP File Manager SFTP dual-pane file manager with transfer queue
Built-in IDE (CodeMirror 6) Built-in IDE mode with CodeMirror 6 editor Smart Port Forwarding Smart port forwarding with auto-detection

Download

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

Feature Overview

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

Under the Hood

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

Architecture — Dual-Plane Communication

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]      │
└─────────────────────────────────────┘
  • Data plane (WebSocket): each SSH session gets its own WebSocket port. Terminal bytes flow as binary frames with a Type-Length-Payload header — no JSON serialization, no Base64 encoding, zero overhead in the hot path.
  • Control plane (Tauri IPC): connection management, SFTP ops, forwarding, config — structured JSON, but off the critical path.
  • Node-first addressing: the frontend never touches 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.

🔩 Pure Rust SSH — russh 0.59

The entire SSH stack is russh 0.59 compiled against the ring crypto backend:

  • Zero OpenSSL dependencies — the full crypto stack is Rust. No more "which OpenSSL version?" debugging.
  • Full SSH2 protocol: key exchange, channels, SFTP subsystem, port forwarding
  • ChaCha20-Poly1305 and AES-GCM cipher suites, Ed25519/RSA/ECDSA keys
  • Custom 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 .await
pub struct AgentSigner { /* wraps system SSH Agent */ }
impl Signer for AgentSigner { /* challenge-response via Agent IPC */ }
  • Platform support: Unix (SSH_AUTH_SOCK), Windows (\\.\pipe\openssh-ssh-agent)
  • Proxy chains: each hop independently uses Agent auth
  • Reconnect: AuthMethod::Agent replayed automatically

🔄 Smart Reconnect with Grace Period

Most SSH clients kill everything on disconnect and start fresh. OxideTerm's reconnect orchestrator takes a fundamentally different approach:

  1. Detect WebSocket heartbeat timeout (300s, tuned for macOS App Nap and JS timer throttling)
  2. Snapshot full state: terminal panes, in-flight SFTP transfers, active port forwards, open IDE files
  3. Intelligent probing: visibilitychange + online events trigger proactive SSH keepalive (~2s detection vs 15-30s passive timeout)
  4. Grace Period (30s): probe the old SSH connection via keepalive — if it recovers (e.g., WiFi AP switch), your TUI apps (vim, htop, yazi) survive completely untouched
  5. If recovery fails → new SSH connection → auto-restore forwards → resume SFTP transfers → reopen IDE files

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.

🛡️ SSH Connection Pool

Reference-counted SshConnectionRegistry backed by DashMap for lock-free concurrent access:

  • One connection, many consumers: terminal, SFTP, port forwards, and IDE share a single physical SSH connection — no redundant TCP handshakes
  • State machine per connection: connecting → active → idle → link_down → reconnecting
  • Lifecycle management: configurable idle timeout (5m / 15m / 30m / 1h / never), 15s keepalive interval, heartbeat failure detection
  • WsBridge heartbeat: 30s interval, 5 min timeout — tolerates macOS App Nap and browser JS throttling
  • Cascade propagation: jump host failure → all downstream nodes automatically marked link_down with status sync
  • Idle disconnect: emits connection_status_changed to frontend (not just internal node:state), preventing UI desync

🤖 OxideSens AI

Privacy-first AI assistant with dual interaction modes:

  • Inline panel (⌘I): quick terminal commands, output injected via bracketed paste
  • Sidebar chat: persistent conversations with full history
  • Target-first workspace context: sees saved connections, live SSH sessions, terminal buffers, SFTP paths, settings, and knowledge base entries as workspace targets
  • Approved actions: can diagnose remote output, run approved commands, inspect files, and explain failures without requiring an OxideTerm account
  • MCP support: connect external Model Context Protocol servers (stdio & SSE) for third-party tool integration
  • RAG Knowledge Base (v0.20): import Markdown/TXT documents into scoped collections (global or per-connection). Hybrid search fuses BM25 keyword index + vector cosine similarity via Reciprocal Rank Fusion. Markdown-aware chunking preserves heading hierarchy. CJK bigram tokenizer for Chinese/Japanese/Korean.
  • Providers: OpenAI, Ollama, DeepSeek, OneAPI, or any /v1/chat/completions endpoint
  • Security: API keys stored in OS keychain; on macOS, key reads gated behind Touch ID via LAContext — no entitlements or code-signing required, cached after first auth per session

🔀 Port Forwarding — Lock-Free I/O

Full local (-L), remote (-R), and dynamic SOCKS5 (-D) forwarding:

  • Message-passing architecture: SSH Channel owned by a single ssh_io task — no Arc<Mutex<Channel>>, eliminating mutex contention entirely
  • Death reporting: forward tasks actively report exit reason (SSH disconnect, remote port close, timeout) for clear diagnostics
  • Auto-restore: Suspended forwards automatically resume on reconnect without user intervention
  • Idle timeout: FORWARD_IDLE_TIMEOUT (300s) prevents zombie connections from accumulating

📦 trzsz — In-Band File Transfer

Upload and download files directly through the SSH terminal session — no SFTP connection required:

  • In-band protocol: files travel as

Extension points exported contracts — how you extend this code

ProgressStore (Interface)
(no doc) [7 implementers]
src-tauri/src/sftp/progress.rs
GpuCanvasRenderer (Interface)
(no doc) [4 implementers]
src/lib/gpu/gpuCanvasManager.ts
SearchMatch (Interface)
* 单个匹配结果
src/components/ide/IdeSearchPanel.tsx
LauncherListResponse (Interface)
Response from launcher_list_apps
src/store/launcherStore.ts
SshConfigExt (Interface)
(no doc) [1 implementers]
src-tauri/tests/upstream_proxy_e2e.rs
Window (Interface)
(no doc)
plugin-api.d.ts
Window (Interface)
(no doc)
plugin-development/plugin-api.d.ts
Window (Interface)
(no doc)
src/types/plugin.ts

Core symbols most depended-on inside this repo

t
called by 3539
src/lib/plugin/pluginI18nManager.ts
push
called by 1154
cli/src/main.rs
getState
called by 1074
src/lib/recording/player.ts
get
called by 925
src-tauri/src/sftp/session.rs
filter
called by 510
src/lib/terminal/serialConsoleIngress.ts
len
called by 449
src-tauri/src/ssh/proxy.rs
set
called by 429
src/lib/plugin/pluginStorage.ts
invoke
called by 390
src/lib/plugin/pluginContextFactory.ts

Shape

Function 5,676
Method 1,756
Class 740
Interface 470
Enum 192

Languages

Rust56%
TypeScript44%

Modules by API surface

src/lib/plugin/pluginContextFactory.ts157 symbols
src-tauri/src/ssh/connection_registry.rs145 symbols
src/types/index.ts133 symbols
src-tauri/src/commands/acp.rs127 symbols
src-tauri/src/commands/config.rs121 symbols
src/lib/ai/tools/toolExecutor.ts120 symbols
cli/src/main.rs117 symbols
src-tauri/src/session/profiler.rs92 symbols
src-tauri/src/state/ai_chat.rs80 symbols
src-tauri/src/config/types.rs77 symbols
src-tauri/src/commands/node_sftp.rs76 symbols
src-tauri/src/update_manager.rs75 symbols

For agents

$ claude mcp add oxideterm \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact