CozySSH is a lightweight, mobile-friendly, full-fledged & self-hosted web-based SSH client and terminal multiplexer. It allows you to manage multiple SSH sessions and local shells from a single, modern web interface. It's intuitive and easy, ready to use out of the box, while also having advanced features and being highly configurable & extensible. It's core functions can be extened via CozySSH Plugins.
- Use Host SSH Config: It uses the host OpenSSH client config files (
~/.ssh/id_ed25519,~/.ssh/known_hosts,~/.ssh/config) directly for ssh auth & server management.- It automatically displays plain text (non hashed name) servers of
~/.ssh/known_hosts. It's recommended to disable known_hosts name hashing feature globally by modifying/etc/ssh/ssh_config:Host * HashKnownHosts no
- It automatically displays plain text (non hashed name) servers of
- Modern UI: A sleek, concise, yet full-fledged UI based on React and Material UI.
- High-contrast Light Theme: Designed for readability.
- Multi-Tab Interface: Run multiple concurrent SSH sessions and local shells in a single browser tab.
- Split Screen Window: Display multiple ssh servers in single split-screen tab. View up to 4 terminal panes in a single tab.
- Broadcast Mode: Synchronize keyboard input across multiple panes or tabs simultaneously.
- Broadcast to Current Tab Panes:
Ctrl + Shift + Itoggles broadcasting keyboard input to all panes in the active tab. - Broadcast to All Tabs & Panes:
Ctrl + Alt + Shift + Itoggles broadcasting keyboard input across all open tabs and their panes. - Clear Visual Clues: High-visibility floating HUD banner, glowing colored borders (solid amber/red for active source pane, dashed for receiving target panes), pane-level corner badges (
BROADCASTING/RECEIVING), tab header antenna indicators, and clickable TabBar status badge.
- Broadcast to Current Tab Panes:
- New Tab Dialog: Powerful "New Tab Dialog" (shortcut:
Alt + O) to quickly create new session, navigate opened tabs, or execute custom button. Inspired by Notion New Tab dialog. - Button Bar: A scrollable toolbar at the bottom of the terminal window for quickly sending string to terminal or executing custom function. Inspired by SecureCRT Button Bar.
- Button Types: Button can be configured to any of the below functions.
- Send String: Send custom string to current terminal. Support sending control keys via
<ctrl-x>syntax (e.g.,<ctrl-c>for SIGINT), which are sent with precise timing to ensure they reach the shell correctly. - Built-in Functions: Lots of pre-defined actions to control the terminal or the frontend.
- Open Terminal: Open specific terminal(s), optionally with custom parameters & options.
- Run Script: Run custom script to archive any desired effect. See Scripts Documentation.
- Send String: Send custom string to current terminal. Support sending control keys via
- Full Shortcut Support: Buttons support keyboard shortcut invocation.
- Direct Shortcut : Built-in
alt + shift + 1-9,0shortcut to invoke the first 10 buttons of current button group. - Custom Shortcut : Assign arbitrary custom shortcut (e.g.
ctrl+shift+m) for any button.
- Direct Shortcut : Built-in
- Autorun:
Open TerminalandRun Scriptbutton can be set to auto-run on frontend page load.
- Button Types: Button can be configured to any of the below functions.
- Mobile-Friendly: All features can be accessed seamlessly from mobile browser.
- Responsive sidebar and layout.
- Mobile Input Toolbar: Quick access to
Ctrl,Alt,Esc,Tab,Arrow keyson mobile device. Click...to access more special chars from on-screen keyboard area. - Keyboard-Aware Viewport: Automatically resizes to fit your visible mobile screen perfectly even when the on-screen keyboard is active.
- Gesture Support : Swipe left / right to switch tab in mobile browser.
- Accident-Proof Forms: All "Add / Edit" dialogs prevent accidental closure via backdrop click if any data has been modified.
- SFTP & Local File Management: π
- SFTP & Local File Browser: Browse, upload, download, filter or edit files directly from your terminal tabs.
- Split View: Access the file browser via the terminal tab's context menu without losing your shell session.
- Text File Editor: Edit text file of SFTP / local server directly in Browser.
- Shell Integration: Built-in Shell Integration features including cwd detection, cmd history, copy last command output and more. An button in File Browser to navigate to shell cwd (
$PWD) directly. In newer Linux systems (Ubuntu 26.04+ / Debian 14+) it uses the OS scope systemd 158+ OSC 3008 sequence; For older Linux systems, it automatically injects VS Code compatible OSC 633 shell integration script into the session on connected. So everything should just works. - Full keyboard Shortcuts: It supports a complete set of keyboard shortcuts.
- Note: in Mac, by default
Commandkey (JavaScript KeyboardEventev.metaKey) is recognized asAlt(Originally theOptionkey); and vice versa. So pressCommand + Oin Mac is recognized asAlt + Oshortcut. Alt + O: Open new tab dialog, useβ β(orAlt + H/L) to switch view,β β(orAlt + J/K) to select,Enterto open,Alt + Enterto open in current tab,Ctrl + Enterto open in new window,Shift + Enterto edit selected host,Alt + Shift + Enterto input selected host into filter. UseAlt + Dto delete a recent item;Alt + Backspaceto clear the filter. UseAlt + ββ(orAlt + Shift + J/K) to jump through items quickly; HoldCtrlto jump to top/bottom.Ctrl/Alt + Mouse Clickis same asClt/Alt/Shift + EnterAlt + A: Open new tab dialog - tabs viewAlt + E / Ctrl + Shift + P: Open new tab dialog - buttons viewAlt + P: Open new tab dialog - tags viewAlt + :: Open new tab dialog - tunnels viewAlt + ?: Open new tab dialog - all viewShiftholded withAlt + O/A/E/P/:/?: Same asAlt + O/A/E/P/:/?but preserve last input filter valueAlt + N: Open new default local shell tab; HoldCtrlto open in current tabAlt + Shift + N: Open new alternative local shell tab; HoldCtrlto open in current tabAlt + S: Open scratchpadAlt + H / Alt + L: Switch to previous / next paneAlt + Shift + H / Alt + Shift + L: Switch to previous / next tabAlt + 1-9,0: Switch to tab 1-9, last tabAlt + C: Clone active pane in new tabAlt + Shift + C: Clone active pane in same tab (Max 4 panes per tab)Alt + W: Close active paneAlt + Shift + W: Close active tabCtrl + Alt + Shift + W: Close other tabsCtrl + Alt + Shift + L: Toggle Lock/Unlock current tabCtrl + Shift + I: Toggle broadcast keyboard input to all panes in current tabCtrl + Alt + Shift + I: Toggle broadcast keyboard input to all tabs & panesAlt + I: Focus sidebar search filter and clear current value, then useβ βto select,Enterto open (or toggle group expandness),Alt + Enterto open in current tab,Ctrl + Enterto open in new window (or toggle group and all sub-groups expandness),Shift + Enterto open context menu.Ctrl/Alt + Mouse Clickis same asCtrl/Alt + Enter,Shift + Mouse Clickto edit host.Alt + Shift + I: Focus sidebar search filter but preserve current valueCtrl + Alt + Backquote: Toggle sidebar tags section expandnessCtrl + Alt + 1/2/3: Toggle sidebar fav/all/auto section expandnessCtrl + Alt + G: Toggle sidebar all groups expandnessAlt + G: Focus active terminal sessionAlt + Shift + G: Focus the first pane of the active tabAlt + Q: Open input dialogAlt + Shift + Q: Open input dialog and preserve last form valuesAlt + V / Alt + Shift + V: Switch to next / previous group in button bar. HoldCtrlto include hidden groupsAlt + Shift + 1-9,0: Click the button in button barAlt + J / Alt + K: Scroll terminal down / up by a few linesAlt + Shift + J / Alt + Shift + K: Scroll terminal down / up by a pageCtrl + Alt + J / Ctrl + Alt + K: Scroll terminal to bottom / topAlt + Enter: Toggle fullscreen of main terminal areaAlt + Backquote: Close any modal (Dialog / Menu / Popover). Similar toEscapebut works even if terminal is in fullscreen modeAlt + Shift + Backquote: Force close all modals. Also close all toasts.Alt + - / Alt + +: Decrease / increase terminal font sizeAlt + Shift + - / Alt + Shift + +: Decrease / increase global & terminal font sizeCtrl + Alt + 0: Reset to default global / terminal font size (14 / 15px)Ctrl + Shift + F: Open terminal search boxCtrl + Shift + R: Reconnect current terminalCtrl + Shift + C: Copy selected text in terminalCtrl + Shift + V (Windows) / Cmd + V (Mac): Paste into terminalCtrl + Alt + R: Refresh data from backendCtrl + Alt + Shift + R: Force clear service worker, cache and reloadMouse Selectin terminal to copyMouse Right Clickin terminal to pasteMouse Middle Clickon a tab to close itAlt + Mouse Clickin terminal to move cursor to mouse positionAlt + Mouse Wheelin terminal to fast scroll up / downShift + Mouse Clickon a button in button bar to edit it;Ctrl/Alt + Mouse Clickon a "Open Terminal" type button to open it in new window / current tab;Ctrl + Mouse Clickon a "Send String" type button to open it in "Terminal Input" dialog,Alt + Mouse Clickon it to copy contents to clipboardCtrl + Mouse Clickon backdrop of modal dialog to force close itCtrl + Shift + M: Enter terminal mark mode (smiliar to Windows Terminal mark mode)
- Note: in Mac, by default
- Advanced SSH Management: π
- ProxyJump Support: Full support for OpenSSH standard
ProxyJumpconfiguration, allowing you to connect to hosts via intermediate jump servers. - RemoteCommand Support: Support ssh_config
RemoteCommandconfiguration, execute a custom command on the remote ssh server after successfully connecting to it. - Tunnels Support : Support ssh_config
LocalForward,RemoteForward&DynamicForwardtunnels configuration. - Tagging System: Organize your hosts using
### #tagcomments in your~/.ssh/config. Tags are fully filterable in the sidebar. - Grouping System: It uses special
g-foo/barsyntax tag to organize hosts by nestable groups. The sidebar display grouped servers in tree view.
- ProxyJump Support: Full support for OpenSSH standard
- Local Shells: Open local shell tab. It automatically discovers and displays list of local system installed / available shells.
- Terminal UX Enhancements:
- Heartbeat & Keep-Alive: Automatic SSH session background heartbeat (
keepalive@openssh.com) every 30 seconds ensures stable connections and prevents idle timeouts. - Manual Reconnection: If a terminal session is lost or "stolen" by another browser instance, simply press Enter to instantly reconnect.
- Auto-copy: Selected text is automatically copied to your clipboard.
- Right-click Paste: Quickly paste clipboard contents into any active terminal session.
- Selection Highlighting: Clear visual feedback for selected text.
- Interactive Verification: Full support for interactive Host Key verification and Keyboard-Interactive (Password) authentication.
- Smart Resize logic: Optimized terminal resizing that preserves shell prompt integrity when switching between multiple active tabs.
- Tab Pinning & Persistence:
- Persistent Sessions: Right-click any tab and select "Pin Tab" to keep the terminal session (PTY or SSH) running in the background even if you close your browser or navigate away.
- Output Buffering: Pinned sessions maintain a circular output buffer (approx. 50KB), ensuring you see the most recent activity immediately upon reconnection.
- Usage-Aware Auto-Restore: Pinned tabs automatically resume when you re-open CozySSH, but only in the primary window to prevent duplicate UI clutter.
- Lock Tab: Tabs can be locked, which works similar to pinning but also prevent accidental closing.
- Heartbeat & Keep-Alive: Automatic SSH session background heartbeat (
- Scratchpad feature: Open a "Scratchpad" text editor tab to write your notes or paste some configuration commands or other text. All data is auto-saving and cached in browser localStorage and automatically synced with and persisted in backend.
- Secure by Default:
- Stateless Authentication: HMAC-SHA256 token-based authentication with a simple App Password.
- Non-Local Restriction: Automatically blocks access from non-local, non-HTTPS environments to prevent credential sniffing.
- Password Management: Reset your application password anytime via the CLI using the
-do-reset-passwordflag.
- Custom Scripting: Fully programmable / extendable via a built-in powerful & TypeScript-capable scripting engine. See Scripts Documentation. It also has a Plugins Repository which includes many official scripts/plugins that can be installed directly from CozySSH frontend.
- Self-Hosted & Easy to deploy: Distributed as a single Go binary that embeds the entire React frontend.
Download from GitHub Releases and put cozyssh binary to any location.
Run the CozySSH binary:
./cozysshOn first run, CozySSH will generate a default configuration file at ~/.config/cozyssh/config.json with an initial random App Password. Check the terminal output to find the initial password. The app password can be changed in UI. If you forget your app password, you can reset it to a new random value by running cozyssh -do-reset-password.
CozySSH listens on 127.0.0.1:8022 by default. By default, CozySSH can only be accessed from localhost hostname (e.g. http://localhost:8022 ) or from a https origin by running CozySSH behind a TLS enabled reverse proxy (like Traefik or Nginx) and / or CDN provider (like Cloudflare). Start cozyssh with -allow-insecure-http flag to lift the restriction.
Example Traefik config to run as a reverse proxy for CozySSH (toml)
[core]
defaultRuleSyntax = "v2"
[entryPoints.websecure]
address = ":443"
[[tls.certificates]]
certFile = "/certs/example.com.pem"
keyFile = "/certs/example.com.key"
[http.routers.cozyssh]
rule = "Host(`cozyssh.example.com`)&&PathPrefix(`/`)"
service = "cozyssh"
[http]
[http.services]
[http.services.cozyssh]
[http.services.cozyssh.loadBalancer]
[[http.services.cozyssh.loadBalancer.servers]]
url = "http://127.0.0.1:8022/"CozySSH stores its settings in ~/.config/cozyssh/config.json. The default ~/.config/cozyssh path can be changed by running CozySSH with -config <dir> command line flag. CozySSH stores all app data (excluding OpenSSH data) here. See docs/DATA.md for more details.
You can run CozySSH as a systemd service.
Example cozyssh.service systemd service file:
# Put this file to `/etc/systemd/system/cozyssh.service`
# Put `cozyssh` binary to `/usr/bin/cozyssh`
# Run `systemctl enable --now cozyssh` to enable & start the service
[Unit]
Description=cozyssh
[Service]
Type=exec
User=root
WorkingDirectory=/root
ExecStart=/usr/bin/cozyssh
Restart=always
[Install]
WantedBy=multi-user.target
CozySSH aims to behavior the same way as standard OpenSSH client. But it still has lots of quirks:
Host *pattern or any other pattern which includes special chars (like*,!) is ignored.- Only
~/.ssh/configconfig file is used. CozySSH doesn't read/etc/ssh/ssh_config, nor does it readInclude *.confdirective introduced sub-config files. - Only one identity file is supported for each host. If host
IdentityFileis not set, CozySSH use~/.ssh/id_ed25519(if exists) of~/.ssh/id_rsaautomatically. - SSH Agent protocol and relative directives are not supported at this time.
- ssh_config directives
TOKENSexpansion is limited, only basic tokens are supported. - Only
RemoteCommandbut notLocalCommandis suuported. - Only
ProxyJumpbut notProxyCommandis supported at this time.
- Go 1.25+ (for building the backend)
- Node.js v24 & npm (for building the frontend)
Older versions of Go or Node.js may also work but I didn't test them.
# Build the frontend
npm --prefix frontend install
npm --prefix frontend run build
# Build the Go binary
go buildSee docs/TEST.md.
Some files are generated by scripts.
frontend/csapi.d.ts: The custom scripting API TypeScript definitions. It's used by CozySSH Plugins. CozySSH itself doesn't use this file. Generated bynpm --prefix frontend run gen-csapi.frontend/src/api.ts: The Go backend API TypeScript definitions. The frontend uses this file. Generated bygo run github.com/tkrajina/typescriptify-golang-structs/tscriptify@latest -interface -package=cozyssh/models -target="frontend/src/api.ts" models/models.go.
BSD 3-Clause License - See the LICENSE file for details.








