← Home / Imperator HotCorners

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.

MenuBar AppMIT Licensev1.0.0Updated 2026-11-04

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.

ControlWhat it does
Corner pop-upSets that corner's action. The change applies at once, and System Settings shows the same value
Hold ⌘, ⌥, ⌃ or ⇧ while choosingAdds a modifier key, as in System Settings. The corner then fires only while those keys are held
Disable HotCorners switch, under the four pop-upsTurns all four corners off, and back on
Open at LoginStarts the app when you log in
AboutVersion and copyright
QuitQuits 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 install

Builds release for Apple silicon and Intel, bundles, codesigns, installs to /Applications, and launches. Other targets:

make run
make test
make clean

platforms: [.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.z

Builds a zip without touching git or the remote.

make release VERSION=x.y.z

Bumps 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.