sshs3 Docs
v0.9 sshs3.com ↗ GitHub ↗

Terminal, Split Panes & Ergonomics

Core Workspace Target Platforms: Linux, Windows, macOS Last Updated: 2026-10-25 10:40
Real OpenSSH process via node-pty, Konsole-style recursive splits, path hover cards, managed SSH_AUTH_SOCK for local shells, and snippets.

The terminal engine in sshs3 pairs hardware-accelerated web rendering via xterm.js with your operating system's native OpenSSH client process via node-pty. Unlike clients relying on JavaScript SSH emulators, all native OpenSSH options, configuration files, smartcards, and command-line habits function identically to your standard terminal.

Split Terminal Workspace
Split Terminal Workspace

1. Native OpenSSH Engine via node-pty

sshs3 executes your operating system's real ssh binary directly in an isolated pseudo-terminal (PTY). Every OpenSSH configuration directive — including ~/.ssh/config, ProxyJump, Match blocks, hardware security keys, and Kerberos/GSSAPI — works out of the box with zero emulation layers.

Terminal Capabilities At a Glance

FeatureSpecificationUser Control
Terminal EmulationANSI / VT100 / VT220 / xterm-256colorFull mouse tracking in htop, mc, tmux, nvim
Color Rendering24-bit TrueColor (RGB)Auto-adapts to Breeze, Dark, and Light themes
Font ScalingDynamic per-tab zoomCtrl++, Ctrl+-, Ctrl+0 (Reset)
Scrollback BufferDefault 5,000 lines (configurable from 500 up to 50,000 lines)Searchable in real time via Ctrl+Shift+S

Technical Architecture: PTY Allocation & Data Streaming

SSHPtyManager (src/main/ssh/SSHPtyManager.ts) allocates a pseudo-terminal through C++ bindings provided by node-pty. It spawns ssh <arguments> <host> in an isolated session. Terminal data streams pass across process boundaries via asynchronous Electron IPC channels:

  • IPC_CHANNELS.TERMINAL_DATA: Multiplexed standard output stream from PTY to xterm.js.
  • IPC_CHANNELS.TERMINAL_WRITE: Keystrokes and input events from renderer to PTY.
  • IPC_CHANNELS.TERMINAL_RESIZE: Window dimensions and column/row geometry adjustments.
Note

System Requirements: Requires an OpenSSH client binary (ssh) accessible in system $PATH. On Windows, the optional OpenSSH Client feature must be active (enabled by default in Windows 10/11).


2. Konsole-Style Recursive Split Panes

sshs3 implements non-destructive recursive pane splitting modeled on KDE's Konsole (ViewSplitter). You can divide workspace real estate horizontally and vertically without disrupting existing background processes, breaking terminal state, or losing scrollback buffers.

Recursive Split Panes
Recursive Split Panes

Split Actions & Spatial Navigation

ActionShortcutDescription
Split VerticallyCtrl+Shift+DSubdivides active pane into left and right terminals.
Split HorizontallyCtrl+Shift+ESubdivides active pane into top and bottom terminals.
Spatial 2D FocusCtrl+Shift+ArrowsMoves focus in the given direction across 2D split space.
Cycle SplitsCtrl+Shift+N / PCycles focus sequentially to Next / Previous pane in the tree.
Zoom Split PaneCtrl+Shift+ZTemporarily maximizes the focused pane; press again to restore.
Close Split PaneCtrl+Alt+Shift+WCloses the active pane (or type exit). Neighbors expand to fill space.
Close Active TabCtrl+Shift+WCloses the entire workspace tab and terminates all splits in it.

Resizing Splits & Unsplit (Close Others)

  • Resizable Dividers: Drag the divider line between any two split panes to resize them horizontally or vertically. Double-click the divider to immediately reset to an equal 50/50 split.
  • Close Other Panes (Unsplit): Click the unsplit icon on the pane's mini-toolbar or click Close others in the Split view bar to restore a single-pane layout keeping only the focused pane. If the panes being closed hold active sessions, sshs3 explicitly prompts for confirmation first because their running sessions will terminate. To temporarily focus on one pane without ending other sessions, use Zoom (Ctrl+Shift+Z).
Tip

Spatial Tab Escape: Pressing Ctrl+Shift+Up from the top row of splits moves keyboard focus directly into the Tab Bar. From there, use Left/Right to switch tabs, and press Down or Enter to return to the active terminal.

