Ready-made profiles
Download an .lp5 and import it in Logi Options+. Every profile targets
the built-in System plugin, so it imports on any machine without needing the
matching application to be installed first.
Build your own
Pick a device, click a control, give it a label and a keystroke. On the dialpad the two dials are editable too — each takes a separate action for turning anticlockwise, turning clockwise, and pressing. Any action can be a keystroke, a string of typed text, or several of them in sequence. The file is assembled in your browser — nothing is uploaded anywhere.
The attention key
The thing a profile alone cannot do is tell you that Claude is waiting.
A .lp5 is static configuration — it maps a key to a keystroke and
nothing more. To make a key light up when Claude needs you, something has to be
running that can push a new image to the device.
How the pieces fit
Claude Code hooks write a small state file; a Logi Actions SDK plugin polls that file and redraws the key when the state changes.
Claude Code hook ──writes──▶ ~/.claude/mx-console/state.json
│
polled 4x/second
▼
Claude Console plugin (C#)
│
ActionImageChanged()
▼
key repaints / flashes
The state file looks like this:
{"state": "needs_input",
"cwd": "/Users/you/project", "title": "project",
"app": "iTerm", "bundle_id": "com.googlecode.iterm2",
"reason": "permission_prompt", "ts": 1769600000}
dotnet build. See claude/plugin/README.md in the repository.
Without the plugin
The hooks are still useful on their own. claude/scripts/focus-claude.sh brings
the terminal running your Claude session to the front, and you can bind it to a key
in Logi Options+ as a Smart Action, or to a system-wide shortcut.
Installing
1. Import a profile
In Logi Options+, choose your MX Creative Console, open the profile menu and pick Import. Keypad profiles and dialpad profiles are separate files — import both if you want the full layout.
2. Install the hooks (optional)
Only needed if you want the attention key or the focus script.
git clone https://github.com/dr-richard-barker/mx-creative-console.git
cd mx-creative-console
./claude/hooks/install.sh
This merges into your existing ~/.claude/settings.json rather than replacing it,
keeps a timestamped backup, and can be undone with ./claude/hooks/install.sh --uninstall.
3. Rebuild the profiles yourself (optional)
python3 tools/lp5kit/build_profiles.py # regenerate every .lp5
python3 tools/lp5kit/verify.py --all # structural self-check
How it works
A .lp5 is a ZIP archive of Newtonsoft.Json-serialised .NET objects. The format
was worked out by unpacking the profiles Logi Options+ exports and matching their
structure exactly — there is no published schema.
Keystroke encoding
Each keystroke is one string with four ___-separated sections:
ControlOrCommand+KeyN___2057___Cmd+N___mac-45#¤%&+?1048584#¤%&+?n#¤%&+?com.apple.keylayout.British
└──── logical ────┘ └LCID┘ └label┘ └─ keycode ─┘└── modifier mask ──┘└char┘└─ input source ─┘
| Section | Meaning |
|---|---|
| logical | Modifiers in the order ControlOrCommand, Control, AltOrOption, Shift, then the key name. |
| LCID | Keyboard locale. 2057 is English (UK), 1033 English (US). |
| label | What Options+ shows in its UI. Uses a different modifier order: Cmd, Opt, Ctrl, Shift. |
| keycode | macOS virtual keycode. The whole mac-… tail is absent in profiles authored on Windows. |
| modifier mask | CGEvent flags OR'd with the left-hand device bits. Arrows also carry 0xA00000, function keys 0x800000. |
Verified against real exports
The encoder reproduces strings from the profiles Options+ itself wrote, byte for
byte, and tools/lp5kit/verify.py passes on all 21 profiles in the repository —
both the generated ones and the originals. That shared pass is the main evidence
the generator is producing genuinely valid files.
What that does not prove is that every key fires the right keystroke once pressed — importing shows the file deserialises, not that each encoding lands correctly on the host. Since the encodings are byte-identical to ones Options+ wrote itself, that is a far weaker assumption. If a key misbehaves, please open an issue saying which one.