● 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. 下のタブでページとプロファイルを切り替えられます(実際のキー配置図)。上段レーンは常に固定。ページ移動は下段の物理ボタン左右で行います。

ULANZI · D200X Vibe · Claude Code

Top row — agent lanes (all pages)上段 — エージェントレーン(全ページ共通)

Idle Thinking (breathes; 2× faster after 15 min)Thinking(呼吸。15分超で約2倍速) Done (just finished)Done(完了直後) Done, unread (90 s → up to 30 min; press = read)未確認の完了(90秒後〜最大30分。押下で既読) Input (needs approval, blinks)Input(承認・入力待ち・点滅) Error Ready (empty lane)Ready(空きレーン) OFFLINE (bridge unreachable)OFFLINE(bridge 不達)

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インストール

terminal
# 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
  1. 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)が表示されることを確認。
  2. Allow Ulanzi Studio in System Settings → Privacy & Security → Accessibility.システム設定 → プライバシーとセキュリティ → アクセシビリティで Ulanzi Studio を許可。
  3. 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 は新規セッションから有効です。

~/.claude/settings.json
{
  "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. レイアウトは同じでも、裏の配線はツールごとに違います。以下の翻訳テーブルはプラグインが自動適用するので、ユーザーが意識する必要はありません。

Profile: Vibe · Claude Code — deep purple + orange sparkプロファイル: Vibe · Claude Code — 深紫+オレンジ Target: Claude.app (desktop; CLI sessions are also monitored)対象: Claude.app(デスクトップ。CLI セッションも状態監視の対象)
Keyキー Sends送出 Effect / guard動作 / ガード
AcceptReturnApprove / run — fires only on orange承認/実行 — 橙のときだけ発火
RejectEscDecline — fires only on orange否認 — 橙のときだけ発火
StopEscInterrupt the turn — blue / orange onlyターン中断 — 青/橙のときのみ
Diff⇧⌘DOpen the diff view差分ビューを開く
New⌘NNew chat新規チャット
Voice⇪Voice input — unstable from the deck (known)音声入力 — デッキからは不安定(既知)
Terminal⌃`Toggle terminalターミナル開閉
Mode⇧⌘MPermission mode UIPermission モード切替UI

System page · tool zone & dialsSystem ページ · ツール固有ゾーンとダイヤル

Model⇧⌘IModel pickerモデル選択
Browser⇧⌘BSide-by-side browser pane並走ブラウザペイン
SideChat⌘;Ask on the side without stopping the main thread本筋を止めずに横質問
Effort⇧⌘EThinking-depth menu思考深度メニュー
Right dial右ダイヤル⇧⌘EEither direction opens the Effort menu; press = Mode (⇧⌘M)どちらに回しても Effort メニュー。押し込み = Mode(⇧⌘M)
Reject vs Stop are both Esc. Claude has no dedicated decline key, so the lane state decides the meaning: press on orange = decline, press on blue = interrupt. The guard makes mixing them up fail safe. Reject と Stop はどちらも Esc。Claude には否認専用キーがないため、状態側で意味が決まります(橙で押せば否認、青で押せば中断)。ガードがあるので取り違えても安全側に倒れます。
Lane cards show the session title. Each lane is a full-colour card with the state label, elapsed time, and the Claude Code session title; while orange it also shows what awaits approval (e.g. Bash: git push). Pressing a lane marks it read and brings Claude.app to the front. レーンカードにはセッションタイトルが出ます。各レーンは全面1色のカードで、状態ラベル・経過時間・Claude Code のセッションタイトルを表示。橙のときは承認内容(例 Bash: git push)も表示します。押すと既読化+ Claude.app 前面化。
Approval hooks make orange instant. Register the Notification / Stop hooks (see Install above) and a lane turns orange the moment approval is requested; the Accept key blinks orange (Armed) while it waits. Accept confirms the dialog's default (e.g. allow once), Reject declines, Stop interrupts. Hooks take effect from new sessions. 承認フックで橙が確実になります。Notification / Stop フックを登録すると(上の Install 参照)、承認要求の瞬間にレーンが橙になり、その間 Accept キーがオレンジ点滅(Armed)します。Accept=承認(「一度だけ許可」等の既定を確定)/ Reject=拒否 / Stop=中断。hooks は新規セッションから有効です。
Too many approvals? The proper fix is Mode (⇧⌘M): relax Permission to Accept edits / Auto. 承認が多すぎるときは Mode(⇧⌘M)で Permission を Accept edits / Auto に緩めるのが本筋です。
Profile: Codex_D200X — black + tealプロファイル: Codex_D200X — 黒+ティール Target: ChatGPT.app — Codex verb keys require the desktop app対象: ChatGPT.app(デスクトップ)— Codex の操作キーはデスクトップアプリ前提
Keyキー Sends送出 Effect / guard動作 / ガード
AcceptaAccept once — fires only on orangeAccept once(一度だけ許可)— 橙のときだけ発火
RejectdDecline — fires only on orangeDecline(否認)— 橙のときだけ発火
StopEscInterrupt the turn — blue / orange onlyターン中断 — 青/橙のときのみ
Diff⌘⌥BToggle the Review panelReview パネルの開閉
New⌘NNew chat新規チャット
Voice⌃⇧DVoice input音声入力
Terminal⌃`Toggle terminalターミナル開閉
Mode/permissionsTyped into chat and executed — opens permission settingsチャット欄に入力して実行 — 権限設定を開く

System page · tool zone & dialsSystem ページ · ツール固有ゾーンとダイヤル

Model⇧⌘PCommand menuコマンドメニュー
Plan/planPlan mode — think first, then act計画モード(深く考えてから着手)
Fast/fastFast mode — for light tasks高速モード(軽いタスク向け)
Quick⌘⌥NQuick chatクイックチャット
Right dial右ダイヤル/fast · /planRotate = ⇧⌘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 キーで
Why the guard matters most here: 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 は承認オーバーレイ表示中だけ意味を持つキーで、それ以外では文字入力になってしまいます。デッキ側が「橙のときだけ送出」に制限しており、これが誤爆防止の要です。
Accept = once. To allow the whole session, choose s (session) on screen, or change the standing setting via Mode (/permissions). Accept は「一度だけ許可」。セッション全体を許可したい場合は画面上で s(session)を選ぶか、Mode(/permissions)で恒久設定を変更してください。
Slash keys need chat focus. If /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 を前面化し、入力欄をクリックしてから再実行してください。
Lane cards show the thread name. Unnamed threads show their start time instead (e.g. 7/31 10:19) — name the thread in Codex and the name appears on the card. レーンカードにはスレッド名が出ます。無名のスレッドは開始日時(例 7/31 10:19)が表示されます — Codex 側でスレッドに名前を付けるとその名前がカードに出ます。
Profile: Vibe · Cursor — dark IDE + blueプロファイル: Vibe · Cursor — ダークIDE+青 Target: Cursor.app対象: Cursor.app
Keyキー Sends送出 Effect / guard動作 / ガード
AcceptReturnApprove / 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⌘EOpen Changes / Agent layoutChanges / Agent レイアウトを開く
New⌘NNew chat新規チャット
Voice⌘⇧SpaceVoice input音声入力
Terminal⌃`Toggle terminalターミナル開閉
Mode⌘.Agent / Ask mode menuAgent / Ask モードメニュー

System page · tool zone & dialsSystem ページ · ツール固有ゾーンとダイヤル

Model⌘/Model switcherモデル切替
Composer⌘IComposer / agent panelComposer / エージェントパネル
Context⇧⌘LAdd the selected code to chat context選択中のコードをチャットの文脈に追加
Inline⌘KInline edit at cursor / selectionインライン編集(カーソル位置・選択範囲の局所修正)
Right dial右ダイヤル⌘/Either direction opens the model menu; press = Mode (⌘.)どちらに回してもモデルメニュー。押し込み = Mode(⌘.)
Cursor is the only tool where green (Done) also arms Accept / Reject. Done means “edits finished, changes pending” — check the Diff, then accept all or reject all (⌘⌫) from the deck. 緑(Done)でも Accept / Reject が有効なのは Cursor だけ。Done は「編集完了・変更が保留中」の意味です。Diff で確認して、Accept(全部通す)か Reject(⌘⌫で全部戻す)を手元で選べます。
MCP approval focus issue (known Cursor issue): if the approval dialog loses focus, Return alone may not work. Press Tab on the physical keyboard, then Accept on the deck again. MCP 承認の既知問題: 承認ダイアログのフォーカスがずれていると Return 単体で効かないことがあります(Cursor 公式の既知問題)。本体キーボードで Tab → もう一度デッキの Accept を押してください。
Lane press jumps to the project. Lane cards are named after the project folder, and pressing a lane opens a 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:// ディープリンクにより該当プロジェクトのウィンドウへ直接ジャンプします(パスの復号に失敗した場合はアプリ前面化にフォールバック)。
State colours can lag slightly: the bridge watches Cursor’s transcript, so updates depend on its write timing. Refresh (Page 3) re-fetches. 色の反映がわずかに遅れることがあります: ブリッジは Cursor の transcript を監視するため、書き出しタイミングに依存します。Page 3 の Refresh で再取得できます。

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 を押すと警告音が鳴りキーが赤くフラッシュする
Working as intended. The guard only lets Accept / Reject fire while the lane is orange (Cursor: also green), and Stop only on blue / orange. A blocked press sends nothing and answers with a warning sound plus a red flash on the pressed key. If ~/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?レーンが深緑になった — これは何?
An unacknowledged completion. A lane that finished (green) more than 90 seconds ago turns dark green and is kept for up to 30 minutes so you don't miss it. Press the lane to mark it read — it returns to white. 未確認の完了です。完了(緑)から90秒を過ぎた未読レーンは深緑になり、見逃さないよう最大30分保持されます。レーンを押すと既読になり白へ戻ります。
Is there a way to see the lanes on screen too?レーンを画面でも見たい
Yes — open 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 のダイアログが出る
That is the Automation (System Events) permission prompt. Approve it for Ulanzi Studio — until you do, verb keys like Accept are not sent at all. オートメーション(System Events)の許可ダイアログです。Ulanzi Studio を必ず許可してください。未許可の間は Accept などの verb キーが送出されません。
Tool switching takes about 9 secondsツール切替に約9秒かかる
Ulanzi Studio has no external API for profile switching (both WebSocket and UI scripting were verified not to work on real hardware). So the deck rewrites the config and auto-restarts Studio — about 9 seconds to come back, and the deck goes dark for a few seconds during the switch. Ulanzi Studio にはプロファイル切替の外部APIが存在しません(WS・UIスクリプト両方とも不可を実機検証済み)。そのため設定書換→Studio 自動再起動で実現しており、復帰まで約9秒かかります。切替中はデッキが数秒消灯します。
Codex keys don't do anythingCodex のキーが効かない
Codex verb keys assume the ChatGPT desktop app (ChatGPT.app). They are not designed to drive the browser version. Codex の操作キーは ChatGPT デスクトップアプリ(ChatGPT.app)前提です。ブラウザ版の操作は想定していません。
Claude's Voice key (⇪) is unreliableClaude の Voice(⇪)が不安定
Known limitation: Caps Lock is unreliable when sent from the deck due to macOS behaviour. Check Claude's voice-input setting, or use Caps Lock on the physical keyboard. 既知の制約です。macOS の仕様上、⇪ はデッキからの送出が不安定です。Claude 側の音声入力設定を確認するか、本体キーボードの ⇪ を使ってください。
Colours are slow or not updating色が遅い/変わらない
Try Refresh on Page 3 first. Then check the bridge: 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?ブリッジが停止したら?
The deck fails safe: Accept / Reject / Stop are withheld entirely, and after 3 consecutive failed fetches every lane shows a dark-gray OFFLINE card. Other keys (Diff, New, Skills, System) keep working, and the lanes recover automatically once the bridge is reachable again. 安全側に倒れます。Accept / Reject / Stop は一切送出されず、取得が3回連続で失敗すると全レーンが濃灰の OFFLINE カード表示になります。他のキー(Diff / New / Skills / System)は動き続け、ブリッジが復旧すればレーンは自動で通常表示に戻ります。
Pages don't flipページが切り替わらない
Check that the two bottom physical buttons are assigned to Studio's standard Previous / Next page, and that the profile has 2+ pages. If not, re-run node scripts/wire-deck.mjs and restart Studio. 下段左右の物理ボタンが Studio 標準の Previous / Next page になっているか、対象プロファイルに Page が2つ以上あるかを確認。ダメなら node scripts/wire-deck.mjs を再実行して Studio を再起動してください。