Profile
Back to NewsBack
GitHub Trending 11 min
Reader Mode
zacharytgray/HyprMac: Keyboard-first tiling window manager for macOS, inspired by Hyprland

zacharytgray/HyprMac: Keyboard-first tiling window manager for macOS, inspired by Hyprland

HyprMac

Tile your Mac from the keyboard.

A keyboard-driven tiling window manager for macOS, inspired by Hyprland.
Free, open source, and the first real job your Caps Lock key has ever had.

[![Latest release][badge-release]][releases] [![Downloads][badge-downloads]][releases] [![Stars][badge-stars]][stargazers] [![macOS 13 or later][badge-macos]](#install) [![MIT license][badge-license]](LICENSE)


Install
 
Features
 
Keys
 
Docs
  [
hyprmac.app
][site]

HyprMac tiling a messy desktop, then moving, swapping, resizing and floating windows from the keyboard

[▶ Watch the one-minute demo][demo]  ·  [Try it in your browser][try]  ·  [Download for macOS][dmg]

What it does

If your Mac usually looks like a pile of windows stacked on top of each other, and the one you want is always at the bottom, HyprMac is for you. Hold one key, tap another, and the desktop does what you asked.

Safari and Terminal open and slot into a tiled layout

Windows arrange themselves

Open an app and it slots into a tidy tiled layout. No dragging, no resizing, no digging.

Focus moves between windows, then windows swap places

Your keyboard drives

Hypr + an arrow moves between windows. Add Shift to swap them. Hypr + J flips a split.

Switching between workspaces 1, 2, 3 and 10

Ten workspaces

Hypr + a number jumps to a workspace. Add Shift to send the focused window there.

Spotify drops in from the scratchpad and hides again

A scratchpad one key away

Keep music or notes on a floating layer. Hypr + S brings it up and puts it away.

10

workspaces

60+

default shortcuts,
all remappable

14

choices for
the Hypr key

1,900+

unit tests

60+

releases since
April 2026

The five keys to know

The Hypr key is Caps Lock out of the box. Hold it like a modifier.

| Keys | What happens | |------|--------------| | Hypr + ← → ↑ ↓ | Move between windows | | Hypr + Shift + ← → ↑ ↓ | Swap windows around | | Hypr + 1–9, 0 | Jump to workspace 1–9, or 10 | | Hypr + Return | Open Terminal | | Hypr + K | Show every keybind |

Most people have these down in a few minutes. Forgot one? Hypr + K lists every shortcut, and you can type to filter it. When you want more, every keybind is remappable and you can point keys at your own scripts.

Install

brew trust --cask zacharytgray/hyprmac/hyprmac
brew install --cask zacharytgray/hyprmac/hyprmac

Homebrew refuses to load casks from third-party taps until you trust them. The first line trusts only the HyprMac cask, which also lets brew upgrade --cask hyprmac work later.

No Homebrew? Download [HyprMac.dmg][dmg], open it, and drag HyprMac to Applications. Older versions are on the [releases page][releases].

Then follow the install guide for first-run setup, permissions, and the recommended macOS settings. A short tour on first launch walks you through the keys.

Requirements

  • macOS 13 (Ventura) or later, on Apple silicon or Intel.
  • Accessibility permission, in System Settings → Privacy & Security → Accessibility.
  • Nothing else. System Integrity Protection stays on.
[!IMPORTANT]
With Caps Lock as your Hypr key, leave Caps Lock set to "⇪ Caps Lock" in System Settings →
Keyboard → Keyboard Shortcuts → Modifier Keys. Do not set it to "No Action". The pane is per
keyboard, so check each one you use. HyprMac remaps Caps Lock to F18 itself.

Choosing a different Hypr key

Settings → Keys offers 14 choices: Caps Lock, backslash, F13–F20, and Option or Command on either side.

  • If Option or Command is your Hypr key, leave it on its default in the Modifier Keys pane too.
Backslash and F13–F20 are not in that pane and need nothing.
  • If you pick the left Option or Command key, that key plus a key HyprMac uses goes to HyprMac.
Type shortcuts like ⌘S or ⌘T with the right-hand key.
  • Shift and Control are not offered because many default shortcuts add them to Hypr. Tab and
backtick are not offered because Hypr+Tab, Hypr+Shift+Tab, and Hypr+ are default shortcuts. A config that already uses one of these keys keeps working, and Settings → Keys says why it is no longer recommended.
  • macOS gives apps no way to read the Modifier Keys setting, so HyprMac shows a reminder in
onboarding and in Settings → Keys, with an Open Keyboard Settings button.

More than tiling

Focus you can see
Inactive windows dim. Corner brackets mark the focused window while you hold Hypr, and they glide to the next one when focus moves.
Drag with a preview
Drag a window onto a tile's edge to insert it there. Hold Hypr while dragging to swap. A highlight shows where it will land.
Every monitor
Each workspace has a home monitor. Hypr + Ctrl + an arrow sends a window to the next display.
Overview
Hypr + O shows every workspace and what is on it. Name your workspaces and the names show up there.
Maximize and float
Hypr + F fills the display and puts the window back. Hypr + T floats a window above the tiles.
Pin apps
Send an app to the same workspace every time it opens, or to the scratchpad. Keep other apps out of tiling entirely.
Saved layouts
Save a layout for the displays you have connected. HyprMac restores it when you plug the same displays back in.
Settings, not dotfiles
Gaps, focus look, keybinds and the Hypr key all live in a Settings window. The same settings are plain JSON on disk if you want them.
Your own tools
Bind a key to any script. Drive HyprMac from Raycast or BetterTouchTool with hyprmac:// links. Feed sketchybar from state.json.

HyprMac is a signed and notarized universal app. It updates itself through Sparkle.

For Hyprland folks

You'll feel at home. The differences are mostly macOS being macOS.

| In Hyprland | In HyprMac | |-------------|------------| | Dwindle layout | BSP dwindle. New windows split the focused one, and Hypr + J flips the split direction. | | Workspaces | Ten virtual workspaces on keys 1–9 and 0. macOS has no public API for this, so HyprMac keeps its own and hides the other workspaces' windows when you switch. | | Special workspace | The scratchpad, on Hypr + S. | | Fullscreen | Hypr + F fills the display over the workspace. Native macOS fullscreen spawns its own Space and wrecks the layout, so HyprMac does not use it. | | follow_mouse | Focus follows mouse, on by default, with an adjustable hover rate. | | SUPER | The Hypr key. Caps Lock by default. | | hyprland.conf | Settings, saved as JSON at ~/Library/Application Support/HyprMac/config.json. The schema is in Keybinds and actions. | | exec binds | Settings → Keys → Add → Command… binds a chord to any program or script. It runs directly, not through a shell, so keep pipes and redirects inside a script. | | hyprctl dispatch | hyprmac://action/… links, once you turn on "Allow other apps to control HyprMac". |

Dragging works too. Drag a tiled window by its title bar onto another tile's edge to insert it there, or hold Hypr while dragging to swap the two. The tile can be on another monitor, and an empty workspace there takes the window whole.

Reference

All default keybinds

Everything below is configurable in Settings → Keys. The full reference lives at hyprmac.app/guides/keybinds.

| Shortcut | Action | |----------|--------| | Hypr + ←/→/↑/↓ | Focus window in direction | | Hypr + Shift + ←/→/↑/↓ | Swap window in direction | | Hypr + Ctrl + ←/→/↑/↓ | Move window to the adjacent monitor in that direction | | Hypr + Ctrl + Shift + ←/→/↑/↓ | Resize focused window in direction | | Hypr + 1–9 / Hypr + 0 | Switch to workspace 1–9 / workspace 10 | | Hypr + Shift + 1–9 / Hypr + Shift + 0 | Move window to workspace 1–9 / workspace 10 | | Hypr + Ctrl + Shift + 1–9 / Hypr + Ctrl + Shift + 0 | Move window to workspace 1–9 / 10 and switch there with it | | Hypr + Tab / Hypr + Shift + Tab | Cycle occupied workspaces on this monitor | | Hypr + F | Maximize the window, or put it back | | Hypr + T | Toggle floating and tiled | | Hypr + Shift + T | Cycle focus through floating windows | | Hypr + J | Toggle split direction | | Hypr + S / Hypr + Shift + S | Toggle scratchpad / send window to scratchpad | | Hypr + W | Close window | | Hypr + P | Pause or resume tiling | | Hypr + K | Show the keybind overlay | | Hypr + O | Show workspace overview | | Hypr + Ctrl + S / Hypr + Ctrl + R | Save / restore the layout for this display setup | | Hypr + R | Retile all spaces (also applies workspace pins) | | Hypr + Return | Launch or focus Terminal | | Hypr + ` | Warp the cursor to the menu bar |

Pinning apps to workspaces

Settings → General → "Pin apps" sends an app to a workspace of your choice, or to the scratchpad. Every new window of a pinned app opens there, and HyprMac shows it. An app pinned to the scratchpad also goes back there at launch and on Hypr + R, with the scratchpad left closed. If a pinned workspace is full, the window goes to the next one with room. Hypr + R (Retile all spaces) also moves a pinned app's open windows back to its workspace. An app in "Never tile" can be pinned too: it goes to its workspace and stays floating.

Apps in "Never tile" can't be tiled by hand either. Hypr+T on one shakes red and says so; remove the app from the list to tile it again.

Saved layouts

Hypr + Ctrl + S saves which workspace each tiled window is on and how each workspace is split, across every monitor, for the displays you have connected right now. Hypr + Ctrl + R puts all of it back. Restore only moves windows that are open; it doesn't reopen closed apps, and a saved window that isn't open is skipped. A HUD like the workspace switch one says whether the layout was saved, restored, or only partly restored.

HyprMac also saves on its own just before your displays change, and restores when you return to a display setup it has saved. To restore at launch too, turn on "Restore saved layout at launch" in Settings → General.

Saved layouts stay on this Mac in ~/Library/Application Support/HyprMac/layout-snapshots.json. The file keeps window titles so it can tell windows apart. To clear it, quit HyprMac and delete the file, plus layout-snapshots.json.unreadable if it exists. Setups with the same monitor models at the same resolutions share one saved layout, however they are arranged.

Config file and updates

Everything, including the Hypr key itself, lives in Settings and is saved as JSON at ~/Library/Application Support/HyprMac/config.json. A config file HyprMac can't decode is copied to config.json.unreadable before a save overwrites it.

HyprMac checks for updates on its own through Sparkle and offers to install them, or use the menu bar icon → "Check for updates…". Homebrew installs can run brew upgrade --cask hyprmac. After any update, macOS may ask you to re-grant Accessibility permission, because the signature changes with each release.

Build from source

git clone https://github.com/zacharytgray/HyprMac.git
cd HyprMac

brew install xcodegen xcodegen generate

export DEVELOPMENT_TEAM=YOUR_TEAM_ID xcodebuild -project HyprMac.xcodeproj -scheme HyprMac -configuration Debug \ -derivedDataPath build DEVELOPMENT_TEAM=$DEVELOPMENT_TEAM build

cp -r build/Build/Products/Debug/HyprMac.app /Applications/

The reality of macOS

macOS was not built to let other apps manage its windows, and every tiling window manager on the Mac is working against that. Some apps push back, and now and then a window will insist on doing its own thing. HyprMac is in active development and very usable day to day. When something misbehaves, open an issue and tell me about it.

Why I built it

I use Hyprland on Linux and wanted the same workflow on my Mac. Reaching for the mouse to find a window is a small cost paid hundreds of times a day, so I built HyprMac to remove it. I rely on it every day.

Docs

Contributing

Bug reports, ideas, and pull requests are all welcome. Before you open a pull request, run the test gate:

./scripts/test-isolated.sh --debug-variant

Inspired by

  • Hyprland: the Wayland compositor this project takes after
  • yabai: macOS tiling window manager
  • AeroSpace: Swift tiling window manager with virtual workspaces
  • Amethyst: macOS tiling window manager
  • skhd: hotkey daemon

License

MIT

[site]: https://hyprmac.app [demo]: https://hyprmac.app/hyprmac-demo-github.mp4 [try]: https://hyprmac.app/#try [dmg]: https://github.com/zacharytgray/HyprMac/releases/latest/download/HyprMac.dmg [releases]: https://github.com/zacharytgray/HyprMac/releases [stargazers]: https://github.com/zacharytgray/HyprMac/stargazers [badge-release]: https://img.shields.io/github/v/release/zacharytgray/HyprMac?style=flat-square&label=release&labelColor=181a20&color=56d8f0 [badge-downloads]: https://img.shields.io/github/downloads/zacharytgray/HyprMac/total?style=flat-square&label=downloads&labelColor=181a20&color=56d8f0 [badge-stars]: https://img.shields.io/github/stars/zacharytgray/HyprMac?style=flat-square&label=stars&labelColor=181a20&color=56d8f0 [badge-macos]: https://img.shields.io/badge/macOS-13%2B-56d8f0?style=flat-square&labelColor=181a20 [badge-license]: https://img.shields.io/github/license/zacharytgray/HyprMac?style=flat-square&label=license&labelColor=181a20&color=56d8f0

Chat with me