⚡ OxideTerm
Espace de travail d’exploitation natif avec IA pour serveurs distants — Application native 100% Rust
Terminaux SSH, Telnet, série, RDP/VNC, SFTP, redirection de ports et édition légère dans un espace de travail natif.
Rendu GPU. Gratuit. Aucun compte requis.
Sans Electron. Sans WebView embarquée. Sans télémétrie. Sans abonnement. BYOK d'abord. SSH pur Rust sans OpenSSL/libssh2.
Open source, local-first et rendu par GPU avec GPUI.
English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Français | Deutsch | Español | Italiano | Português | Tiếng Việt
---
## Ce qu’est OxideTerm
OxideTerm est un espace de travail open source pour SSH et les opérations distantes. Terminaux, fichiers, redirections, outils hôte et bureaux distants restent réunis dans un même espace.
**Ce que vous pouvez faire :**
- Gérer SSH, Telnet, série, RDP/VNC, SFTP, redirections de ports, shells locaux et édition légère dans un seul espace de travail
- Maintenir le travail distant pendant de brèves coupures réseau grâce à la reconnexion Grace Period
- Demander à OxideSens d’examiner les sessions actives et d’exécuter des actions approuvées avec votre propre fournisseur d’IA
Vos connexions et données opérationnelles restent sous votre contrôle. OxideSens utilise votre propre fournisseur d’IA et aucun compte n’est requis.
---
## Pourquoi OxideTerm ?
| Si vous recherchez… | OxideTerm vous apporte… |
|---|---|
| Un nœud distant, de nombreux outils | Terminal, SFTP, redirection de ports, RDP/VNC, trzsz, IDE natif, supervision et OxideSens AI restent attachés au même espace de travail |
| Une application de bureau sans Electron ni WebView embarquée | GPUI dessine l’interface directement sur une surface GPU, sans livrer de runtime de navigateur |
| Des flux d’exploitation local-first | SSH, Telnet, SFTP, redirection, RDP/VNC, shell local, terminaux série et configuration fonctionnent sans inscription |
| OxideSens AI avec vos propres clés plutôt que des crédits de plateforme | OxideSens utilise votre point de terminaison OpenAI, Anthropic, Gemini, Ollama ou compatible OpenAI, avec MCP, RAG, contrôles de raisonnement adaptés au fournisseur et actions approuvées |
| La stabilité de reconnexion | Grace Period sonde l’ancienne connexion pendant 30 s avant son remplacement, afin que les applications TUI survivent aux brèves coupures réseau |
| SSH Rust pur et sécurité des identifiants | La pile SSH utilise `russh` + `ring` sans OpenSSL/libssh2 ; les identifiants enregistrés utilisent le trousseau système et les paquets `.oxide` utilisent ChaCha20-Poly1305 + Argon2id |
---
## Captures d’écran
Les captures ci-dessous présentent les parcours terminal, fichiers, édition et redirection d’OxideTerm.
Terminal SSH + OxideSens AI
 |
Gestionnaire de fichiers SFTP
 |
IDE intégré
 |
Redirection de ports intelligente
 |
