macOS system monitoring dashboard with a menu bar agent -- Bonjour auto-discovery, live CPU/temperature/network metrics, and Tailscale/VPN support.
Dashboard App
- Grid view of all monitored Macs with live-updating metric rings (CPU, temperature, network)
- Bonjour auto-discovery -- agents appear automatically on the local network
- Manual endpoint support for Tailscale/VPN connections
- Apple Watch-style metric rings with configurable temperature thresholds
- Card flip animation to reveal per-machine settings
- One-click VNC screen sharing from any machine card
- Sort by name, temperature, or uptime
- Light and dark mode support
Agent App (Menu Bar)
- Lightweight menu bar app -- no dock icon, minimal resource usage (~0.1% CPU, ~55 MB)
- HTTP server exposing read-only system metrics on demand
- Bonjour service registration for auto-discovery
- Reports: CPU usage, CPU temperature, network throughput, uptime, IP/MAC address, FileVault status, OS version, chip type
- macOS 14 Sonoma or later
- Apple Silicon or Intel Mac
- Download
Dashboard.zipandDashboardAgent.zipfrom Releases - Extract both and move the
.appfiles to/Applications - On first launch of each app, right-click > Open (required for ad-hoc signed apps)
Install the Agent on every Mac you want to monitor. Install the Dashboard on the Mac you want to view metrics from.
- Launch DashboardAgent on each Mac to monitor
- The agent appears in the menu bar with a gauge icon
- It begins advertising on the local network automatically
- Launch Dashboard on your monitoring station
- Machines running the agent are discovered and appear in the grid automatically
- Click any card to flip it and adjust the display name or temperature thresholds
- Click the machine name pill to open a VNC screen sharing session
- Use the toolbar sort control to order by name, temperature, or uptime
For machines not on the local network:
- Click + in the toolbar
- Enter the IP address or hostname and port (default: 49990)
- The machine appears in the grid once the agent responds
The agent runs automatically with no configuration. It binds to port 49990 by default (incrementing if occupied, with dynamic fallback).
Per-machine settings are accessible by clicking a card to flip it:
- Display name -- custom label (defaults to hostname)
- Temperature thresholds -- Good, Warning, Critical in Celsius (defaults: 50, 70, 90)
Settings persist in ~/Library/Application Support/ComputerDashboard/.
┌─────────────────────────────────────────────────┐
│ Local Network │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Agent │ │ Agent │ │ Agent │ │
│ │ (Mac A) │ │ (Mac B) │ │ (Mac C) │ │
│ │ :49990 │ │ :49990 │ │ :49990 │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ Bonjour │ │ │
│ │ mDNS │ │ │
│ ┌────▼──────────────▼─────────────▼─────┐ │
│ │ Dashboard App │ │
│ │ (discovers + polls agents) │ │
│ └──────────────────┬────────────────────┘ │
│ │ │
└─────────────────────┼────────────────────────────┘
│ Manual endpoints
┌───────▼───────┐
│ Tailscale / │
│ VPN agents │
└───────────────┘
| Layer | Technology | Purpose |
|---|---|---|
| Discovery | Bonjour (NWBrowser) | Agents advertise _computerdash._tcp |
| Manual | Direct IP:port | Reach agents across VPN/Tailscale |
| Transport | HTTP (Network.framework) | Dashboard polls each agent every 5 seconds |
| Data | JSON | Metric payloads |
Returns current system metrics as JSON:
{
"hardwareUUID": "8A2E3F1B-...",
"hostname": "Aarons-MacBook-Pro",
"cpuTempCelsius": 42.5,
"cpuUsagePercent": 12.3,
"networkBytesPerSec": 54200.0,
"uptimeSeconds": 86400,
"osVersion": "15.3",
"chipType": "Apple M2",
"network": {
"ipAddress": "192.168.1.5",
"macAddress": "AA:BB:CC:DD:EE:FF",
"interfaceType": "Wi-Fi"
},
"fileVaultEnabled": true
}git clone https://github.com/NorthwoodsCommunityChurch/AVL-Dashboard.git
cd AVL-Dashboard
./Scripts/build.shThe build script compiles both apps with Swift Package Manager, creates .app bundles in ./build/, and applies ad-hoc code signing.
Prerequisites: Xcode or Swift toolchain (no external dependencies).
AVL-Dashboard/
├── Package.swift # SPM manifest (targets: Shared, Dashboard, Agent)
├── Sources/
│ ├── Shared/ # Shared library
│ │ ├── Models/ # MachineStatus, MachineIdentity, Thresholds, SortOrder
│ │ ├── Networking/ # BonjourConstants, HTTPUtils
│ │ └── Extensions/ # TimeInterval + bytes/sec formatting
│ ├── Dashboard/ # Dashboard app
│ │ ├── DashboardApp.swift # Entry point
│ │ ├── Views/ # Grid, cards, rings, flip animation
│ │ ├── ViewModels/ # DashboardViewModel, MachineViewModel
│ │ └── Services/ # Discovery, polling, persistence
│ └── Agent/ # Menu bar agent
│ ├── AgentApp.swift # Entry point
│ ├── Views/ # Menu bar dropdown
│ └── Services/ # HTTP server, system metrics collection
├── Resources/
│ ├── Dashboard-Info.plist
│ └── Agent-Info.plist
└── Scripts/
└── build.sh # Build + bundle + code sign
The agent runs an unauthenticated HTTP server exposing read-only system metrics. This is designed for trusted local networks. See SECURITY.md for details.
MIT License -- see LICENSE for details.
See CREDITS.md for acknowledgments and third-party references.