● Free & open source無料・オープンソース macOS · Ulanzi Studio 3.1+ Inspired by OpenAI Codex MicroOpenAI Codex Micro に触発
Vibe Deck
for D200X
Turn your Ulanzi D200X into a command deck for Claude Code, Codex, and Cursor. Watch up to five agents on live lane cards — session name, elapsed time, and what's awaiting approval — and approve, reject, or stop them without touching the screen. Ulanzi D200X を Claude Code / Codex / Cursor のコマンドデッキに。最大5つのエージェントをライブなレーンカード(セッション名・経過時間・承認内容)で監視し、画面に触れずに承認・否認・中断できます。
Why it works特徴
One layout. Three tools.1つのレイアウトで3ツール
Every profile shares the same key map — the only thing that changes is the theme colour. Your muscle memory transfers across tools. どのプロファイルでも同じ位置のキーは同じ意味。変わるのはテーマ色だけなので、指の記憶がそのまま他ツールでも使えます。
Unified layout統一レイアウト
Same key, same meaning on Claude Code, Codex, and Cursor. Tool differences (Return / a / ⌘⌫ …) are absorbed by a built-in translation table. You tell tools apart by theme colour: purple / teal / blue. Claude Code・Codex・Cursor で同じ位置のキーは同じ意味。ツール差(Return / a / ⌘⌫ など)は内蔵の翻訳テーブルが吸収。見分けはテーマ色(紫/ティール/青)のみ。
State-guarded keys誤爆防止ガード
Accept / Reject only fire while the lane is orange (Input) — Cursor also allows green (Done) for accepting all pending edits. Stop fires only on blue or orange. A guard-blocked press sends nothing: you get a warning sound and a red flash on the key. While a lane is orange, the Accept key itself blinks orange (Armed). Accept / Reject は橙(Input)のときだけ送出(Cursor のみ緑 Done でも有効=変更の一括承認/棄却)。Stop は青/橙のときのみ。ガードに阻止された押下は何も送出されず、警告音+キーの赤フラッシュで知らせます。橙の間は Accept キー自体がオレンジ点滅(Armed)します。
5 dynamic lane cards5枚の動的レーンカード
Each top-row key is a full-colour card: state label, elapsed time, session name, and — while orange — what awaits approval (e.g. Bash: git push). Thinking breathes, Input blinks, Done pops a white check; lanes light up left to right at startup. Press a lane to mark it read and focus the tool — Cursor jumps straight to that project's window via a cursor:// deep link. 上段5キーは全面1色のカード(状態色+白抜き文字)。状態ラベル・経過時間・セッション名、橙のときは承認内容(例 Bash: git push)を表示。作業中は呼吸、承認待ちは点滅、完了直後は白チェックのポップ、起動時は左から順に点灯。押すと既読化+フォーカスで、Cursor は cursor:// ディープリンクで該当プロジェクトのウィンドウへ直接ジャンプします。
Dials + Tool keyダイヤルと Tool キー
The left dial scrolls, the middle dial switches sessions/chats, and the right dial opens the autonomy menu (Effort / command menu / model). The Tool key on Page 3 cycles Claude ↔ Codex ↔ Cursor (Studio auto-restarts, ~9 s). 左ダイヤルはスクロール、中ダイヤルはセッション/チャット移動、右ダイヤルは自律軸メニュー(Effort / コマンドメニュー / モデル)。ツール切替は Page 3 の Tool キー(Studio が自動再起動・約9秒)。
Auto-focus, then send自動前面化→送出
Every key automatically brings the target app to the front, verifies it is frontmost, then sends. You never need to bring the app to the front yourself. どのキーも「自動で対象アプリを前面化→前面確認→送出」。先にアプリを前面化しておく必要はありません。
Local bridgeローカルブリッジ
A resident process on 127.0.0.1:17823 aggregates agent state; the plugin diff-updates tiles about every 150 ms. Claude Code hooks push approvals to /event, and /dashboard shows every tool's lanes live in a browser on the same Mac. If the bridge stops, Accept / Reject / Stop are withheld and all lanes show dark-gray OFFLINE (after 3 consecutive failed fetches; recovers automatically). 常駐プロセス(127.0.0.1:17823)が状態を集約し、プラグインが約150msで差分更新。Claude Code の hooks が /event に承認を通知し、/dashboard では全ツールのレーンを同一 Mac のブラウザでライブ表示。ブリッジ停止時は Accept / Reject / Stop を送出せず、全レーンが濃灰 OFFLINE 表示(3回連続の取得失敗で表示・自動復帰)。
Deck mapデッキマップ
The Vibe Deck OS layout統一レイアウト「Vibe Deck OS」
Switch pages and profiles below — this is the actual key map. The top lane row never changes; page flipping is done with the two physical buttons. 下のタブでページとプロファイルを切り替えられます(実際のキー配置図)。上段レーンは常に固定。ページ移動は下段の物理ボタン左右で行います。
Top row — agent lanes (all pages)上段 — エージェントレーン(全ページ共通)
Lane cards are live: on the real deck each lane is a full-colour card showing the state label, elapsed time, and session name (Claude Code = session title, Codex = thread name or its start time, Cursor = project folder name), plus the pending approval while orange. Pressing a lane marks it read and focuses the tool. Guard dots: the small dots on Accept / Reject / Stop show which lane states arm that key — orange arms Accept / Reject (switch the profile to Cursor above and a green dot appears: Cursor also fires on Done), blue + orange arm Stop; while a lane is orange the Accept key blinks orange (Armed), and a guard-blocked press answers with a warning sound and a red flash. The slim bar at the bottom right is the built-in widget window (clock), not a key. Skill keys type a prompt opening into the chat box — they never auto-send. レーンは動的カード: 実機では各レーンが全面1色のカードになり、状態ラベル・経過時間・セッション名(Claude Code=セッションタイトル / Codex=スレッド名か開始日時 / Cursor=プロジェクトフォルダ名)、橙のときは承認内容まで表示します。押すと既読化+フォーカス。ガードドット: Accept / Reject / Stop の下の小さな点は「どの状態でそのキーが発火するか」を示します。橙で Accept / Reject が有効(上のプロファイルを Cursor にすると緑の点が増えます=Cursor は Done でも有効)、Stop は青+橙。橙の間は Accept キーがオレンジ点滅(Armed)し、ガードに阻止された押下は警告音+赤フラッシュで知らせます。下段右端の細長い表示は本体の小窓ウィジェット(時計)でキーではありません。Skills キーはプロンプト冒頭を入力するだけで、送信はしません。
Page 4 — Commands (not shown in the diagram above): five shared autonomous-run prompt keys — Goal / Continue / FixAll / TestAll / Ship — typed into the chat (never auto-sent), plus a per-tool zone: Claude Code /compact · session switch · element pick, Codex /goal · history · panel, Cursor next/prev diff hunk · queue message. See the manual for the full key map.Page 4 — Commands(上の図には未掲載): 全ツール共通の自走プロンプト5キー(Goal / Continue / FixAll / TestAll / Ship。入力のみで自動送信はしません)と、ツール固有ゾーン(Claude Code: /compact・セッション切替・要素ピック / Codex: /goal・履歴・パネル / Cursor: 差分ハンク移動・メッセージのキュー)。詳細は取扱説明書を参照。
Setupセットアップ
Install in one scriptスクリプト1本でインストール
One installer wires the bridge, the plugin, and three ready-made profiles: Vibe · Claude Code, Vibe · Cursor, and the official-style Codex_D200X. インストーラ1本で、ブリッジ・プラグイン・3つのプリセット(Vibe · Claude Code / Vibe · Cursor / Codex_D200X)を配線します。
Requirements必要なもの
- Ulanzi D200X (USB connection)(USB 接続)
- Ulanzi Studio 3.1+ (Apple Silicon)
- macOS 12+
- Target apps: Claude.app / ChatGPT.app (Codex) / Cursor.app対象アプリ: Claude.app / ChatGPT.app(Codex)/ Cursor.app
- Node.js 20+
- Python 3 + Pillow (icon generation)(アイコン生成)
Installインストール
# get the repo, then run the installer git clone https://github.com/goonobu-dot/vibe-deck-for-d200x.git cd vibe-deck-for-d200x ./scripts/install.sh
- Fully quit and relaunch Ulanzi Studio. Check that the three profiles appear: Vibe · Claude Code / Vibe · Cursor / Codex_D200X.Ulanzi Studio を完全終了→再起動。3つのプロファイル(Vibe · Claude Code / Vibe · Cursor / Codex_D200X)が表示されることを確認。
- Allow Ulanzi Studio in System Settings → Privacy & Security → Accessibility.システム設定 → プライバシーとセキュリティ → アクセシビリティで Ulanzi Studio を許可。
- Also allow Automation (System Events / control of each app) — the verb keys (Accept etc.) and profile switching use it.同じ項目でオートメーション(System Events / 各アプリの制御)も許可 — verb キー(Accept 等)とプロファイル切替が使用します。
First press: the first time you press a verb key, macOS may show an Automation permission dialog. You must approve it — until then, keys like Accept are silently not sent. 初回押下時: verb キーを初めて押すと macOS のオートメーション許可ダイアログが出ることがあります。必ず許可してください — 未許可の間は Accept 等のキーが送出されません。
Claude Code approval hooks (recommended)Claude Code 承認フック(推奨)
Register the bundled hook script in ~/.claude/settings.json — the Notification / Stop hooks report to the bridge's /event endpoint, so a lane turns orange the moment approval is requested. Replace the path with your own checkout. Hooks take effect from new sessions.
同梱のフックスクリプトを ~/.claude/settings.json の hooks に登録すると、Notification / Stop フックが bridge の /event へ通知し、承認要求の瞬間に確実にレーンが橙になります。パスは自分の環境に置き換えてください。hooks は新規セッションから有効です。
{
"hooks": {
"Notification": [
{ "hooks": [ {
"type": "command",
"command": "\"/path/to/vibe-deck/scripts/claude-hooks/vibe-deck-event.sh\" needs_input"
} ] }
],
"Stop": [
{ "hooks": [ {
"type": "command",
"command": "\"/path/to/vibe-deck/scripts/claude-hooks/vibe-deck-event.sh\" done"
} ] }
]
}
}
Per-tool guidesツール別ガイド
What each key actually sends各キーが実際に送るもの
Same layout, different wiring underneath. The translation table below is applied automatically by the plugin — you never think about it. レイアウトは同じでも、裏の配線はツールごとに違います。以下の翻訳テーブルはプラグインが自動適用するので、ユーザーが意識する必要はありません。
| Keyキー | Sends送出 | Effect / guard動作 / ガード |
|---|---|---|
| Accept | Return | Approve / run — fires only on orange承認/実行 — 橙のときだけ発火 |
| Reject | Esc | Decline — fires only on orange否認 — 橙のときだけ発火 |
| Stop | Esc | Interrupt the turn — blue / orange onlyターン中断 — 青/橙のときのみ |
| Diff | ⇧⌘D | Open the diff view差分ビューを開く |
| New | ⌘N | New chat新規チャット |
| Voice | ⇪ | Voice input — unstable from the deck (known)音声入力 — デッキからは不安定(既知) |
| Terminal | ⌃` | Toggle terminalターミナル開閉 |
| Mode | ⇧⌘M | Permission mode UIPermission モード切替UI |
System page · tool zone & dialsSystem ページ · ツール固有ゾーンとダイヤル
| Model | ⇧⌘I | Model pickerモデル選択 |
| Browser | ⇧⌘B | Side-by-side browser pane並走ブラウザペイン |
| SideChat | ⌘; | Ask on the side without stopping the main thread本筋を止めずに横質問 |
| Effort | ⇧⌘E | Thinking-depth menu思考深度メニュー |
| Right dial右ダイヤル | ⇧⌘E | Either direction opens the Effort menu; press = Mode (⇧⌘M)どちらに回しても Effort メニュー。押し込み = Mode(⇧⌘M) |
Bash: git push). Pressing a lane marks it read and brings Claude.app to the front.
レーンカードにはセッションタイトルが出ます。各レーンは全面1色のカードで、状態ラベル・経過時間・Claude Code のセッションタイトルを表示。橙のときは承認内容(例 Bash: git push)も表示します。押すと既読化+ Claude.app 前面化。| Keyキー | Sends送出 | Effect / guard動作 / ガード |
|---|---|---|
| Accept | a | Accept once — fires only on orangeAccept once(一度だけ許可)— 橙のときだけ発火 |
| Reject | d | Decline — fires only on orangeDecline(否認)— 橙のときだけ発火 |
| Stop | Esc | Interrupt the turn — blue / orange onlyターン中断 — 青/橙のときのみ |
| Diff | ⌘⌥B | Toggle the Review panelReview パネルの開閉 |
| New | ⌘N | New chat新規チャット |
| Voice | ⌃⇧D | Voice input音声入力 |
| Terminal | ⌃` | Toggle terminalターミナル開閉 |
| Mode | /permissions | Typed into chat and executed — opens permission settingsチャット欄に入力して実行 — 権限設定を開く |
System page · tool zone & dialsSystem ページ · ツール固有ゾーンとダイヤル
| Model | ⇧⌘P | Command menuコマンドメニュー |
| Plan | /plan | Plan mode — think first, then act計画モード(深く考えてから着手) |
| Fast | /fast | Fast mode — for light tasks高速モード(軽いタスク向け) |
| Quick | ⌘⌥N | Quick chatクイックチャット |
| Right dial右ダイヤル | /fast · /plan | Rotate = ⇧⌘P command menu (/plan · /fast live there); press = ⇧⌘P. One-touch /plan · /fast keys are on Page 3回転=⇧⌘P(コマンドメニュー。/plan・/fast はそこから)。押し込み=⇧⌘P。ワンタッチの /plan・/fast は Page 3 の Plan / Fast キーで |
a / d only mean approve / decline while the approval overlay is on screen — at any other time they would just type letters into chat. The deck restricts them to orange lanes, which is the core of the misfire protection.
ガードが最も効くのが Codex: a / d は承認オーバーレイ表示中だけ意味を持つキーで、それ以外では文字入力になってしまいます。デッキ側が「橙のときだけ送出」に制限しており、これが誤爆防止の要です。s (session) on screen, or change the standing setting via Mode (/permissions).
Accept は「一度だけ許可」。セッション全体を許可したい場合は画面上で s(session)を選ぶか、Mode(/permissions)で恒久設定を変更してください。/plan etc. gets sent as plain text, focus was outside the chat box — press a lane key to bring ChatGPT to the front, click the chat box, then retry.
スラッシュ系はチャット欄フォーカスが必要。/plan などが文章として送信されてしまったら、入力欄以外にフォーカスがあった状態です。上段レーンを押して ChatGPT を前面化し、入力欄をクリックしてから再実行してください。7/31 10:19) — name the thread in Codex and the name appears on the card.
レーンカードにはスレッド名が出ます。無名のスレッドは開始日時(例 7/31 10:19)が表示されます — Codex 側でスレッドに名前を付けるとその名前がカードに出ます。| Keyキー | Sends送出 | Effect / guard動作 / ガード |
|---|---|---|
| Accept | Return | Approve / run — fires on orange or green (green = accept all pending edits)承認/Run — 橙または緑で発火(緑=変更をすべて受け入れる) |
| Reject | ⌘⌫ | Reject all pending edits — orange or greenReject all(変更をすべて棄却)— 橙または緑 |
| Stop | ⌘⇧⌫ | Interrupt the turn — blue / orange onlyターン中断 — 青/橙のときのみ |
| Diff | ⌘E | Open Changes / Agent layoutChanges / Agent レイアウトを開く |
| New | ⌘N | New chat新規チャット |
| Voice | ⌘⇧Space | Voice input音声入力 |
| Terminal | ⌃` | Toggle terminalターミナル開閉 |
| Mode | ⌘. | Agent / Ask mode menuAgent / Ask モードメニュー |
System page · tool zone & dialsSystem ページ · ツール固有ゾーンとダイヤル
| Model | ⌘/ | Model switcherモデル切替 |
| Composer | ⌘I | Composer / agent panelComposer / エージェントパネル |
| Context | ⇧⌘L | Add the selected code to chat context選択中のコードをチャットの文脈に追加 |
| Inline | ⌘K | Inline edit at cursor / selectionインライン編集(カーソル位置・選択範囲の局所修正) |
| Right dial右ダイヤル | ⌘/ | Either direction opens the model menu; press = Mode (⌘.)どちらに回してもモデルメニュー。押し込み = Mode(⌘.) |
cursor:// deep link that jumps straight to that project's window (falls back to bringing Cursor to the front if the path cannot be resolved).
レーン押下でプロジェクトへ直接ジャンプ。レーンカードの名前はプロジェクトフォルダ名で、押すと cursor:// ディープリンクにより該当プロジェクトのウィンドウへ直接ジャンプします(パスの復号に失敗した場合はアプリ前面化にフォールバック)。FAQ & known limitsFAQ・既知の限界
Honest edges正直な限界も書いておきます
A few behaviours are by design, and a few are platform limits. Here is the full list. 仕様どおりの挙動と、プラットフォーム側の制約をすべて挙げます。
I press Accept and it beeps with a red flashAccept を押すと警告音が鳴りキーが赤くフラッシュする
~/Library/Logs/vibe-deck-plugin.log shows guard blocked, it is behaving exactly as designed.
仕様どおりです。ガードにより Accept / Reject は橙のときだけ(Cursor は緑も)、Stop は青/橙のときだけ送出されます。阻止された押下は何も送出されず、警告音+押したキーの赤フラッシュで知らせます。~/Library/Logs/vibe-deck-plugin.log に guard blocked とあれば仕様どおりです。A lane turned dark green — what is that?レーンが深緑になった — これは何?
Is there a way to see the lanes on screen too?レーンを画面でも見たい
http://127.0.0.1:17823/dashboard in a browser on the same Mac. It shows every tool's lanes live.
同一 Mac のブラウザで http://127.0.0.1:17823/dashboard を開くと、全ツールのレーンをライブ表示できます。The first key press shows a macOS dialog初回押下で macOS のダイアログが出る
Tool switching takes about 9 secondsツール切替に約9秒かかる
Codex keys don't do anythingCodex のキーが効かない
Claude's Voice key (⇪) is unreliableClaude の Voice(⇪)が不安定
Colours are slow or not updating色が遅い/変わらない
curl http://127.0.0.1:17823/health, restart Ulanzi Studio (reloads the plugin), and if you use the LaunchAgent: launchctl kickstart -k gui/$(id -u)/com.vibe.deck.bridge. On Cursor specifically, updates depend on transcript write timing.
まず Page 3 の Refresh。次にブリッジ確認: curl http://127.0.0.1:17823/health → Studio 再起動(プラグイン再読込)→ LaunchAgent 利用時は launchctl kickstart -k gui/$(id -u)/com.vibe.deck.bridge。Cursor は transcript の書き出しタイミングに依存します。What happens if the bridge stops?ブリッジが停止したら?
Pages don't flipページが切り替わらない
node scripts/wire-deck.mjs and restart Studio.
下段左右の物理ボタンが Studio 標準の Previous / Next page になっているか、対象プロファイルに Page が2つ以上あるかを確認。ダメなら node scripts/wire-deck.mjs を再実行して Studio を再起動してください。