One keystroke, twice — first in a terminal, then in a browser. The window centers and grows; the wallpaper, Menu Bar, Dock, and every other window go dark behind it.
Zen Mode is one hotkey that centers the focused window, grows it to full height, and blacks out everything else on screen — Menu Bar, Dock, wallpaper, other windows. It is not an app. It is about 250 lines of Hammerspoon Lua, which is both the appeal and the catch.
Every good writing app ships a zen mode, and every one of them stops at its own window. VS Code, Obsidian, and iA Writer will each give you a centered, chrome-free canvas — but only for VS Code, Obsidian, or iA Writer. The moment the work is in a terminal, a browser tab, or a PDF, there is no zen mode to reach for, because zen mode was never a property of the desktop. Zen Mode moves it there: it operates on whatever window is focused, so the same keystroke works everywhere, with no per-app setup and nothing to configure per app.
The mechanism is smarter than dimming background windows one by one. The script draws a single full-screen canvas, raised to the macOS cursor window level — above the layers the Menu Bar and Dock live on, which is why it can actually bury them — and then punches a rounded, transparent cutout exactly where your focused window sits. Your window is never touched or re-parented; it stays a completely normal, interactive window, and everything around it is simply blacked out. Option + Cmd + Z toggles it; Esc also exits. Entering is choreographed in two phases for a reason worth knowing: the window first glides to center at its original size while the backdrop fades, and only grows to full height once the screen is fully dark — resizing forces an app to re-layout (a terminal reflows its entire character grid), so the ugly part happens where you can’t see it. Exiting reverses the sequence and restores the window’s exact prior position and size.
One correction to the pitch, including the project’s own: it is not a true black overlay. The default backdrop is {white = 0, alpha = 0.85} — an 85%-opaque dark scrim, not opacity 1.0 — and the alpha is a variable you can set anywhere from 0.0 to 1.0. That is a deliberate choice, not a shortcut. A frosted-glass blur would need private API, or a screenshot-and-blur workaround that demands Screen Recording permission and produces a frozen image that goes stale the moment anything moves. A translucent dark fill stays live, costs nothing, and works in both light and dark mode. The practical upshot is that Zen Mode needs Accessibility permission only — no Screen Recording. The rest of the aesthetics are equally tunable: top and bottom margins, corner radius, the edge seal, and the two animation durations (set them to 0 for instant snapping).
Now the friction, and it is real. This is a Hammerspoon script, not an app — there is no download, no .dmg, no Settings window. You install Hammerspoon (brew install --cask hammerspoon), grant it Accessibility, append the repo’s init.lua to your ~/.hammerspoon/init.lua, and pick Reload Config from the menu bar. If you already run Hammerspoon, that is a two-minute append and the barrier is nil. If you don’t, you are installing a whole desktop automation runtime and maintaining a Lua config file in order to get one hotkey — a genuine cost, and one the project is upfront about. Note too that the script sets hs.window.animationDuration = 0 globally, which disables the built-in move animation for every other window script in your config.
The limits are honest and documented. Only one window can be zenned at a time — the top request on its Show HN thread, and already in the TODO. Native full-screen windows don’t respond at all, because macOS puts them in their own Space and ignores the reposition, so leave full screen first. The overlay covers only the display the focused window is on; other monitors are untouched. Windows that refuse to resize (some utility and settings panels) will center but keep their size. Switching Spaces while active is untested. And Esc is captured globally while Zen Mode is on, so Vim users should toggle off with the hotkey instead. It’s tested on macOS 26 “Tahoe” only; on older releases the default cornerRadius = 24 is too generous and wants dropping to about 10.
Ryan Cabeen published it two days ago under MIT — 25 stars, no forks, no open issues, which is to say there is no track record here at all. Judge it as what it is: a small, readable, dependency-free script that does one thing the operating system should probably have done itself, and that you can read end to end in a few minutes before deciding to trust it.