All projects, one list.
One read-only API token per Hetzner project, grouped under labels you choose. Several projects under one label share one heading and one ssh namespace.
macOS menu bar app · for Hetzner Cloud
Rackbar lists the servers of every Hetzner Cloud project in the menu bar and writes an ssh config
from the same list, so ssh acme/web-1 and ssh acme/Tab just work.
brew install --cask rackbar
read-only token · App Sandbox · macOS 27 · MIT · Mac App Store later
Every server with a public IPv4 gets a Host acme/web-1 entry, written for you. ssh, scp,
rsync and mosh read it, and so does your shell's tab completion.
The label is the namespace: one per project, or one for every project a customer has.
The addresses you keep pasting into a terminal, and the state of each machine, without opening the console.
One read-only API token per Hetzner project, grouped under labels you choose. Several projects under one label share one heading and one ssh namespace.
Click a row for its IPv4. The menu has the name, IPv6, private IP and ssh alias. Storage Boxes too, with how full they are.
Every server becomes Host <label>/<server>. ssh, scp, rsync and mosh read it, and so does your shell's tab completion.
Filled is running, hollow is off. Filled against hollow is a shape, not a shade, so it reads in every appearance.
Read-only by design. It lists, it copies, it never powers anything on or off. Power actions are not on the roadmap, and patches for them are not accepted.
Rackbar runs in the App Sandbox. It does not get ~/.ssh. It gets one folder that you create
and pick once, and it owns the one file in there.
~/.ssh/├── id_ed25519Rackbar cannot see this
├── confignor this
└── hcloud/the only folder you granted
└── configwritten by Rackbar
~/.ssh/config are outside the sandbox. The one folder you pick is all Rackbar can write to.If any project fails to load (an expired token, a dropped network) nothing is written. Writing would delete that project's hosts over a passing error.
A name outside [A-Za-z0-9._/-], an address that is not an IP, a user or key path with whitespace: the whole job is refused, and Settings says which one.
The file is written atomically with mode 600, and not at all when nothing changed.
Once. Each step is in the Settings window too, with the text ready to copy.
In the Hetzner Cloud Console, under Security → API tokens → Generate, with Read permission. One per project. Rackbar tries it before it keeps it.
Open the Hetzner Console~/.ssh/hcloudCreate a folder of its own inside ~/.ssh and choose it in Settings → SSH. It is the only folder Rackbar can see.
mkdir ~/.ssh/hcloud
~/.ssh/configAt the end, once. Your own Host blocks above them still win.
Match all
Include hcloud/config
Or append them from a terminal:
printf '\nMatch all\nInclude hcloud/config\n' >> ~/.ssh/config
No completions in zsh? Its completion system is off in the stock macOS ~/.zshrc. Add
autoload -Uz compinit && compinit, before plugins such as zsh-syntax-highlighting.
A popover closes the moment you switch to the browser to create a token. Projects, the ssh setup and the refresh interval live in a window that stays put.
Listing servers and writing an ssh config only need read access, so that is all Rackbar asks for. A Read token cannot change anything in your project, whatever the app does with it. A menu bar is also one stray click from anything it offers, and nobody should restart a database by mistake.
In the data protection Keychain on your Mac: readable after first unlock, never synced. Not in UserDefaults, not on a command line. Rackbar tries a token before it keeps it, and removing a project deletes its tokens from the Keychain.
That is what it is for. Add one token per Hetzner project, each under a label. Tokens that share a label share one heading and one ssh namespace, which helps when a customer's servers are spread over several projects. A refresh costs three requests per token, made side by side.
~/.ssh/config?Because ssh takes the first value it finds. Whatever you set above the Include wins over the generated entries:
Host acme/* User deploy IdentityFile ~/.ssh/work_ed25519 Host acme/db-1 ProxyJump acme/bastion Match all Include hcloud/config
Match all closes whatever Host block came last. Without it, the Include would only apply inside that block.
Rackbar is macOS only. On Linux with Omarchy, its sibling omarchy-hcloud does the same in the Omarchy bar.