Ghostty, in every tile.
A full Ghostty terminal with your Ghostty config, fonts, and theme. IME, mouse, clipboard, and shell integration all work.
- libghostty
- GPU rendered
- OSC 9 / 777 notifications
Terminals, browsers, and simulators, tiled in one native window with Hyprland's keybinds, looks, and motion.
project ❯ hello
Hyprland-style tiling for macOS, in one window.
terminals · web · iOS Simulator · pickers · sessions
project ❯ git status --short
M Sources/Layout/Dwindle.swift
?? site/
project ❯
What goes in a tile
A tile holds a terminal, a web page, a document, or a device. Put them side by side on one workspace, and move between them with the same keys.
A full Ghostty terminal with your Ghostty config, fonts, and theme. IME, mouse, clipboard, and shell integration all work.
Back, forward, reload, and an address bar for URLs or searches. Popups open as new tiles. ⌘-click a link in a terminal to open it next to it.
⌘-click a local .md file in a terminal to read it rendered. The view follows your edits, and FILE.md:42 jumps to line 42.
Live iOS Simulator and Android Emulator screens. Click and drag to touch, type to use the keyboard, and use the buttons for Home, Lock, Back, and Recents. Simulator.app isn't needed.
VS Code, Cursor, and Zed already open in tiles. Any app can build against Hyprmux to show its own UI as a tile. Hyprmux places it, decorates it, and animates it like the rest.
Configuration
The same syntax, binds, dispatchers, and bezier curves. Save the file and Hyprmux reloads it. A mistake shows in a red bar, and the rest of the file still applies. Try it here: edit a value, or pick a preset.
~ ❯ hyprmuxctl reload
ok
~ ❯
Directional focus, move and swap, resizing with keys or the mouse, floating, and fullscreen.
Gradient borders, shadows, rounded or squircle corners, blur, and dimmed inactive tiles.
Tiles pop in, workspaces slide, and borders fade, on the curves you set.
Your Ghostty config still applies to terminals. A ghostty { } block can override it.
Built for agents
Each tile shows what its agent is doing: working, needs you, or done. Scripts and agents drive Hyprmux through hyprmuxctl, and your focus stays where it is.
~/app ❯ pi "fix the flaky login test"
● Reading tests/login.spec.ts
Edit src/auth/session.ts
Run npm test -- login
~/app ❯ pi "add a dark mode switch"
● Writing src/theme.ts
❯ hyprmuxctl new-surface --input 'pi "document the orders API"\n' | jq -r .ref
surface:4
❯ hyprmuxctl read-screen --surface 2 --lines 2
Allow rm -rf build?
1. Yes 2. No
❯ hyprmuxctl send --surface 2 'y\n'
❯ agent-browser connect "$(hyprmuxctl cdp-url)" && agent-browser click @e2
✓ clicked @e2
❯ hyprmuxctl events
agent>>4,pi,done
agent>>1,pi,done
Orange for working, red for needs you, green for done. Workspace pills count them, and a notice tells you when an agent waits for an answer.
hyprmuxctlA hyprctl-like CLI. Read screens, send text and keys, open tiles in the background, and stream events. Hooks run commands when events happen.
agent-browser, Playwright, and Puppeteer drive Chromium tiles. A banner and a cursor show what the agent does, and Stop takes control back.
Relaunch and get back your workspaces, layouts, directories, programs like nvim, and agent sessions for pi and Codex.
Claude Code, Codex, pi, opencode, and the rest run as they are. A one-line hook reports their state, and pi ships with an extension.
hyprmuxctl skill install gives your agent a skill that teaches it to find, read, and drive other tiles.
The rest of Hyprland
The parts of Hyprland you miss on a Mac, plus a few it never had.
Numbered workspaces that slide like Hyprland's, with optional names.
Several windows as tabs in one tile. ⌃Tab switches them.
A hidden workspace that slides in over the current one, and away again.
Save a workspace as a template, then summon it again with its programs and agents.
fzf-style lists for workspaces, apps, and an app's windows, plus a menu of all of them.
Float any tile, maximize it, or make it fill the screen. Then tile it again.
Fill web fields and terminal password prompts from 1Password, after Hyprmux checks the origin.
Config errors and terminal notifications, styled like your terminal.
Shows each shortcut as you press it, for recordings and screen sharing.
Default binds
SUPER is ⌘. Keys are physical positions, so they work with any keyboard layout. Keys no bind claims go to the focused tile, so ⌘C and ⌘V still work.
The full default set is in config/hyprmux.conf. New to it? Run hyprmux-tour in any Hyprmux terminal.
Free and open source, under the MIT license.
git clone https://github.com/gavrix/hyprmux.git && cd hyprmux
scripts/bundle.sh
open build/Hyprmux.app
Needs Xcode 16 or later and about 1.5 GB of disk. The first run downloads libghostty and the Chromium SDK, about 260 MB.
FAQ
Both are native macOS apps built on libghostty, with a scriptable browser and a CLI. cmux is a terminal first: vertical tabs with git branches and ports, split panes, notification rings, remote SSH workspaces, and an iOS companion app. Hyprmux is a tiling environment: Hyprland's dwindle layout, workspaces, groups, and animations, a hyprland.conf-style config, and tiles that hold simulators and editors as well as terminals and web pages. Pick cmux for a polished terminal with tabs. Pick Hyprmux if you want Hyprland's way of working.
herdr runs inside your terminal, like tmux. It keeps agents running in a background server, lets you detach and reattach, works over SSH, and runs on macOS, Linux, and Windows. Hyprmux is a native Mac app with a graphical compositor. It tiles more than terminals, and it shows agent state on tiles and workspaces. It doesn't run headless, and when Hyprmux quits its programs stop. On relaunch it brings back the layout and resumes agent sessions.
They run in any terminal, on any machine, over SSH, and sessions survive when you disconnect. Hyprmux can't do that. In exchange, it draws real tiles: smooth animation, gradient borders, blur, mouse resizing, and tiles that aren't terminals at all. You can still run tmux inside a Hyprmux terminal.
Those tile the real windows of every app on your Mac. That's their strength, and they work around macOS limits to do it. Hyprmux tiles only inside its own window, so it controls every pixel: animations, borders, blur, and the same keys everywhere. It holds terminals, web pages, simulators, and supported apps, not arbitrary Mac windows. They work fine together, because to a tiling window manager Hyprmux is one window.
It borrows Hyprland's ideas, not its code. The config syntax is hyprlang, with the same sections, bind lines, dispatchers, gradients, and bezier animations, so much of a general, decoration, animations, and bind setup carries over. Parts that only make sense on Linux, like monitors and Wayland window rules, don't apply. Hyprmux isn't affiliated with Hyprland.
Hyprmux uses libghostty to draw terminals, the way apps use WebKit to draw web pages. It isn't a fork of Ghostty. Your Ghostty config, themes, and fonts apply to Hyprmux terminals. Ghostty has its own splits and tabs. Hyprmux adds a tiling layout, workspaces, tiles that aren't terminals, and scripting.
Every agent that runs in a terminal: Claude Code, Codex, pi, opencode, Gemini CLI, Aider, and the rest. To show an agent's state on its tile, a hook calls hyprmuxctl agent-state. pi has a bundled extension that does it. Session restore resumes pi and Codex sessions.
macOS gives apps no way to move other apps' windows between Spaces, and little control over how those windows animate. Inside its own window, Hyprmux owns the whole layout, so tiling, workspaces, and animation behave the same every time. Press ⌃⌘F to make that window your whole screen.
Apps in tiles (VS Code, Cursor, other Electron apps, and Zed), and the protocol that lets any app show its UI as a tile. Electron apps work through an adapter. Drag and drop doesn't work in them, and their menu bar isn't reachable, so use the command palette instead.
One monitor: there's no multi-display support yet. Only terminal tiles support reads and input from hyprmuxctl. The WebKit engine has no passkeys, and Chromium supports phone and security-key passkeys, not Touch ID. Simulator tiles and the libghostty build depend on private or fast-moving APIs, so an Xcode or libghostty update can break them.
Yes. Hyprmux is free and open source under the MIT license. It needs macOS 14 or later on Apple silicon. iOS Simulator tiles need Xcode, and Android Emulator tiles need the Android SDK emulator.