qsh is a terminal-based tool designed to manage SSH port-forward tunnels with a polished, zero-idle-CPU terminal UI (TUI). It serves as the command-line counterpart to QuickSSH, the Electron-based desktop application, sharing the same configuration file for seamless integration.
Key Features:
Zero Idle CPU Usage: Built on Bubbletea, qsh renders only when state changes, ensuring minimal resource consumption.
Cross-Platform Support: Available on Windows, macOS, Linux, and other platforms via winget or package managers.
Seamless Configuration Sync: Shares the exact same config.json as QuickSSH, allowing aliases and settings to stay in sync across both applications.
Interactive SSH Sessions: Supports direct SSH connections with full terminal capabilities by leveraging native system calls.
Audience & Benefit:
Ideal for developers, DevOps engineers, and anyone managing SSH tunnels who need a lightweight, efficient alternative to desktop applications. qsh offers the benefit of running anywhere a terminal is available, without the overhead of Electron or Node.js, making it perfect for environments like tmux sessions, remote servers, or constrained devices.
qsh can be installed via winget on Windows, providing an easy and consistent way to deploy this powerful tool across your development environment.
README
QuickSSH Terminal
Terminal-resident equivalent of QuickSSH (the Electron version). Same SSH port-forward tunnels, same JSON config file - but a polished, idle-zero-CPU TUI built on Bubbletea + Lipgloss instead of Electron + React.
> Looking for the GUI version? See allenbijo/QuickSSH - the original Electron app this TUI mirrors. Both share the same config.json, so aliases created in one show up in the other.
Why a TUI port?
No Chromium/Node runtime in memory.
Lives over SSH, inside tmux, on a Raspberry Pi - anywhere you have a terminal.
Renders only when state changes (Bubbletea is Msg-driven, not FPS-driven), so idle CPU is 0 %.
Reads and writes the same config.json as the Electron app, so aliases, settings, and SSH host names stay in sync across both.
Install
Pre-built binary (no Go required)
macOS / Linux
curl -fsSL https://github.com/allenbijo/QuickSSH-terminal/releases/latest/download/install.sh | sh
> Whichever channel you use, the resulting command is qsh. Run it from any terminal.
Manual - grab the archive for your platform from the Releases page, unzip, drop the binary anywhere on your PATH.
From source
The build needs Go 1.22 or newer.
One-shot via go install
go install github.com/allenbijo/QuickSSH-terminal/cmd/qsh@latest
This places qsh in $(go env GOBIN) (defaults to ~/go/bin). Make sure that directory is on your PATH.
Manual build
git clone https://github.com/allenbijo/QuickSSH-terminal
cd QuickSSH-terminal
go mod tidy
go build -o qsh ./cmd/qsh
Cross-compile examples:
# from Windows for Linux
$env:GOOS="linux"; $env:GOARCH="amd64"; go build -o qsh ./cmd/qsh
# from Linux/macOS for Windows
GOOS=windows GOARCH=amd64 go build -o qsh.exe ./cmd/qsh
The 2.5 s connection heuristic, 10 s health-check, and SIGTERM-then-SIGKILL teardown mirror the original. On Windows it uses taskkill /T /F /PID since SIGTERM isn't POSIX there.
Interactive sessions - Pressing h on an alias calls tea.ExecProcess(exec.Command("ssh", "-t", "-t", host)), which suspends the TUI, hands the user a real native SSH session (full color, mouse, resize, scrollback, nested TUIs), and resumes the TUI on exit. There is no PTY emulation layer.
Rendering - Bubbletea only redraws on a Msg. The manager fans tunnel status changes into a chan StatusEvent that the TUI consumes via a recursive tea.Cmd; the health-check goroutine emits a Msg only when a status actually changes. Idle CPU is 0 %.