A simple SSH, SFTP, FTP, serial, Remote Desktop and VNC connection manager, with no cloud, accounts or vault service. Your hosts live on your computer, and you move them to another computer with one export file.
Runs natively on macOS, Windows and Linux (Tauri: Rust core + the OS's own webview, ~10–15 MB installers).
- Hosts and groups: card grid, or a compact list (the switch by the New Host button; Nimbus remembers your choice). Like the Passwords list, the group chips along the top filter the list, and "All" shows a section per group. Colours, tags, notes, search. Groups can set a default username, port and key for every host inside them (edit a group from the pencil by its chip, or right-click a group).
- Serial consoles: add a host of type Serial for a router or switch console cable, an Arduino
or any USB-serial adapter. Pick the port (Scan lists what's plugged in), baud rate, data bits,
parity, stop bits and flow control, what Enter sends (CR / LF / CR LF) and local echo. It opens
in a terminal tab with a Break button; Snippets and Type password work there too.
On Linux your user needs to be in the
dialoutgroup to open serial ports. - Remote Desktop (RDP): add a host of type RDP for a Windows PC or server, or a Linux desktop running xrdp. It opens in a tab like any other connection (and can be pulled out into its own window). The remote desktop is resized to fit the tab whenever the window changes size, at your screen's full resolution so text stays sharp on Retina / HiDPI displays (turn that off per host for slow connections). Sign-in uses Network Level Authentication with the host's saved password, and the server's certificate is checked like an SSH host key: trusted the first time, flagged if it changes. Text copy and paste works both ways. Rest the pointer at the top edge for the toolbar: Ctrl+Alt+Del, the Start key, Type password, full screen and disconnect. On a Mac, ⌘ works as Ctrl (⌘C / ⌘V / ⌘Z). Jump hosts work, so a desktop behind a bastion is one click. Built on IronRDP.
- VNC (screen sharing): add a host of type VNC for a Mac (turn on Screen Sharing), a Linux desktop (TigerVNC, x11vnc, wayvnc), a Raspberry Pi, or a virtual machine's console (Proxmox, QEMU). It works like a Remote Desktop tab: the same toolbar, Type password, copy and paste (accents and emoji too, with servers that support the extended clipboard), tabs that move between windows. The remote desktop is resized to fit the tab when the server allows it (TigerVNC does); otherwise the picture is scaled to fit. Sign-in, best first: VeNCrypt with a certificate (encrypted; the certificate is checked like an SSH host key), Apple's sign-in for a Mac (user name and password, sent encrypted), or the classic VNC password. Plain VNC isn't encrypted, so on untrusted networks connect through a jump host.
- Quick connect: type
user@hostoruser@host:portin the search box and press Enter. Start withsftp://,ftp://orftps://to open the file browser instead, orrdp:///vnc://for a remote desktop. - Light and dark themes: follow the system, or pick one in Settings.
- Tabs: many sessions at once. ⌘T home, ⌘W close tab, ⌘1–9 switch, ⌘D duplicate, Ctrl+Tab cycle (on Windows and Linux use Ctrl+Shift instead of ⌘). Drag a tab along the tab bar to reorder it, or pull it out of the bar to give it its own window, like Chrome; drop it on another window's tab bar to put it back. The connection stays up and the scrollback comes along.
- Authentication: saved key → SSH agent (ssh-agent, 1Password, Secretive, Pageant) → password / keyboard-interactive (2FA prompts work). Anything missing is asked for, with an option to save it.
- Keychain: add a key from a file, paste one, or generate an Ed25519 key and copy its public half to your servers.
- Jump hosts: connect through a bastion (chains work too).
- Known hosts: you confirm a server's fingerprint the first time, and you're warned loudly if it changes later.
- File browser (SFTP, FTP, FTPS): two panes, this computer on the left and the server on the
right. Drag files and folders between them (or drop them in from Finder / Explorer), double-click
a file to copy it across, rename, new folder, delete, show hidden files. Transfers show progress
and can be cancelled. Open it from an SSH host (folder icon, right-click → Open SFTP, the terminal's
SFTP button, or ⌘⇧O), or add an FTP / FTPS host, which opens straight into the file browser.
- SFTP uses the host's normal SSH login, keys and jump hosts.
- FTPS uses explicit TLS. A certificate your computer doesn't recognise (self-signed, as on most NAS boxes) is shown once to trust, like an SSH host key, and you're warned if it changes.
- Deleting on this computer moves things to the Trash / Recycle Bin. Deleting on the server is permanent and asks first.
- Passwords: a simple password manager in a list view. Store name / username / password / website / notes, sort them into coloured groups, generate strong passwords, show or copy them (the clipboard clears itself after 30 s), search, and click a website or address to open it.
- API Keys: a home for API credentials, Postman-style. Each one has a type (API key, Bearer
token, Basic auth, OAuth 2.0 client credentials, or Custom fields), a service, an environment
(Production / Staging / Development…), a group, a base URL, an expiry date and notes. Secret
fields are encrypted like passwords; add your own extra fields and choose which are secret.
Copy the key on its own, or Copy as an Authorization header, a curl command,
.envlines or JSON. Expired and soon-to-expire credentials are flagged. - Type password into a session: the terminal's Password button (or ⌘⇧P / Ctrl+Shift+P)
types the host's saved password, or any Passwords entry, as keystrokes and presses Enter.
Use it at a
sudoprompt. The password goes straight from the encrypted store to the SSH connection, never through the UI or the clipboard. Turn off the automatic Enter in Settings. - Snippets: saved commands you can paste into any terminal from the Snippets button.
- Import
~/.ssh/config: picks up Host, HostName, User, Port, IdentityFile and ProxyJump. - Export / import: one file with hosts, groups, keys, passwords, API credentials, snippets and trusted host keys / certificates. Exports are always encrypted with a password you choose (scrypt + AES-256-GCM over the whole file, so not even host names are readable), and that password is needed to import. A forgotten export password can't be recovered.
- AI agents (MCP): let Claude Code, Claude Desktop, Grok, Cursor or any MCP client run commands on your hosts and call APIs with your saved credentials. Turn it on in Settings → AI agents, then add one agent per app. See AI agents below.
- Links (password and API websites, links in the terminal with ⌘/Ctrl-click) open in your default browser; Nimbus never loads outside pages in its own window.
Nimbus can act as an MCP server, so AI agents can work on your machines without ever being handed your passwords or keys. It's off until you turn it on.
Setting up: Settings → AI agents → tick Allow AI agents to connect, then + Agent. Nimbus shows the agent's token once, with ready-to-paste setup for:
- Claude Code:
claude mcp add --transport http nimbus http://127.0.0.1:47821/mcp --header "Authorization: Bearer <token>" - Claude Desktop, Cursor and other apps that start a command: the Nimbus app itself with
--mcpand the token inNIMBUS_MCP_TOKEN(a stdio bridge to the running app). - Anything else (Grok, scripts): Streamable HTTP at
http://127.0.0.1:47821/mcpwith anAuthorization: Bearer <token>header.
Then choose what the agent can use: single hosts, passwords and API credentials, or whole groups (which include anything added to them later).
What an agent can do
| Tool | What it does |
|---|---|
list_hosts, list_credentials |
See what it's been granted: names, addresses, usernames, URLs. Never notes or secret values. |
run_command |
Run a command on a granted SSH host and get the output. Nimbus logs in with the saved key or password. With sudo, Nimbus types the host's saved password at sudo's prompt. |
http_request |
Call an API with a granted credential. Nimbus adds the API key, token, Basic auth or OAuth client-credentials token, only for the credential's own site, and scrubs the secret from the reply. |
get_secret |
Only if you allow it for that agent: ask to see a secret value. You approve every single one. |
How it's kept safe
- Listens on 127.0.0.1 only, and refuses requests from web pages or other host names.
- Each agent has its own random token; Nimbus stores only a hash of it. Pause an agent, make a new token, or remove it at any time.
- By default every command and API request waits for you to click Allow in Nimbus (the window comes to the front). You can choose "Allow for 30 min" for one host or credential, or set an agent to run without asking.
- Agents can't change anything in Nimbus, can't trust a new host key, and can't answer login prompts. Connect to a host once yourself first.
- An API credential only works against its own base URL (no sending your key to another site, no https → http, no following redirects).
- Everything an agent does is in Settings → AI agents → Recent activity (also
mcp-activity.login the data folder). Agent access is never included in exports.
What it can't protect against: an agent you've set to "allow without asking" can run anything on
the hosts you gave it, and once you approve get_secret the agent has that value.
| macOS | Windows | Linux | |
|---|---|---|---|
| Folder | ~/Library/Application Support/app.nimbus.ssh |
%APPDATA%\app.nimbus.ssh |
~/.local/share/app.nimbus.ssh |
nimbus-data.json: hosts, groups, public keys, snippets, password and API key names, known hosts, settings, AI agents and their access (plain JSON, no secrets; agent tokens only as hashes)mcp-activity.log: what AI agents did (no secret values)secrets.bin: passwords, private keys, passphrases and API secrets, encrypted with AES-256-GCM. The encryption key is held in the OS keychain (Keychain / Credential Manager / Secret Service). If no keychain is available, it falls back to a localmaster.keyfile and the app says so.
To move to a new computer, use Import & Export. Don't copy secrets.bin by hand, because
its key stays in the old computer's keychain.
Needs Node 20+ and Rust (rustup). On Linux, also install the
Tauri system packages (webkit2gtk etc.).
npm install
npm run tauri dev # run the app
npm run dev # UI only, in a browser, with a fake backend (src/dev-mock.js)
npm run tauri build # installer for the current OS (.dmg / .msi+.exe / .deb+.AppImage)Each OS's installer has to be built on that OS. .github/workflows/build.yml builds them all on
GitHub (push a v* tag): macOS (Apple Silicon and Intel), Windows, Linux x86-64 and Linux ARM64.
npm run build:linux-arm64 # needs Docker; output in dist-linux-arm64/This builds inside an ARM64 Ubuntu 22.04 container: natively on an Apple Silicon Mac, emulated
(slower) elsewhere. You get an .AppImage, a .deb and an .rpm.
On a Steam Frame (SteamOS, Snapdragon, ARM64): switch to Desktop Mode, copy the .AppImage
over, make it executable (right-click → Properties → Permissions, or chmod +x), and run it.
The AppImage carries its own copy of the web view, so nothing needs installing. To use a USB
serial adapter on Linux, your user needs to be in the dialout group.
Scripted UI checks: a debug build runs the JavaScript file in NIMBUS_DEV_SCRIPT in every
window, and can report back with the dev_log command (printed to stderr). Use it with a throwaway
NIMBUS_DATA_DIR.
Backend tests (src-tauri/src/tests.rs). The FTP and FTPS tests start their own FTP server
inside the test. The SSH and SFTP tests run against a real sshd on 127.0.0.1:2222 (with
Subsystem sftp internal-sftp) when NIMBUS_TEST_SSHD points at a folder with the test keys
client and client_enc (passphrase secretpass):
cd src-tauri && NIMBUS_TEST_SSHD=/path/to/keys cargo testThe Remote Desktop tests run against the xrdp container in src-tauri/tests/xrdp (see the top of
its Dockerfile) when NIMBUS_TEST_RDP=127.0.0.1:3390 is set; with NIMBUS_TEST_SSHD too, they
also connect through the SSH test server as a jump host. The VNC tests run against the TigerVNC
container in src-tauri/tests/vnc when NIMBUS_TEST_VNC=127.0.0.1 is set.
The agent sudo test also needs a second sshd on 127.0.0.1:2223 whose PATH starts with a fake
sudo that accepts hunter2-sudo (SetEnv PATH=... in its config); set NIMBUS_TEST_SUDO=1.
src/ UI (vanilla JS + xterm.js)
main.js views, editors, tabs, shortcuts
terminal.js one terminal tab ↔ one SSH session (tabs can move between windows)
files.js one file browser tab (local pane + SFTP/FTP pane, transfers)
desktop.js one Remote Desktop or VNC tab (canvas, keyboard and mouse, toolbar)
prompts.js host-key / password / 2FA dialogs
src-tauri/src/ Rust core
ssh.rs connect, host-key check, auth, jump hosts, PTY pump (russh)
files.rs local disk, SFTP and FTP/FTPS browsing and transfers
mcp.rs AI agent (MCP) server, approvals, stdio bridge
serial.rs serial port sessions
desktop.rs what Remote Desktop and VNC share: streaming the screen, input, tunnels
rdp.rs Remote Desktop sessions (IronRDP): sign-in, screen updates, resize, clipboard
vnc.rs VNC sessions: sign-in, the decoders (Tight, ZRLE, Hextile…), resize, clipboard
src/apikeys.js API credential types and "Copy as" formats
docker/, scripts/ the Linux ARM64 build
store.rs data model + persistence
vault.rs at-rest encryption + export passphrase encryption
transfer.rs export / import file
sshconfig.rs ~/.ssh/config import
keys.rs read / generate private keys
- Remote Desktop: sound, drive and printer redirection, multiple monitors, RD Gateway, and the H.264 graphics pipeline (screen updates use RemoteFX and bitmap codecs today).
- VNC: newer macOS sign-in types (when the Mac offers only those), anonymous-TLS VeNCrypt, file transfer, sound.
- Port forwarding, agent forwarding, split panes, editing a remote file in place.
MIT. See LICENSE.
