Your servers in your Mac menu bar
Rackpulse shows your cloud servers from all your projects: whether they are running, how busy they are, and what they cost this month. It sends a notification when something goes wrong. Connect a provider with an API key, and add the agent to see inside a server.
v0.2.1 · macOS 14 or later · Hetzner Cloud supported · free, open source (MIT) · no account, no telemetry
fig. 1 · the panel, with sample data
Connect a provider, add the agent where you need it
Rackpulse reads your cloud provider's API with a key you create, so it needs nothing on your servers. The agent is a small read-only Linux program that adds what a provider's API can't see. You can mix both: some servers with the agent, some without.
| Feature | Simpleprovider API key | Agentkey and agent |
|---|---|---|
| Servers | ||
| Running status and a one-line summary | ||
| CPU, disk I/O, and network charts | ||
| Traffic against the included amount | ||
| Power controls | ||
| Costs, budgets, and idle spend | ||
| Inside the server | ||
| Memory and load | ||
| Disk space per file system | ||
| Failed services and pending reboots | ||
| Docker | ||
| Containers with health, restarts, CPU, and memory | ||
| Container pages and Docker disk usage | ||
| Uptime | ||
| From the provider's start and stop history | ||
| Recorded on the server, including crashes the provider can't see | ||
| Installed on your servers | nothing | read-only agent |
Every server and its cost, one click away
Everything here works with a provider's API key alone. Nothing is installed on your servers.
One status line
"All 5 servers running" or "1 not running · 2 alerts" across all projects, in the colour of the worst alert.
Grouped by project
Servers from all your projects, with problems sorted to the top. Switch to a single project from the menu.
Charts
CPU, disk IOPS, and network for 1 hour, 6 hours, 24 hours, 7 days, or 30 days. Hover a chart to read any moment.
Uptime
The last 24 hours and 30 days, from the provider's start and stop history and Rackpulse's own checks.
Power controls
Start, shut down, reboot, power off, and reset, each confirmed first. Needs a key that can write.
Costs
Month to date and the forecast to month end, per project, from the provider's list prices, with an optional budget. Stopped servers that still bill are listed separately.
Environments
Tag each server as Production, Staging, or Development, or let Rackpulse read an env label from the provider.
Menu bar readout
A status dot in the colour of the worst alert, plus the busiest server's CPU, this month's cost, or the alert count.
Keyboard and Touch ID
Press ⌃⌥R anywhere to open the panel, then type to find a server. Optionally lock the panel with Touch ID after the Mac sleeps.
See inside the server
Memory, disk space, Docker containers, failed services, and pending reboots live inside the server, and a provider's API does not report them. The agent is a small read-only Linux program that reports them.
Memory and load
Memory use, load, and uptime since boot, with failed systemd services and pending reboots.
Disk space
Space and inodes per file system, with an alert when one fills up or turns read-only.
Docker containers
Grouped by Compose project, with health, restarts, CPU, and memory.
A page per container
7 days of charts, ports (local only or public), volumes and mounts, networks, and the last health check.
Docker disk usage
How much space images, volumes, and build cache take, and how much of it is reclaimable.
Uptime on the server
30 days recorded on the server itself. It catches crashes the provider can't see and keeps history while your Mac sleeps.
Set up the agent on a server
optional · per server01Open Set up agent
Open a server in Rackpulse and choose Set up agent. Rackpulse creates a key for that server.
02Run the command on the server
The command contains the server's own key in place of
rb1_.... It checks the binary's SHA-256 checksum and installs a systemd service.curl -fsSL https://tools-cdn.en3sis.com/tools/rackpulse/agent/install.sh | sudo sh -s -- --pair rb1_...
03Open port 7311
Make TCP port 7311 reachable from your Mac, as shown here. Rackpulse connects within a few seconds.
port 7311, by the address Rackpulse uses
Add an inbound rule for TCP port 7311 to the server's cloud firewall, for example a Hetzner Cloud Firewall. If you have a fixed IP, set it as the source. If ufw is active:
sudo ufw allow 7311/tcp
No public rule needed. If ufw is active:
sudo ufw allow in on tailscale0 to any port 7311 proto tcp
No public rule needed. Your Mac must reach the private network, for example through a VPN server in it.
Run the script again without --pair. It keeps the key, port, and address.
curl -fsSL https://tools-cdn.en3sis.com/tools/rackpulse/agent/install.sh | sudo sh
Run this on the server, remove the firewall rule, then choose Remove agent in Rackpulse.
sudo rackpulse-agent uninstall
The app






