shellwing 0.1.0 is out · free and open source

The SSH client that
feels native.

Tabs, split panes, SFTP, port forwarding and an encrypted vault that syncs between your devices, in a GPU-rendered terminal built with Rust and Zig. Your local shell lives in it too.

  • macOS
  • Windows
  • Linux
  • GPL-3.0
  • No account needed

Native, all the way down.

No Electron, no web view. shellwing is a Rust app on a GPU UI framework, around the terminal core of Ghostty. It starts like a native app because it is one.

GPUIRustfrom Zed

The window, tabs, panes and every panel, drawn on the GPU by the framework the Zed editor is built on.

libghostty-vtZigfrom Ghostty

The terminal itself: Ghostty's emulator core, built from source with Zig, parsing output on its own thread.

russhRustpure Rust SSH

SSH the way OpenSSH does it, in pure Rust: no OpenSSL to install, nothing to shell out to.

Metal · DirectX · VulkanmacOS · Windows · Linux (Wayland & X11)

Full refresh rate

Smooth at your display's rate, even under a flood of output.

Off the UI thread

Parsing runs on its own thread, so a busy pane never stalls the window.

Sharp at any scale

Text stays crisp on every HiDPI scale factor, on every platform.

IME at the cursor

Input methods show the text being composed right at the cursor.

Everything you expect.
Nothing to migrate.

shellwing reads the same files OpenSSH does and signs in the same ways, so your hosts are there the first time you open it.

Your ~/.ssh/config, as is

Aliases, ProxyJump, forwards, identity files, known_hosts, agent keys, certificates and two-factor prompts. Nothing to import.

Tabs and split panes

Split a tab to the same host, drag tabs to reorder them, and type into every pane at once, like tmux synchronize-panes.

Files over SFTP

Browse, upload and download with drag and drop, rename and delete, and edit remote files in your own editor.

Port forwarding

Local, remote and SOCKS (-L, -R, -D) from the command line, a saved host, or the palette while connected.

Saved hosts

Groups, colors, favorites, tags, jump hosts and a command to run after connecting, in a plain hosts.toml.

Reconnects on its own

A dropped connection is retried with a back-off, and its port forwards come back with it.

Palette and find

One keystroke to any host, snippet, environment or note; find in the terminal and its history.

Session logs

Keep what a session printed, to read later or to attach to a ticket.

One app for your machine and your servers.

A local terminal opens in a tab beside the SSH ones, with the same speed, themes and shortcuts. Leave your old terminal app closed: shellwing does both.

  • Your own shell. $SHELL (a login shell on macOS), PowerShell 7 on Windows, or any other with local_shell: fish, nu, zsh with your config.
  • The same tools as over SSH. Split panes, find, snippets and typing into every pane work the same on this computer.
  • A real terminal. Truecolor, xterm-256color and Ghostty's emulator: vim, htop and tmux look as they should.
  • From the command line. shellwing --local opens straight into a shell; shellwing user@host into a host.

The commands, secrets and notes your servers need.

Snippets, environments, config files and notes live in the encrypted vault, sync to your other devices, and are one palette search away in any pane.

Snippet library~250 commands

Ready commands for the whole stack.

The system, systemd, the network, Docker, Kubernetes, web servers, a dozen databases, backups and clouds. Pick the ones you want, set their options and sudo, run them on the host or in a container. Anything that changes things is typed, not run, until you press Enter; passwords come from an environment, never the command.

SystemsystemdNetworkDockerKubernetesnginxPostgreSQLMySQLRedisMongoDBresticAWS
DiagnosticsLogsMaintenanceDeployBackupDatabaseDataTesting
Active queries
Largest tables
Vacuum and analyze
Restore from a dumpMakes changes
sudoin a containerAdd to my snippets
Snippets

Your commands, with blanks to fill.

{{values}} are asked when it runs. Give a snippet the environments it needs and it runs in a subshell that has them, then drops them.

pg_dump -U {{db_user}} -Fc {{database}} \
  > {{database}}-$(date +%F).dump
needs pg-prodBackup
Environments

Secrets in the shell, only when you say.

Named sets of variables, pasted from a .env. Load one into a pane from the palette: the echo goes off, the command stays out of your history, and a badge's ✕ unsets it.

aws-prod for web-01, web-02
AWS_ACCESS_KEY_ID••••••••••••
AWS_SECRET_ACCESS_KEY••••••••••••
AWS_REGION••••••
Paste a .env fileShow values · Touch ID
NotesMarkdown

Runbooks next to the servers they're about.

Markdown that renders as you type: headings, tables, task lists, code blocks. Tie a note to its hosts and the palette lists it first there. A code block's Insert types it straight into the pane; mark a note sensitive and it shows only once you confirm it's you.

Runbooksdb-primary: failoverweb: deploy checklistRotating the TLS certHostsbastion 🔒
db-primary: failover
Note Promote the replica only after the primary is fenced.
Stop writes on api
Promote db-replica
shCopyInsert
sudo -u postgres pg_ctl promote -D /var/lib/postgresql/16/main
Config files

Put a kubeconfig on a host, until the tab closes.

Keep ~/.kube/config, ~/.aws/credentials or ~/.npmrc in the vault and place it from the palette. Close the tab and it's gone; the file that was there comes back. Written whole, with its permissions from the start, and cleaned up on the next connect if the link dropped.

▤
kubeconfig · prod
~/.kube/config · 600
→
web-01

All of it, encrypted.

Every snippet, environment, file and note is a record in the vault, encrypted on your device and synced end to end. Values stay masked until you prove it's you.

