If you find EdgeControl useful, consider giving it a star — it helps the project show up in search results and reach platforms like Homebrew. No ads, no premium tiers, just a tool I built for myself and wanted to share.
A native macOS system dashboard that turns any display into a fully customizable monitoring station.
Built from scratch in Swift & SwiftUI — no third-party dependencies. Works on any screen: ultrawide monitors, iPads via Sidecar, vertical displays, TVs, or the CORSAIR XENEON EDGE. Includes macOS desktop widgets, notes you can actually write in, and full touch support.
I got the XENEON EDGE because I loved the idea of a dedicated touchscreen dashboard on my desk. But on macOS, there's no software for it — it just shows up as another monitor. So I built my own.
What started as a basic system monitor for one specific display has grown into a universal dashboard platform that adapts to any screen. 27 widgets, dynamic grid layout, macOS desktop widgets, complete theme customization, and a plugin system. Contributors then pushed it past a thing to glance at: it has a real note editor now, a key that captures a line from any app, and a door to Apple Reminders. It's something I use every single day, and it keeps getting better.
EdgeControl turns any display into a fully customizable system dashboard. You create pages, place widgets wherever you want on a dynamic grid that automatically adapts to your screen, resize them, and configure everything from colors to fonts. Run it full-screen on a secondary display or as a resizable window on your main monitor. And when you need to write something down, the notes are right there rather than in another app.
System (9) — CPU Gauge, Memory Gauge, CPU History, Memory History, Process List, Disk I/O, Storage Bars, Memory Pressure, CPU Cores (per-core usage)
Temperature (5) — CPU Temp, GPU Temp, SSD Temp, Temperature History, Per-Core Temp (P-core/E-core breakdown)
Network (3) — Network Stats (up/down speeds), WiFi Info (SSID, signal, channel), Bluetooth Devices
Media (2) — Now Playing (Safari, Chrome, Edge, Spotify, Apple Music — controls, artwork, progress), Audio Devices (output, volume)
Info (7) — Weather (current + 5-day forecast), Clock (10 visual themes), World Clocks, Day Progress, Moon Phase, Sticky Note (a real editor — see below), Reminders (your actual Reminders lists)
DevTools (1) — CI/CD Runs (GitHub Actions and Forgejo/Gitea, across all your hosts)
- Grid adapts to any screen: 6x4 to 24x12 cells, ~120px per cell
- Works on any display — XENEON EDGE (20x6), 1080p monitor (16x9), iPad Sidecar (10x7), vertical screens, TVs
- Kiosk mode (full-screen borderless) or window mode (resizable)
- Drag to move, corner handles to resize, collision detection
- Unlimited pages with swipe navigation
- Each widget adapts its layout to its size (compact, bar, chart, full)
- 8 presets: Default Dark, OLED Black, Midnight Blue, Neon Cyan, Neon Purple, Arctic, Ember, Terminal
- Custom color scheme: individually set all 8 scheme colors (backgrounds, text, borders)
- Accent color: 9 presets + native color picker for any color
- Per-widget colors: primary/secondary/tertiary color overrides with native color picker
- Font system: 4 font families, global scale, 6 individually adjustable font levels
- Widget appearance: opacity, corner radius, gap
Digital, Analog, LCD Retro, Minimal, Split, Rings, Day Bar, Neon, Binary, Dot Matrix
EdgeControl provides native macOS desktop widgets via WidgetKit — add system metrics directly to your desktop without opening the app.
- System Monitor — CPU and memory gauges (small/medium)
- Temperature — CPU, GPU, SSD temps with color coding (small/medium)
- Disk I/O — Read/write speeds (small/medium)
- Network — Upload/download speeds (small/medium)
- WiFi Info — SSID, signal strength, channel (small/medium)
- CI/CD — Workflow run status from GitHub and Forgejo/Gitea (small/medium/large)
See CI/CD setup for adding accounts and the token scopes required.
- Note — The unfinished to-dos of a note from the dashboard (small/medium/large)
- Plugin Widget — Any plugin with
desktopWidgetsupport rendered as a desktop widget
The Sticky Note widget is a rich text editor, not a text field. Markup converts as
you type — - becomes a bullet, - [ ] a checkbox, # a heading, --- a rule,
`code` a chip, ``` a block — and a slash at the start of a line offers
the same things as a menu. Selecting text raises a formatting bar, which is how any
of this is reachable on a touch panel with no keyboard.
- Notes are files.
~/Library/Application Support/EdgeControl/Notes/holds one real RTF per note, a plain-text mirror Spotlight indexes, and the last twenty versions of each. Back up the folder and you have backed up the notes. - Markdown in and out. Paste markdown and it becomes a note; ⌘⇧C copies a note — or a selection — back out. Export Notes in General writes every note as Markdown with its images alongside, so the exported folder stands on its own.
- Images paste in and live next to the note rather than inside it, which is what keeps the folder readable.
- Quick capture. ⌃⌥Space opens a box from any app; what you type lands in the Inbox note. Turn it off in General if the key is spoken for.
- Reminders. ⌘⇧R sends the caret's unfinished to-do — or every one in a selection — to Apple Reminders, skipping what is already there.
- Fill the panel. A note in a small cell is a note you cannot write in; the corner button expands it to the whole display, Esc brings the dashboard back.
- Several notes per widget. Point a widget at any note, or keep a few within reach as tabs.
Extend EdgeControl with custom HTML/JS widgets:
.ecpluginbundle format with manifest.json- WKWebView rendering with full JavaScript SDK
- 14 permissions: 9 data (system metrics, temperature, network, etc.) + 5 actions (notifications, clipboard, storage, URL, network access)
- Dynamic theme integration — CSS custom properties (
--ec-*) auto-injected and live-updated - Persistent key-value storage per plugin
- Network sandbox with domain whitelisting
- Lifecycle events: resize, theme change, visibility
- Install from zip, enable/disable, hot reload
- Plugin Developer Documentation
| System Monitor | Temperatures | Media Control |
|---|---|---|
![]() |
![]() |
![]() |
| Network | Clocks | Connectivity |
|---|---|---|
![]() |
![]() |
![]() |
brew tap kemalandic/edgecontrol
brew trust kemalandic/edgecontrol
brew install --cask edgecontrolRecent Homebrew refuses to load a cask from a third-party tap until you trust it,
so the middle line is not optional — without it the install stops at
Refusing to load cask ... from untrusted tap. Older Homebrew has no brew trust
command and does not need one; skip it there.
Download the latest .dmg from Releases, open it, and drag EdgeControl to Applications.
Requires macOS 14.0 or later. Works on any display — the grid adapts automatically to your screen resolution.
git clone https://github.com/kemalandic/edgecontrol.git
cd edgecontrol
xcodegen generate # requires: brew install xcodegen
open EdgeControl.xcodeproj
# Cmd+R to runThe Xcode project is generated from project.yml and is not in the repository —
xcodegen generate creates it, and re-running it picks up any files added since.
EdgeControl has native HID touch input support for touchscreen displays (including the CORSAIR XENEON EDGE). Every button and control works with both mouse clicks and direct touch taps. The touch system auto-calibrates to your display positioning. On non-touch displays, all controls work with standard mouse input.
Sources/EdgeControl/
├── App/ # Entry point, window placement
├── Models/ # WidgetProtocol, DynamicGrid, LayoutConfig, ThemeSettings, PluginManifest, WidgetData
├── Services/ # AppModel, LayoutEngine, WidgetRegistry, PluginManager, WidgetDataBridge, PluginWidgetRenderer
├── UI/
│ ├── Components/ # RadialGauge, HistoryGraph, ThemeEnvironment, WidgetHeader
│ ├── Settings/ # 6-tab settings window (Pages, Widgets, Theme, Plugins, Display, General)
│ ├── DashboardShell.swift # Main dashboard container with dynamic grid
│ └── GridPageView.swift # Widget grid renderer with edit mode
└── Widgets/
├── System/ # CPU, Memory, Storage, Pressure, Cores, DiskIO, ProcessList
├── Temperature/ # CPU/GPU/SSD Temp, TempHistory, PerCoreTemp
├── Network/ # NetworkStats, WiFiInfo, Bluetooth
├── Media/ # NowPlaying, AudioDevices
├── Info/ # Weather, Clock, WorldClocks, DayProgress, MoonPhase
├── DevTools/ # CICDRuns
└── Plugin/ # PluginWebWidget (WKWebView renderer + JS SDK)
Sources/EdgeControlWidgets/ # macOS Desktop Widget Extension (WidgetKit)
├── Providers/ # TimelineProviders for each widget type
└── Views/ # SwiftUI widget views + shared styles
- Location — weather data (Open-Meteo, free API)
- Bluetooth — connected device list
- Questions & Help — Discussions (Q&A)
- Feature Ideas — Discussions (Ideas)
- Bug Reports — Issues
- Show Your Setup — Discussions (Show and Tell)
Contributions welcome — see Build from Source to get started.
Built by PaksLab





