tag:github.com,2008:https://github.com/houmain/keymapper/releases Release notes from keymapper 2026-03-07T08:57:43Z tag:github.com,2008:Repository/177397013/5.4.1 2026-03-07T09:01:12Z 5.4.1 <h3>Changed</h3> <ul> <li>On Windows the mouse is now also only hooked when it has mappings. One can add <code>@grab-device mouse</code> to further hook it unconditionally (<a href="https://github.com/houmain/keymapper/issues/344" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/344/hovercard">#344</a>).</li> <li>On Windows the devices are unhooked when the active context only contains <code>Any &gt;&gt; Any</code> (<a href="https://github.com/houmain/keymapper/issues/351" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/351/hovercard">#351</a>).</li> <li><code>keymapper-launchd</code> also installs the <code>Karabiner-DriverKit-VirtualHIDDevice</code> daemon (<a href="https://github.com/houmain/keymapper/issues/298" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/298/hovercard">#298</a>).</li> <li>Updated <code>Karabiner-DriverKit-VirtualHIDDevice</code> to version 6.10.0.</li> </ul> <h3>Fixed</h3> <ul> <li>Fixed expression <code>Any</code> to match all inputs (<a href="https://github.com/houmain/keymapper/issues/351" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/351/hovercard">#351</a>).</li> <li>Fixed string comparison blocks with empty strings (<a href="https://github.com/houmain/keymapper/issues/334" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/334/hovercard">#334</a>).</li> </ul> houmain tag:github.com,2008:Repository/177397013/5.4.0 2026-03-01T09:38:53Z 5.4.0 <h3>Added</h3> <ul> <li> <p>Added FreeBSD support (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2819930378" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/222" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/222/hovercard" href="https://github.com/houmain/keymapper/issues/222">#222</a>).</p> </li> <li> <p>Allow <code>keymapperctl</code> to press/release non-virtual keys (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="9534718" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/discussions/348" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/348/hovercard" href="https://github.com/houmain/keymapper/discussions/348">#348</a>).</p> </li> <li> <p>Added <code>getenv</code> builtin macro and string comparison blocks (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3787889069" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/334" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/334/hovercard" href="https://github.com/houmain/keymapper/issues/334">#334</a>). .e.g.:</p> <div class="highlight highlight-source-ini notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="# activate context when environment variable has some specific value [getenv[&quot;HOSTNAME&quot;] = &quot;LaptopMum&quot;]"><pre><span class="pl-c"><span class="pl-c">#</span> activate context when environment variable has some specific value</span> <span class="pl-en">[getenv["HOSTNAME"]</span> = <span class="pl-s"><span class="pl-pds">"</span>LaptopMum<span class="pl-pds">"</span></span>]</pre></div> </li> <li> <p>Added window title change detection to KWin script (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4000618874" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/349" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/349/hovercard" href="https://github.com/houmain/keymapper/issues/349">#349</a>).</p> </li> <li> <p>Improved version mismatch error dialog on Windows.</p> </li> </ul> houmain tag:github.com,2008:Repository/177397013/5.3.2 2026-02-07T10:22:25Z 5.3.2 <h3>Changed</h3> <ul> <li>Showing path in "Opening configuration file failed" error (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3749844974" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/326" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/326/hovercard" href="https://github.com/houmain/keymapper/issues/326">#326</a>).</li> </ul> <h3>Fixed</h3> <ul> <li>Fixed concurrent output on release (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3850594976" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/341" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/341/hovercard" href="https://github.com/houmain/keymapper/issues/341">#341</a>).</li> <li>Fixed empty strings in context filters (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3760029993" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/329" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/329/hovercard" href="https://github.com/houmain/keymapper/issues/329">#329</a>).</li> <li>Added missing dependency to DEB package.</li> <li>Bundling documentation (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3788187860" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/336" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/336/hovercard" href="https://github.com/houmain/keymapper/issues/336">#336</a>).</li> </ul> houmain tag:github.com,2008:Repository/177397013/5.3.1 2025-12-04T19:20:52Z 5.3.1 <h3>Fixed</h3> <ul> <li>Fixed <code>ContextActive</code> for contexts with device filter (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3690794979" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/319" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/319/hovercard" href="https://github.com/houmain/keymapper/issues/319">#319</a>).</li> <li>Fixed <code>keymapperctl --next-key-info</code> (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3653599918" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/314" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/314/hovercard" href="https://github.com/houmain/keymapper/issues/314">#314</a>).</li> <li>Fixed disabling notifications (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3653599918" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/314" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/314/hovercard" href="https://github.com/houmain/keymapper/issues/314">#314</a>).</li> </ul> houmain tag:github.com,2008:Repository/177397013/5.3.0 2025-11-21T19:33:02Z 5.3.0 <h3>Added</h3> <ul> <li>Added <code>keymapperctl --print "string"</code> (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="9090907" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/discussions/312" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/312/hovercard" href="https://github.com/houmain/keymapper/discussions/312">#312</a>).</li> <li>Allow to pass key <code>Any</code> to <code>keymapperctl --wait-toggled</code> (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="9090907" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/discussions/312" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/312/hovercard" href="https://github.com/houmain/keymapper/discussions/312">#312</a>).</li> </ul> <h3>Fixed</h3> <ul> <li>Retry initializing Winsock when network subsystem is not ready yet (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3580525294" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/313" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/313/hovercard" href="https://github.com/houmain/keymapper/issues/313">#313</a>).</li> <li>Fixed path separator in <code>keymapper-launchd</code> (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3437603494" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/298" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/298/hovercard" href="https://github.com/houmain/keymapper/issues/298">#298</a>).</li> </ul> houmain tag:github.com,2008:Repository/177397013/5.2.0 2025-10-25T08:31:54Z 5.2.0 <h3>Added</h3> <ul> <li> <p>Added directive <code>@virtual-keys-toggle</code>, which allows to change the behavior of virtual keys in outputs (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3530374184" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/309" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/309/hovercard" href="https://github.com/houmain/keymapper/issues/309">#309</a>). e.g.</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="@virtual-keys-toggle true # true is (still) the default # toggle Virtual1 F1 &gt;&gt; Virtual1"><pre>@virtual-keys-toggle <span class="pl-c1">true</span> <span class="pl-c"><span class="pl-c">#</span> true is (still) the default</span> <span class="pl-c"><span class="pl-c">#</span> toggle Virtual1</span> F1 <span class="pl-k">&gt;&gt;</span> Virtual1</pre></div> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="@virtual-keys-toggle false # press Virtual1 F1 &gt;&gt; Virtual1 # release Virtual1 F2 &gt;&gt; !Virtual1 # toggle Virtual1 Virtual1{F3} &gt;&gt; !Virtual1 F3 &gt;&gt; Virtual1"><pre>@virtual-keys-toggle <span class="pl-c1">false</span> <span class="pl-c"><span class="pl-c">#</span> press Virtual1</span> F1 <span class="pl-k">&gt;&gt;</span> Virtual1 <span class="pl-c"><span class="pl-c">#</span> release Virtual1</span> F2 <span class="pl-k">&gt;&gt;</span> <span class="pl-k">!</span>Virtual1 <span class="pl-c"><span class="pl-c">#</span> toggle Virtual1</span> Virtual1{F3} <span class="pl-k">&gt;&gt;</span> <span class="pl-k">!</span>Virtual1 F3 <span class="pl-k">&gt;&gt;</span> Virtual1</pre></div> </li> </ul> <h3>Fixed</h3> <ul> <li>Improved performance of sending mouse events on Windows (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3450450221" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/300" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/300/hovercard" href="https://github.com/houmain/keymapper/issues/300">#300</a>).</li> <li>Fixed output on release with together groups (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3509050945" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/306" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/306/hovercard" href="https://github.com/houmain/keymapper/issues/306">#306</a>).</li> </ul> houmain tag:github.com,2008:Repository/177397013/5.1.0 2025-10-12T10:15:52Z 5.1.0 <h3>Added</h3> <ul> <li>Verbose keymapper logging logs virtual key state changes (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="8909128" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/discussions/297" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/297/hovercard" href="https://github.com/houmain/keymapper/discussions/297">#297</a>).</li> <li>Allowing next-key-info to report multiple keys (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2766068465" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/212" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/212/hovercard" href="https://github.com/houmain/keymapper/issues/212">#212</a>).</li> </ul> <h3>Fixed</h3> <ul> <li>Fixed obtaining current keyboard layout on X11/XKB (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3424019364" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/296" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/296/hovercard" href="https://github.com/houmain/keymapper/issues/296">#296</a>).</li> <li>Ignoring key repeat also when mouse was clicked (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="8838097" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/discussions/294" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/294/hovercard" href="https://github.com/houmain/keymapper/discussions/294">#294</a>).</li> <li>Fixed <code>keymapperctl --toggle</code> when invalid key is passed.</li> </ul> houmain tag:github.com,2008:Repository/177397013/5.0.0 2025-09-02T17:41:21Z 5.0.0 <p>The reason for the major version number increment is mainly because of the changed behavior of <code>;</code>. Up until 4.9 it was documented to start comments like <code>#</code>. Otherwise all configurations should work like before.</p> <h3>Added</h3> <ul> <li> <p>Allow to separate multiple mappings on one line with <code>;</code>. This is useful for macros which generate multiple mappings. e.g.:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="swap = $0 &gt;&gt; $1 ; $1 &gt;&gt; $0 swap[Y, Z]"><pre>swap = <span class="pl-smi">$0</span> <span class="pl-k">&gt;&gt;</span> <span class="pl-smi">$1</span> <span class="pl-k">;</span> <span class="pl-smi">$1</span> <span class="pl-k">&gt;&gt;</span> <span class="pl-smi">$0</span> swap[Y, Z]</pre></div> </li> <li> <p>Allow to add mappings for inputs which are released. e.g.:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="# trigger when A is released !A &gt;&gt; B # trigger when B is released while A is held A{!B} &gt;&gt; C # trigger when B is released while A is NOT held !A !B &gt;&gt; C"><pre><span class="pl-c"><span class="pl-c">#</span> trigger when A is released</span> <span class="pl-k">!</span>A <span class="pl-k">&gt;&gt;</span> B <span class="pl-c"><span class="pl-c">#</span> trigger when B is released while A is held</span> A{<span class="pl-k">!</span>B} <span class="pl-k">&gt;&gt;</span> C <span class="pl-c"><span class="pl-c">#</span> trigger when B is released while A is NOT held</span> <span class="pl-k">!</span>A <span class="pl-k">!</span>B <span class="pl-k">&gt;&gt;</span> C</pre></div> </li> <li> <p>Toggling virtual keys can also have immediate effects. Using them as modifiers is toggling them twice:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="# toggle Virtual1 before and after pressing B # this effectively maps D to A B C Virtual1 &gt;&gt; A ^ C D &gt;&gt; Virtual1{B} # {} may also be empty. This maps C to A B Virtual2 &gt;&gt; B Virtual1 &gt;&gt; A Virtual2{} C &gt;&gt; Virtual1{}"><pre><span class="pl-c"><span class="pl-c">#</span> toggle Virtual1 before and after pressing B</span> <span class="pl-c"><span class="pl-c">#</span> this effectively maps D to A B C</span> Virtual1 <span class="pl-k">&gt;&gt;</span> A ^ C D <span class="pl-k">&gt;&gt;</span> Virtual1{B} <span class="pl-c"><span class="pl-c">#</span> {} may also be empty. This maps C to A B</span> Virtual2 <span class="pl-k">&gt;&gt;</span> B Virtual1 <span class="pl-k">&gt;&gt;</span> A Virtual2{} C <span class="pl-k">&gt;&gt;</span> Virtual1{}</pre></div> </li> <li> <p>Automatically replace <code>Virtual</code> with an unused virtual key. e.g.:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="# assign different virtual keys to VimMode and CapsWord VimMode = Virtual CapsWord = Virtual"><pre><span class="pl-c"><span class="pl-c">#</span> assign different virtual keys to VimMode and CapsWord</span> VimMode = Virtual CapsWord = Virtual</pre></div> </li> <li> <p>Added <code>keymapperctl</code> operation <code>--notify</code> for showing notifications (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="8560761" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/discussions/282" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/282/hovercard" href="https://github.com/houmain/keymapper/discussions/282">#282</a>). e.g.:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="notify = $(keymapperctl --notify &quot;$0&quot;) F1 &gt;&gt; notify[&quot;Test&quot;]"><pre>notify = <span class="pl-s"><span class="pl-pds">$(</span>keymapperctl --notify <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$0</span><span class="pl-pds">"</span></span><span class="pl-pds">)</span></span> F1 <span class="pl-k">&gt;&gt;</span> notify[<span class="pl-s"><span class="pl-pds">"</span>Test<span class="pl-pds">"</span></span>]</pre></div> </li> <li> <p>Added <code>toggle-active</code> directive, which allows to set a sequence that de-/activates keymapper (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="8560793" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/discussions/283" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/283/hovercard" href="https://github.com/houmain/keymapper/discussions/283">#283</a>). e.g.:</p> <div class="highlight highlight-source-python notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="@toggle-active ScrollLock"><pre>@<span class="pl-s1">toggle</span><span class="pl-c1">-</span><span class="pl-s1">active</span> <span class="pl-v">ScrollLock</span></pre></div> </li> <li> <p>Added <code>include-optional</code> directive, which includes a file but does not fail when file does not exist.</p> </li> </ul> <h3>Fixed</h3> <ul> <li>Fixed suppressed modifiers getting reapplied (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3267293047" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/291" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/291/hovercard" href="https://github.com/houmain/keymapper/issues/291">#291</a>).</li> <li>Fixed loading config from <code>"%HOME%\.config\keymapper"</code> on Windows (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3327123294" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/292" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/292/hovercard" href="https://github.com/houmain/keymapper/issues/292">#292</a>).</li> <li>Properly releasing keys when UAC prompt appeared on Windows.</li> </ul> houmain tag:github.com,2008:Repository/177397013/4.12.3 2025-07-13T06:32:17Z 4.12.3 <h3>Fixed</h3> <ul> <li>Fixed problem with virtual keys (introduced in 4.12.1 for <a href="https://github.com/houmain/keymapper/discussions/275#discussioncomment-13210753" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/275/hovercard?comment_id=13210753">#275</a>).</li> <li>Fixed checking for a specific number of mouse wheel events (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3200204013" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/280" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/280/hovercard" href="https://github.com/houmain/keymapper/issues/280">#280</a>).</li> </ul> houmain tag:github.com,2008:Repository/177397013/4.12.2 2025-06-29T10:34:34Z 4.12.2 <h3>Added</h3> <ul> <li>Showing a hint in "Next Key Info" that Gnome/KDE script is not enabled.</li> </ul> <h3>Changed</h3> <ul> <li>Handling only lowres wheel events by default on Linux (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3039804327" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/268" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/268/hovercard" href="https://github.com/houmain/keymapper/issues/268">#268</a>).</li> </ul> <h3>Fixed</h3> <ul> <li>Not blocking when opening configuration from tray on Linux (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2816838501" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/220" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/220/hovercard" href="https://github.com/houmain/keymapper/issues/220">#220</a>).</li> <li>Fixed focus update when xwayland app is minimized to tray (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2816838501" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/220" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/220/hovercard" href="https://github.com/houmain/keymapper/issues/220">#220</a>).</li> <li>Fixed device context fallthrough (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3185455160" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/277" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/277/hovercard" href="https://github.com/houmain/keymapper/issues/277">#277</a>).</li> <li>Optimized SVG icon.</li> </ul> houmain