I've been using Magnet for years. Then I got a Mac Mini to run OpenClaw agents 24/7. Didn't want to sign in with my Apple ID on that machine, so I skipped the App Store entirely.
That's when I found out: Magnet is App Store only. No DMG, no Homebrew, nothing.
Tried going without a window manager for two days. Couldn't do it. So I built one.
Nudge
Nudge is a free, open-source macOS window manager built with pure Swift and AppKit. 19 layouts, customizable keyboard shortcuts, drag-to-edge snapping, multi-monitor support. The whole app is under 1MB.How it works
Started with the basics — keyboard shortcuts for halves, quarters, thirds. Every layout uses Ctrl+Option as the modifier. Arrow keys for halves, U/I/J/K for quarters, D/F/G for thirds. All fully remappable.
Then I added drag-to-edge snapping. Drag a window to a screen edge, a blue translucent overlay shows where it'll land, release to snap. The overlay fades in at 150ms — fast enough to feel responsive, slow enough to not be jarring.
Multi-monitor support came next. Press the same shortcut twice and the window moves to the next display with the position mirrored (left becomes right). Dedicated Next Display / Previous Display shortcuts are also there for explicit control.
Here's what it looks like in action:
The Accessibility API rabbit hole
macOS window management is entirely through the Accessibility API (AXUIElement). You ask the system for the focused window, read its position and size, then set new values. Straightforward in theory.
In practice, some apps don't play nice:
Problem 1: Apps that don't expose windows. Some Electron apps report 0 windows through AX even though you can see the window on screen. Fixed it with a multi-step fallback:kAXFocusedWindowAttribute (standard)kAXMainWindowAttribute (popups/dialogs)kAXWindowsAttribute arrayNSWorkspace.frontmostApplication + AXUIElementCreateApplicationCGWindowListCopyWindowInfo with .optionAll to find the window by PID and match by boundsAXEnhancedUserInterface which causes window moves via AX to animate instead of snapping instantly. Fix: disable that flag before each move. Rectangle uses the same workaround.
Problem 3: SkyLight fallback. For apps where AX truly can't control windows (position/size calls succeed but nothing happens), the app falls back to Apple's private SkyLight framework loaded at runtime via dlopen/dlsym. Not ideal, but it works and degrades gracefully if the APIs change.
Why not Rectangle?
Rectangle is a good app. If you're happy with it, keep using it.
But I wanted something minimal. Here's the comparison:
| | Nudge | Magnet | Rectangle |
|---|---|---|---|
| Price | Free | $9.99 | Free |
| Open Source | Yes (MIT) | No | Yes |
| App Size | <1MB | ~5MB | ~15MB |
| Dependencies | None | - | Several |
| Drag-to-Edge | Yes | Yes | Yes |
| Multi-Monitor | Yes | Yes | Yes |
| App Store Required | No | Yes | No |
Nudge is 17 Swift files. No SwiftUI, no Electron, no frameworks. Hotkeys use Carbon's RegisterEventHotKey. Drag detection uses a CGEvent tap. The entire codebase is auditable in an afternoon.
Install
brew tap mikusnuz/tap
brew install nudge-runOr download the DMG from GitHub Releases. Signed and notarized — no Gatekeeper warnings.
Source: github.com/mikusnuz/nudge
Now I use it on all my Macs. If you find bugs, open an issue.
Website: nudge.run