Vizhi
For Claude Code

Claude Console

Physical hardware controls for Claude Code in Apple Terminal or Windows Terminal, on the Logitech MX Creative Keypad. Press a button. Ship code.

Version 2.2.1 · macOS + Windows · In Marketplace review

Claude Console turns the keypad's nine LCD keys into a control surface for Claude Code: a key per session, one-press prompts and git actions, answering permission prompts, terminal navigation, screenshots into the conversation, and fully offline voice. No cloud, no API keys. Everything runs on your own machine — see the privacy policy.

Requirements

Both platforms

  • A Logitech MX Creative Keypad and Logi Options+ 6.4 or newer. Options+ 6.4 installs the Logi Plugin Service with the .NET 10 runtime the plugin needs. On an older Options+ the plugin does not load, so let Options+ update itself first.
  • Claude Code installed natively on the machine. A session running inside WSL is not visible to the plugin.

macOS

  • Apple Silicon. Voice transcription uses Metal.
  • Apple Terminal (Terminal.app). Every typing key targets Claude's own Terminal tab. iTerm2, Ghostty and Warp are not supported, and sessions running in them do not appear on the session keys.

Windows

  • Windows 10 or 11, x64 or arm64.
  • Windows Terminal. Typing also reaches Claude in a classic console or VS Code's integrated terminal, but the tab, window and session keys drive Windows Terminal and need it. See Windows notes.

Install

  1. Install the plugin. From the Logi Marketplace inside Options+, or by opening a ClaudeConsole_2.2.1.lplug4 package: double-click it and Options+ registers the plugin.
    macOS

    If Gatekeeper blocks the package, right-click it and choose Open, or run xattr -dr com.apple.quarantine ClaudeConsole_2.2.1.lplug4 first.

  2. Nothing appears on the keypad yet. That is correct. The plugin is universal: it binds to no application and ships no layout, so there is no Claude Console entry in the Options+ application strip and no keys until you give it some. Its actions are listed under Claude Console Actions in the Options+ action panel. If that list is missing, the plugin did not load — check the log.
  3. Import the keypad layout, below. Two clicks.
Verifying a clean load from the log

The last lines of the plugin log should read Plugin 'ClaudeConsole' version '2.2.1' loaded. A line saying the plugin was disabled as it had crashed before means the service gave up on it; uninstall, reinstall, and send us the log.

  • macOS~/Library/Application Support/Logi/LogiPluginService/Logs/plugin_logs/ClaudeConsole.log
  • Windows%LOCALAPPDATA%\Logi\LogiPluginService\Logs\plugin_logs\ClaudeConsole.log

Import the keypad layout

This is the normal setup, not a fallback. Import the ready-made layout once and all five pages of keys appear at the same time.

  1. Download the layout for your platform from the keypad layouts page: ClaudeConsole-Keypad.lp5 on macOS, ClaudeConsole-Windows.lp5 on Windows.
  2. In Logi Options+, open your MX Creative Keypad, open the profile menu (the button or profile dropdown) and choose Import Profile. Pick the .lp5 file.
  3. It imports as a Terminal profile (Windows Terminal on Windows), five pages deep, and activates whenever that application is in front. Rearrange or rebind any key afterwards.
PageKeys, top row to bottom row
1Session 1 Session 2 Session 3 / Clear No Yes / Esc Tab Dictate
2Cost Model Compact / Up Return Down / Scroll Up Scroll Down
3Explore Explain Review / Optimize Refactor Write Tests / Document Fix Bug Security
4Go to Project New Tab Next Tab / Prev Tab New Claude Exit
5Commit Create PR Diff / Log Push Status
  • Install the plugin first, so the imported keys resolve to real actions.
  • Import once. Updating or reinstalling the plugin never touches the profile; it belongs to Terminal's entry in Options+, not to the plugin. The keys simply light up again after an update.
  • Already have a Terminal profile you like? Skip the import and drag the Claude Console actions onto it instead.
  • Session 4 to 6, Screenshot, Voice Draft, Context, Activity, Mode and the window keys exist as actions but are not on the shipped pages. Drag them on wherever you like.
  • Do not open the live keys in the Options+ icon editor (sessions, Yes, No, Model, Cost, Context, Activity). The editor freezes them into a snapshot. Why, and the fix.

