Imperator HotCorners
Four pop-ups, one per screen corner, that set the same hot corners System Settings does, plus one switch that turns all four off and puts them back later.
README.md
// Overview
Set the four macOS hot corners from the menu bar, or turn them all off with one switch. Quick and easy.
// Requirements
Requires macOS 26 or later, on Apple silicon or Intel. Built and tested on macOS 27 on Apple silicon only. Older versions and Intel Macs are expected to work but have not been verified.
Install at your own risk. The app is not notarized and carries no Apple Developer signature, so macOS cannot vouch for it. It is provided as is, with no warranty, under the MIT license.
// Install
Download the latest zip from
Releases,
unzip, and move Imperator HotCorners.app to /Applications.
The app is signed with a self-signed certificate and is not notarized, so Gatekeeper blocks the first launch. Right-click the app and choose Open, or clear the quarantine flag:
xattr -dr com.apple.quarantine "/Applications/Imperator HotCorners.app"There is no Dock icon. The app lives in the menu bar.
// Permissions
None. The app requests no Accessibility, Input Monitoring, or Automation grants,
and declares no NSUsage keys. It reads and changes hot corners through the
same two Dock functions System Settings uses, and macOS asks for no permission
for those.
The one system integration is Open at Login, the toggle in the panel footer.
It calls SMAppService.mainApp.register(), which adds the app to Login Items in
System Settings. Turning the toggle off unregisters it.
// Use
Click the icon in the menu bar and a panel drops down. The four pop-ups sit where their corners are: top left, top right, bottom left, bottom right. Whatever you already set in System Settings shows up here, because the panel reads the Dock every time it opens. Clicking the icon again closes the panel, as does Escape or a click in another app.
| Control | What it does |
|---|---|
| Corner pop-up | Sets that corner's action. The change applies at once, and System Settings shows the same value |
| Hold ⌘, ⌥, ⌃ or ⇧ while choosing | Adds a modifier key, as in System Settings. The corner then fires only while those keys are held |
| Disable HotCorners switch, under the four pop-ups | Turns all four corners off, and back on |
| Open at Login | Starts the app when you log in |
| About | Version and copyright |
| Quit | Quits the app |
The actions and their order are the ones System Settings offers: Mission Control, Application Windows, Desktop, Notification Center, Apps, Quick Note, Start Screen Saver, Disable Screen Saver, Put Display to Sleep, Lock Screen, and "-" for no action.
Turning Disable HotCorners on sets every corner to "-" and remembers what each one did, modifier keys included. Turning it off puts them back. While it is on, the pop-ups still work, dimmed: what you choose then is what comes back when you turn it off, and the Dock is not touched until you do. If you turn a corner on in System Settings while the corners are disabled, System Settings wins and the switch goes back off.
If the Dock does not answer, or a change does not stick, a short notice in the panel says so, with a button to try again or to open Desktop & Dock settings. Nothing is changed while that notice is showing. A switch that fails halfway is undone; if even that fails, the app keeps the remembered corners, so turning the switch off again puts every one of them back.
// How it works
System Settings reads hot corners with CoreDockGetExposeCornerActionsWithModifiers
and writes them with CoreDockSetExposeCornerActionWithModifier, two private
functions in HIServices that send a message straight to the Dock. The app calls
the same two. A change therefore lands immediately, the Dock is never restarted,
and System Settings shows it on its next open.
Both functions are loaded with dlsym at launch rather than linked. If a future
macOS removes them, the app still starts, shows a notice and links to Desktop &
Dock settings instead.
The logic lives in HotCornersCore, a library with no AppKit in it, so every
rule in the store is covered by unit tests against an in-memory Dock and never
touches the real one.
// Known limits
- The two Dock functions are private. A macOS update can change or remove them; the app then shows a notice instead of changing anything.
- A title with modifier keys can be wider than its column. The longer ones end in an ellipsis; the tooltip shows the full title.
- Hot corners are one set for all displays. That is how macOS works, and the app follows it.
// Build from source
make installBuilds release for Apple silicon and Intel, bundles, codesigns, installs to
/Applications, and launches. Other targets:
make runmake testmake cleanplatforms: [.macOS("26.0")] in Package.swift makes macOS 26 the minimum and
stamps minos 26.0 / sdk 26.0 into the binary. AppKit picks which generation of
a control to draw from that sdk field, so the stamp is what gives the switches
and pop-ups their current look.
Signing uses the self-signed Imperator Dev identity by default. It has to be a
stable identity rather than ad-hoc: the login item registration is keyed to the
bundle's designated requirement, and ad-hoc signing mints a new hash on every
build, so each update would look like a different app and drop the registration.
// Release
make dist VERSION=x.y.zBuilds a zip without touching git or the remote.
make release VERSION=x.y.zBumps Info.plist, commits, tags vx.y.z, pushes, and publishes a GitHub
release with the zip attached. Requires the GitHub CLI and a clean working tree.
// Implementation note
The menu bar panel is drawn by MenuBarPanel, an NSPanel, rather than by
NSPopover. macOS 27 draws its own menu bar panels as plain rounded rectangles
with no arrow and no open or close animation, and NSPopover draws neither that
shape nor that corner and exposes no radius to set. The panel is 400 pt wide
instead of the brand book's 340, because two columns of pop-ups need 176 pt each
for the longest action title.
// Third-party
None. The app uses only Apple frameworks.