Display AirGradient air quality measurements in your macOS menu bar
- Real-time temperature, PM2.5, humidity, and CO2 levels in your menu bar
- Auto-refresh every 60 seconds (configurable)
- Clean, minimal menu bar interface
- Background daemon mode with automatic installation
- Native macOS app using AppKit
- macOS 11 (Big Sur) or later
- Apple Silicon (M1/M2/M3/M4)
- AirGradient sensor with API access
- Download the latest DMG from Releases
- Open
AirDash-{version}-arm64.dmg - Drag
AirDash.appto the Applications folder - Launch AirDash from Applications
- On first launch, it automatically installs itself as a background service
- Download the latest release from Releases
- Extract the archive:
tar -xzf airdash_{version}_darwin_arm64.tar.gz - Run the binary:
./airdash
git clone https://github.com/ljagiello/airdash.git
cd airdash
go build
./airdashRequirements: Go 1.25.4+ and Xcode Command Line Tools
Create ~/.airdash/config.yaml:
# Required: Your AirGradient API token
token: your-secret-token-here
# Optional: Specific location ID (0 = all locations, default)
locationId: 0
# Optional: Update interval in seconds (default: 60)
interval: 60
# Optional: Temperature unit - "C" or "F" (default: "C")
tempUnit: F- Log in to AirGradient Dashboard
- Navigate to Settings → API
- Generate a new API token
- Copy the token to your
config.yaml
| Option | Type | Default | Description |
|---|---|---|---|
token |
string | required | Your AirGradient API token |
locationId |
int | 0 |
Specific sensor location (0 = all) |
interval |
int | 60 |
Update interval in seconds |
tempUnit |
string | "C" |
Temperature unit: "C" or "F" |
- First Launch: After dragging to Applications and launching, AirDash automatically installs itself as a background service
- Background Operation: The app runs continuously in the background, fetching air quality data
- No GUI Required: Once installed, the daemon runs headlessly - no menu bar needed
- Automatic Startup: Starts automatically when you log in
- Run once:
./airdash- runs in GUI mode with menu bar - Install daemon:
./airdash install- sets up automatic background service - Uninstall:
./airdash uninstall- removes background service
Check your configuration:
- Verify
~/.airdash/config.yamlexists with a valid API token - Ensure
locationIdmatches your sensor (or use0for all sensors)
Check the logs:
# View recent logs
log show --predicate 'process == "airdash"' --last 5m
# View with more detail
log show --predicate 'process == "airdash"' --info --last 1hCommon issues:
- Invalid or expired API token
- Sensor offline or not reporting data
- Network connectivity issues
If you see a security warning:
- Right-click the app and select Open
- Click Open in the security dialog
- Alternatively: System Settings → Privacy & Security → Allow
If you see HTTP errors in logs:
- Check your internet connection
- Verify AirGradient API status at https://status.airgradient.com
- Confirm your API token is valid and hasn't expired
- Try accessing the API directly:
curl "https://api.airgradient.com/public/api/v1/locations/measures/current?token=YOUR_TOKEN"
- Ensure you're on macOS 11 or later
- Check for updates: Releases
- Report issues with crash logs: GitHub Issues
Check daemon status:
launchctl list | grep airdashView daemon logs:
# View recent logs
tail -50 ~/Library/Logs/airdash.log
# View errors
tail -50 ~/Library/Logs/airdash.error.log
# Monitor logs in real-time
tail -f ~/Library/Logs/airdash.logManually restart daemon:
launchctl stop com.github.ljagiello.airdash
launchctl start com.github.ljagiello.airdashReinstall daemon:
./airdash uninstall
./airdash installCommon daemon issues:
- Config file missing or invalid - check
~/.airdash/config.yaml - API token expired - update your token in config
- Network connectivity issues - check internet connection
- Binary moved or deleted - reinstall daemon
# Clone the repository
git clone https://github.com/ljagiello/airdash.git
cd airdash
# Install dependencies
go mod download
# Build locally
go build -o airdash .
# Run
./airdashgo test -v -race -coverprofile=coverage.out ./...
go tool cover -html=coverage.outAirDash uses the AirGradient Public API v1.
Endpoints used:
GET /locations/measures/current- All locationsGET /locations/{locationId}/measures/current- Specific location
Contributions are welcome! Please read CODE_OF_CONDUCT.md before contributing.
Guidelines:
- Write tests for new features
- Run
golangci-lint runbefore submitting - Follow existing code style
- Update documentation as needed
See LICENSE file for details.
- Built with DarwinKit for macOS AppKit bindings
- Air quality data from AirGradient
- Logo design inspired by air quality monitoring