Permissions

macOS

Each is asked once, on first use.

  • Accessibility for the Logi Plugin Service, so keys can type into Terminal. Asked the first time a key types.
  • Microphone for ClaudeVoiceHelper, asked on the first Dictate press. The helper and speech model install themselves at the same time.
  • Screen Recording for the Logi Plugin Service, asked on the first Screenshot press.
Windows

No permission prompts. For voice, microphone access for desktop apps must be enabled in Windows Settings.

Live status: the keys are the switch

The live keys (Cost, Model, Context, Activity), the session state bars and the Yes / No approval badge all read state that Claude Code reports through a status line and five hooks. Wiring those in edits your Claude Code settings file, so the plugin never does it on its own. Nothing is written on install.

Before you turn it on, the live keys read Set up, Yes and No read Set up or Off on a grey tile, and each session key's bar reads Set up or Status off. Without the wiring the plugin cannot see a permission prompt, so those keys have nothing to show or answer.

Turn it on

  1. Press a live key, for example Cost. The key flashes Press again and a card appears in Options+ stating the exact change.
  2. macOS: a dialog opens mid-screen naming the change, with Not now and Turn on. Choose Turn on, or press the same key again within 15 seconds.
    Windows: there is no dialog. Press the same key again within 15 seconds.
  3. macOS: the keys come alive with each running session's next activity; no restart.
    Windows: start a new Claude Code session. The key says so.

Turning it on merges one statusLine handler and five hooks into ~/.claude/settings.json. It appends only hooks that are not already there, chains an existing status line so yours still renders, and rewrites a backup, settings.json.claude-console.bak, immediately before every change it makes. That backup is always the state one change ago, not a pre-install snapshot. Each command it writes checks that its handler still exists before running, so an entry left behind after an uninstall is a silent no-op rather than an error on every turn.

Exactly what is written

The plugin writes absolute paths rather than $HOME. On Windows the same entries use a command-shell guard around claude-console-hook.exe.

{
  "statusLine": {
    "type": "command",
    "command": "[ ! -f \"$HOME/.claude/claude-console/scripts/statusline-handler.sh\" ] || bash \"$HOME/.claude/claude-console/scripts/statusline-handler.sh\""
  },
  "hooks": {
    "UserPromptSubmit":  [{ "hooks": [{ "type": "command", "command": "[ ! -f \"$HOME/.claude/claude-console/scripts/activity-hook.sh\" ] || bash \"$HOME/.claude/claude-console/scripts/activity-hook.sh\" busy" }] }],
    "PostToolUse":       [{ "matcher": "*", "hooks": [{ "type": "command", "command": "[ ! -f \"$HOME/.claude/claude-console/scripts/activity-hook.sh\" ] || bash \"$HOME/.claude/claude-console/scripts/activity-hook.sh\" busy" }] }],
    "Notification":      [{ "hooks": [{ "type": "command", "command": "[ ! -f \"$HOME/.claude/claude-console/scripts/activity-hook.sh\" ] || bash \"$HOME/.claude/claude-console/scripts/activity-hook.sh\" waiting" }] }],
    "Stop":              [{ "hooks": [{ "type": "command", "command": "[ ! -f \"$HOME/.claude/claude-console/scripts/activity-hook.sh\" ] || bash \"$HOME/.claude/claude-console/scripts/activity-hook.sh\" done" }] }],
    "PermissionRequest": [{ "hooks": [{ "type": "command", "command": "[ ! -f \"$HOME/.claude/claude-console/scripts/activity-hook.sh\" ] || bash \"$HOME/.claude/claude-console/scripts/activity-hook.sh\" permission" }] }]
  }
}

The status-line handler captures session state for the plugin and prints no visible status line. State lives under a private /tmp/claude-console/ directory, owner-only (0700 directories, 0600 files).

Turn it off

Hold a live key (a long press). macOS: choose Turn off in the dialog (the other button is Keep). Windows: hold it again within 15 seconds. Without the keypad, run bash ~/.claude/claude-console/scripts/uninstall.sh --unwire on macOS.

