Your Datadog monitors, incidents, and deploys β one click away in the menu bar, with alerts that are impossible to ignore. Native SwiftUI, no Electron, no agent, no permissions: just HTTPS to Datadog's API.
β οΈ Unofficial personal tool β not affiliated with or endorsed by Datadog, Inc. You bring your own API keys.
Option A β download the app
- Grab
Datadog-Assistant.dmgfrom the latest release, open it, and drag the app to Applications. - First open only: the app isn't notarized yet, so right-click the app β Open β Open (or System Settings β Privacy & Security β Open Anyway on macOS 15+).
- A πΎ appears in the menu bar and a welcome window walks you through connecting β done.
Option B β Homebrew
brew tap mxnyawi/datadog-assistant https://github.com/mxnyawi/datadog-assistant
brew install --cask --no-quarantine datadog-assistant(--no-quarantine skips Gatekeeper's "can't be checked for malicious
software" block β the app is ad-hoc signed, not notarized yet. Omit it if you
prefer the right-click β Open ritual.)
Option C β build from source (Xcode CLT + Swift 5.9)
git clone https://github.com/mxnyawi/datadog-assistant
cd datadog-assistant/swift && ./Scripts/build-app.sh
open "build/Datadog Assistant.app"With nothing configured, the panel shows a Connect to Datadog prompt right in the app β no separate setup window. Three ways in:
-
Access token (primary). A Datadog access token β
ddpat_β¦(personal, Datadog's recommended credential for tools like this since mid-2026) orddsat_β¦(service-account, can be non-expiring) β is one scoped credential that replaces the API + app key pair. Create it under Personal Settings β Access Tokens; the setup UI lists the exact scopes with a copy button:monitors_read, monitors_downtime, events_read, incident_read, dashboards_read, timeseries_query. Paste it into the connect prompt; it's validated before saving. (Personal tokens expire β max 1 year; the app shows 401/403 when it lapses, paste a fresh one. Want set-and-forget? Use a service-accountddsat_token.) -
API + Application keys. The classic pair still works β same tab in the connect prompt and in Settings.
-
Team LastPass vault. Point the app at a shared LastPass secure note and the whole team runs off one credential, rotation in one place. Settings β Team LastPass β Set upβ¦ installs the
lpassCLI (via Homebrew), signs you in (MFA supported), and validates the entry β no terminal. The note holdsdatadogAPIKey/datadogAPPKey(or a single access-token field viaDD_LASTPASS_TOKEN_FIELD); optionalgithubTokenpowers deploy correlation,jiraTokenpowers one-tap Jira tickets.
Secrets never touch the macOS login Keychain (which prompts unsigned apps for your password on every access). They're AES-GCM encrypted on the device, Secure-Enclave-wrapped where possible β details in swift/README.md.
Every Datadog site works (US1/EU/US3/US5/AP1/Gov). Power users can override
everything with env vars (DD_BEARER_TOKEN, DD_API_KEY, DD_APP_KEY,
DD_SITE, DD_LASTPASS_ENTRY, β¦) or a password-manager command
(op read β¦, lpass show β¦) β see swift/README.md.
GitHub, without a token to mint: if you're logged into the gh CLI, the
app borrows its token automatically for the Changes tab. Settings β GitHub
lists the orgs you belong to and can auto-fill watched repos by matching
your monitors' service: tags against the org's repo names.
| π¨ | Menu bar count appears the second a monitor alerts; the panel opens on β₯βD from anywhere |
| π¦Έ | Hero card for the worst firing P1/P2: live value vs threshold, sparkline with deploy markers, the suspect change, mute/open actions |
| π΄π‘π’ | Tap-to-drill summary tiles + every monitor grouped by state, worst first, with search |
| π | Sparkline, firing duration, triggered hosts, and threshold on every expanded row |
| π | Changes tab β merged PRs, deploy events, and CI runs, with "landed 12m before this alert" suspects called out |
| π | Dead-letter-queue grouping β DLQ monitors auto-detected and consolidated; firing ones stay in your face, healthy ones collapse |
| π€« | No Data triage β likely broken vs expected quiet, only the broken ones notify |
| π | Mute 1h/4h/24h/forever, unmute, snooze everything for the afternoon |
| πͺ§ | Native notifications with per-priority rules (P1 β modal + nag, P3 β banner), recovery alerts, daily digest |
| π« | One-tap Jira ticket per alert (or auto-create for P1s) |
| βοΈ | Local rename β relabel unwieldy monitor names just for yourself |
| β¨οΈ | βK command palette β fuzzy-find any monitor and open it, no mouse (βR refresh, βF list) |
| β | Favorite monitors β star the ones you own; they pin to the top whatever their state |
| π | Pin the panel open for a second display; Compact density for big fleets |
| π | Quiet hours β a nightly window where only P1s break through |
| π | Copy alert as Markdown/Slack for an incident channel, in one tap |
| π | Quick links to Dashboards / Monitors / Logs / APM / Incidents + your own dashboards |
The panel follows the macOS design language β system materials, light & dark mode, the menu-bar-panel layout conventions used by the system status menus β so it feels like part of the OS, not a web page in a window.
The native app lives in swift/ (SwiftPM, no Xcode project needed):
cd swift
swift build # compile
./Scripts/build-app.sh # assemble the .app bundle (ad-hoc signed)
DD_DEMO=1 swift run # dev loop on generated demo dataCI compiles the package on macOS and runs the checks on every PR. Tagging
v* (or dispatching the Release workflow) builds the app on a macOS runner
and publishes the DMG/zip with checksums.
- swift/README.md β architecture, credential precedence, feature docs
- swift/PARITY.md β feature-parity audit vs the original Python app
- CONTRIBUTING.md Β· SECURITY.md Β· CODE_OF_CONDUCT.md
This project started as a Python/rumps menu bar app. It's archived under
legacy/python-app/ (docs:
docs/legacy-python-app.md, last state tagged
python-final) for reference β it isn't an install option and doesn't gate
CI. All development happens in the Swift app.
MIT β see LICENSE.
