A macOS menubar app that gives Keepit customers an at-a-glance view of their backup connector health in a single region.
Note that this isn't an official product of Keepit A/S, and it's not guaranteed to work. It might steal your wallet, kiss you on the ear, or run off with your dog.
- Connector health monitoring — see healthy/unhealthy/critical status for all connectors with color-coded indicators
- Last backup time — hover over any connector to see when its last backup completed
- Anomaly detection — connectors with anomalies in the last 7 days are flagged with a warning indicator
- Real-time updates — uses Keepit vqueues SSE API for near-instant connector status changes
- Push notifications — optional Pushover alerts when a connector degrades, recovers, or misses a backup
- Configurable fallback refresh — poll every 1–60 minutes as a safety net (default 5)
- Unhealthy filter — toggle to show only connectors that need attention
- Quick access — click any connector to open the Keepit web console
- Secure credentials — stored in the macOS Keychain
brew tap probichaux/tap
brew install --cask keepitmenubarDownload the latest KeepitMenuBar-*-macos.zip from the
Releases page, unzip it, and drag
KeepitMenuBar.app to /Applications.
These builds are ad-hoc signed but not notarized (that requires a paid Apple Developer account), so macOS will refuse to open the app the first time with an "unidentified developer" warning. To get past it, either:
- Right-click (or Control-click)
KeepitMenuBar.appand choose Open, then confirm in the dialog that appears, or - Run
xattr -cr /Applications/KeepitMenuBar.appin Terminal.
You only need to do this once per download.
mb-monitor is a macOS menubar extension that gives Keepit customers an easy way to see the state and status of their Keepit backups in a single region. Once you sign in, it subscribes to the Keepit vqueues SSE API for real-time notifications of connector changes, with a configurable polling timer as a fallback. It shows you the health, anomaly status, and last-completed-backup time for each connector. There's a "lights out" mode that minimizes clutter by only showing you unhealthy or anomalous connectors.
It uses the Keepit APIs documented in the Keepit developer center
To use it, you'll need to create a Keepit API token (ideally with restricted righgts) and use it to log in. The token values you enter will be stored in the macOS Keychain.
The app can push alerts to your phone, watch, or desktop through Pushover. Pushover is a third-party service and is not affiliated with Keepit — you'll need your own account.
- Create a Pushover account and install the Pushover app on the devices you want alerts on. Pushover is free to try for 30 days; after that each platform (iOS, Android, desktop) is a one-time purchase. The API itself is free up to 10,000 messages per month.
- Copy your user key from the Pushover dashboard.
- Create an application at https://pushover.net/apps/build (call it anything — "Keepit Monitor" works) and copy the API token it gives you.
- In the menubar popover, click the gear, then Notifications…. Paste the application token and user key, click Verify & Save, then Send Test to confirm it works.
- Turn on Send push notifications via Pushover and pick the events you care about.
Leave Device blank to alert all of your Pushover devices, or enter a single device name to target just one.
| Event | Fires when |
|---|---|
| Health degraded | A connector goes from healthy to unhealthy or critical, or from unhealthy to critical |
| Health recovered | A connector returns to healthy |
| Anomaly detected | Keepit flags an anomaly in the last 7 days |
| Anomaly cleared | A connector no longer has anomalies in the last 7 days |
| Backup completed | A new snapshot finishes — chatty on accounts with many connectors |
| Backup overdue | No completed backup within the age limit you set (6–72 hours) |
| Connector added | A connector appears in the account |
| Connector removed | A connector disappears from the account |
Health degraded, anomaly detected, and backup overdue are treated as problem alerts and use the priority you choose — including Pushover's Emergency priority, which repeats every 60 seconds for an hour until you acknowledge it in the Pushover app. Everything else is sent at normal or quiet priority.
You can notify on all connectors or pick a specific subset under Connectors in the notification settings.
- Notifications only fire while the app is running. This is a menubar app, not a server-side monitor. If your Mac is asleep or the app is quit, changes that happen in the meantime are picked up as the current state on next launch, not replayed as individual alerts.
- The first run is silent. On a fresh install the app records a baseline of your connectors without notifying, so installing it doesn't produce a wall of "connector added" pushes.
- Bursts are collapsed. If one refresh produces more than five events — a nightly run completing across many connectors, say — you get a single digest push instead of a flood.
- Failed lookups don't alert. If the Keepit health or anomaly API call fails, the app keeps the last known value rather than reporting a change, so a blip in connectivity won't page you.
- Signing out clears the baseline, so switching accounts doesn't fire add/remove alerts for the previous account's connectors.
- Backup overdue fires once per overdue stretch, and resets as soon as a new backup completes.
- Your Pushover token and user key are stored in the macOS Keychain, alongside your Keepit token.
- Pushover's free tier allows 10,000 messages per month. The remaining count is shown in the notification settings after each send.
cd MBMonitor.swiftpm
swift build # compile
swift run # run from terminal
open Package.swift # open in XcodeOr open MBMonitor.swiftpm directly in Xcode as a Swift Playground App package.
Requires macOS 14+ and Swift 5.9+.
MBMonitor.swiftpm/Sources/
MBMonitorApp.swift # @main entry — MenuBarExtra scene + Settings scene
AppState.swift # Central ObservableObject: auth, SSE stream, connector list
Models.swift # Region, Credential, Connector, ConnectorType, HealthStatus
KeepitAPIClient.swift # HTTP client — Basic Auth, XML responses, vqueue URLs
SSEClient.swift # Server-Sent Events parser for vqueues real-time updates
XMLParsers.swift # XMLParser-based parsers for connectors & health
CredentialStore.swift # Generic macOS Keychain store (Keepit + Pushover credentials)
NotificationEngine.swift # Diffs refreshes into events; decides what to push
PushoverClient.swift # Pushover Message API client
IconProvider.swift # Connector and menubar icon lookup
MenuBarView.swift # Menubar popover: connector list with health badges
SettingsView.swift # Sign-in form, popover preferences, settings tabs
NotificationSettingsView.swift # Pushover credentials, event and connector selection
Data flow: SettingsView -> AppState.signIn() -> KeepitAPIClient -> XML parsing -> AppState.connectors -> MenuBarView
Notifications: Each refresh() hands the connector list to NotificationEngine, which diffs it
against a snapshot persisted in UserDefaults, filters the resulting events by the user's event and
connector selections, and dispatches them to Pushover on a detached task so a slow send never blocks
a refresh.
Real-time updates: After sign-in, AppState subscribes to the Keepit vqueues SSE API (devices-{userId} and job-{userId} queues). SSE events are debounced (2s) and trigger a full connector refresh. A configurable polling timer acts as a fallback for silent disconnects. SSEClient reconnects automatically with exponential backoff.
Credentials: Stored in macOS Keychain via CredentialStore. Loaded on app launch to auto-authenticate.
- API docs: http://developers.keepit.com
- Base URLs:
https://{region}.keepit.com(e.g.ws.keepit,us-dc,dk-co) - Key endpoints used:
/users/,/users/{id}/devices,/users/{id}/devices/{id}/health
MIT