Either removes only the plugin's entries and leaves a marker file, ~/.claude/claude-console/no-autowire, so the keys read Off rather than Set up. Pressing a live key turns it back on.

What each key needs

  • Activity and the approval badge come entirely from the hooks. Without them Activity reads Ready and never changes, and Yes and No have no approval to see.
  • Cost, Model and Context need only the status line. Context turns amber at 75% and red at 90%, so you can compact before an automatic compaction.

Sessions

Run Claude in more than one Terminal tab and each session gets its own key: the project folder name on a black face and a state bar along the bottom. Thinking while it works, Waiting when it has stopped for you, Allow? when a permission prompt is up, Complete when the turn is done. Press a session key to jump to that tab.

Pressing a session key also pins every other key to it. You can approve a prompt in session 2 while looking at session 1, or while reading a browser. The pinned session's bar is highlighted; the others are grey. The pin holds until you press another session key, press the same key again to release it, or that session exits. Switching Terminal tabs does not move it.

  • With only one session running nothing changes. If you have not pinned anything and exactly one session is waiting on you, that is the one that gets your Yes. When it is genuinely ambiguous the plugin does not guess; it beeps instead of answering the wrong Claude.
  • A pin aims the keys; it does not freeze the readouts. On macOS, Cost, Model and Context show the session in the tab you are looking at, while Yes, No, Tab and the typing keys act on the pinned one. On Windows both follow the pin, because Windows Terminal cannot report which tab is in front.
  • Slots are stable. A session keeps its key for as long as it lives, and the freed key is reused by the next session you start. Six sessions get keys; the shipped layout shows three.
  • A new session takes a key immediately, labelled Claude Code until it reports its project. A closed tab clears within about two seconds.

Yes, No and the approval badge

When Claude asks for permission, answer from the keypad. Yes confirms the highlighted option; No dismisses it without running the tool. They act only when the plugin can see a pending approval. With nothing to approve they beep and do nothing rather than guess, because typing at a hidden menu is how the wrong thing gets approved. For plain-text questions, type into the session. Up, Down and Return walk any selection menu.

Both answer keys carry a small filled dot when an answer is pending, and the session's own key reads Allow?.

BadgesMeaningWhat to do
NoneNothing is waiting for an answer.
Amber on Yes and NoWaiting on you, and approving is routine: reading a file, running a test, an edit.Press Yes or No.
Red on Yes, amber on NoYes would run something destructive or outward-facing. No would reject it.Look before pressing Yes, or press No.

Red is triggered by the pending command matching patterns such as sudo, rm -rf, git push, git reset --hard, --force, drop table, kubectl delete, terraform apply, npm publish and piping a download into a shell. It is a hint, not a gate: Claude Code's own prompt still holds the command, and the classifier leans toward warning unnecessarily. The badge describes the session the answer keys are pinned to, and clears the moment the session stops waiting or you answer from the keypad.

With live status off, Yes and No read Set up or Off, and a press posts a card in Options+ explaining which key turns it on. See Live status.

Voice

Everything is transcribed on your machine by whisper.cpp. No audio leaves it.

  • Dictate. Press (you hear a Tink on macOS), say your prompt, press again. The text is typed into Claude's Terminal tab and sent.
  • Voice Draft. Same flow, but the transcript is only typed, not sent. It sits in Claude's input box so you can fix a mis-hearing, then submit with Return. Use Dictate for quick prompts, Voice Draft for anything long.
  • Go to Project. Press, say a project name, press again. Opens a new tab in that project running claude. It looks in every project a session is already open in, plus every git repository within three levels of your home folder. To point it elsewhere, list the folders that contain your projects in ~/.claude/claude-console/project-roots, one per line.

Each voice key starts and stops its own recording. Pressing a different voice key while one is recording stops it, and the transcript still goes where the first key intended. While a transcript is being produced, a further press is ignored with a beep.

First use

The first press installs the voice helper, asks for Microphone access, and downloads the base.en speech model once, about 142 MB. That download is the only network request the plugin ever makes, and the file is verified against a known checksum before use. To skip it, place ggml-base.en.bin at ~/.claude/claude-console/whisper/ beforehand.

