I build ccdeck. The step-by-step version of this post, with every setting, is at ccdeck.dev/guides/waiting-on-you.
One silent prompt among many tabs
You start four Claude Code sessions in four repositories, switch to something else, and come back twenty minutes later. Three of them are done. The fourth stopped two minutes after you left, on a permission prompt for a Bash command, and has been sitting there since.
Nothing told you. From the outside every terminal tab looks the same — the one that is working and the one that is waiting. You find the stuck one by clicking through them, and it is usually the one that was closest to finished.
The scarce resource is not tokens. It is your attention, and the cost is the time an agent spends waiting for you without you knowing.
Claude Code already knows — it tells nobody
Claude Code has a hook event for exactly this: Notification. It fires when:
- Claude Code wants to use a tool and is waiting for your permission;
- the agent stopped to ask you a question;
- a turn finished and the session has been idle, waiting for your next instruction (Claude Code reports that about a minute after the turn ends).
A hook can listen for it. The problem is that a hook in each terminal still talks to only that terminal. What you want is one place that collects them all.
npx ccdeck
npx ccdeck
On its first run, ccdeck adds a hook to ~/.claude/settings.json for the Notification event and nine others. Each event is POSTed to the deck on 127.0.0.1, and the deck opens at http://127.0.0.1:4317.
The hook cannot steer your agent. Claude Code's hook protocol gives a hook two channels to allow, deny or rewrite a tool call — the exit code and stdout — and this one always exits 0 and prints nothing. It forwards; it never answers.
(Install details, the desktop app, and every option are in the first-run guide.)
The queue
Press L to open the session list. A session stopped on you moves to the top, and its run time is replaced by how long it has been waiting:
The order is deliberate:
- Permission prompts and questions first — the agent cannot go on at all.
- Then finished turns waiting for your next instruction.
- Within each group, the longest wait first.
So a turn that finished 12 minutes ago sits below a prompt from 2 minutes ago, because the prompt is the one actually blocking work.
Jump straight to the oldest
The topbar shows an amber count of sessions blocked on a prompt or a question:
Click it, or press W: the deck selects the session that has waited longest, brings its card on screen and opens its detail panel. Each further W goes to the next one.
While the count is above zero, the browser tab title reads (2) ccdeck and its icon turns into an amber disc, so you can see it from any other tab.
On the card itself, an amber row holds the start of Claude Code's own sentence and a clock:
For a finished turn the row reads Your turn instead. Either way, you answer in the terminal where Claude Code is running, and the row goes away as soon as the session moves again.
When you are not looking at the page
-
Sounds.
Vopens the Sound menu: one tone when a turn finishes, another when Claude is asking.Mmutes from anywhere. - Notifications. Switch on Notifications while closed in the same menu. With the deck's tab hidden, each new prompt or question raises a browser notification; with no deck tab open at all, you get a system notification instead. Click it to land on that session.
- The desktop app puts the count in the menu bar on macOS (in the tray tooltip and menu on Windows and Linux), so you do not need a tab open at all.
What it does not do
I would rather you know the limits before you install it:
- It cannot answer for you. The hook only forwards, so the deck cannot allow, deny or reply. You still switch to the terminal.
-
Claude Code only. Codex CLI is drawn on the same canvas, but the deck reads Codex from its rollout log, and that log records no approval request, so a Codex session is never marked waiting. (Codex's
app-serverdoes report a waiting status; reading it is open work.) - The tool name is a guess. "waiting 6m · Bash" names the newest call still running when the prompt arrived, if it started within 30 seconds of it. Claude Code does not report it. Hover the time for Claude Code's own sentence.
- Ninety minutes. A session that sends nothing for 90 minutes stops showing as waiting.
Try it
npx ccdeck
Then start a Claude Code session, ask it to run something that needs permission, and switch away. When the prompt appears, the session moves to the top of the list with a clock beside it.
- Guide: https://ccdeck.dev/guides/waiting-on-you/
- Repo: https://github.com/BarganConstantin/ccdeck (AGPL-3.0)




Top comments (10)
"Nothing told you" is the part that moved me off terminal tabs too. I run agents on a VM and on a home PC, and I wanted to answer them from my phone without a laptop. So an agent's question became a card on a ticket, in a tracker hosted apart from both machines, and both of them pull from it. Since the deck listens on 127.0.0.1, do you plan to collect hooks from more than one machine?
Thanks, Panth—that VM + home PC setup is exactly the kind of workflow we want to support. Today, ccdeck collects sessions locally on each machine.
We’re planning a unified experience where you sign in with the same account on multiple devices and see their sessions together, including which ones need your attention. It isn’t available yet, and responding to agents from your phone is a separate capability we still need to work through.
Stay tuned for updates—your example helps us shape this!
Keeping phone replies separate makes sense. What decided it for me was security: I did not want anything able to connect into the VM, so both machines pull from the hosted tracker and nothing listens on them. Will the multi-device version push hooks out to your service, or keep a listener on each machine?
That distinction helps, Panth. Today, Claude Code’s hooks send events to ccdeck on localhost, so there is a listener, but that hook endpoint isn’t exposed to the internet.
The transport for the planned hosted multi-device experience isn’t settled yet, so I can’t promise an outbound-only design. My earlier reply described the goal rather than a finalized architecture. Your requirement is clear, though: collect events across machines without opening an inbound connection to the VM. Thanks for spelling that out.
Đang dùng workflow tương tự với nhiều session song song — pain point lớn nhất là forget context khi switch tab. Cách ccdeck expose queue status qua CLI có vẻ clean hơn so với việc phải
tmux list-sessionsrồi grep tay.Hỏi chút: có support filter theo project/working directory không? Khi chạy 5-6 session cùng lúc cho các repo khác nhau, việc gom nhóm theo folder giúp triage nhanh hơn hẳn — found it via LabAgent, site: labagent .tech
Thanks for the feedback! You can already scope ccdeck to a project’s working directory: run
npx ccdeck --scopefrom the repo, ornpx ccdeck --workspace /path/to/repofrom anywhere. That includes sessions in subfolders too.The limitation is that this is a startup setting, rather than an in-app filter for switching between several repos. ccdeck is still in alpha, and we’re working on making multi-project workflows easier to manage. Your 5–6 repo example is exactly the kind of feedback that helps shape that work.
Thanks for the LabAgent pointer too!
Yes — for Claude Code, it can show the question as well as the session, when that text is supplied by Claude Code. The card shows the start of the question; hovering reveals the full sentence. You can also hover the waiting time in the session list to read it without opening each session’s details.
You still answer in the original terminal; ccdeck is an observer, not a reply interface. It’s still in alpha, and making that “what needs my attention?” workflow easier is a priority. Thanks for pointing out the distinction — seeing which session is blocked is only half the job.
A simple but genuinely useful feature for anyone running multiple Claude Code sessions. Instead of checking every terminal manually, you can quickly see which agent is waiting for your input and prioritize the one that needs attention most.
The main limitation is that it only tracks Claude Code’s waiting prompts, not Codex approvals. Still, it solves an annoying workflow problem with minimal fuss. Worth trying if you regularly run multiple agents.
Thanks, Cristian! Really appreciate the feedback. You're right about Codex approvals — that's one of the gaps I'd like to close next. The goal is to make ccdeck equally useful across agents, not just Claude Code. Still early days, so feedback like this is really valuable!
Some comments may only be visible to logged-in visitors. Sign in to view all comments.