Windows/Linux keyboard habits on Mac: hardcoded shortcuts, zero UI.
Move windows with Control + arrow keys. Switch Dock apps with Control + 1 through 9. The app runs as a background utility with fixed shortcuts: no settings pane, menu bar item, or Dock icon during normal use.
- At a glance
- Who is this for
- How this differs from other snap tools
- Try it locally
- Shortcut cheat sheet
- How it behaves
- FAQ
- Status and limitations
- Build from source
- Project layout
- Contributing
- Window placement: left/right halves, top and bottom rows, fill, minimize/restore, and multi-display cycling.
- Dock app switching: launch, activate, unhide, or restore pinned Dock apps by number, like
Win+1–9on Windows. - Zero configuration: shortcuts are fixed; there is nothing to customize.
- No analytics, no network calls, no accounts.
- Login Start: after you open it once, macOS can start it automatically at login.
- You switched from Windows or Linux and miss
Control+ arrow window snapping. - You want keyboard-driven window management without a tiling window manager or a settings app.
- You are fine granting Accessibility so the app can perform Native Window Actions on other apps' windows.
Not a fit if you need custom shortcuts, a visible menu bar utility, or guaranteed pixel-perfect tiling. The app accepts each Native Result from macOS, including partial sizing when an app constrains its windows.
Tools like Rectangle, Magnet, and Swish excel at window geometry, often with drag zones, menu bar icons, and remappable shortcuts. Windows Snap for Mac takes a narrower path:
| Windows Snap for Mac | Typical snap utilities | |
|---|---|---|
| Shortcuts | Fixed Control-based set | User-configurable |
| Visible UI | None during normal use | Menu bar, preferences, drag targets |
Dock Control + 1–9 |
Yes (Windows taskbar parity) | Not usually included |
| Window behavior | Public Accessibility APIs; accepts macOS placement results | Often custom geometry or tiling |
| Source & distribution | MIT open source; App Store planned, not live yet | Varies (Rectangle is OSS; Magnet is App Store) |
If you want to remap keys or snap by dragging windows to screen edges, use one of those tools. If you want a fixed Windows/Linux shortcut set with no configuration surface, start here.
Requirements: macOS Tahoe 26 or newer, Xcode 26+ with Swift 6.2, and XcodeGen (brew install xcodegen).
xcodegen generate
CODE_SIGN_IDENTITY=- ./scripts/build-app.sh
open "/tmp/windows-snap-for-mac-build/Windows Snap for Mac.app"On first launch, macOS shows the native Accessibility permission prompt. Grant it under System Settings → Privacy & Security → Accessibility. Without that permission, shortcut capture does not register. The app will not swallow key presses it cannot act on.
For shortcuts to keep working across rebuilds, use a stable Developer ID signing identity instead of ad-hoc signing. See CONTRIBUTING.md.
| Shortcut | What it does |
|---|---|
Control + ← / → |
Move the active window to the left or right half. Press again within 1.5 s to Display Cycle to the previous or next monitor. |
Control + ↑ |
Restore a window minimized by Control + ↓; otherwise move to the top half. If already top-full-width, fill the display. |
Control + ↓ |
Move to the bottom half (keeps the current column). If already bottom-full-width, minimize. Press ↑ or ↓ again to restore. |
Combine directions for quarters. For example, Control + ↑ then Control + ← places the window in the top-left quarter.
| Shortcut | What it does |
|---|---|
Control + 1–9 |
Launch, activate, unhide, or restore the matching Dock App in pinned left-to-right order. |
| Repeat within 2 s | While that app is frontmost, toggle minimize/restore on the current window only. |
Control + 1 treats Finder as usable only when a Finder window is visible. If another Dock app is already frontmost with a visible window, a non-repeat shortcut stops silently (Silent Failure).
Option + arrow keys are native macOS text-navigation shortcuts (move by word). Control + arrows match the Windows/Linux mental model and avoid breaking text editing.
- Uses public Apple APIs for Native Window Actions, not custom tiling geometry.
- If a shortcut cannot run, it stops instead of trying a fallback (fail fast).
- Normal failures are logged internally only; no notifications or HUDs (silent failure).
- Quit or remove the app through normal macOS surfaces; there is no in-app quit button (system-managed exit).
Shortcuts do nothing after I launch the app.
Grant Accessibility under System Settings → Privacy & Security. The app has no Dock icon during normal use. Confirm it is running via Activity Monitor or Login Items. Rebuilds signed ad-hoc (CODE_SIGN_IDENTITY=-) get a new code identity each time, so macOS drops Accessibility trust; use Developer ID signing for a stable local build.
Why does Accessibility reset every time I rebuild?
Ad-hoc signing creates a new bundle identity on each build. macOS treats each build as a different app for TCC (privacy permissions). Sign with a Developer ID Application certificate so the bundle identity stays stable.
Why macOS Tahoe 26+?
Development and release gates target the current Apple SDK and macOS generation. Older releases are out of scope for this repo.
Can I change the shortcuts or add a menu bar icon?
No. Zero configuration is intentional. See Out of scope in CONTRIBUTING.md.
Is there an App Store download?
Not yet. The product targets Mac App Store distribution as a sandboxed background utility, but sandbox + Accessibility proof is still in progress. Build locally or watch the repo for release updates.
In active development. The product targets Mac App Store-only distribution as a fully sandboxed background utility (ADR 0017).
Sandbox proof is still in progress: sandboxed builds can register shortcut capture, but cross-app Accessibility window control inside the App Sandbox needs further work before submission. The repo includes diagnostic scripts and a sandbox probe build for that investigation. Local builds outside the store path are for development and testing.
There is no App Store download yet. Marketing and support pages live at windows-snap-for-mac.alexpedersen.dev.
# Regenerate Xcode project and build
xcodegen generate
xcodebuild -project WindowsSnapForMac.xcodeproj \
-scheme WindowsSnapForMac -configuration Debug build
# Unit tests (no Apple Developer account required)
swift test
# Signed local .app bundle (see CONTRIBUTING.md for signing options)
./scripts/build-app.shUnsigned Debug builds work for code review:
xcodegen generate
xcodebuild -project WindowsSnapForMac.xcodeproj \
-scheme WindowsSnapForMac -configuration Debug build \
CODE_SIGNING_ALLOWED=NOApp Store release tooling (validate-app-store-prep.sh, audit-app-store-release-readiness.sh, and related scripts) is documented in CONTRIBUTING.md and AGENTS.md.
Sources/WindowsSnapForMac/ App lifecycle, shortcuts, window and Dock services
Sources/WindowsSnapForMacCore/ Pure logic: grid placement, Dock resolution
Tests/WindowsSnapForMacCoreTests/ Unit tests
docs/adr/ Architecture decision records
CONTEXT.md Product glossary and terminology
IMPLEMENTATION_PLAN.md Build sequence and verification matrix
Issues and pull requests are welcome. See CONTRIBUTING.md for prerequisites, signing expectations, and pull request guidelines. Report security issues through SECURITY.md.
Released under the MIT License.

