Inspiration

AI used to be one interface, one question, one answer. Then agents came along, and now you're jumping between terminals talking to several of them at once.

Running four agents means four windows. To know where your work stands you tab through all of them and read scrollback this one is mid-task, this one finished ten minutes ago, this one has been blocked on a permission prompt you never saw. Nothing coordinates them. You're the only thing connecting the sessions, and you're doing it by reading and remembering.

I wanted to go back to talking to one thing. So I built Fogy.

What it does

Fogy is a small tab on the side of your screen. Hover it and the rail opens, showing every Claude Code session running on your Mac at a glance.

Each session shows its real state working, idle, or blocked waiting on you read from Claude's own agent listing rather than guessed. Hover a session and its recent conversation opens beside it, pulled from that session's transcript: the questions and the answers, not a status line.

Type into the rail and a dispatcher agent works out which session should handle it and sends it there. Open a specific session's card and you talk to that one directly. If the target is busy, the instruction waits and delivers the moment it goes idle, so you never interrupt an agent mid-task.

Answers come back to you. After sending, Fogy watches the target session and surfaces its reply on the rail the session answers in its own terminal, and you still see it here.

You can also screenshot any region of your screen and send it to Claude with a prompt, or talk instead of typing and have your words go to whichever session you're looking at.

How we built it

Swift, SwiftUI and AppKit, about 4,400 lines. Native Mac app, no Electron.

The rail is a borderless non-activating panel, so clicking it never takes focus from your editor. Every popup is its own window. When they lived inside the rail's window, opening one resized it, which moved the buttons out from under the cursor and closed the popup you were reaching for.

Three problems took most of the time.

Sending a message to a running session looked simple, because Claude Code has a resume flag. It doesn't do what it looks like it does — resuming a session that's already running forks a copy and talks to the fork. Every send reported success and nothing arrived. I found it by counting sessions before and after and watching a new one appear with a different id. Delivery now goes through Claude Code's own cross-session messaging, carried by a short-lived relay agent.

That relay reported back in plain English, and the code checked whether its reply contained the word "sent". So "nothing was sent" and "did not succeed" both counted as success, and failed deliveries were shown to the user as confirmations. The relay answers with a fixed token now, and failure is checked before success.

The last problem was that sending is one-way. A session answers in its own terminal, not back to the toolbar, so Fogy would confirm your message was delivered and then go quiet forever. A dispatcher you can't hear back from isn't worth much. Fogy now watches each session's transcript file and picks up what it says after the hand-off.

What's next for Fogy

Support for other agents, commands, functionalities

Built With

Share this project:

Updates

Submission history