All posts

Dropdown Terminals on macOS: The Quake-Style Setup (2026)

·Terminal Candy ·6 min read

macoshotkeyworkflowiterm2guide

There is a category of terminal window that most Mac developers have never set up, and it is the one I use more than any other: the kind that is not a window at all. You press a key, it drops down over whatever you were doing, you type six characters, you press the key again, it is gone.

Linux people have had this since Guake and Yakuake in the mid 2000s, named after the Quake console it imitates. On a Mac it is oddly under-adopted, mostly because the good implementations are buried three menus deep.

Here is how to set one up properly, and — more usefully — when it is actually the right tool and when it is not.

What problem this actually solves

Think about what you do in a terminal in a given hour. Some of it is work: an agent running for twenty minutes, a dev server, a long build. That work wants a real window, real estate, and tabs.

The rest is interruptions. git status. brew install. Checking what is on port 3000. Copying a UUID out of a database. Each of those takes under ten seconds of typing and about four seconds of window management — Cmd+Tab, find the right window, realize it is in the wrong directory, Cmd+T, cd, do the thing, Cmd+Tab back and hope you land where you started.

The window management costs more than the command. A dropdown terminal removes it entirely. The terminal is always running, always in the same place, and never competes for a slot in your window ordering.

The rule I settled on: long-running work goes in a real window, everything under thirty seconds goes in the dropdown.

iTerm2: the most configurable version

iTerm2 has the best built-in implementation on macOS, and it is genuinely hidden.

Go to Settings → Profiles, create a new profile (do not reuse Default — you want this one to look different so you always know which terminal you are in). With that profile selected, go to the Keys tab and click Configure Hotkey Window.

Set these:

  • Hotkey: pick something with no chance of collision. ⌥Space is the sweet spot — ⌘Space is Spotlight, ⌃Space is often input switching.
  • Floating window — on. The dropdown should sit above everything, not join the window stack.
  • Pin hotkey window — off. You want it to disappear when it loses focus. This is the whole point. If it stays up when you click away, you have built a normal window with extra steps.
  • Animate showing and hiding — personal taste, but turn it off if you are on an external display. The animation makes a 60ms action feel like 250ms.

Then, in the same profile, under Window, set the style to Top of Screen and give it a height of around 35%. Full-height dropdowns defeat the purpose — you want to still see the thing you were looking at.

One more, in the Session tab: set the profile to not close when the shell exits, or an accidental exit kills your always-there terminal and the hotkey stops doing anything until you notice.

Make it look different from your main terminal

This sounds cosmetic. It is not.

You will be typing into a floating window that appeared over the app you were just using, and your muscle memory for "which terminal am I in" is built on window position. That cue is gone. If your dropdown looks identical to your project terminal, you will eventually run a destructive command in the wrong one. I have.

Give the hotkey profile:

  • a distinctly different background color (I use something noticeably darker than my main theme)
  • slightly lower opacity, so it reads as an overlay rather than a window — see transparent terminals on macOS for doing that without wrecking legibility
  • a different prompt, ideally a one-line minimal one. Whatever you use for projects, this one should be short. You are running one command, not reading a git status in the prompt.

Same principle as giving each agent its own look, which I wrote about in skin your AI agent. Different job, different appearance, zero cognitive overhead.

If your terminal has no hotkey mode

Alacritty, Kitty, Ghostty, and most of the GPU terminals do not ship a dropdown mode. They take the position — reasonably — that window management is the window manager's job.

So use a window manager. Hammerspoon is the least painful option, it is free, and it is about fifteen lines:

-- ~/.hammerspoon/init.lua
local DROP_APP = "Alacritty"

hs.hotkey.bind({"alt"}, "space", function()
  local app = hs.application.get(DROP_APP)
  if not app then
    hs.application.launchOrFocus(DROP_APP)
  elseif app:isFrontmost() then
    app:hide()
  else
    app:activate()
  end
end)

Reload Hammerspoon and ⌥Space now toggles that app. It is not a true dropdown — no slide-down animation, no screen-edge docking — but the part that matters, one key to show and hide, works.

To get closer to the real thing, launch a dedicated instance with its own class so your toggle does not grab a project window:

alacritty --class dropdown,dropdown

Then match on that class instead of the app name. If you already run skhd or yabai, both can do the same toggle with a single line of config.

Where this fits with agents

This is where the pattern changed for me.

Coding agents are long-running by nature. Claude Code or Aider on a real task occupies a terminal for minutes at a stretch, and during that time you still need to run things — check a diff, look at a log, hit an endpoint. Historically that meant opening another tab in the same window, which pushes the agent's output off screen right when it might be asking you something.

The dropdown makes that a non-issue. Agents keep their windows. Everything else happens in a layer that appears and vanishes.

The catch is that you now have a terminal you deliberately cannot see most of the time, which is exactly the wrong place to put an agent — you will never notice it waiting. Keep agents in visible windows, or use a terminal that tells you when one needs input rather than requiring you to look. I went through every option for that, including the free DIY ones, in AI agent alerts on Mac.

Terminal Candy handles the dropdown case natively — ⌥Space summons it over whatever you are in, and mini mode keeps a small always-there terminal that is not trying to be a full window. Agent detection runs per session, so the agents you left in real windows still reach you while the dropdown is closed.

What I would skip

Do not make it full height. The value is glancing at a command's output while still seeing the thing that made you run it.

Do not run tmux inside it. You will attach to a session, forget it is attached, and the dropdown becomes a stateful thing you have to manage. It should be disposable. That is its entire personality.

Do not use it for SSH. Same reason. Anything that has to survive being hidden belongs in a real window.

Do not bind it to a single modifier tap. Caps Lock and right-Command toggles feel clever for a week, then start firing while you are typing in other apps.

The setup, in one paragraph

A separate profile, ⌥Space, floating, unpinned, 35% height from the top, visually distinct from every other terminal you own, running a minimal prompt, holding no state you would miss. Long work in real windows. Everything else in the layer that comes and goes.

Terminal Candy is a native macOS terminal — AppKit and SwiftTerm, Apple Silicon, no Electron — with a global hotkey, mini mode, and agent alerts built in. $10 once, 14 day trial. Try it, or browse the skin gallery first.

Keep reading