Multi-Window Workspaces (Multi-Monitor Setup)

  • Open New Window: Press Ctrl+Alt+Shift+N to open an independent sshs3 window on the monitor where the mouse pointer is located.
  • Tab Actions Menu: Press Ctrl+Alt+Shift+K (or Shift+F10 / Menu key on a focused tab) to open the Tab Actions menu, then select Move to New Window or Move to Window N.
  • Move Tab Shortcut: Press Ctrl+Alt+Shift+M to immediately detach the active tab into a new window.
  • Live Transfer: A terminal keeps running while it moves: it is the same shell or SSH connection, and the most recent ~1 MB of output is redrawn in the new window.
  • Window State Restoration: Position and size of every window, and the tabs in each, are restored on the next start. A window whose monitor is no longer connected reopens on the primary monitor.
  • Window Lifecycle: Closing a secondary window ends its sessions (prompting first when sessions are running). Closing the main window quits the application and closes all windows.

Good to Know & Limitations: Multiple Windows & Splits

  • Unsaved Editor Tabs: A tab with unsaved changes in the built-in editor cannot be moved to another window until saved.
  • Unsaved SSH Credentials: A moved SSH tab does not carry credentials that were typed interactively for an unsaved connection; reconnecting such a tab prompts for credentials again.
  • Wayland Window Positioning: On Linux Wayland sessions, the Wayland protocol prohibits client applications from reading or setting absolute window coordinates. Secondary windows open where the desktop compositor places them.
  • File Manager Tabs: When moving file manager tabs, both panes (host, folder, split) and their underlying connections are preserved. Kubernetes log views automatically re-establish log following.
  • Split Count & Columns: Splitting a terminal excessively on smaller displays can reduce column width below 40 characters, causing line wrapping in wide tabular utilities (htop, ps).

3. Interactive Path Hover Cards & Smart Detection

Hovering over any recognized file or directory path in the terminal displays an interactive Path Hover Card, allowing you to inspect, edit, or copy remote files without leaving your terminal flow.

Terminal Settings Details
Terminal Settings Details

At a Glance: Path Card Capabilities

CapabilityDescription
Instant PeekAsynchronously loads the first 3 lines, total line count, and file size over the active SSH connection.
Image ThumbnailsRenders live raster thumbnails for .png, .jpg, .jpeg, .webp, .gif, and .svg files directly in the card.
Edit FileOpens the remote file directly in the built-in CodeMirror 6 Editor without switching tabs.
Reveal in ManagerOpens the dual-pane file manager, navigates to the parent directory, and highlights the target file.
Drag & Drop HandleDrag the grip handle, file icon, or preview to drop the file directly onto your desktop or email client (up to 500 MB). For remote SSH/K8s terminals, a confirmation dialog downloads a temporary copy before dragging.

Path Detection Mechanics & Operational Filters

  • Real-Time Existence Check: Before a card opens, the path is verified over the active connection. Strings that merely look like paths (Node.js, example.com, v1.2.3, 3.5MB/s, Notes) produce no card when the file does not exist.
  • Reliable CWD Tracking: Relative paths (config/app.json) are checked only when the working directory is reliable: reported by the shell through OSC 7, or read from a local shell process via /proc/<pid>/cwd. In an SSH terminal without OSC 7, the directory can only be inferred from prompt heuristics.
  • Zero-Touch FIDO2 Multiplexing: On Linux and macOS, lookups multiplex through the terminal's active OpenSSH ControlMaster socket. Your hardware token is touched only once when connecting, never again for hover cards. On Windows, a secondary connection is opened which asks for the key.
  • Latency Protection: Any path lookup taking longer than 500 ms aborts silently to prevent sluggishness over slow WAN connections.
  • Pointer Anchoring & Edge Detection: The card never grows past the available screen room on its side of the pointer (content scrolls instead), avoiding cursor clipping or jumps.
  • Local Shells Running SSH (Linux): Hover peek is intentionally not offered when a local shell runs an external ssh command, because on-screen text belongs to the remote host while local lookups would read files from your workstation. Use a dedicated sshs3 SSH profile terminal for remote previews.
  • Trigger Mode (Ctrl-Only): Under Settings → Terminal (Show the card), select Only while Ctrl is held (Cmd on macOS) instead of When hovering over a path. Cards will only open when you deliberately hold Ctrl over a path, keeping them out of the way during text-heavy sessions.

4. Local Shells & Intelligent SSH Agent Injection

sshs3 allows opening local terminal tabs executing directly on your workstation (bash, zsh, fish, pwsh, WSL) alongside remote SSH tabs. Open one with New Terminal (Ctrl+Shift+T) and the local option, or with Open Local Terminal in an empty pane.

Local Terminal SSH Agent Management

Configure agent behavior under Settings → Terminal (Local Terminal SSH Agent):

