Open-source · Local-first · Windows · macOS · Linux

The SSH client that
does a whole lot more.

Infra Companion is a modern, local-first desktop SSH client — everything you love about Termius, plus broadcast, bulk execution, agentless monitoring, zero-knowledge sync, an AI assistant, a plugin system, and now a local PHP/WordPress dev stack.

Free & open-source · v0.2.4 · Grab an installer from Releases — or build from source: git clone https://github.com/xShiroeNguyenx/infra-companion && pnpm install && pnpm dev

web cluster — 2 panes 📡 BROADCAST ON
● deploy@web-01
deploy@web-01:~$
● deploy@web-02
deploy@web-02:~$
Everything in one window

Powerful by default

From a single SSH session to broadcasting commands across a whole cluster — without leaving the app.

🔑

SSH, your way

Password, SSH key (ed25519/RSA/ECDSA), OS agent (incl. FIDO2), or a secrets-manager reference.

🪜

Jump host chains

Multi-hop ProxyJump (ssh -J), each hop verified and prompted independently.

🎬

Login scripts

Automate su → ssh or nested SSH with encrypted expect/send steps — re-runs on reconnect.

♻️

tmux resume

Wrap a session in tmux so it survives drops and reattaches automatically when you reconnect.

📡

Multi-pane + Broadcast

Split into panes and type once to run on every pane at the same time.

📁

SFTP

Dual-pane file manager, edit remote files locally (auto-upload on save), even over nested SSH.

🔀

Tunnels

Local, Remote, and Dynamic (SOCKS5) port forwarding, sorted by name — pin the dashboard to a tab or detach it into an always-on-top window while your DB client covers the app.

🖥️

Remote desktopNEW

VNC embedded in a tab (noVNC) and RDP over an SSH tunnel — both reach targets through your jump hosts.

Bulk execution

Run one command across N hosts in parallel and group by output to spot the odd one out.

📊

Monitoring

Agentless CPU / RAM / disk / uptime over SSH, refreshed every 3 seconds.

🔁

MySQL replication

One master and all its slaves on one screen: real lag plus the binlog byte gap, and a copy-paste runbook for every problem it finds.

🅰️

Font pickerNEW

Choose from the fonts actually installed on this machine — or add a .ttf you downloaded, no OS install needed. It warns when your font isn't really there or isn't monospace.

🏠

Dashboard homeNEW

Every tool one click away as icons, host groups as cards showing which machines are up, plus recent connections, workspaces and tunnels.

🛠️

Network toolbox

Ping, DNS lookup, and common-port scan — runs locally, no SSH required.

🔒

E2EE sync

Zero-knowledge sync of your vault through any shared folder — the backend never sees plaintext.

🤖

AI assistant

Claude, OpenAI, Gemini, or local Ollama: generate commands, explain output, and a step-by-step read-only troubleshooter you approve.

🗝️

Secrets manager

Store a reference, not a password — fetched from 1Password / Bitwarden / Vault at connect time.

⏯️

Session recording

Record sessions as asciicast v2 and replay with seek bar and 1×–8× speed.

🧩

Plugin systemNEW

Extend the app with trusted JavaScript plugins running in an isolated worker.

🎨

Theme studioNEW

Recolor the full UI palette per theme and export / import themes as JSON.

Favorite hostsNEW

Pin the hosts you use most to a Favorites section at the top of the sidebar.

🖱️

Mouse copy / paste

Select then left-click the highlight to copy; right-click to paste — alongside the usual shortcuts.

🧱

Local dev stackNEW

Run your PHP / WordPress sites locally instead of Laragon or XAMPP: the app downloads and supervises its own PHP, Nginx and MariaDB, serves sites at *.localhost with no hosts file and no admin rights, and provisions a database per site.

🎯

Domain → serverNEW

Test one machine in a load-balanced cluster without editing your hosts file: a browser window with a DNS override scoped to that window — HTTPS still validates, and you can open every server side by side.

