mirror of
https://github.com/MonitorControl/MonitorControl.git
synced 2026-05-15 14:15:55 -06:00
[GH-ISSUE #1803] 🚀 MonitorControl 2.0 Vision: Ultra-Light Menu Agent + Pro-Level Features to Outshine Lunar & BetterDisplay #994
Labels
No labels
Status: Abandoned
arm64
beta
beta
bug
done
duplicate
enhancement
feedback needed from reporter
in progress
invalid
investigating
known Issue
monitor Issue
pull-request
translation
unable to reproduce
unreleased
x86
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: github-starred/MonitorControl#994
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @Yodoma on GitHub (Sep 18, 2025).
Original GitHub issue: https://github.com/MonitorControl/MonitorControl/issues/1803
Before opening the issue, have you...?
Discussion
TL;DR — biggest opportunities
Quick feature comparison (what users want)
Concrete improvements to tremendously outcompete others
Product / UX (what to build)
Engineering / performance (how to make it efficient)
Do not poll. Replace any polling loop with event callbacks from the OS (display add/remove) and DDC-notifications where available. Polling is the main CPU killer when many apps try to “refresh” monitor state. Use CoreGraphics display callbacks and IOKit for DDC when needed. ([Apple Developer]1)
Two-process architecture (recommended):
Lazy load modules — keep frameworks (DDC/IOKit, color management, UI heavy code) in dynamic frameworks and only
dlopen/instantiate when needed.Security & packaging
How to implement the “menu but no CPU/RAM until a display is connected” (practical pattern)
Important note up front: a visible menu bar icon requires a running process — you cannot magically show a UI element with zero process memory. But you can make that resident process extremely tiny and event-driven, and only start the heavy work when a display is present. Below is a safe, practical pattern used by macOS apps.
Minimal strategy (implementation steps)
Create a tiny agent (LSBackgroundOnly or small GUIless status item) that:
CGDisplayRegisterReconfigurationCallback) to get add/remove events. ([Apple Developer]1)When the callback indicates a compatible display is present, the agent spawns the worker (Process or XPC service) which loads the DDC / IOKit code and UI.
Worker does DDC/CI via IOKit APIs like
IOI2CSendRequest(DDC over I2C) or platform-specific helpers (note: some connections/hubs block DDC — fall back to software dim). ([Stack Overflow]7)When displays disconnect, the worker gracefully exits — agent returns to idle.
Example Swift-ish sketch (display callback + spawn)
(Cite Apple docs for the callback API.) ([Apple Developer]1)
Why this is low-cost
DDC/CI and platform notes (real-world quirks)
m1ddc), so test on M1/M2 and document any known limitations. ([Ask Different]8)Roadmap (prioritized)
Quick wins (weeks):
Mid (1–3 months):
Bigger (3–6 months):
Business & trust (ongoing):
Final note (realistic expectations)
@amelnikoff commented on GitHub (Sep 23, 2025):
Ex Lunar user here:
I switched off it almost immediately because it's hard to configure same brightness levels on Macbook with non Apple monitor. You always see diffenet ambience, colors.
Much easier to calibrate once color profiles between monitors, and use after hotkeys to adjust brightness.