---
## Conçu pour les opérations distantes
OxideTerm réunit connexions, fichiers, redirections, outils hôte, automatisation et contexte IA dans un espace Rust. Les outils partagent la même identité serveur et le même cycle de session.
| Aspect | Approche avec navigateur embarqué | OxideTerm |
|---|---|---|
| **Rendu** | Moteur de navigateur et mise en page web | GPUI sur une surface GPU |
| **Flux de données du terminal** | WebSocket → boucle d’événements JS → xterm.js | Entrée Rust → mutation de `TerminalState` → rendu GPUI |
| **Cycle de vie des connexions** | Réparti entre frontend et backend | Un pipeline de connexion et reconnexion dans un seul processus |
| **Contexte IA** | Copié via un pont applicatif | Construit depuis l’espace de travail actif avec accord de l’utilisateur |
| **Runtime des plugins** | Environnement de scripts navigateur | Chemins manifest-only, WASM à capacités limitées et processus nécessitant une confiance explicite |
| **CLI** | Nécessite l’application de bureau en cours d’exécution | Binaire autonome avec liaison directe aux crates |
| **Frontière d’exécution** | Enveloppe de bureau et runtime navigateur | Processus natif sans runtime navigateur embarqué |
---
## Fonctions
| Catégorie | Fonctions |
|---|---|
| **Terminal et connexions** | Shells locaux, SSH, Telnet, série, volets, mode de saisie libre, envoi avancé vers plusieurs cibles, routes multi-hop et reconnexion stable |
| **Fichiers et édition distante** | SFTP, files de transfert, favoris, écritures sûres, arbres de projet et édition par onglets |
| **Redirection et réseau** | Redirections locale, distante et SOCKS5 dynamique, règles enregistrées et débogage de sockets |
| **Opérations hôte et bureau distant** | Supervision, processus, services, journaux, ports, tâches, disques, paquets, conteneurs, tmux, RDP et VNC |
| **OxideSens et automatisation** | Fournisseurs IA personnels, MCP, RAG local, Agent Skills, actions approuvées, synchronisation chiffrée et CLI |
| **Extensions et personnalisation** | Plugins manifest-only, WASM et processus, onglets personnalisés, commandes rapides, thèmes, arrière-plans, raccourcis et 11 langues |
---
*OxideSens suit une demande utilisateur et ouvre un terminal dans OxideTerm.*
---
## Architecture
OxideTerm réunit terminal, SSH, Telnet, RDP, VNC, SFTP, redirection, IDE, IA, plugins et CLI dans une architecture Rust. Les détails techniques suivent ci-dessous.
Architecture, internes SSH, shell GPUI, reconnexion, IA, plugins et plus
### Architecture — cœur en processus, sans pont WebView
```text
GPUI Render Loop
WorkspaceApp / Tab surfaces / GPUI views
│ dans le processus Arc<> / async
Domain Crates
NodeRouter → SshConnectionRegistry
TerminalState ← SSH PTY channel
SftpSession / ForwardingRuntime / IdeWorkspace
Ai/ACP Entities / CloudSync / Plugin Runtimes
```
Il n'y a pas de frontière de sérialisation entre l'UI et le backend SSH/terminal. Les octets du terminal modifient directement `TerminalState`, puis GPUI lit l'état et émet les draw calls GPU.
### SSH pur Rust — russh (ring)
- **Sans OpenSSL/libssh2 dans la pile SSH** — `ring` fournit la cryptographie SSH
- SSH2 complet : échange de clés, canaux, sous-système SFTP, redirection de ports
- ChaCha20-Poly1305 / AES-GCM, clés Ed25519/RSA/ECDSA
- SSH Agent sur Unix (`SSH_AUTH_SOCK`) et Windows (`\\.\pipe\openssh-ssh-agent`)
- ProxyJump multi-hop avec authentification indépendante à chaque saut
### Reconnexion intelligente avec Grace Period
1. Détecter le timeout SSH keepalive sans JavaScript timer throttling
2. Instantané des panneaux de terminal, transferts SFTP, redirections et fichiers IDE
3. Sonder l’ancienne connexion pendant 30 secondes de Grace Period pour laisser survivre les TUI lors d’un changement réseau
4. Si la récupération échoue, reconnecter, restaurer les redirections, reprendre ou retenter les transferts selon la stratégie et rouvrir les fichiers IDE
Pipeline: `queued → snapshot → grace-period → ssh-connect → await-terminal → restore-forwards → retry-or-resume-transfers → restore-ide → verify → done`
### Pool de connexions SSH et routage par nœud
- En mode par défaut, une connexion SSH physique peut servir les panneaux de terminal, SFTP, redirections de ports et IDE ; un terminal peut utiliser une connexion dédiée si la politique l’exige
- Chaque connexion passe par `connecting → active → idle → link_down → reconnecting`
- L’UI adresse `nodeId`; `NodeRouter` résout atomiquement le `connectionId` actif
- `NodeRuntimeStore` conserve l’état d’exécution des nœuds et exporte les snapshots de topologie ; les helpers du workspace écrivent ces snapshots dans `session_tree.json` et reconstruisent les handles actifs au démarrage
- La panne d’un jump host propage `link_down` aux nœuds descendants
### OxideSens AI
OxideSens reste BYOK d’abord, avec construction du contexte dans le processus :
- Fournisseurs : OpenAI, Anthropic, Gemini, Ollama ou tout point d’accès OpenAI-compatible
- MCP : transports stdio et SSE, découverte et invocation d’outils
- RAG : BM25 full-text, index vectoriel HNSW, Reciprocal Rank Fusion, tokenizer CJK bigram
- Les messages envoyés aux fournisseurs passent par un filtre de motifs d’identifiants ; le contexte et les actions du workspace restent sous le contrôle de l’utilisateur
- Les clés API sont conservées dans le trousseau système et délibérément exclues des journaux structurés et des messages du cœur de l’application
### Shell desktop GPUI
L’UI est dessinée directement avec GPUI, sans pipeline DOM/CSS/JavaScript :
- Types d’onglets de l’espace de travail : terminaux locaux, SSH, Telnet, série, RDP, VNC, SFTP, IDE, Forwards, Settings, plugins, Topology, etc.
- Arbre binaire de panes avec séparateurs déplaçables, jusqu’à quatre panes par onglet terminal
- Command palette, raccourcis globaux et sidebars construits avec des primitives GPUI
- Immediate-mode rendering réagit à l’état Rust sans round-trip de sérialisation
### État du terminal et rendu
Le rendu terminal est d’abord modélisé comme état Rust, puis dessiné par GPUI :
- La sortie PTY arrive dans `TerminalState` ; scrollback, curseur, sélection, marks et état de recherche restent en Rust
- La rendering policy peut passer entre Boost, Normal et Idle sans attendre un browser event loop
- Les graphiques Sixel et Kitty sont suivis comme assets propres au terminal, pas comme DOM nodes ou canvas overlays
- Les panneaux divisés partagent le même modèle de état de l’espace de travail, ce qui permet à restauration d’onglet et reconnect de prendre un instantané ensemble la topologie terminal
### Workspace SFTP et IDE
Les fichiers distants font partie du même node espace de travail, pas d’une fonction séparée :
- Les sessions SFTP sont résolues via `NodeRouter` avec une génération de connexion ; reconnect peut acquérir une session valide, mais une opération de l’ancienne génération n’est jamais remplacée silencieusement par une nouvelle connexion
- Les transfer queues suivent direction, progression, retry state et speed limits indépendamment des file panes visibles
- Les onglets IDE gardent ensemble dirty buffers, remote paths, conflict state et restore metadata
- Lorsque le backend le permet, les écritures distantes utilisent un staged/atomic behavior pour éviter les partial writes dans le flux d’édition normal
### Plugins, CLI et diagnostics
Les extensions et surfaces de support respectent des limites explicites définies en Rust :
- Les plugins prennent en charge les chemins manifest-only, WASM et processus ordinaires. WASM utilise le runtime Wasmtime/WASI intégré ; les plugins processus sont des processus locaux sans sandbox du système d’exploitation.
- La CLI lie directement les crates de domaine pour doctor, settings, connections, redirections, portable bundles, backups et reports
- Les diagnostics privilégient compteurs, chemins, indicateurs de fonctionnalité et indices expurgés plutôt que des charges utiles brutes porteurs de secrets
- Les flows CLI qui modifient l’état utilisent dry-run plans, `--yes` guards et rollback backups lorsque c’est pertinent
### Redirection de ports — Lock-Free I/O
- Local `-L`, Remote `-R`, Dynamic SOCKS5 `-D`
- Un seul task `ssh_io` possède chaque SSH Channel et évite `Arc>`
- Auto-restauration après reconnexion, rapport de fin et expiration d’inactivité
### trzsz — transfert in-band
trzsz continue d’utiliser le flux terminal, sans port supplémentaire ni agent distant :
- Upload/download via le flux terminal existant
- Fonctionne à travers les chaînes ProxyJump
- Les sélecteurs de fichiers natifs évitent les limites mémoire du navigateur
- Transfert bidirectionnel, dossiers, limites configurables
### Export `.oxide` chiffré
- **ChaCha20-Poly1305 AEAD** authenticated encryption
- **Argon2id KDF** : 256 MB memory cost, 4 iterations, augmente le coût du brute force GPU
- Couvre connections, redirections, settings, quick commands, réglages de plugin et secrets portables
---
## Lancer depuis le code source
**Prérequis :** une chaîne d’outils Rust (édition 2024) et un environnement de bureau capable d’exécuter GPUI.
```sh
cargo run
OXIDETERM_RENDER_PROFILE=compatibility cargo run
./scripts/build/build-cli.sh
./scripts/build/build-agent.sh
```
## CLI
La CLI sans interface `oxideterm` fonctionne sans lancer l’application et sert à l’automatisation, à la CI et aux diagnostics.
```sh
cargo run -p oxideterm-cli -- doctor --strict
cargo run -p oxideterm-cli -- settings validate --strict --json
cargo run -p oxideterm-cli -- connections search prod
cargo run -p oxideterm-cli -- forwards list --format json
cargo run -p oxideterm-cli -- cloud-sync push --dry-run --json
cargo run -p oxideterm-cli -- oxide export ./profile.oxide --connection prod --password-stdin
cargo run -p oxideterm-cli -- report --bundle ./oxideterm-report.zip
cargo run -p oxideterm-cli -- completion install zsh --force
```
## Technologies
| Couche | Technologie | Notes |
|---|---|---|
| Interface | GPUI (Zed) | Mode immédiat accéléré par GPU, entièrement en Rust |
| Exécution | Tokio + DashMap | Exécution asynchrone et tables concurrentes |
| SSH | russh (`ring`) | Sans OpenSSL/libssh2 dans la pile SSH ; SSH Agent |
| Terminal | portable-pty + alacritty_terminal | PTY locaux, émulation de terminal et graphismes Sixel/Kitty |
| Plugins | Wasmtime/WASI et processus | Manifest-only, appels hôte WASM contrôlés et processus locaux nécessitant une confiance explicite |
| IA et recherche | SSE + BM25 + HNSW | Diffusion des fournisseurs, bigrammes CJK et fusion RRF |
| Éditeur | tree-sitter (syntaxe), tampon personnalisé | Multilingue, adossé à SFTP |
| Chiffrement | ChaCha20-Poly1305 + Argon2id | AEAD + KDF gourmande en mémoire (256 Mo) |
| i18n | oxideterm-i18n | Chargeur intégré, 11 langues distribuées |
## Sécurité
| Sujet | Implémentation |
|---|---|
| Identifiants enregistrés | macOS Keychain / Windows Credential Manager / libsecret |
| Secrets en mémoire | Les types contenant des secrets et les tampons temporaires utilisent `zeroize` / `Zeroizing` aux frontières de possession compatibles |
| Diagnostics | Les rapports d’assistance privilégient les métadonnées structurées et les indices expurgés aux charges contenant des secrets |
| Contexte IA | Les messages envoyés aux fournisseurs passent par un filtre de motifs d’identifiants ; le contexte et les actions du workspace restent sous le contrôle de l’utilisateur |
| `.oxide` | ChaCha20-Poly1305 + Argon2id |
| Écritures CLI | dry-run, garde `--yes`, sauvegardes rollback |
| Clés d’hôte | TOFU avec `~/.ssh/known_hosts`, rejette les changements inattendus |
| Plugins | manifest-only, API hôte WASM contrôlée et processus locaux nécessitant une confiance explicite |
## Avis d’utilisation légale
OxideTerm est distribué sous licence GPL-3.0-only sans restriction de licence supplémentaire. Lors de son utilisation, accédez uniquement aux systèmes, réseaux et appareils qui vous appartiennent ou pour lesquels vous disposez d’une autorisation explicite, et respectez la législation applicable. N’utilisez pas OxideTerm pour un accès non autorisé, une interruption de service ou le contournement de contrôles d’accès.
## Contribution
Les contributions au code, à la documentation, aux traductions, aux plugins, aux tests et aux rapports de bugs sont bienvenues. Discutez les changements importants ou les corrections bien délimitées dans une issue.
```sh
cargo run -p oxideterm-cli -- report --bundle ./oxideterm-report.zip
```
---
## Support et maintenance
Les bugs et régressions reproductibles avec diagnostics expurgés sont prioritaires. Les demandes de fonctionnalités sont évaluées selon leur périmètre, leur sûreté et leur alignement avec la direction d’OxideTerm pour le espace de travail de serveurs distants.
Si OxideTerm aide votre workflow, une étoile GitHub, une reproduction, une correction de traduction ou un plugin rendent le projet plus facile à maintenir.
---
## Licence
**GPL-3.0-only**. Les avis détaillés sur les composants tiers figurent dans [`THIRD_PARTY_NOTICES.md`](../../THIRD_PARTY_NOTICES.md), avec des informations complémentaires dans [`NOTICE`](../../NOTICE).
## Remerciements
Merci à `russh`, `GPUI`, `alacritty_terminal`, `portable-pty`, `wasmtime` et `tree-sitter`.