Frequently Asked Questions

Likely cause, next action, and a link to the detailed guide when recovery needs more than a short answer.

macOS · Desktop app

Why are key presses not highlighted on macOS?

Keyboard Helper needs Input Monitoring to observe keys globally; Accessibility alone is not enough. Quit the app, remove stale Keyboard Layout or Keyboard Helper entries in System Settings > Privacy & Security > Input Monitoring, add the current app from /Applications, enable it, and restart.

macOS · Desktop app

Why does macOS block the downloaded app?

The preview builds are ad-hoc-signed and unnotarized. Open the app once, then use System Settings > Privacy & Security > Open Anyway. Follow the complete first-launch flow.

Desktop app

Where did the window go after I closed it?

Closing the overlay hides it to the system tray instead of quitting. Restore it from the tray menu, use the configured show/hide hotkey, or launch the executable with --toggle.

Desktop app

How do I select a different layout or use my own?

Open Settings, enable the layouts you want, and use Add layout file... for an external JSON definition. See desktop layout configuration for examples.

Desktop app · BLE-dependent

Why is BLE layer sync not connecting?

The active layout needs valid bleLayerSource metadata and the desktop app needs Bluetooth access. Wake the keyboard, verify the UUIDs and permission, then choose Connection > Reconnect BLE. See BLE layer-sync setup.

Android preview

Why does Android reject the APK update?

The likely cause is a signer mismatch between a local debug build and the signed preview. Uninstall the debug app once, then install the verified release; private imports and permission state may reset. Follow Android installation and signature recovery.

Android preview · BLE-dependent

Why is my keyboard missing from the companion?

Nearby devices permission, Android pairing, or an available ZMK Bluetooth profile is probably missing. Grant permission, pair in system Settings, wake the keyboard, and retry. For PIN, security, capacity, and reconnect branches, use Android troubleshooting.

Android preview · Enhanced firmware

Why does Live say it is waiting or unsupported?

Stock firmware does not provide Live telemetry. With compatible enhanced firmware, press a key or change a physical layer and reconnect if waiting persists; select a matching layout after a mismatch. Live is read-only and never changes the remote layer. See the Live contract.

Android preview

Why was my custom layout rejected or reset?

The JSON or one of its embedded images failed validation, or a stored record became unavailable. Check the document version and resource limits; the companion keeps the current catalog on rejection and repairs invalid selection to the bundled default. See custom-layout format, storage, replacement, and recovery.

macOS · BLE-dependent

Why is the Language flyout missing or disabled?

This feature is macOS-only and requires valid inputSourceSync.macos metadata, installed input-source IDs, and a compatible writable BLE layer characteristic. An unavailable source is disabled instead of guessed. See macOS language-sync setup.

Desktop app

How do I get out of Mini Mode?

Use the Restore full size arrow in the mini overlay. Mini Mode is temporary, so a fresh launch starts in full mode.

Desktop app · Diagnostic limit

What can Keyboard Self-test verify?

Self-test verifies configured HID output for one layout layer in the global event stream. It cannot identify the physical keyboard, activate firmware layers, or diagnose raw matrix wiring, combos, macros, or hold-tap timing.

Desktop app · Practice mode

Why does Shift-Space Invaders ignore some keys?

The game uses focused window input and accepts plain English letters. It intentionally ignores modifiers, repeats, composition input, releases, and unsupported printable characters; global overlay highlighting may continue independently.

Desktop + Android

Does Keyboard Helper work only with split keyboards?

No. Bundled layouts include standard and ergonomic keyboards. Desktop can load an external JSON file; Android can copy a validated compatible JSON definition into private app storage. The two products do not synchronize layouts through desktop or cloud services.