ModeBehaviorBest Used When
Auto (Default)If Global PIN caching is enabled, local shells automatically inherit the app-wide AppAgent socket. Unlocked smartcards and FIDO2 keys are instantly available for local git, ssh, and terraform!Standard workstation workflow with hardware keys.
System OnlyStrictly inherits your desktop's pre-existing $SSH_AUTH_SOCK (e.g. gpg-agent or systemd ssh-agent) and never starts an app agent.Using an external specialized agent daemon.
DisabledCompletely unsets SSH_AUTH_SOCK and SSH_AGENT_PID in the spawned shell environment.Air-gapped or testing environments requiring zero credentials.

Technical Architecture: AgentLifecycleManager Resolution Order

When a local shell tab is spawned, AgentLifecycleManager (src/main/ssh/AgentLifecycleManager.ts) resolves credentials in this sequence:

  1. Under Global PIN caching: Injects AppAgent on a dedicated, permission-checked socket ($XDG_RUNTIME_DIR/sshs3/agent.sock with 0700 permissions). Because the socket path is stable, a shell opened before unlocking a card immediately picks up the credentials once unlocked!
  2. Inherits any running app-managed agent instance.
  3. Inherits the desktop system agent from the parent login environment.
  4. Spawns a fresh private agent daemon if none of the above are available.

5. Terminal Productivity & Power Tools

5.1 Scrollback Buffer Search (Ctrl+Shift+S)

  • Opens an overlay search bar with match count indicator (e.g. 3/6). Matches update dynamically as you type.
  • Step through occurrences forward with Enter and backward with Shift+Enter. Close with Esc.
  • Search highlights adapt automatically to Breeze, Dark, and Light themes. Stepping through matches highlights text without triggering Copy-on-Select.
  • Tip: To search inside files on the remote filesystem rather than terminal scrollback, use Search in Files (Ctrl+Shift+K, see File Manager).

5.2 Clickable URLs and File Paths (Ctrl+Click)

Hold Ctrl (Cmd on macOS) and click:

  • Web URLs: Any http:// or https:// link opens in your workstation's default browser (supported in terminals and Kubernetes log streams).
  • Remote & Local File Paths: Clicking a file or directory path in an SSH or local terminal (e.g. /var/log/syslog, ~/notes.md, src/index.ts, ./build.sh:42:7) immediately opens that folder in a file manager tab!
  • Path Resolution: Quotes and spaces are parsed cleanly. Tilde paths (~/) resolve to the user's home directory. Clicking a file without a trailing slash opens its containing parent folder.

5.3 Clean Output Copy (Ctrl+Shift+Y)

  • Copies the clean output of the previous command directly to clipboard without manual mouse highlighting.
  • Prompt Stripping: Strips Starship, Powerlevel10k, and default shell prompts, box lines (╭─, ╰─$), and git decorators.
  • OSC 133 Shell Integration: In modern shells emitting OSC 133 semantic prompt marks (fish, zsh, bash), command boundaries are 100% exact.
  • Heuristic Fallback: In shells without OSC 133, tracks command boundaries via Enter keypress markers while ignoring full-screen interactive programs (vim, less, htop).

5.4 Encrypted Clipboard History (Ctrl+Shift+R)

  • When Copy text automatically on selection is active, copied strings are stored in an encrypted ring buffer.
  • Press Ctrl+Shift+R or right-click to search and paste previous clippings (Up/Down to navigate, Enter to paste).
  • Ctrl+Shift+V, Shift+Insert, and middle-click paste directly.
  • Encrypted at rest via OS Keyring (safeStorage). If the OS keyring is unavailable, history is retained in volatile memory only. Can be scoped per connection or configured to purge on application exit.

5.5 Saved Snippets Palette (Ctrl+Shift+L)

  • Searchable palette of reusable shell runbooks. Press Enter to insert into prompt, or Ctrl+Enter to insert and execute immediately. Multi-line snippets paste as an atomic batch.
  • Supports dynamic variables: {{host}}, {{user}}, and {{date}} (formatted yyyy-mm-dd HH:mm).
  • Security Note: Snippets are stored unencrypted in snippets.json. Do not store passwords or API secrets in snippets!

5.6 Smart Drag-and-Drop: Drop-to-Upload & Paste Path

  • SSH Terminals: Dropping a file onto a remote SSH terminal activates an animated frosted drop overlay indicating the remote working directory. The file uploads via SFTP in the background, and its properly shell-quoted remote path (e.g. '/var/www/site/dump.sql') is automatically typed into the prompt upon completion.
  • Local Terminals: Dropping a file into a local shell immediately quotes and pastes the workstation path ('/home/user/Downloads/archive.tar.gz') into the prompt. On Windows, paths are pasted in double quotes (PowerShell and cmd); a path containing $, a backtick, or % is single-quoted. In WSL terminals, dropped Windows files paste as /mnt/<drive>/... paths.

