ClauDeck User Guide
Connect, place keys, and press. This guide walks you through everything from installing to returning your first approval. It covers version 2.0.
Contents: Getting started / Setup steps / Reading the keys / Approving / Opening the AI's window / Settings / Antigravity / SSH remote / Troubleshooting / Terms and defaults
Some dialogs in the app (such as Agent Integration and SSH Remote Sync) show Japanese button labels even when the app is set to English. This guide gives the Japanese label with its meaning in parentheses.
Let's set it up together. I'll explain any jargon as we go.

Getting started
What you need
- An Apple silicon Mac (macOS 13 or later). It does not run on Intel Macs, Windows, Linux, iPhone or iPad.
- An Elgato Stream Deck and the Stream Deck app.
- Claude Code, Codex or Antigravity.
How it fits together
ClauDeck is a menu bar app that brings status, approvals and window switching for Claude Code, Codex and Antigravity onto Stream Deck keys.
① AI
Claude Code, Codex and Antigravity report their status at key points in their work.
② ClauDeck
Receives the reports, decides what to show on which key, and passes approvals back.
③ Stream Deck
Shows the status on keys and sends your presses back to ClauDeck.
- See status: Idle, Unread, Working, Approve, Input, On Screen, Ended and more appear on the slots.
- Approve: Press a slot waiting for approval to answer the AI.
- Jump back: Press a slot that is not waiting for approval to bring that session's app to the front.
If Claude Code is in auto mode, Codex is set to dontAsk or bypassPermissions, or the AI runs without a screen (such as claude -p), the AI itself never asks for approval. Status still works, and the key shows "<mode> · No Approvals".
Status, window switching and approvals are supported. Read-only actions are never held; only writes, command execution and similar actions (Tier 2 and above in Antigravity's terms) are sent for approval. Approvals are enabled only when you choose "承認・拒否も有効" (Approve/Deny enabled), and if you do not press, Antigravity returns to its own setting after 15 seconds (default). See "Connecting Antigravity".
Three words to know first
Session
One conversation or task with an AI. Each conversation gets its own place on the deck.
Slot
A Stream Deck key that handles one session. Create one by placing "ClauDeck Slot" on a key.
Integration
The setting that lets the AI report to ClauDeck, plus the plugin that adds ClauDeck to Stream Deck. Both are set up from the menu.
Setup (7 steps)
Go from top to bottom. You can always check the connection under "Status" in the ClauDeck menu. If you have not installed it yet, see "How to install" on the download page first.
KeiUse each step's "Done when" line as your checkpoint.
-
Show ClauDeck in the menu bar
Open ClauDeck from the Applications folder and look for the deck-shaped icon in the menu bar at the top right of the screen.
Done when: clicking the icon shows "このアプリについて…" (About this app) at the top, and the menu has a line starting with "Status:".
Not there? Check "Allow in the Menu Bar" in System Settings.
-
Register your AI tools
Open "Agent Integration" in the menu and choose the row for the AI you use (Claude Code, Codex, Antigravity). For Claude Code and Codex, review what will be added and press "入れる" (Install). For Antigravity, choose the integration level and press "適用" (Apply). No coding needed.
Done when: Claude Code and Codex show "Registered", and Antigravity shows the level you chose.
Antigravity settings not found? Launch Antigravity once, then try again.
-
Install the Stream Deck plugin
Choose "Install Stream Deck Plugin…" in the menu, then quit and reopen the Stream Deck app as instructed. The plugin is the part that adds ClauDeck's actions to Stream Deck.
Done when: "Status" in ClauDeck shows "Stream Deck: Connected (N seats)".
-
Place slots on the deck
Find "ClauDeck Slot" in the Stream Deck app's action list and drag it onto any key. Then run "Test Buttons" from the ClauDeck menu to check it.
Done when: the slot ID (such as c0r0) appears in the in-app guide. "AI Slot" is a different plugin, so do not mix them up.
-
Check the approval mode
Look at "Mode" under "Status". own means approvals are taken on the deck (default). defer shows status only, and approvals happen on the AI's screen. You can change it with "Show Welcome Screen Again…".
-
Give your AI its first task
Run your AI once in your project as usual. For Codex, answer the one-time prompt in the interactive CLI to trust ClauDeck's notifications. For Antigravity, quit and reopen it after applying the settings, then send a task.
Done when: the session takes a slot and the start of your prompt appears on the key's top line.
-
Return one approval
Ask the AI to do something that needs confirmation, such as editing a file. When the key flashes and a sound plays, check what it is and press the key.
Done when: the action goes ahead on the AI side.
Reading the keys
The top line shows the start of the prompt or the tool name, the center shows the current state, and the bottom line shows extra details. A red dot at the top right and flashing mean "a person needs to approve now".
| Example | State | Meaning and what a press does |
|---|---|---|
| Empty Dashed frame, no text | The key is placed but no session has taken it yet. Only a slate band at the top and a dashed frame appear. Text appears when you send your first prompt. Pressing does nothing. | |
my-appIdlea18f3c2d | Idle Grey | The session exists but is not doing anything. Press to open its window. |
my-appIdleCC · a18f3c2d | Unread Grey, raised | The turn has finished but you have not looked yet. Same color as Idle, but it stays raised until you press it or send the next prompt. |
Prompt textThinkingCX · Bash | Thinking Blue | The AI is working out its answer; no tool is running. The previous tool name appears at the bottom. Most of a turn is spent here (measured: median thinking time 7.9 s, tool run time 117 ms). |
Prompt textBashCX · a18f3c2d | Working Blue | Running the tool shown (Bash, Read and so on). No sound plays while working. |
Prompt textCompactingCC · a18f3c2d | Compacting Blue | The conversation got long, so the AI is summarizing it automatically. Your task is not moving forward, so this is shown separately from Working. |
EditApproveHold=Always | Approve Amber, flashing | Press once to approve. The red dot and flashing mean a person is needed. |
BashHoldb72e91a4 | Hold Red, flashing | A high-impact action such as deletion, push or sending data out. It is approved only when you hold the key for 0.8 s or longer. |
QuestionInputa18f3c2d | Input Green, not flashing | A multiple-choice question. It cannot be answered on the deck, so press to open the AI's window. |
EditOn Screena18f3c2d | On Screen Amber, not flashing | The hold time passed and the approval went back to the AI's screen. Press to open it and answer there. |
UndoableSendingPress again | Grace period Blue | The 1.5 s before an approval is sent. Press the same key again to cancel sending. |
EditDenyRelease=Back | Deny Red slash, not flashing | Shown while you hold the Deny key. All flashing on the deck stops. Press a slot now to deny that request. |
my-appEndeda18f3c2d | Ended Black | The session has ended. It stays as a record and becomes empty after 15 minutes (default). If slots run short, the oldest ones are reused sooner. |
ClauDeckOffline | Offline Black, raised | ClauDeck is not running (quit, not yet started, and so on). The key changes to this about 3 seconds after the connection drops. Approvals are asked on the AI's screen as usual during this time, so your work does not stop. |
The keys in this table are illustrations. Details may differ from the actual display.
Top and bottom lines
- The top line shows the start of the latest prompt. For Approve and Hold, the tool name comes first so you can see what you are approving.
- Hold=Always: you can auto-allow the same request for the rest of that session (see Approving).
- <mode> · No Approvals: a session, such as auto mode, that never asks for approval.
- Child N: the number of Codex subagents.
- 8 characters: the start of the session ID. Same ID means same session.
Which AI (the colored band)
- Slate band: standby (empty). No AI has taken the slot yet.
- CC · orange band: Claude Code (desktop and terminal are not distinguished).
- CX · blue band: Codex.
- AG · purple band: Antigravity.
Shown both as the band at the top and the first two letters of the bottom line. When the bottom line is full, the letters are dropped, but the band always stays. You can change band colors with agent_colors in the settings file (the two-letter marks are fixed).
Approving
How you press depends on what the center of the key says.
| Key shows | How to press | What happens |
|---|---|---|
| Approve | Press once | Approves and starts a 1.5 s grace period. |
| Hold | Hold 0.8 s or longer | A high-impact action. A short press does not approve it. |
| To deny | Hold the Deny key and press the slot once | While the Deny key is held, pressing a slot denies. Denying always takes a single press, even for Hold actions. |
| Input | Press and answer on screen | Brings the app to the front. |
KeiCheck the tool name on the top line before you press.
Cancel right after pressing
While "Undoable / Sending" is shown (1.5 s), press the same key again to cancel sending the approval. This stops the send; it does not undo actions that have already run.
Hold to "Always allow"
If the bottom line says "Hold=Always", holding the key for 0.8 s or longer auto-allows the same request for the rest of that session. This record lives only in ClauDeck's memory and expires after 24 hours; it is never written to a settings file. The highest-impact actions, such as deletion or push (Tier 3), cannot be set to Always allow.
When a key does not respond
Presses within 0.3 s after a key lights up are ignored to prevent mistakes. "Hold" does not go through under 0.8 s. "Input" is not an approval. A normal approval goes back to the AI's screen after 15 seconds (default).
Approve "On Screen" slots with a hold (off by default)
If you turn on screen_approve in the settings file, holding an "On Screen" slot brings that window forward and ClauDeck presses the approval key (Enter for Claude Code) or button (the "一度だけ許可" / Allow once button for Codex) for you. Slots where this is active show "Hold=Screen" on the bottom line.
- There is a 1.5 s grace period; press again to cancel. If you answered on screen during that time, it is called off automatically.
- It will not press for slots that went back to the screen more than 10 minutes ago (default). SSH remote and Antigravity slots are not supported.
- It needs macOS Accessibility permission (only when this feature is on).
- It sends ordinary key presses. If the confirmation was already answered on screen, the key goes into the input field, and any half-written text there may be sent.
Opening the AI's window
Press a slot that is not waiting for approval once to go back to that session's app.
- Terminal.app: brings the app forward and selects the right tab. The first time, macOS may ask for Automation permission.
- Codex, Claude and Antigravity desktop apps: brings the app forward. It cannot select a specific session inside the app.
- Input / On Screen: opens the screen where you need to answer.
- SSH remote slots: opening windows is not supported. Approving works.
- Empty slots: nothing happens.
The slot currently in front gets a white band at the bottom of the key.
Deny key (ClauDeck Deny)
- "Deny / Hold + Slot" is its resting state. Pressing it alone does nothing.
- While held, it is armed: waiting keys stop flashing and get a red slash. Press a slot now to deny.
- Letting go always returns to approve. It never times out on its own.
- If nothing is waiting for approval, it shows "No target".
- The Deny key does not light up. Put it in an edge column so you can find it without looking.
Dial (ClauDeck Dial)
- Put it on a Stream Deck + XL dial and it becomes a "window" into your session list.
- Turn to scroll the list. Turning any dial moves all windows.
- Press it or touch the screen to bring that session's window forward.
- Windows are for reading. Approve and deny with slot keys.
- Each line fits 12 full-width characters (a key fits 8), so you can read prompts that do not fit on a key.
- Place as many as you like. With more dials than slots, you can see everything without turning.
Page key (ClauDeck Page)
- "Page 1/3" is the current page. Press to go to the next one.
- If a background page has an approval waiting, it shows "Pending / N" and the page key flashes.
- Without a ClauDeck Page key there is only one page; approvals for sessions that do not fit go back to the AI's screen.
- It does not switch pages automatically by default. Turn on
auto_pageto switch to the page with a waiting approval, only when the front page has none.
Test Buttons
Run "Test Buttons" from the ClauDeck menu, and the placed slots cycle in order through Thinking → Working → Compacting → Approve → Hold → Deny → Input → On Screen → Unread → Idle → Ended, then show the three AI colors. It will not run while a real approval is waiting.
Settings and everyday use
Language, launch at login, sounds, number of slots, the settings file, and the log.
Language
Switch between Japanese and English with "Language" in the ClauDeck menu bar menu.
Launch at login
Toggle "Launch at Login" in the ClauDeck menu. When checked, ClauDeck starts automatically from your next login. While ClauDeck is not running, approvals happen on the AI's screen as usual.
Sounds and volume
- Approve: a rising sound that stops. The loudest, meant to call you.
- Input: two short questioning tones. A cue to answer on screen.
- Task finished: rises and drops at the end, marking the end of a turn.
- Session ended: three gently falling notes.
Each slot has its own pitch. Under "Sound" in the menu, you can turn off just the transition sounds, or all sounds. "Sound" → "Volume" offers High, Medium and Low (High is the default).
More slots and pages
- Place more ClauDeck Slot actions to add slots right away. Removing one frees it.
- Write "slot name: slot ID" under
pinsin the settings file to keep a slot in the same place after restarting. You can also pin by AI type (claude, codex, antigravity) to keep the three AIs in fixed positions. - If you use more sessions than slots, place one ClauDeck Page key.
- On a second deck, slot IDs get a device suffix (for example c0r0#56bc). Which deck is primary is decided by device ID order, so it does not change with launch order.
Settings file
Settings are in ~/.config/claudeck/config.json. They are reloaded automatically when you save and apply from the next approval, so you normally do not need to restart (band colors appear a few seconds after saving).
{
"policy": "own",
"hold": 15,
"sound": true,
"state_sound": true,
"pages": 3,
"notify_ms": 9750,
"volume": 100,
"ended_ttl_ms": 900000,
"auto_page": false,
"pins": { "claude": "c0r0", "codex": "c1r0" },
"agent_colors": { "antigravity": "#c026d3" }
}What the main settings mean
policy: own approves on the deck; defer sends approvals back to the AI's screen.state_sound: false turns off transition sounds. Approval sounds remain.volume: loudness (1–100, default 100). High, Medium and Low in the menu are 100, 50 and 25.screen_approve: when you hold an "On Screen" slot, ClauDeck presses the approval key for you. Off by default. Needs Accessibility permission.approve_action: overrides how that press is done, per AI type, askey:enter,key:cmd+enterorbutton:button name. Types you leave out use the default (Enter for claude, the "一度だけ許可" / Allow once button for codex).ended_ttl_ms: time before an ended slot becomes empty (milliseconds, default 15 minutes). 0 keeps them.auto_page: switches to a background page when an approval is waiting there. Off by default. It never switches while the front page has a waiting approval.pins: fixed slots. Map a slot name or AI type to a slot ID. If that slot is taken, normal assignment is used.agent_colors: colors of the top band, as a color name or #rrggbb. Anything left out keeps its default.
Viewing the log
Choose "Open Log in Finder" in the menu to see the activity log. It contains no conversation text or file contents.
Main words in the log
press: a key was pressedcue: a sound was playedalways_added: set to Always allowno_seat: no slot was free, so it went back to the AI's screenseat_busy: the same slot was handling another approvalescalated: judged as left unattendedseat_vacated: an old ended slot was emptiedconfig_reloaded: settings were reloadeddeny_armed/deny_disarmed: Deny key armed / releaseddial_rotate/dial_focus: a dial was turned / pressed or touchedauto_page_turn: switched to a background page automaticallyshutdown: ClauDeck quit by itself (if this line is missing, it was stopped from outside)
Checking the version and updating
Click the ClauDeck icon in the menu bar and choose "このアプリについて…" (About this app) at the top to see the version and build number, the copyright and a link to the official site (up to 2.0 it was called "About ClauDeck"). If that item is missing, you have an older version. Update to the latest version and open it again.
At launch, ClauDeck checks for a newer version and, if there is one, opens a "Software Update" window. You can also check from "Check for Updates…" in the menu.
Connecting Antigravity
Open the menu
In ClauDeck, open "Agent Integration" → "Antigravity".
Choose a level
Choose from the table below and press "適用" (Apply).
Reopen Antigravity
Quit and reopen Antigravity, then send a new task.
| Option | What it does |
|---|---|
| 状態表示と画面復帰 Status & window focus | Shows status on slots; pressing a slot takes you back to Antigravity. |
| 承認・拒否も有効 Approve/Deny enabled | In addition to status and window switching, approvals for writes, command execution and similar actions are taken on the deck. |
| 連携を解除 Remove integration | Removes ClauDeck's Antigravity integration. |
Your previous Antigravity settings are backed up. You can later go back to status only, or remove the integration, from the same menu. No commands to type.
A slot marked AG is an Antigravity session. Press the slot to approve; to deny, hold ClauDeck Deny and press the slot. A timeout is not a denial: Antigravity returns to its own auto-execution setting. If you use auto-execution (EAGER), turning on approvals adds a ClauDeck confirmation to actions that used to run automatically.
SSH remote
Show Claude Code running on a Linux machine outside your Mac on the same Stream Deck.
SSH remote works with Claude Code only; Codex is not supported. You can approve, but remote slots cannot open windows on your Mac.
Check the remote machine
Make sure the Linux machine has Python 3.6 or later and Claude Code.
Set up passwordless SSH
Add your public key to
~/.ssh/authorized_keyson the remote machine, and check that you can connect from Terminal on your Mac without a password.Enter the connection
Open "SSH Remote Sync…" in the ClauDeck menu and enter a connection name, display name, SSH user, host and port. To use a specific private key, pick it with "選ぶ…" (Choose…).
Connect
Turn on auto-connect and reconnect-on-disconnect, then press "設定して接続" (Set up and connect). It checks the connection, sends a small helper to the remote machine, registers with the remote Claude Code, and opens a dedicated channel, in that order.
Reopen Claude Code on the remote machine
When it works, a slot named "[display name] directory" appears on the deck.
How the connection is handled, and what happens when it drops
- ClauDeck connects only to the host you specify. It does not go through the developer's servers or any third-party service.
- The channel inside your Mac is never exposed to the remote machine; only a separate remote entrance protected by a token is used.
- Passwords, two-factor codes and private key contents are not saved (only the private key's file location is remembered).
- When the connection drops, it retries at growing intervals of up to 30 seconds. You can also reconnect with "今すぐ再接続" (Reconnect now) in "SSH Remote Sync…".
- After about 20 seconds disconnected, the slot changes to "Ended", and returns to the same slot with the next activity after reconnecting.
- Approvals during a disconnection cannot be shown on the deck, so they are asked on the AI's screen on the SSH host.
When something does not work
Open the item closest to your symptom.
KeiFirst, open "Status" in the menu and take a look.
No keys light up at all
Under "Status", check in order that Stream Deck is connected, at least one slot exists, the mode is own, and a session has taken a slot. If Claude Code is in auto mode, it never asks for approval.
It says the plugin is not connected
Install the Stream Deck plugin from the menu, then quit and reopen the Stream Deck app. Then place "ClauDeck Slot" on a key. "AI Slot" is a different plugin.
Approvals are asked on the AI's screen instead of the deck
Check "Approvals undelivered to deck" under "Status". It lists reasons such as no free slot, timeout, defer mode, or the slot already handling another approval. Each slot takes only one approval at a time.
A lit key does not respond
Presses within 0.3 s of lighting up are ignored. "Hold" needs 0.8 s or longer. Green "Input" keys cannot be answered on the deck; press them and answer on screen.
It says "On Screen"
The 15-second hold time (default) passed and the approval went back to the AI's screen. Press the key to open the AI's screen and allow or deny there.
I noticed a mistake right after pressing
While "Undoable" is shown (1.5 s), press the same key again to cancel sending the approval. Actions that have already run cannot be undone.
Not enough slots, or slots moved
Place a ClauDeck Page key to use background pages. Slots stay fixed per session, but what you see changes when all slots fill and an ended slot is reused, when an ended slot times out (15 minutes by default), when you move keys, or when your deck layout changes. To keep things in fixed positions, use pins in the settings file.
I held an "On Screen" slot but nothing was sent
Check: ① screen_approve is on (the bottom line shows "Hold=Screen") ② Accessibility permission is granted (the menu shows a notice if not) ③ the AI's window could be brought forward ④ no more than 10 minutes (default) have passed since it went to the screen ⑤ it is not a remote or Antigravity slot. When nothing is sent, you hear the Input sound and only the window comes forward, so answer on screen.
The deck shows "ClauDeck / Offline"
ClauDeck is not running. Open ClauDeck from the Applications folder again. Approvals are asked on the AI's screen as usual while this is shown. If the menu bar icon does not appear, see the first item.
Codex is registered but nothing happens
Start the interactive Codex CLI once and answer the prompt to trust ClauDeck's notifications. The ChatGPT app and codex exec cannot answer this prompt.
No sound, or too loud
Check "Sound" in the menu. Turning off transition sounds leaves only approval sounds; turning off "Play Sound" stops everything. To keep sounds but make them quieter, set "Volume" to Medium or Low. If "Test Sound" is silent too, check the macOS volume and output device.
Pressing a slot does not take me to the right window
Only slots that are not waiting for approval switch windows. Terminal.app cannot select tabs without Automation permission. Desktop apps only come forward, and SSH remote does not support opening windows.
SSH remote says Permission denied
Check that you can SSH to the host directly from Terminal and that your public key is in ~/.ssh/authorized_keys. Connections that ask for a password or two-factor code are not supported.
SSH remote stays disconnected
Run "今すぐ再接続" (Reconnect now) from "SSH Remote Sync…". Also check the host, Python 3, and that the SSH port is reachable. Automatic reconnection keeps trying at intervals of up to 30 seconds.
If this does not help, email info@k386.sub.jp with your version (see "このアプリについて…" / About this app) and what is happening.
Terms and default values
If you have changed settings, check the actual values under "Reference" in the in-app guide.
| Item | Default |
|---|---|
| How long the deck holds an approval | 15 s |
| Ignore presses right after lighting up | 0.3 s (300 ms) |
| Grace period after pressing | 1.5 s (1,500 ms) |
| Time needed for "Hold" | 0.8 s (800 ms) |
| Hold for "Always allow" | 0.8 s (800 ms) |
| Until an ended slot is emptied | 15 minutes |
| How long "Always allow" is remembered | 24 hours |
| macOS notification | 9.75 s with the default 15 s hold (65% of the hold time, up to 20 s) |
| Maximum pages | 3 |
| Approval mode | own |
Terms
- Slot: a Stream Deck key taken by one session.
- Session: one conversation with Claude Code, Codex or Antigravity.
- Approve: the flashing state waiting for allow or deny.
- Deny key: a key that turns slot presses into denials while held. It is not a slot.
- Armed: the Deny key being held down. It never times out and always returns when released.
- Unread: a slot whose turn finished but you have not looked at. Same grey as Idle, but raised.
- Offline: shown by the plugin when ClauDeck is not running. Approvals are asked on the AI's screen meanwhile.
- Window: the session list shown on a dial. It does not approve or deny.
- Front: the slot whose window is currently in front. It gets a white band at the bottom.
- Source: which AI a slot belongs to, shown by the top band and the two letters at the start of the bottom line (CC, CX, AG).
- Input: a multiple-choice question. It cannot be answered on the deck.
- Grace period: the time after pressing during which sending the approval is held back.
- Focus: pressing a slot to bring its app to the front.
How it works under the hood (hooks and Unix domain sockets)
Hooks are how Claude Code, Codex and Antigravity call another registered program at key points in their work (before using a tool, at the end of a turn, and so on). Registering ClauDeck under "Agent Integration" makes status and approval requests reach ClauDeck.
A Unix domain socket is a channel that only programs on the same Mac can use. ClauDeck uses it to talk to the AI tools and the Stream Deck plugin, so that traffic never leaves your Mac.
Answering multiple-choice questions from the deck, selecting a specific session inside a desktop app, opening SSH remote windows, and Codex over SSH remote are not supported.