A macOS menu bar app for monitoring AWS RDS instances with real-time health metrics and alerts.
- π At-a-glance Monitoring: CPU, connections, sessions, and storage for every RDS instance, right in the menu bar
- π Detail Dashboard: Click any database for a popup with six time-series charts (CPU, Memory, Storage) over the last 1 day / 7 days / 30 days β sized to fit the content, no scrolling
- π Performance Insights: Top SQL queries, users, and hosts by average active sessions (when PI is enabled)
- π Query Drill-down: Click any Top Query to open a dedicated window with its load over time, the individual SQL statements behind the digest (expand any to its full SQL), and the users/hosts that ran it β the same flow as the RDS console's Top SQL view
- 𧬠Replica Awareness: Read replicas are nested under their primary, with replica lag
- π Open in AWS Console: One-click deep link to any instance in the RDS console
- β‘ Auto-refresh: Menu-bar metrics update automatically (configurable: 1β60 min)
- π Smart Alerts: macOS notifications when metrics exceed a configurable threshold (default 50%), plus an always-visible in-menu alert banner
- βοΈ Settings: Adjust alert threshold and refresh interval from the menu
- π¨ Color-coded Status: Green (<50%), Yellow (50-75%), Red (>75%)
- π AWS Integration: Uses your existing
~/.aws/credentialsand~/.aws/config - π Multi-region/Profile: Switch between AWS profiles and regions easily
In the menu bar, for each RDS instance:
| Metric | Source | Description |
|---|---|---|
| CPU Utilization | CloudWatch CPUUtilization |
Current CPU usage percentage |
| Connections | DatabaseConnections / max_connections Γ 100 |
Percentage of connection pool used |
| Sessions | CloudWatch DBLoad (falls back to DatabaseConnections) |
Average active sessions |
| Storage | (AllocatedStorage - FreeStorageSpace) / AllocatedStorage |
Percentage of disk space used |
In the detail dashboard (click a database), six charts grouped by type:
| Group | Charts |
|---|---|
| CPU | CPUUtilization, DBLoad (avg active sessions) |
| Memory | FreeableMemory, SwapUsage |
| Storage | FreeStorageSpace, ReadIOPS + WriteIOPS |
- macOS 13.0 or later
- Swift 5.9+
- AWS credentials configured at
~/.aws/credentials - IAM permissions:
rds:DescribeDBInstancescloudwatch:GetMetricDatapi:DescribeDimensionKeys(optional β for the Top Queries/Users/Hosts panels)pi:GetResourceMetrics(optional β for the query drill-down load chart)pi:GetDimensionKeyDetails(optional β to expand a statement to its full SQL)
- Go to the Releases page
- Download the latest
PulseBar-vX.X.X-macOS.zip - Unzip and move to Applications:
unzip PulseBar-vX.X.X-macOS.zip mv PulseBar.app /Applications/
- First launch (app is unsigned, so macOS will block it):
- Right-click
PulseBar.appβ Open β Click Open in the dialog - Or run:
xattr -cr /Applications/PulseBar.app
- Right-click
# Clone the repository
git clone <repository-url>
cd PulseBar
# Build and install to /Applications
make install# Run in debug mode
make run
# Or build release binary
make buildNote: When running via
make run(without app bundle), macOS notifications are disabled. Usemake installfor full functionality.
Ensure you have AWS credentials configured:
# ~/.aws/credentials
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
[production]
aws_access_key_id = PROD_ACCESS_KEY
aws_secret_access_key = PROD_SECRET_KEY# ~/.aws/config
[default]
region = us-west-2
[profile production]
region = us-east-1{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"rds:DescribeDBInstances",
"cloudwatch:GetMetricData",
"pi:DescribeDimensionKeys",
"pi:GetResourceMetrics",
"pi:GetDimensionKeyDetails"
],
"Resource": "*"
}]
}Only
rds:DescribeDBInstancesandcloudwatch:GetMetricDataare strictly required. Thepi:*actions power the Performance Insights panels and the query drill-down (pi:DescribeDimensionKeysfor the Top lists and statement breakdown,pi:GetResourceMetricsfor the per-query load chart,pi:GetDimensionKeyDetailsfor full SQL text) β PulseBar degrades gracefully when any are missing.
- Launch PulseBar from Applications or run
make run - Click the chart icon in your menu bar
- Select your AWS profile and region
- View at-a-glance metrics for all RDS instances
- Hover an instance and choose π Open Detailsβ¦ to open the full dashboard with charts and Performance Insights
- In the dashboard, click any Top Query to drill into its load over time, individual SQL statements, and the users/hosts that ran it
- Profile Selector: Switch between AWS profiles
- Region Selector: Change AWS region (us-east-1, us-west-2, eu-west-1, etc.)
- Refresh Now: Manual refresh (βR)
- Instance List: Click any instance for details
- Quit: Exit the application (βQ)
π’ my-database-prod # Green = all metrics healthy (<50%)
π Open Detailsβ¦ # Opens the charts + Performance Insights dashboard
postgres - db.r5.large # Engine and instance class
π’ CPU: 12.5% # CPU utilization
π’ Connections: 23.1% # Connection pool usage
Sessions: 1.42 avg active # Average active sessions (DBLoad)
π΄ Storage: 78.2% # Storage used (red = >75%)
Activity: 14 connections # Raw connection count
Color Coding:
- π’ Green: < 50% (healthy)
- π‘ Yellow: 50-75% (warning)
- π΄ Red: > 75% (critical)
- βͺ Gray: N/A (data unavailable)
Status Messages:
- β³ Loading... - Fetching data from AWS
β οΈ AWS credentials not found - Missing~/.aws/credentialsfile- π Invalid credentials - Credentials expired or invalid
- π No RDS instances found - No databases in the selected region
Notifications are sent when any metric exceeds the configured threshold (default 50%, set in βοΈ Settings):
- Alerts are deduplicated (won't spam for the same condition)
- New notifications sent if:
- Different metrics breach thresholds
- Instance recovers and breaches again
- 15+ minutes since last alert for same condition
Example notification:
β οΈ RDS Alert: production-db
CPU: 72%
Connections: 61%
Note: System notifications are most reliable from an installed, signed app bundle (
make install). For local builds, PulseBar falls back to a legacy notification path and always shows an alert banner at the top of the menu, so breaching instances are visible regardless of notification permissions.
Timer (configurable interval)
β
Load AWS Profile/Credentials
β
DescribeDBInstances (RDS API)
β
GetMetricData (CloudWatch API) β latest scalar values
β
Metric Calculations
β
Menu UI Update + Alert Engine (notifications + in-menu banner)
Click "Open Detailsβ¦"
β
GetMetricData (1d/7d/30d range) + DescribeDimensionKeys (Performance Insights)
β
SwiftUI + Charts dashboard (NSHostingView in a floating NSWindow, sized to fit)
Click a Top Query
β
GetResourceMetrics (load over time, filtered to the digest)
+ DescribeDimensionKeys (db.sql statements behind the digest, plus users/hosts)
+ GetDimensionKeyDetails (full SQL text, on demand)
β
Query drill-down window (its own floating NSWindow)
PulseBar/
βββ Sources/
β βββ main.swift # App entry point
β βββ AppDelegate.swift # Menu bar UI & coordination
β βββ AWSCredentialsReader.swift # Reads ~/.aws files
β βββ RDSMonitoringService.swift # AWS SDK integration (RDS, CloudWatch, PI)
β βββ AlertManager.swift # Notification logic
β βββ Settings.swift # User preferences (threshold, interval)
β βββ DatabaseDetailWindowController.swift # Detail window + view model (auto-sizes to fit)
β βββ MetricsDashboardView.swift # SwiftUI + Charts dashboard
β βββ QueryDetailWindowController.swift # Per-query drill-down window + view model
β βββ QueryDetailView.swift # SwiftUI view for the query drill-down
β βββ Models.swift # Data structures
βββ Assets/
β βββ screenshot.png # App screenshot
βββ Icons/
β βββ *.png # App icons (16-1024px)
βββ .github/
β βββ ISSUE_TEMPLATE/ # Bug report & feature request templates
β βββ PULL_REQUEST_TEMPLATE.md # PR template
β βββ workflows/
β βββ pr-validation.yml # PR build checks
β βββ release.yml # Auto-build on release
βββ Package.swift # Swift Package Manager config
βββ Info.plist # App metadata
βββ Makefile # Build commands
βββ README.md # This file
βββ CONTRIBUTING.md # Contribution guidelines
βββ CODE_OF_CONDUCT.md # Community standards
βββ SECURITY.md # Security policy
βββ LICENSE # MIT License
βββ agents.md # Developer/AI agent guide
make run # Debug build and run
make build # Release build (.build/release/PulseBar)
make clean # Clean build artifacts
make install # Install to /Applications
make help # Show all commandsaws-sdk-swiftv0.40.0+ (AWSRDS, AWSCloudWatch, AWSPI)SwiftUIandCharts(system frameworks, macOS 13+) for the detail dashboard
Dependencies are managed via Swift Package Manager and will be automatically resolved on build.
This project uses GitHub Actions for:
- PR Validation: Builds and validates code on every pull request
- Release Build: Automatically builds and attaches binaries when a GitHub release is published
See .github/workflows/ for details.
- Basic
max_connectionsestimation (not querying parameter groups) - Performance Insights panels and the query drill-down require PI to be enabled on the instance and the
pi:*permissions listed above - Performance Insights retains data for the past 7 days, so the query drill-down's 30-day range is clamped to that window
- Single account only (no multi-account aggregation)
- Read-only monitoring (cannot modify RDS instances)
- System notifications are most reliable from a signed, installed app bundle (an in-menu alert banner always works as a fallback)
The app is unsigned, so macOS Gatekeeper blocks it. Fix with one of these:
Option 1: Right-click the app β Open β Click Open in the dialog
Option 2: Run in terminal:
xattr -cr /Applications/PulseBar.appThe app can't find ~/.aws/credentials. Set up AWS credentials:
# Option 1: Use AWS CLI
aws configure
# Option 2: Create manually
mkdir -p ~/.aws
cat > ~/.aws/credentials << EOF
[default]
aws_access_key_id = YOUR_KEY
aws_secret_access_key = YOUR_SECRET
EOF- Verify the selected profile exists in
~/.aws/credentials - If using temporary credentials (SSO, assumed role), refresh them
- Check credentials haven't expired
Verify your IAM user/role has these permissions:
rds:DescribeDBInstancescloudwatch:GetMetricDatapi:DescribeDimensionKeys,pi:GetResourceMetrics,pi:GetDimensionKeyDetails(only for Performance Insights panels and the query drill-down)
CloudWatch may not have recent data. The app queries a 1-hour window; if no data exists, it shows N/A.
DBLoad and the Top Queries/Users/Hosts panels require Performance Insights to be enabled on the instance. When it's off, the Sessions row falls back to the raw connection count and the dashboard panels show a notice.
- Ensure you're running the installed app (
/Applications/PulseBar.app), notswift run - Check System Settings β Notifications β PulseBar
- Ensure notifications are enabled
- Restart the app if needed
Even when system notifications are blocked, PulseBar shows an alert banner at the top of the menu listing any instances that are breaching thresholds β so you never miss an alert.
The first build downloads and compiles AWS SDK dependencies (~200 MB). Subsequent runs will be fast.
MIT License - See LICENSE file for details
Contributions welcome! Please read our Contributing Guidelines before getting started.
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
For architecture and technical details, see agents.md.
- Historical metric graphs (detail dashboard)
- Performance Insights integration (top queries/users/hosts)
- Custom alert thresholds + configurable refresh interval
- Read-replica grouping with replica lag
- RDS events & CloudWatch alarms panel
- Open in AWS Console deep link
- Parameter group querying for accurate
max_connections - Multi-account support
- Export charts to CSV/PNG
- Sparkline trends in menu