5.7 Web Service & Port Forward Auto-Detection

The terminal monitors output streams for web servers and listening ports:

  • Framework Detection: Automatically detects Vite, Next.js, Django, Flask, Express, Spring Boot / Tomcat, Python http.server, Go (Gin/Fiber), and standard http://localhost:<port> / http://127.0.0.1:<port> URLs.
  • Action Banner: An interactive floating banner appears:

- SSH Sessions: Clicking Forward & Open (or Retry) spins up a background SSH local tunnel (window.multissh.sshTunnelStart) on a free local port and opens the forwarded URL in your workstation's default browser. - Local Sessions: Clicking Open in Browser opens http://localhost:<port> directly. - Kubernetes Sessions: Port detection is not offered (use the dedicated pod port forwarding view instead).

  • Custom Regex: Under Settings → Terminal, operators can provide custom regular expressions with capture group (\d+) to match proprietary server port announcements.

5.8 Re-run with sudo (Ctrl+Shift+X)

Pressing Ctrl+Shift+X offers to re-run the last command with sudo at any time, not only after an error. Furthermore, when a command fails with a permission error (cat: /etc/shadow: Permission denied, Operation not permitted, Are you root?), an action bar appears:

  • Press Enter to paste sudo <your command> onto the prompt line. You see the whole command on the real line, can edit it, and press Enter again to run it (or clear the line to cancel). sudo asks for the password in the shell as usual; sshs3 never sees it.
  • The first Enter is ignored for a moment after the bar appears to prevent accidental acceptance from rapid double-pressing.
  • Press Esc or type anything else to dismiss the prompt.
  • Safety Exclusions: Never offered for ssh, scp, sftp, rsync, git; commands starting with sudo/su/doas or NAME=value; shell builtins (cd, source, export); package managers (npm, pip, cargo where running as root pollutes home folders); commands with ;, &&, || or redirects (>, <); long output; or when you are already root (# or root@host prompt). Never shown in PowerShell or cmd.

6. Terminal Settings Reference

SettingDefaultDescription
Terminal Font Size13Base font size. Adjust dynamically with Ctrl++, Ctrl+-, Ctrl+0.
Terminal Font FamilyMonospace stackSelect from curated monospace fonts or enter a custom font name.
Cursor StyleBlockVisual cursor style: Block, Underline, or Vertical Bar.
Scrollback Buffer (lines)5000 linesRetained scrollback per pane (configurable from 500 up to 50,000 lines), searchable with Ctrl+Shift+S.
Enable file path hover previewOnShows an interactive preview card when hovering over paths that exist.
Show the cardWhen hovering over a pathOr Only while Ctrl is held. Disabling the preview above leaves Ctrl+Click path activation fully working.
Offer to re-run failed commands with sudoOnAfter a permission error, press Enter to re-run with sudo or Esc to dismiss.
Enable web service & port forward auto-detectionOnDetects web servers and listening ports in terminal output and shows a quick-forward banner.
Custom port detection regex (optional)EmptyOptional regex with capture group (\d+) to match custom port strings.
Copy text automatically on selectionOffCopies highlighted text to the clipboard and records it in encrypted history.
Clipboard history scopeGlobalGlobal (shared by all hosts and terminals) or Per host (follows the connection).
Empty clipboard history on exitOffWipes the encrypted clipboard history when sshs3 quits.
On Logout / Session EndReconnectAction when the session ends: Reconnect, close the tab, or Keep Open.
Local Terminal SSH AgentAutoSelects agent injection for local workstation shell tabs: Auto, System Only, or Disabled.
Keep ~/.ssh/config in sync with saved SSH profilesOnMaintains a marked block in ~/.ssh/config so external terminals can connect to profiles.

7. Troubleshooting & Diagnostics

Symptom / ErrorProbable Root CauseCorrective Action
Blank black terminal screenSystem exhausted PTY descriptorsCheck availability: cat /proc/sys/kernel/pty/nr. Close unneeded sessions.
Swedish / non-ASCII characters garbledRemote server locale is not UTF-8Check echo $LANG on remote host. Export UTF-8: export LANG=en_US.UTF-8.
Path click (Ctrl+Click) does nothingFile does not exist or remote CWD unavailableAbsolute paths (/...) always resolve directly. Verify directory export via OSC 7.
Clipboard history is empty"Copy text automatically on selection" is disabledOpen Settings → Terminal and check Copy text automatically on selection.