When it fails, the key says so

  • Mic denied. The helper was refused the microphone. On macOS allow ClaudeVoiceHelper under System Settings → Privacy & Security → Microphone, or reset and re-grant on the next press: tccutil reset Microphone com.rshankar.claudeconsole.voicehelper.
  • No speech. It recorded but heard nothing usable.
  • Model loading. The speech model is still downloading. Try again shortly.

Windows notes

The Windows build reaches Claude a different way than macOS does. A few differences are worth knowing before you install.

  • Import the Windows layout. The file is ClaudeConsole-Windows.lp5, because a profile is bound to an application and here that is Windows Terminal.
  • Typing cannot land in the wrong app. Windows writes key events straight to the target session's console handle, which has no relationship to the focused window. A keypress reaches the intended Claude session or nothing at all.
  • Windows Terminal is required for tab and window navigation, session focus, Go to Project and Screenshot. When no Windows Terminal window is open those keys beep and post a Windows Terminal required card in Options+ instead of doing something unrelated. New Claude (Window) still works, because its job is to open that first window. Running Claude in a classic Command Prompt or PowerShell console? Set Settings → System → For developers → Terminal to Windows Terminal and start a new session.
  • Pin a session first. Windows Terminal cannot say which tab is in front, so with several idle sessions open the plugin cannot tell which one you are looking at. Press a session key to pin it; every key then goes to that session until you pin another or release it. One session needs no pin, and neither does "exactly one session is waiting".
  • Run Claude unelevated. Options+ runs unelevated and Windows blocks the console attach across integrity levels, so an elevated session cannot be controlled.
  • Voice works on Windows. The package carries a Windows whisper bundle; the model downloads on first use as on macOS.
  • Not available on Windows: Next Window and Prev Window (they log and do nothing), and the on-screen Turn on / Turn off dialog for live status (the second press within 15 seconds is the switch). Go to Project always opens a fresh tab, because Windows Terminal offers no way to tell a busy tab from an idle one.
  • Before uninstalling, turn live status off (hold a live key, then hold again). The cleanup script that does this on macOS is not installed on Windows, and an Options+ uninstall leaves the hooks in your Claude Code settings. See Uninstall.

Key map

GroupKeys
SessionsSession 1 to 6. One key per running Claude session: project name and state bar. Press to focus it and pin the other keys to it.
CoreModel, Cost, Activity, Context (live, once live status is on) · Screenshot · Esc · Mode · Tab · Compact · Clear · Exit
AnswerYes · No · Up · Down · Return
PromptsFix Bug · Write Tests · Explore · Explain · Refactor · Review · Optimize · Security · Document · Deploy
GitCommit · Diff · Push · Create PR · Status · Log
ScrollScroll Up · Scroll Down
TerminalTerminal · New Tab · New Claude · Next Tab · Prev Tab · New Claude (Window) · Next Window · Prev Window · Go to Project (voice)
UniversalDictate · Voice Draft
  • Tab completes Claude Code's highlighted suggestion and submits it in one press. To complete without sending, use Up, Down and Return.
  • Mode sends Shift+Tab, which cycles Claude Code's input modes: normal, auto-accept edits, plan.
  • Screenshot captures a region with the system's own picker and types the file path into the current conversation without pressing Return, so you add your question and send.
  • Scroll Up and Scroll Down page through the transcript.

Customising the prompt keys

Each Prompts key shows a one-word label but sends a full, structured prompt. All of them are defined in ~/.claude/claude-console/prompts.json, seeded with the defaults on first run. Reword a prompt, relabel a key, delete keys you never press, or add your own; each entry becomes its own bindable key. Set "submit": false on an entry to make a draft key that types the prompt without pressing Return. Reload the plugin to pick up edits. Once you change the file, no update overwrites it; delete it to restore the defaults.

Troubleshooting

The plugin log answers most questions. Attach it when you report a problem.

  • macOS~/Library/Application Support/Logi/LogiPluginService/Logs/plugin_logs/ClaudeConsole.log
  • Windows%LOCALAPPDATA%\Logi\LogiPluginService\Logs\plugin_logs\ClaudeConsole.log
