ccdeck

See which session is waiting on you

The Claude Code sessions stopped on you, at the top of the session list with how long each has waited, and a tone when a new one asks.

Claude Code only Checked against ccdeck 3.31.0 on

Before you start

Steps

  1. Open the session list

    Press L, or click Session list in the topbar. On a window narrower than 1440 px the button shows only its list icon.

    The list starts closed on a new deck, and the deck remembers whether you left it open. To close it, press L again or click the ‹ at its top.

  2. Read which sessions are waiting

    A session that is stopped on you moves to the top of the list, and the time since it stopped takes the place of its run time, as in waiting 6m · Bash. Three things count as waiting:

    • a permission prompt: Claude Code wants to use a tool and will not go on until you answer;
    • a question the agent stopped to ask you;
    • a finished turn waiting for your next instruction. Claude Code reports it about a minute after the turn ends.

    Prompts and questions come first, the longest wait first. Finished turns come next, also the longest wait first, then running sessions, then finished ones. So a turn that finished 12 minutes ago stays below a prompt from 2 minutes ago.

    The tool name after the time is the deck’s guess, not something Claude Code reports: the newest call still running in that session when the prompt arrived, shown only if it started within 30 seconds of the prompt. Hover the time to read Claude Code’s own sentence, the guess (“Likely on: …”) and when the wait started.

    The session list, headed Sessions 4, 2 waiting and 3 live: web-api waiting 6m · Bash, docs-site waiting 2m · Write, data-pipeline waiting 12m, and infra with a run time of 13m.
    Demo data Two prompts at the top, the older one first, then data-pipeline’s finished turn. The header counts 2 waiting, not 3: a finished turn is not counted.

    Claude Code only. A Codex session is never marked waiting. It keeps its place among the running and finished sessions; step 7 says why.

  3. Go to the session that has waited longest

    The amber 2 waiting in the topbar counts the sessions on a permission prompt or a question. Finished turns are not counted. Click it to go to the session that has waited longest.

    Part of the topbar: this month 225.93M tokens · $228, then 2 waiting in amber, with a dot before the number.
    Demo data Two sessions are on a permission prompt. data-pipeline’s finished turn is left out of the count.

    Press W to do the same from anywhere. Each press after that goes to the next waiting session, and after the last one it starts again from the first. Clicking a row in the session list goes to that session instead. All three make it the selected session, bring its card on screen and open the detail panel.

    The count reaches you in other tabs too: while it is above zero, the browser tab reads “(2) ccdeck” and its icon is a solid amber disc. When the waiting sessions change, a screen reader hears who is first, as in “web-api and 1 more session are waiting for your permission.”, and “No sessions are waiting for you.” once they are all answered. The count goes away when nothing is left to count. On a window 640 px wide or narrower it shows only its number.

    While Anthropic’s or OpenAI’s status page reports an incident on something your sessions use, a link such as Claude · partial outage sits just before the count. It opens that status page. It is about the provider, not a session waiting on you, and it is not there while the page reports no incident.

  4. Read the card, then answer in the terminal

    A waiting session’s card has a row of its own under its title.

    • For a prompt or a question, the row is amber, with a pulsing dot, the start of Claude Code’s own sentence and a clock. For a question, the sentence is the question. Hover the row for the whole sentence.
    • For a finished turn, the row reads Your turn in the session’s own colour, with a still dot.
    The web-api card: LIVE, Opus 5, its title, and an amber row reading “Claude needs your permission …” with 6m 21s beside it.
    Demo data The row keeps the clock and cuts the sentence to fit the card.
    The data-pipeline card: DONE, Sonnet 5, its title, and a row reading Your turn with 13m 11s beside it.
    Demo data A finished turn: the session reads DONE, and the row says whose move it is.

    Zoomed out, a card shrinks to its name and one line. For a prompt or a question that line is the same sentence, or Needs you or Asked you where the sentence does not fit, and the card and its session’s label carry a warning triangle. For a finished turn it reads Your turn.

    Answer in the terminal where Claude Code is running. ccdeck cannot allow, deny or reply: its hook only forwards events. The row goes away as soon as the session moves again.

  5. Set up the sounds

    Click Sound in the topbar, or press V. The Sounds switch turns both tones on or off, and M does the same from anywhere.

    • Turn finished plays when a Claude Code or Codex session finishes a turn.
    • Claude is asking plays whenever Claude Code sends a notification: a prompt, a question, or the reminder about a finished turn.

    Each tone has its own Volume, Tone and Hear it. Hear it plays even while Sounds is off. Sounds start on, at 50%, and this browser remembers what you set. They play only from an open deck tab, and only after you have clicked or pressed a key on the page since it loaded.

    Claude Code only. The Sound button, V and M are there only when the deck found Claude Code, and Claude is asking never plays for Codex. Codex finished turns do play Turn finished.

  6. Turn on notifications for when you are away

    In the same menu, click the Notifications while closed switch to turn it on. It is off by default. If the browser has not been asked yet, turning it on asks for permission; allow it. Browser notifications then reads Enabled. An Enable button there means the question was dismissed; click it to ask again. Blocked can be undone only in the browser’s own site settings.

    The Sound menu under the Sound button: Sounds and Notifications while closed both on, Browser notifications Enabled, then the Turn finished and Claude is asking sections, each at 50% with the tone Two notes.
    Demo data Both switches on, and the browser has allowed notifications. That notification state was supplied to the page for this picture.

    The one switch covers two kinds of notification, and neither appears while the deck is on screen:

    • With a deck tab open but hidden, the page shows a browser notification for each new prompt or question. Its title is the session’s name, and its text is Claude Code’s sentence and “Likely on: …”. Clicking it brings the tab back to that session. Prompts that were already there when the page opened, or when you allowed notifications, are not announced.
    • With no deck tab open, the deck shows a system notification wherever a sound would have played: Claude Code prompts, questions and finished turns, and Codex finished turns.
  7. Know what Codex sessions do not show

    Codex sessions are on the canvas and in the session list, but they are never marked waiting: no row, no count, no tab title or icon, no Claude is asking tone and no browser notification. ccdeck reads Codex from its rollout files, and a rollout records no approval request, so the deck cannot tell a Codex session that is asking you from one that is busy.

    While a Codex session is running under an approval policy that can ask, or one the deck has not read yet, its card says approvals not visible. Hover it for the reason, and check that session’s terminal. At the policy never the card says nothing, because the session cannot ask.

    The infra card: LIVE, a context ring at 15%, GPT-5.5 and no title row, then a grey italic row reading approvals not visible, above 4 tools with 1 in flight.
    Demo data infra runs under the on-request policy. In the session list it shows a run time, not a wait.

