What changed in Karabiner-Elements from 15 to 16
3 releases numbered after v15.9.0 up to and including v16.2.0, stable releases only. v15.9.0 and v16.2.0 are the newest stable releases of 15 and 16 we track; this page follows them as new ones ship.
- 1 mentions breaking changes
- 1 removes or deprecates something
48 changes across 3 releases
Added 29
- Add the `Swap ISO layout-specific keys` configuration to Device tab
- Add filtering functionality to the Complex Modifications list
- Add support for buttons 6–8 on the ELECOM HUGE PLUS and DEFT trackballs
- Add appearance settings for the notification window
- Add `Capture Raw Input Events` and `Capture Raw Input Records` to EventViewer
- Add `--set-variables-from-stdin` option to karabiner_cli
- Add the `duration_milliseconds` option to `set_notification_message`
- Add the `Modify events for pointing devices by default` setting to Expert tab
- Add support for unbundled GUI apps in `frontmost_application_if` and `frontmost_application_unless`
- Add support for `notes` in complex modification rules
- Add support for accessibility.focused_ui_element.window_title_string variable in `variable_if`
- Add the event timestamp in EventViewer
- Add filtering functionality to the log viewer
- Support consumer_key_code::ac_keyboard_layout_select
- Support consumer_key_code::ac_desktop_show_all_windows
- Support consumer_key_code::ac_soft_key_left
- Support consumer_key_code::ac_desktop_show_all_applications
- frontmost_application_if can now detect overlay windows such as Spotlight using the Accessibility API
- variable_if now supports accessibility.focused_ui_element.role_string, accessibility.focused_ui_element.subrole_string, accessibility.focused_ui_element.title_string, accessibility.focused_ui_element.window_position_x, accessibility.focused_ui_element.window_position_y, accessibility.focused_ui_element.window_size_height, and accessibility.focused_ui_element.window_size_width
- Generate JSON for Complex Modifications rules by writing JavaScript
- Add your own rule using JavaScript button in the complex modifications viewer
- Open in external editor button in the complex modifications editor
- Clear user variables button in EventViewer
- to.to_if_other_key_pressed for implementing conditional key presses based on other keys being pressed
- to.send_user_command for executing actions via an external server built with Karabiner-Elements-user-command-receiver
- to.from_event allowing pressed events to be passed through as-is
- relative_to and fallback_to options for software_function.set_mouse_cursor_position
- Enable CGEventTap fallback setting in Expert tab for receiving events via CGEventTap when IOHIDDeviceOpen fails
- Setup tab in Settings
Changed 8
- Integrate the Multitouch Extension menu into the Karabiner-Elements menu
- Complex Modifications import now supports JavaScript files and single-rule JSON files
- Improve the handling of macOS sleep shortcuts to prevent key-up events from immediately waking the Mac
- Consolidate the `karabiner_console_user_server`, Menu, and NotificationWindow components into a single app named Karabiner-Console-User-Server
- Replace the IPC backend with pqrs::unix_domain_stream to improve internal communication between Karabiner-Elements processes
- Change update checks to run periodically, not only at startup
- Call exit instead of abort to suppress crash reports when a fatal error prevents CFRunLoop from running in background processes
- Request only Accessibility permission instead of both Accessibility and Input Monitoring permissions when Accessibility permission makes Input Monitoring permission unnecessary
Fixed 10
- Fix CGEventTap leaks
- Fix an issue where the core service agent could rarely abort during termination
- Fix an issue where modifications could stop working for several seconds after waking from sleep on macOS
- Close Karabiner-EventViewer and the Settings window after an upgrade
- Fix ac_zoom_in and ac_zoom_out key codes being swapped
- Fix an issue where the settings window could open at login when the system default configuration used an old format
- Fix typo in ComplexModificationsView
- Fixed an issue where modifier keys could remain stuck when physical keyboard events were missed during capture
- Fixed an issue where reordering in Complex Modifications and Profiles did not work properly when dragging while scrolling
- Fixed an issue where variables in expressions were not properly initialized when unset
Removed 1
- Remove the karabiner_session_monitor process
Original release notes, newest first
The list above is our reading of these notes; the originals from pqrs.org are here, one fold per release.
v16.2.0
- 📦 Download
- 📅 Release date
- Aug 30, 2026
- 🔔 Important Notes
- When upgrading from v15.9.0 or earlier, automatic startup of the Karabiner-Elements services will be disabled. After upgrading, open Karabiner-Elements.app to re-enable automatic startup.
- 💥 Breaking changes
- Integrated the Multitouch Extension menu into the Karabiner-Elements menu. Open the Multitouch Extension settings from the Karabiner-Elements menu.
- ✨ New Features
- Added the
Swap ISO layout-specific keysconfiguration to Device tab. - Added filtering functionality to the Complex Modifications list.
- Added support for buttons 6–8 on the ELECOM HUGE PLUS and DEFT trackballs. (Thanks to @z11i)
- Added appearance settings for the notification window. (Thanks to @xianjianlf2)
- Added
Capture Raw Input EventsandCapture Raw Input Recordsto EventViewer. - Added
--set-variables-from-stdinoption to karabiner_cli. - Added the
duration_millisecondsoption toset_notification_message. (Thanks to @xianjianlf2) - Added the
Modify events for pointing devices by defaultsetting to Expert tab. (Thanks to @xianjianlf2)
- Added the
- 🐛 Bug Fixes
- Fixed CGEventTap leaks (Thanks to @MrMage and @VitalyShein)
- ⚡️ Improvements
- Complex Modifications import now supports JavaScript files and single-rule JSON files.
- Improved the handling of macOS sleep shortcuts to prevent key-up events from immediately waking the Mac.
- Fixed an issue where the core service agent could rarely abort during termination.
- Fixed an issue where modifications could stop working for several seconds after waking from sleep on macOS.
- Karabiner-EventViewer and the Settings window are now closed after an upgrade.
- Added support for unbundled GUI apps in
frontmost_application_ifandfrontmost_application_unless. - Added support for
notesin complex modification rules. variable_ifnow supports the following variable:- accessibility.focused_ui_element.window_title_string
- Added the event timestamp in EventViewer.
- The
karabiner_console_user_server, Menu, and NotificationWindow components have been consolidated into a single app named Karabiner-Console-User-Server. - Refactored the C++ and Swift code for the Settings, EventViewer, and MultitouchExtension apps.
v16.1.0
- 📦 Download
- 📅 Release date
- Jul 5, 2026
- ✨ New Features
- Added filtering functionality to the log viewer.
- 🐛 Bug Fixes
- Fixed the ac_zoom_in and ac_zoom_out key codes being swapped.
- Fixed an issue where the settings window could open at login when the system default configuration used an old format.
- ⚡️ Improvements
- Improved internal communication between Karabiner-Elements processes by replacing the IPC backend with
pqrs::unix_domain_stream. - Changed update checks to run periodically, not only at startup.
- Supported the following keys:
- consumer_key_code::ac_keyboard_layout_select (Thanks to @PedroSebastiao)
- consumer_key_code::ac_desktop_show_all_windows (Thanks to @omor1)
- consumer_key_code::ac_soft_key_left
- consumer_key_code::ac_desktop_show_all_applications
- Fix typo in ComplexModificationsView (Thanks to @kiangkuang)
- The
karabiner_session_monitorprocess has been removed.
- Improved internal communication between Karabiner-Elements processes by replacing the IPC backend with
v16.0.0
- 📦 Download
- 📅 Release date
- May 3, 2026
- 🔔 Important Notes
- Karabiner-Core-Service now requires Accessibility permission. Please enable it in System Settings.
- ✨ New Features
frontmost_application_ifcan now detect overlay windows, such as Spotlight, using the Accessibility API.variable_ifnow supports the following variables, making it possible to change behavior depending on whether the focused element is a text area.- accessibility.focused_ui_element.role_string
- accessibility.focused_ui_element.subrole_string
- accessibility.focused_ui_element.title_string
- accessibility.focused_ui_element.window_position_x
- accessibility.focused_ui_element.window_position_y
- accessibility.focused_ui_element.window_size_height
- accessibility.focused_ui_element.window_size_width
- You can now generate JSON for Complex Modifications rules by writing JavaScript.
- Added an "Add your own rule using JavaScript" button to the complex modifications viewer.
- Added an "Open in external editor" button to the complex modifications editor.
- Added a "Clear user variables" button to EventViewer. (Thanks to @BarakXYZ)
- Added
to.to_if_other_key_pressed. It's now possible to implement "Change option+tab to command+tab" in a more natural way and reliable way. - Added
to.send_user_command. By using it together with an external server built with Karabiner-Elements-user-command-receiver, you can execute any action from Karabiner-Elements with low latency. (Thanks to @nikivdev) - Added
to.from_event, allowing pressed events to be passed through as-is. - Added
relative_toandfallback_totosoftware_function.set_mouse_cursor_position. - Added
Enable CGEventTap fallbacksetting to Expert tab. Enable receiving events via CGEventTap for keyboards where IOHIDDeviceOpen fails for some reason. - Added Setup tab to Settings.
- 🐛 Bug Fixes
- Fixed an issue where modifier keys could remain stuck when physical keyboard events were missed during capture.
- Fixed an issue where reordering in Complex Modifications and Profiles didn't work properly when dragging while scrolling.
- Fixed an issue where variables in expressions were not properly initialized when unset.
- ⚡️ Improvements
- Changed to call
exitinstead ofabortto suppress crash reports when a fatal error prevents CFRunLoop from running in background processes. - If Accessibility permission makes Input Monitoring permission unnecessary, only Accessibility permission will be requested.
- Changed to call