MyTerm is an SSH-first desktop operations workspace inspired by XTerminal. It focuses on the daily loop of connecting to servers, opening terminal tabs, moving files, checking host state, and routing through proxies without turning the app into a cloud sync product.
| Workflow | Status | Notes |
|---|---|---|
| SSH connection manager | Stable path | Password, explicit private key path, ssh-agent, and default private keys. |
| Terminal tabs | Stable path | xterm.js terminal sessions inside a Tauri desktop shell. |
| SFTP from terminal | Stable path | File operations launch independent SSH sessions for blocking work. |
| Host monitoring | Stable path | Monitoring launched from an active terminal tab with separate SSH collection. |
| Outbound proxy | Stable path | HTTP CONNECT, SOCKS5, and ProxyJump through SSH direct-tcpip. |
| Extra tool views | Experimental | Notes, quick commands, import/export, local terminal, Telnet, RDP launcher, port forwarding. |
Cloud sync is intentionally not implemented.
- Tauri 2 + Rust
- React 19 + TypeScript + Vite
- Zustand for client state
- xterm.js for terminal rendering
- ssh2 for SSH/SFTP
- SQLite via rusqlite
Install dependencies:
npm installRun the frontend only:
npm run devRun the desktop app in development mode:
npm run tauri devDevelopment mode starts a local Vite server, so it occupies a localhost port. Packaged desktop builds do not need that development port.
The app does not need to listen on a public port for normal SSH terminal, SFTP, monitoring, or outbound HTTP/SOCKS5 proxy workflows. Local listening is only needed for development server mode and features that intentionally expose a listener, such as local or dynamic port forwarding.
The desktop app writes runtime logs to the Tauri app data directory as myterm.log. The log includes startup, connection CRUD, SSH connect/disconnect, SSH outbound proxy and ProxyJump setup, SFTP operations, monitor fetches, and port-forward lifecycle events with operation IDs and elapsed times.
Default level is info. Use MYTERM_LOG=debug or MYTERM_LOG=trace before launching the app when deeper troubleshooting is needed.
Logs intentionally do not record passwords, private key contents, or terminal input bytes.
Frontend build:
npm run buildRust check:
cd src-tauri
cargo checkRust tests:
cd src-tauri
cargo testmacOS package build:
npm run tauri -- buildIn this automation environment the standard DMG bundler can fail when Finder AppleScript times out. The release binary and .app are still produced under src-tauri/target/release. A verified fallback is to clean stale rw.*.dmg files and run the generated bundle_dmg.sh with --skip-jenkins; the resulting DMG is written to src-tauri/target/release/bundle/dmg/.
Real SSH connectivity smoke test:
ssh -o BatchMode=yes -o ConnectTimeout=10 -p 17244 wayserver@103.112.184.13 'echo MYTERM_SSH_OK && uname -a && pwd'The test server is for runtime validation only. Do not commit passwords, private keys, or generated local connection databases.