Alerts when something goes wrong
Each rule has its own threshold and duration. A server can use the global rules, its own thresholds, or no alerts.
| rule | fires when | mode |
|---|---|---|
| Server down | A server is not running and you did not stop it | Simple |
| Sustained CPU | CPU stays above the threshold for the whole period | Simple |
| Traffic quota | Outgoing traffic passes a share of the included traffic | Simple |
| Disk I/O anomaly | Disk IOPS stay above a multiple of the 7-day median | Simple |
| Budget | The month's cost forecast goes above the project's budget | Simple |
| Unexpected change | A server or volume appears or disappears, a server is rebuilt, or a firewall changes | Simple |
| Disk space | A file system passes a share of its space or inodes, or turns read-only | Agent |
| Memory | Memory use stays above the threshold for the whole period | Agent |
| Docker containers | A container is unhealthy, keeps restarting, or stopped with an error | Agent |
| Failed service | A systemd service is in the failed state | Agent |
| Reboot required | Installed updates need a reboot | Agent |
| Agent not answering | The provider says the server runs, but the agent does not answer, for example because it froze | Agent |
Notifications
Each with Snooze and Open buttons, grouped per server in Notification Center.
Quiet hours
Hold notifications back during the hours you set.
Snooze
From the notification or the popover, to silence an alert for 24 hours.
Only your provider, the update feed, and your agents
Where data goes
Rackpulse talks to your provider's API, its own update feed, and the agents you set up. Nothing else.
Keychain
API keys and agent keys are stored in the macOS Keychain, never in files or logs.
App Sandbox
Runs in the macOS App Sandbox with outgoing network access only. Signed and notarized by Apple.
Limited changes
With a read-only key, Rackpulse can't change anything. With a key that can write, it only sends the power actions, after you confirm.
Read-only agent
The agent can't run commands or change anything, only reads from Docker, and runs sandboxed by systemd.
Per-server keys
Each server has its own key, and the agent's certificate is pinned on the first connection. Change a key from the app at any time.
Install Rackpulse
Install the app
Open Rackpulse.dmg and drag Rackpulse to Applications.
Create an API key at your provider
For Hetzner Cloud: in the Hetzner Console, open a project and go to Security, then API tokens. Choose Read to monitor only, or Read & Write to also use the power controls.
Add the project
Click the Rackpulse icon in the menu bar, paste the key, and click Verify and Save. Add one key for each project.
Set up the agent on a server Agent
Open a server, choose Set up agent, and run the command it shows. Skip this step to stay in Simple mode. The agent
requirements
- Mac
- macOS 14 Sonoma or later
- Provider
- An API key per project. Hetzner Cloud today
- Server
- Linux on x86_64 or ARM64 with systemd Agent
- Network
- TCP port 7311 reachable from your Mac Agent
Rackpulse checks its update feed once a day and asks before it installs an update. To build from source, see the README.
Get help
For a bug, include your macOS version, the Rackpulse version from About, and what you expected to happen. If the agent is involved, add its version from the agent setup page.
Questions and answers
Which providers does Rackpulse support?
Hetzner Cloud today. More providers, and servers with only the agent, are in progress. Tell us on Discord which provider you want next.
Do I need to install anything on my servers?
No. Rackpulse works with a provider's API key. The agent is optional. It adds memory, disk space, Docker containers, and uptime recorded on the server.
Which key permission should I choose?
A read-only key to monitor. A key that can write if you also want to start, shut down, reboot, power off, or reset servers from Rackpulse. On Hetzner Cloud, these are Read and Read & Write tokens.
How accurate are the costs?
They are estimates from the provider's list prices and the hours each resource existed this month. Hetzner has no billing API, so credits and extra traffic are not included. VAT is added only when you choose prices with VAT in Settings.
Does the agent need a public port?
Your Mac connects to the agent on TCP port 7311. On a public address, add an inbound rule to the server's cloud firewall. Over Tailscale, another VPN, or a private network, no public rule is needed.
Does Rackpulse send my data anywhere?
Only to your provider's API, its own update feed, and the agents you set up. There is no account and no telemetry.
How do I remove the agent?
Run sudo rackpulse-agent uninstall on the server and remove the firewall rule. In Rackpulse, choose Remove agent on the server page.
How does Rackpulse update?
Rackpulse checks for updates once a day and asks before it installs one. To update the agent, run the install command on the server again without --pair. It keeps its key, port, and address.
Is Rackpulse free?
Yes. Rackpulse is open source under the MIT License. It is an independent project, not affiliated with Hetzner Online GmbH or any other provider.
Rackpulse is open source
The app and the agent are on GitHub under the MIT License. Questions, bugs, and ideas are welcome, on Discord or in an issue.