How the vault works →

Your hosts and secrets on every device. Your storage, your keys.

Passwords, SSH keys, snippets, environments, config files and notes are kept in one encrypted vault. It syncs through storage you already have, encrypted end to end: the storage only ever sees ciphertext.

  • Unlock the way your system does. The keychain, Windows Hello, Touch ID or a passphrase, and it can lock itself when you step away.
  • No account, no limits. Syncing through a folder, WebDAV, S3 or Git is free, for as many hosts as you have.
  • A new device joins safely. Approve it from one that already syncs, or type the recovery key that always opens the vault.
  • Keys in the vault. Generate or import SSH keys, sign in with them on every device without a passphrase prompt, and export them as OpenSSH files when another tool needs one.

69 themes. 10 languages.

Light and dark, following your desktop, with a theme for each. 20 of them are gradients. Give a host or a group its own theme so production never looks like staging, and use shellwing in your own language.

Pick a theme the whole page follows

Pick a language as the app shows it

  • Shortcuts are yours: rebind any of them in Settings › Keyboard.
  • Themes are files: drop a TOML in the themes folder and it shows under Your themes.
  • Fonts and sizes apply as you change them, with no restart.

The speed of a terminal.
The tools of an SSH client.

A terminal app with OpenSSH is fast but bare; an Electron client has the tools but runs in a browser engine. shellwing is both, natively.

FeatureshellwingTerminal app + sshElectron SSH clients
Native app, GPU-renderedElectron draws through ChromiumYesSomeNo
Reads ~/.ssh/config as isYesYesSome
Your local shell in the same windowYesYesSome
Saved hosts with groups, tags and colorsYesNoYes
SFTP browser and port forwards built inYesNoYes
Snippets, and a library of ~250 ready commandsYesNoSome
Environments loaded into a shell on demandYesNoNo
Config files placed until the tab closesYesNoNo
Markdown notes tied to hostsYesNoSome
End-to-end encrypted sync through your own storageYesNoSome
Open sourceYesSomeSome

Some: depends on the app. Electron clients and terminal apps differ a lot from one to the next; this is what's common among them, not any one product.

Questions, answered.

Is shellwing free?

Yes. shellwing is free software under the GPL-3.0. Every feature on this page works without an account, and syncing through storage of your own (a synced folder, WebDAV, S3 or a Git repository) is free and has no limits.

How do I install it, and how does it update?

Download it for your system above: a .dmg for macOS, an installer for Windows, an AppImage or a .deb for Linux. The app tells you when a newer version is out, and the .dmg app, the Windows installer and the AppImage update themselves when you say so. The releases are not signed with an Apple or Windows certificate yet, so the first launch asks you to allow it once.

Why Rust and Zig?

The app is Rust, drawn with GPUI, the GPU UI framework Zed is built on. The terminal itself is libghostty-vt, the core of the Ghostty terminal, written in Zig: it parses on its own thread, so heavy output never stalls the window. No browser engine, no Electron.

Can it replace my terminal app?

Yes. A local terminal opens beside the SSH tabs with your own shell ($SHELL, or PowerShell on Windows), or set local_shell to fish or anything else. Splitting, find, snippets and typing into every pane work the same as over SSH.

Do I have to move my hosts over?

No. shellwing reads ~/.ssh/config as OpenSSH does: aliases, ProxyJump, forwards, identity files, known_hosts, the agent and certificates. Saved hosts in hosts.toml add groups, colors, tags and more on top.

Where are my passwords and keys kept?

In the vault, an encrypted file on your device, unlocked through the system keychain, Windows Hello, Touch ID or a passphrase. When it syncs, it is encrypted end to end before it leaves the device: the storage it syncs through sees only ciphertext. A recovery key always opens it.

Are environments safe to load on a server?

Nothing is loaded unless you choose it. Values are sent with the terminal echo off and the command kept out of the shell history, and a snippet that needs an environment runs in a subshell that drops it when done. While loaded, root on that server can read them, so load them on servers you trust and unload them when done.

Is there a mobile app?

Not yet. The core of shellwing has no UI and already builds for iOS and Android, so mobile apps can follow; the desktop app comes first.

Get shellwing 0.1.0

Free and open source, for macOS, Windows and Linux. It tells you when a new version is out and installs it when you say so.

Download for macOSApple silicon · M1 and later · .dmg

macOS

macOS 11 Big Sur or later

Install

  1. Open the .dmg.
  2. Drag shellwing into Applications.
  3. Open it from Applications or Spotlight.
First launch. Not signed by Apple yet: the first time, macOS says it cannot check the app. Open System Settings › Privacy & Security and choose Open Anyway (on macOS 14 and older, Control-click the app › Open).

Install

  1. Run the installer: it installs for you, without admin rights.
  2. Start shellwing from the Start menu.
  3. Updates install themselves when you say so.
First launch. Not signed yet: SmartScreen may say "Windows protected your PC". Choose More info › Run anyway.

Install

  1. AppImage: make it executable and run it. It updates itself.
  2. Debian or Ubuntu: install the .deb with apt.
# AppImage
chmod +x shellwing_0.1.0_linux_x86_64.AppImage
./shellwing_0.1.0_linux_x86_64.AppImage

# Debian / Ubuntu
curl -LO https://github.com/hivepaas/shellwing/releases/download/v0.1.0/shellwing_0.1.0_amd64.deb
sudo apt install ./shellwing_0.1.0_amd64.deb
First launch. Where FUSE is missing, run the AppImage with --appimage-extract-and-run.

Like it? Star shellwing on GitHub to follow what comes next.