I run between four and twelve Claude Code terminal sessions at any given time. Different projects, different contexts, different threads of work. That’s fine for the real tasks — the ones where I need Claude to read a codebase, refactor something, coordinate across files.
But there’s a different category of question. The quick ones. “What did I decide about X last week?” or “What’s the status on that project?” — things my second brain already knows, if I could just ask it without switching to a terminal window.
ChatGPT has this nice overlay on macOS. Option+Space, floating panel, ask a thing. I wanted that, but backed by Claude Code with all my local context.
So I described what I wanted, went back to what I was doing, and about ten minutes later it existed.
What it is
350KB native macOS app. Four Swift files, one dependency (a hotkey library). Sits in the menu bar, registers Option+Space globally, and pops up a frosted glass panel at the bottom of your screen.
Type a question, hit return, response streams in with markdown rendering. Press Escape when you’re done. Stays above other windows so you can read it while you work.
Why it’s more useful than it sounds
Claude Code picks up CLAUDE.md from whatever directory it runs in. I have a knowledge management system — Odin — with a CLAUDE.md that gives Claude context about my projects, clients, preferences, current priorities. The launcher always runs from that directory.
So I can press Option+Space from anywhere — browser, email, whatever — and ask “what’s the latest with project X” and it actually knows. It has my notes, my files, my context. Quick questions to a second brain that’s always listening.
You point it at your own project with a dotfile:
echo "$HOME/path/to/your/project" > ~/.claude-launcher-dir
How it works
Global hotkey via soffes/HotKey — thin wrapper around Carbon’s event tap API.
Floating panel — borderless NSPanel with NSVisualEffectView for the frosted glass. Finds whichever screen your mouse is on, positions bottom-center, grows upward as response streams in.
Process spawning — the fiddly part. Claude Code sets environment variables that prevent nesting (you don’t want Claude launching Claude). So the launcher spawns a clean login shell, unsets the nesting guard, execs claude. Response streams via a readability handler on the stdout pipe.
The ten minutes thing
I didn’t spend an evening building a macOS app. I told Claude Code “recreate the ChatGPT Option+Space overlay but backed by Claude Code CLI” and went back to other things. It wrote a plan, I approved it, it wrote the code, I tested it, we went back and forth on a few things — multi-monitor positioning, environment variable cleanup, markdown rendering. My actual attention was maybe ten minutes, scattered.
388 lines of Swift. I didn’t write any of them.
I keep noticing this pattern. I want a thing, I describe the thing, and then I have the thing. The constraint used to be “can I build it?” Now it’s “can I explain what I actually need?” Which is a much better problem to have, because I can - not least because I’ve had 25 years of practise of doing exactly that.
github.com/eddowding/ClaudeLauncher
git clone https://github.com/eddowding/ClaudeLauncher.git
cd ClaudeLauncher
swift build -c release
.build/release/ClaudeLauncher
Needs Claude Code and macOS 14+. First launch asks for Accessibility permissions for the hotkey. README has instructions for bundling as a .app and adding to Login Items if you want it running at boot, which I’d recommend — I use it constantly now.