See it in action

One window, many superpowers

A peek at a few of the built-in tools — no extra apps, no context switching.

Bulk Executiondf -h / · 5 hosts
4 hosts · same output
web-01/dev/sda1  41% used
web-02/dev/sda1  41% used
web-03/dev/sda1  43% used
web-04/dev/sda1  40% used
1 host · differs
db-01/dev/sda1  92% useddiffers?
📊Monitoringlive · every 3s
web-01up 27d
CPU0.32
RAM74%
Disk41%
db-01up 5d
CPU1.40
RAM91%
Disk92%
📁SFTPweb-01
Local · ~/project
📁 dist
📁 src
📄 deploy.sh
📄 .env
Remote · /var/www
📁 releases
📁 shared
📄 nginx.conf
📄 index.html
🔀Tunnels3 active
L 13306→ 127.0.0.1:3306 (MySQL)Running
D 1080SOCKS5 proxy via gate-01Running
L 18080→ 10.0.0.5:8080 (admin UI)Running
R 9000→ localhost:9000Stopped
🖼️Background imagelocal file or URL · Drive / Dropbox
● deploy@web-01
deploy@web-01:~$ uptime
14:02:51 up 27 days, load average: 0.18, 0.22, 0.20
Opacity 25% Blur 4px Fit Cover Position Center
🧩Plugins↻ Rescan · 📂 Open folder
🧩Hello World v1.0.0ActiveReloadDisable
🧩Output Highlighter v1.0.0ActiveReloadDisable
🧩Deploy Notifier v0.2.0ActiveReloadDisable
Operate at scale

Broadcast once, run everywhere

Merge every open tab into split panes with one click, flip on Broadcast, and your keystrokes go to all of them. Perfect for cluster maintenance and side-by-side debugging.

  • Open a group as panes — one click opens every host in a group, ready to broadcast.
  • Merge ⇄ split — combine tabs into one toolbar; scrollback is preserved.
  • Works through login scripts — commands land on the inner host, not the gate.
# broadcast to web-01 + web-02 $ sudo systemctl restart nginx ✓ web-01 active (running) ✓ web-02 active (running)
// my-plugin/index.js module.exports.activate = (api) => { api.commands.register('hi.say', 'Say hi', async () => { await api.ui.showPanel({ title: 'Hello', markdown: '# Hi 👋\nIt **works**.' }) }) }
Make it yours

Extend with plugins

Drop a trusted JavaScript plugin into a folder and it runs in an isolated Node worker — a crash can't take down the app, and it only reaches the app through a controlled API (never the vault).

  • Add Command Palette commands & markdown panels
  • Observe terminal output and write to a session for light automation
  • Rescan picks up new plugins with no restart; per-plugin logs & errors

Read the Plugin docs →

Less typing, fewer mistakes

An AI that speaks your shell

Describe what you want in plain language and get a ready-to-review command — it's inserted, never auto-run. Paste a confusing command or error and get a clear explanation. Bring your own key, or keep it 100% local with Ollama.

Claude OpenAI Gemini Ollama (local)
# "find the 5 biggest files in /var/log" $ du -ah /var/log | sort -rh | head -5 # ↵ Insert into terminal — you press Enter
Local-first & private

Your secrets stay yours

No account, no telemetry, no cloud lock-in. Everything is encrypted on your machine.

🛡️

Encrypted vault

Master password → argon2id → AES-256-GCM field-level encryption. Auto-lock after idle; unlock with Windows Hello / Touch ID.

🕵️

Zero-knowledge sync

Only an encrypted blob ever leaves your machine. The shared folder/backend never sees a single plaintext secret.

🧱

Isolated plugins

Plugins run in a separate worker and can't read the vault or secrets — a misbehaving plugin can't crash the app.

Ready when you are

Bring your whole fleet into one terminal

Free and open-source. Download an installer for your OS, or clone the repo and run it from source — connect your first host in seconds.