{"id":47724013,"url":"https://github.com/zouwei/termex","last_synced_at":"2026-05-06T06:05:22.588Z","repository":{"id":347524715,"uuid":"1193273299","full_name":"zouwei/termex","owner":"zouwei","description":"一款开源 AI 驱动的本地 SSH 客户端","archived":false,"fork":false,"pushed_at":"2026-04-06T12:32:14.000Z","size":2413,"stargazers_count":72,"open_issues_count":7,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-04-06T13:32:53.873Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zouwei.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-27T03:40:00.000Z","updated_at":"2026-04-06T13:05:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/zouwei/termex","commit_stats":null,"previous_names":["zouwei/termex"],"tags_count":50,"template":false,"template_full_name":null,"purl":"pkg:github/zouwei/termex","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zouwei%2Ftermex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zouwei%2Ftermex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zouwei%2Ftermex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zouwei%2Ftermex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zouwei","download_url":"https://codeload.github.com/zouwei/termex/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zouwei%2Ftermex/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31710792,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-12T06:22:27.080Z","status":"ssl_error","status_checked_at":"2026-04-12T06:21:52.710Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-02T20:01:05.503Z","updated_at":"2026-05-06T06:05:22.576Z","avatar_url":"https://github.com/zouwei.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e  \n  \u003ch1 align=\"center\"\u003eTermex\u003c/h1\u003e  \n  \u003cp align=\"center\"\u003e\u003cstrong\u003eAn open-source, AI-native SSH client built with Rust.\u003c/strong\u003e\u003c/p\u003e  \n  \u003cp align=\"center\"\u003e以 SSH 协议为底座，打造 AI 时代永不断线的云端智能工作平台。\u003c/p\u003e  \n  \u003cp align=\"center\"\u003eSSH is the wire. What flows through it is your entire AI-powered workflow.\u003c/p\u003e  \n  \u003cp align=\"center\"\u003eConnect from any device. Punch through any network.\u003c/p\u003e  \n  \u003cp align=\"center\"\u003eAI keeps working while you're away. Reconnect, and pick up right where it left off.\u003c/p\u003e  \n  \u003cp align=\"center\"\u003eDevices are temporary. Your workspace is permanent.\u003c/p\u003e  \n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e  \n  \u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e \u0026bull;  \n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e \u0026bull;  \n  \u003ca href=\"#keyboard-shortcuts\"\u003eShortcuts\u003c/a\u003e \u0026bull;  \n  \u003ca href=\"#development\"\u003eDevelopment\u003c/a\u003e \u0026bull;  \n  \u003ca href=\"#roadmap\"\u003eRoadmap\u003c/a\u003e  \n\u003c/p\u003e\n\n---\n\n![](https://raw.githubusercontent.com/zouwei/resource/master/images/moraya/20260329-023219.-image.png)\n\n![](https://raw.githubusercontent.com/zouwei/resource/master/images/moraya/20260329-151239.-image.png)\n\n![](https://raw.githubusercontent.com/zouwei/resource/master/images/moraya/20260402-141840.-image.png)\n\n![](https://raw.githubusercontent.com/zouwei/resource/master/images/moraya/20260410-101142.-image.png)\n\n## Why Termex?\n\n|  | Termius | Tabby | WindTerm | Termex |\n| --- | --- | --- | --- | --- |\n| Beautiful UI | Yes | Yes | No | **Yes** |\n| Native Performance | Yes | No (Electron) | Yes | **Yes (Tauri/Rust)** |\n| AI Integrated | No | No | No | **Yes** |\n| Free \u0026 Open Source | No | Yes | Yes | **Yes (MIT)** |\n| Encrypted Config | No | Partial | Partial | **Yes (OS Keychain + AES-256-GCM)** |\n\n## Installation\n\n### Download\n\nDownload the latest release for your platform from [GitHub Releases](https://github.com/user/termex/releases/latest):\n\n| Platform | Architecture | Format |\n| --- | --- | --- |\n| macOS | Apple Silicon (M1/M2/M3) | `.dmg` |\n| macOS | Intel | `.dmg` |\n| Windows | x64 | `.msi` / `.exe` |\n| Linux | x86_64 | `.deb` / `.rpm` / `.AppImage` |\n| Linux | aarch64 | `.deb` / `.rpm` |\n\n### Build from Source\n\n```bash\ngit clone https://github.com/user/termex.git\ncd termex\npnpm install\npnpm tauri build\n```\n\n## Features\n\n- **SSH Terminal** -- WebGL-accelerated xterm.js, multi-tab, 60fps, password \u0026 key auth\n- **Server Management** -- Tree view with groups, search, drag \u0026 drop, encrypted credential storage\n- **SFTP File Browser** -- Dual-pane with context menu, drag \u0026 drop, copy/cut/paste, chmod, file info\n- **SSH Tunnel** -- ProxyJump / bastion host support (multi-level), port forwarding (local/remote/dynamic)\n- **AI Assistant** -- Dangerous command detection, command explanation, natural language to shell\n- **Local AI** -- Built-in llama-server with 12 GGUF models, fully offline, no API key required\n- **Terminal Search** -- In-terminal search (`Cmd+F`), keyword highlighting, cross-tab search (`Cmd+Shift+F`)\n- **Customization** -- Dark/Light themes, 6 built-in fonts + custom upload, customizable keybindings\n- **Security** -- OS Keychain (macOS/Windows/Linux), AES-256-GCM fallback, SQLCipher encrypted database\n- **Config Backup** -- Encrypted export/import (`.termex` format), cross-device migration\n- **i18n** -- English and Chinese out of the box\n\n## Tech Stack\n\n\u003e **Repository state**: Termex is currently in a dual-stack migration period. The production app ships on the Tauri/Vue stack (v0.34.x). A parallel Flutter rewrite targets v0.49.0 and lives in `app/` + `crates/`. See [`docs/iterations/v0.51.0-remediation.md`](docs/iterations/v0.51.0-remediation.md) for current status.\n\n### Production stack (v0.34.x — Tauri/Vue)\n\n```text\nTauri v2 + Rust          Backend, SSH, encryption, storage\nVue 3 + TypeScript       Frontend framework\nElement Plus             UI components\nTailwind CSS             Styling\nxterm.js (WebGL)         Terminal rendering\nSQLCipher                Encrypted local database\nrussh                    Pure-Rust SSH2 protocol\nring + Argon2id          AES-256-GCM encryption \u0026 key derivation\n```\n\n### Migration stack (WIP — target v0.49+ — Flutter/Rust)\n\n```text\nFlutter 3.24+ (Dart)     Self-drawn UI, no Material/Cupertino\nflutter_rust_bridge v2   FRB bindings (Dart \u003c-\u003e Rust)\nRiverpod                 State management\nCustom VT100 emulator    Terminal rendering (Dart, no xterm.js)\nRust core (shared)       Same russh/ring/SQLCipher, extracted to crates/termex-core/\n```\n\n## Keyboard Shortcuts\n\n\u003e All shortcuts are fully customizable via **Settings → Keybindings**. Click any shortcut label to enter recording mode and press your desired key combination.\n\n### General\n\n| Action | macOS | Windows / Linux |\n| --- | --- | --- |\n| New Connection | `Cmd+N` | `Ctrl+N` |\n| Open Settings | `Cmd+,` | `Ctrl+,` |\n| Toggle Sidebar | `Cmd+\\` | `Ctrl+\\` |\n| Toggle AI Panel | `Cmd+Shift+I` | `Ctrl+Shift+I` |\n\n### Tabs\n\n| Action | macOS | Windows / Linux |\n| --- | --- | --- |\n| Close Current Tab | `Cmd+W` | `Ctrl+W` |\n| Next Tab | `Cmd+Tab` | `Ctrl+Tab` |\n| Previous Tab | `Cmd+Shift+Tab` | `Ctrl+Shift+Tab` |\n| Go to Tab 1–9 | `Cmd+1` \\~ `Cmd+9` | `Ctrl+1` \\~ `Ctrl+9` |\n\n### Search\n\n| Action | macOS | Windows / Linux |\n| --- | --- | --- |\n| Search in Terminal | `Cmd+F` | `Ctrl+F` |\n| Search All Tabs | `Cmd+Shift+F` | `Ctrl+Shift+F` |\n\n## Security\n\n### OS Keychain Storage (v0.10.0+)\n\nTermex uses the operating system's native credential manager to protect all sensitive data:\n\n| Platform | Backend | Protection |\n| --- | --- | --- |\n| macOS | Keychain Services | Hardware-level (Secure Enclave + Touch ID) |\n| Windows | Credential Manager (DPAPI) | User login password |\n| Linux | Secret Service (GNOME Keyring / KDE Wallet) | User login password |\n\n**How it works:**\n\n- SSH passwords, private key passphrases, and AI API keys are stored in the OS keychain -- never in `termex.db`\n- `termex.db` only stores a keychain reference ID (e.g., `termex:ssh:password:{uuid}`)\n- Even if `termex.db` is stolen, no credentials are exposed\n- No master password required -- the OS login session provides the security boundary\n- Fallback: If the OS keychain is unavailable (headless Linux), Termex falls back to AES-256-GCM encryption with a user-provided master password\n\n### Additional Security Measures\n\n- Credential fields encrypted with **AES-256-GCM** (ring crate) in fallback mode\n- Fallback master password derived via **Argon2id** (m=64MB, t=3, p=4)\n- Database encrypted with **SQLCipher**\n- AI requests **never** include passwords, keys, or tokens\n- No telemetry, no analytics, no phone-home\n\n## Project Structure\n\n```text\ntermex/\n├── .github/workflows/         # CI + cross-platform release\n├── docs/                      # Requirements, design, prototype\n│   ├── iterations/            #   Version iteration plans (v0.1.0 ~ v0.51.0)\n│   └── migration/             #   Flutter migration roadmap\n├── scripts/                   # Version bump + FRB codegen utilities\n│   └── frb-codegen.sh         #   Regenerate Flutter bindings from Rust API\n├── flutter_rust_bridge.yaml   # FRB codegen config\n│\n├── src-tauri/src/             # ── Production (Tauri/Vue v0.34.x) ──\n│   ├── commands/              #   Tauri IPC handlers\n│   ├── ssh/  sftp/  crypto/  storage/  ai/  team/  recording/\n│   └── state.rs\n├── src/                       #   Vue 3 frontend\n│   ├── components/  composables/  stores/  i18n/  types/  utils/\n│\n├── crates/                    # ── Migration (Flutter/Rust WIP) ──\n│   ├── termex-core/           #   Shared Rust business logic\n│   │   └── src/ (14 modules: ssh, sftp, crypto, storage, ai, team, ...)\n│   └── termex-flutter-bridge/ #   flutter_rust_bridge v2 layer\n│       ├── src/api/           #     29 API modules (≈7,200 LOC)\n│       └── lib/src/           #     Dart bindings (stub until codegen runs)\n└── app/                       #   Flutter app\n    ├── lib/\n    │   ├── features/          #     server_list, ai, sftp, team, cloud, ...\n    │   ├── terminal/          #     Custom VT100 emulator\n    │   ├── widgets/           #     Self-drawn design system\n    │   ├── design/  system/   #     Theme tokens, sentinel flags, updater\n    │   └── main.dart\n    ├── test/  integration_test/\n    ├── pubspec.yaml\n    └── distribute_options.yaml\n```\n\n## Development\n\n### Prerequisites\n\n**Production stack (Tauri/Vue)**:\n- [Rust](https://rustup.rs/) (stable)\n- [Node.js](https://nodejs.org/) (22+)\n- [pnpm](https://pnpm.io/) (10+)\n- Platform-specific [Tauri v2 dependencies](https://v2.tauri.app/start/prerequisites/)\n\n**Migration stack (Flutter)**:\n- Rust (stable)\n- [Flutter SDK](https://docs.flutter.dev/get-started/install) (3.24+)\n- `cargo install flutter_rust_bridge_codegen --version '^2.0'`\n\n### Setup — Production stack\n\n```bash\ngit clone https://github.com/user/termex.git\ncd termex\npnpm install\npnpm tauri dev\n```\n\n### Setup — Migration stack (Flutter, WIP)\n\n```bash\ngit clone https://github.com/user/termex.git\ncd termex\n./scripts/frb-codegen.sh          # generate Dart bindings from Rust API\ncd app\nflutter pub get\nflutter run -d macos              # or -d windows / -d linux\n```\n\n### Commands\n\n| Command | Stack | Description |\n| --- | --- | --- |\n| `pnpm tauri dev` | Tauri | Start dev server with hot reload |\n| `pnpm tauri build` | Tauri | Build production app |\n| `pnpm dev` | Tauri | Start frontend dev server only (Vite) |\n| `pnpm run build` | Tauri | Type-check + build frontend |\n| `cd src-tauri \u0026\u0026 cargo test` | Tauri | Run Rust tests |\n| `cd src-tauri \u0026\u0026 cargo clippy` | Tauri | Lint Rust code |\n| `cargo test --workspace` | Both | Run all Rust tests across workspace |\n| `./scripts/frb-codegen.sh` | Flutter | Regenerate Flutter \u003c-\u003e Rust bindings |\n| `./scripts/frb-codegen.sh --check` | Flutter | CI: verify bindings up-to-date |\n| `cd app \u0026\u0026 flutter test` | Flutter | Run Flutter unit/widget tests |\n| `cd app \u0026\u0026 flutter analyze` | Flutter | Static analysis |\n| `cd app \u0026\u0026 flutter build macos --release` | Flutter | Build Flutter production binary |\n| `pnpm version:bump patch` | Both | Bump version (patch/minor/major/x.y.z) |\n\n### Debug \u0026 Launch\n\n```bash\n# Full-stack development (frontend + Rust backend with hot reload)\npnpm tauri dev\n\n# Frontend only (no Rust backend, useful for UI work)\npnpm dev\n\n# Run Rust backend tests\ncd src-tauri \u0026\u0026 cargo test\n\n# Run with verbose Rust logging\nRUST_LOG=debug pnpm tauri dev\n\n# Build production binary\npnpm tauri build\n\n# Build in debug mode (faster compile, larger binary)\npnpm tauri build --debug\n```\n\n### Version Release\n\n```bash\n# Semantic version bump (syncs package.json, Cargo.toml, tauri.conf.json)\npnpm version:bump patch         # 0.1.0 → 0.1.1\npnpm version:bump minor         # 0.1.0 → 0.2.0\npnpm version:bump major         # 0.1.0 → 1.0.0\npnpm version:bump 0.2.0         # explicit version\n\n# Commit and tag\ngit add -A \u0026\u0026 git commit -m \"chore: release v0.2.0\"\ngit tag v0.2.0\ngit push origin main --tags     # triggers GitHub Actions build\n```\n\n## Roadmap\n\n### Shipped\n\n- [x] v0.1.0 -- MVP (SSH + Terminal + Server Management + Encrypted Storage)\n- [x] v0.2.0 -- SFTP File Browser\n- [x] v0.3.0 -- Port Forwarding + Config Export/Import\n- [x] v0.4.0 -- Theme System + Settings Persistence + UX Polish\n- [x] v0.5.0 -- AI Core: Danger Detection + Command Explanation\n- [x] v0.6.0 -- AI Advanced: NL2Cmd + Smart Autocomplete\n- [x] v0.7.0 -- Session Recording + Server Monitoring\n- [x] v0.8.0 -- Plugin System + Extensibility\n- [x] v0.9.0 -- Stable Release\n- [x] v0.10.0 -- OS Keychain Security (credential protection)\n- [x] v0.11.0 -- Local AI Models (llama-server, 12 GGUF models, fully offline)\n- [x] v0.12.0 -- SSH ProxyJump \u0026 Bastion (multi-level jump, connection pooling, SSH Agent)\n- [x] v0.13.0 -- SFTP Enhancement (context menu, clipboard ops, chmod, file info)\n- [x] v0.14.0 -- Font Management (6 built-in fonts, custom upload, live reload)\n- [x] v0.15.0 -- Terminal Search (in-terminal + keyword highlighting + cross-tab)\n- [x] v0.16.0 -- Custom Keybindings (record mode, conflict detection, persist)\n- [x] v0.17.0 -- Server-to-Server SFTP (direct file transfer between remotes)\n- [x] v0.18.0 -- Network Proxy (SOCKS5/4, HTTP/HTTPS CONNECT, mTLS, proxy+bastion chain)\n- [x] v0.19.0 -- SFTP Per-Tab (per-tab instances, layout switching, CWD sync)\n- [x] v0.20.0 -- Tor Proxy + tmux Sessions + Git Auto Sync\n- [x] v0.21.0 -- SSH Dynamic Port Forwarding (SOCKS5 proxy, `ssh -D`)\n- [x] v0.22.0 -- ProxyCommand (Cloudflare Tunnel, custom transport)\n- [x] v0.23.0 -- Portable Mode (USB drive, data relative to exe)\n- [x] v0.24.0 -- Connection Chain (multi-hop any-order, SOCKS5 exit routing)\n- [x] v0.25.0 -- Security Compliance (GDPR / ISO 27001 / GB/T 22239, audit logging)\n- [x] v0.26.0 -- AI Smart Autocomplete (inline ghost text, context-aware, local AI priority)\n- [x] v0.27.0 -- **SSH Config Import + Snippet Manager** (one-click `~/.ssh/config` import, command snippets with variable templates, quick palette)\n- [x] v0.28.0 -- **Server Monitoring Dashboard** (real-time CPU/Memory/Disk/Network via SSH exec, process Top N, sparkline charts, threshold alerts)\n- [x] v0.29.0 -- **Session Recording + AI Summary** (asciicast v2 record/playback, speed control, AI-generated session summary)\n- [x] v0.30.0 -- **Team Collaboration v1** (Git-based config sharing, team encryption, selective sharing, role-based access)\n- [x] v0.31.0 -- **AI Operations Assistant** (context-aware chat, error auto-diagnosis, multi-turn troubleshooting, command orchestration)\n- [x] v0.32.0 -- **Terminal Split Pane** (horizontal/vertical split, broadcast input to all panes, focus navigation)\n- [x] v0.33.0 -- **Cloud Native Integration** (kubectl exec, AWS SSM, K8s pod browser, container log streaming)\n\n### Desktop — Planned\n\n- [ ] v0.34.0 -- **Team Collaboration v2** (fine-grained role permissions, audit dashboard, conflict resolution UI)\n- [ ] v0.35.0 -- Desktop v1.0 Stable (performance optimization, stability polish)\n- [ ] v0.53.0 -- **macOS Code Signing \u0026 Notarization** (signed/notarized DMG via Apple Developer ID, no xattr workaround needed)\n\n### Mobile — Planned\n\n- [ ] v0.40.0 -- Mobile Foundation (Tauri mobile init, minimal SSH client on iOS/Android)\n- [ ] v0.42.0 -- Mobile Server Management + SFTP + Cross-Device Sync\n- [ ] v0.44.0 -- Mobile AI + Native Keychain (iOS Keychain / Android Keystore)\n- [ ] v0.46.0 -- Mobile Polish + App Store / Google Play Release\n\n## Contributing\n\nContributions are welcome! Please open an issue before submitting large PRs.\n\n## License\n\n[MIT](LICENSE)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzouwei%2Ftermex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzouwei%2Ftermex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzouwei%2Ftermex/lists"}