SymptomCause and fix
Nothing appears on the keypad after installing. Expected. The plugin is universal and ships no layout. Import the layout. If Claude Console Actions is missing from the Options+ action panel, the plugin did not load; check the log.
The Cost, Context, Activity or session keys say Set up. Live status is off. Press a live key and confirm. See Live status.
Yes and No read Off, or beep and do nothing. Either live status is off, or the session is not at a permission menu (a plain-text question or an idle prompt). Type into the session for those. The refusal is deliberate.
The session keys are stuck: one session ever shows, the bar never changes, the badge never lights, but presses still work. A key opened in the Options+ icon editor was frozen into a snapshot. Delete the profile and re-import it, or restore live rendering with the plugin's unfreeze-keys.sh script. Avoid restyling the live keys; the static keys are safe to customise.
Windows: session or navigation keys beep, or Options+ says Windows Terminal required. Open Windows Terminal and run Claude Code in it. Set the default terminal to Windows Terminal for classic consoles. Run Claude unelevated. See Windows notes.
Voice: the key says Mic denied, No speech or Model loading. See Voice. Grant or reset the microphone permission, speak audibly, or wait for the model download.
Screenshot captures nothing. On macOS the Screen Recording grant for the Logi Plugin Service was refused. Allow it under System Settings → Privacy & Security → Screen Recording. On Windows the key needs a Windows Terminal session.
The log says Cannot load plugin … already loaded at service start. On its own this is benign: the service loads every sideloaded plugin twice at startup and refuses the duplicate. It only signals a problem alongside a development link on a build machine.
Keys show an exclamation mark or plain text, or the plugin vanishes after a reinstall. Both belong to versions before 2.2.0. Update.

Uninstall

Options+ removes the plugin and nothing else, on macOS as on Windows. A complete uninstall is three steps, in this order.

  1. Turn live status off. Hold a live key and choose Turn off (on Windows, hold again within 15 seconds). This removes the plugin's entries from your Claude Code settings while the plugin is still there to do it.
  2. Uninstall in Options+. Right-click the Claude Console plugin and choose Uninstall, then delete the imported Claude Console — Keypad profile.
  3. Remove the rest.
    macOS

    The plugin leaves a cleanup script outside its own package so it survives step 2:

    bash ~/.claude/claude-console/scripts/uninstall.sh            # confirm, then remove
    bash ~/.claude/claude-console/scripts/uninstall.sh --dry-run  # preview only

    It removes the status line and hook entries from ~/.claude/settings.json surgically (your own entries stay, a chained status line is put back), then ~/.claude/claude-console/ with the voice helper, the speech model and your prompts.json, the /tmp/claude-console state files, and the Microphone grant. It prints its targets and asks before deleting.

    Windows

    There is no cleanup script yet. If you turned live status off in step 1, only the plugin's folder under your home directory's .claude\claude-console remains; delete it. If you uninstalled without step 1, the leftover entries do nothing and raise no error, because each checks that its helper still exists. To remove them by hand, open %USERPROFILE%\.claude\settings.json and delete the statusLine entry and the five hook entries that name claude-console-hook.exe.

Do not restore settings.json.claude-console.bak by hand to undo the plugin. It is a rolling backup of the state one change ago, not a pre-install snapshot.

What's new

2.2.1

  • Yes and No say when they cannot work. With live status off they read Off, and a press explains how to turn it on instead of beeping.
  • A No press clears the pending cue at once. Both answer keys now show it, and Yes turns red for a risky request.
  • The bundled voice helper now replaces an older copy on macOS.
  • Leftover hooks stay silent. If you uninstall without turning live status off, the entries left in your Claude Code settings no longer error on every turn.
  • Windows: hook processes end themselves after 8 seconds and are capped, so they can no longer pile up and block an uninstall.
  • No warnings on load; the shipped symbols carry no build paths.

Keypad layouts are unchanged from 2.2.0.

2.2.0

  • Now a universal plugin: it binds to no application. Import the keypad layout once onto your Terminal profile, or drag the actions where you want them.
  • Live status is opt-in. The plugin no longer edits your Claude Code settings on its own.
  • The No key now rejects. Yes confirms the permission prompt, No dismisses it, and neither acts when there is nothing to approve.
  • Typing works on every keyboard layout, including AZERTY and QWERTZ.
  • Voice works on Windows, and a failed dictation says why on the key.

Free · Privacy · EULA · Report a problem