macOS 15+

See your keyboard's
active L0 L1 L2 L3 layer.

A native macOS overlay that mirrors the live layer state of your QMK or Vial keyboard. Pin it on screen, watch it flash on every layer change, theme it like the rest of your battlestation. Free, open source, signed and notarised.

Free & open source GPL-3.0 Universal DMG

L0

Built for people
who care about keys.

LayerLens runs in your menu bar, sees every layer your keyboard broadcasts, and surfaces it in a panel that's actually pleasant to look at. No daemon to babysit, no Electron.

L1 — overlay

The active layer, on screen.

A non-activating panel that floats above your work, fades in on every layer transition, and gets out of your way. Pin it for a live view; let it flash if you only need a glance. Per-board theming, custom labels, your choice of font.

Main floating overlay showing all keys of a Kyria split keyboard
L2 — config

One Configure window per keyboard.

Rename labels, browse layers, set the layout source, see live stats — protocol version, layer count, whether the firmware module is responding. Plug a different board in and the window re-shapes itself to match.

The per-keyboard Configure window showing the keymap, layer picker, and status row
L3 — themes

Pick a palette. Or build your own.

All the programmer favourites — Dracula, Tokyo Night, Solarized, Nord, Monokai, Gruvbox, One Dark — built in. Each colour role (regular, modifier, layer, special, label) is independently editable, with a live preview that paints onto your wallpaper while you fiddle.

R0

What you'll need.

LayerLens reads layer events directly from your firmware over Raw HID. Both ends need to be on board.

Your Mac
  • Apple Silicon or Intel
  • macOS 15 Sequoia or later
  • ≈ 14 MB on disk
Your keyboard
  • QMK or Vial firmware
  • layerlens_notify module flashed — required for live layer events
  • USB or wireless connection with Raw HID exposed
F0

Live layer events?
Flash a tiny module.

VIA's protocol exposes the keymap, but doesn't expose live layer changes. layerlens_notify is a 60-line QMK module that fixes that. Two pure functions, you wire them in.

VIA

Talks to any QMK board with the standard 0xFF60 / 0x61 Raw HID interface.

Vial

Auto-fetches the layout from the firmware on protocol v9 boards.

QMK

Plain QMK works too. Drop in the firmware module for live layer events.

01

Drop the module in.

Copy firmware/layerlens_notify/ from the repo to your QMK userspace. Add it to your keymap:

keymap.json
{
  "modules": ["fireball1725/layerlens_notify"]
}
02

Wire the layer-state recorder.

Chain it from your layer_state_set_user:

keymap.c
layer_state_t layer_state_set_user(layer_state_t state) {
    return layer_state_set_layerlens_notify(state);
}
03

Wire the receiver.

One snippet, pick what matches your firmware:

keymap.c — VIA or Vial
bool via_command_kb(uint8_t *data, uint8_t length) {
    return layerlens_notify_handle_command(data, length);
}
keymap.c — plain QMK
void raw_hid_receive(uint8_t *data, uint8_t length) {
    if (layerlens_notify_handle_command(data, length)) return;
}
04

Build and flash.

That's it. Open LayerLens; the Configure window's Live stat flips to Yes and the overlay starts flashing on every layer change.

Read the wire-format spec ↗