If something goes wrong

A session is at the top with “waiting 12m”, but the topbar shows no count and W does nothing

It is a finished turn waiting for your next instruction, and its card reads Your turn. Finished turns sort above running sessions but are left out of the count on purpose. Type the next instruction in that session’s terminal, or leave it.

A Codex session is waiting for approval, and ccdeck shows nothing

The deck has no signal for it (step 7). Check the Codex terminal. If the card shows approvals not visible, that session’s policy can ask.

No Claude Code session ever shows as waiting

Look at the Claude hooks line the deck printed when it started. If it says “skipped”, the deck did not find Claude Code, or was started with --no-claude, and installed no hook. If Claude Code is installed, start the deck again with --claude. The new start stops the running deck first, because that one was started with different settings:

npx ccdeck --claude

A deck started with --workspace or --scope captures only sessions inside that folder. A session that sends nothing for 90 minutes also stops showing as waiting.

No sound

Sounds may be off: press M. The page may not have been clicked, or had a key pressed, since it loaded; browsers play nothing until then, and the Sound button’s tooltip says “Waiting for a click”. Sounds also need an open deck tab, and events the deck replays when a tab opens never play. Hear it in the Sound menu checks the level.

There is no Sound button, and V and M do nothing

The deck did not find Claude Code, so it draws no Claude-only controls. If Claude Code is installed, start the deck again with --claude, as above.

No notification arrives

Check each of these. Notifications while closed is off, which is the default. Browser notifications reads Blocked: allow notifications for the deck’s address in the browser’s site settings. The deck tab is on screen: the page notifies only while it is hidden. The prompt was already there when you opened the deck. On Linux, no notification daemon is running, and nothing says so.

If the menu says “Held off for this run — the deck was started with alerts disabled”, the deck was started with AGENTS_DECK_NO_NOTIFY=1. Stop it with npx ccdeck --stop, then start it again without that variable; the switch keeps your choice.

Next