<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://hypr-input-switcher.ews.im/blog</id>
    <title>Hypr Input Switcher Blog</title>
    <updated>2026-10-25T01:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://hypr-input-switcher.ews.im/blog"/>
    <subtitle>Hypr Input Switcher Blog</subtitle>
    <icon>https://hypr-input-switcher.ews.im/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Hypr Input Switcher 0.6.0: Multi-Engine Support, Per-App Memory, and Configuration v3]]></title>
        <id>https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0</id>
        <link href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0"/>
        <updated>2026-10-25T01:00:00.000Z</updated>
        <summary type="html"><![CDATA[We are excited to announce the release of Hypr Input Switcher v0.6.0! 🚀]]></summary>
        <content type="html"><![CDATA[<p>We are excited to announce the release of <strong>Hypr Input Switcher v0.6.0</strong>! 🚀</p>
<p>This release marks our largest architectural update to date. It introduces native multi-engine fcitx5 support, per-application input method memory, first-class Wayland layer-shell overlay rules, and <strong>Configuration Specification v3</strong>.</p>
<h2 class="anchor anchorWithStickyNavbar_uj1B" id="highlights-in-v060">Highlights in v0.6.0<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#highlights-in-v060" class="hash-link" aria-label="Direct link to Highlights in v0.6.0" title="Direct link to Highlights in v0.6.0" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_uj1B" id="1-multi-engine-input-method-switching">1. Multi-Engine Input Method Switching<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#1-multi-engine-input-method-switching" class="hash-link" aria-label="Direct link to 1. Multi-Engine Input Method Switching" title="Direct link to 1. Multi-Engine Input Method Switching" translate="no">​</a></h3>
<p>Prior to v0.6.0, <code>hypr-input-switcher</code> was tightly coupled to Rime: non-English input methods were assumed to be Rime schemas, and switching to English deactivated the fcitx5 controller globally.</p>
<p>In environments running multiple fcitx5 engines—such as <a href="https://msime.app/" target="_blank" rel="noopener noreferrer"><code>msime</code></a> for Chinese alongside <code>rime</code> (for Japanese or dialect schemas) and <code>keyboard-us</code> for English—this caused state mismatch issues:</p>
<ul>
<li>Other engines were incorrectly classified as English.</li>
<li>Attempting to switch to non-Rime input methods failed because the switcher attempted to set non-existent Rime schemas.</li>
<li>Deactivating the controller for English caused disruptive state teardowns across window focus changes.</li>
</ul>
<p>In <strong>v0.6.0</strong>, the switching architecture is completely decoupled:</p>
<ul>
<li><strong>Direct Engine Switching</strong>: Input method labels now map directly to fcitx5 input engines (e.g. <code>keyboard-us</code>, <code>msime</code>, <code>rime</code>, <code>mozc</code>). The switcher communicates directly via <code>SetCurrentIM</code>.</li>
<li><strong>Non-Disruptive English</strong>: Switching to <code>english</code> selects the configured English layout (<code>keyboard-us</code>) directly without deactivating the fcitx5 controller.</li>
</ul>
<hr>
<h3 class="anchor anchorWithStickyNavbar_uj1B" id="2-per-app-input-method-memory">2. Per-App Input Method Memory<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#2-per-app-input-method-memory" class="hash-link" aria-label="Direct link to 2. Per-App Input Method Memory" title="Direct link to 2. Per-App Input Method Memory" translate="no">​</a></h3>
<p>A long-standing pain point was the "English infection" problem: when navigating between windows using the <code>keep</code> rule, the switcher passively inherited whichever input method the previous window had left active. If you switched from a chat application (Chinese) to an IDE (English) and back to the chat application, your chat window was forced into English.</p>
<p>Starting in <strong>v0.6.0</strong>:</p>
<ul>
<li>The switcher maintains an internal <code>appHistory</code> cache keyed by window class (<code>clientInfo.Class</code>).</li>
<li>When switching to a window governed by a <code>keep</code> rule (or falling back to a <code>keep</code> default), the switcher restores the <strong>last-used input method for that specific application</strong>.</li>
<li>Explicit target rules (e.g. <code>input_method: chinese</code>) continue to take immediate precedence and update the application's remembered state.</li>
</ul>
<hr>
<h3 class="anchor anchorWithStickyNavbar_uj1B" id="3-configuration-specification-v3--profile-abstraction">3. Configuration Specification v3 &amp; <code>profile</code> Abstraction<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#3-configuration-specification-v3--profile-abstraction" class="hash-link" aria-label="Direct link to 3-configuration-specification-v3--profile-abstraction" title="Direct link to 3-configuration-specification-v3--profile-abstraction" translate="no">​</a></h3>
<p>To support multi-engine setups cleanly, v0.6.0 introduces <strong>Configuration Specification v3</strong>.</p>
<p>Instead of fragmenting configuration across separate top-level <code>input_methods</code>, <code>rime_schemas</code>, <code>display_names</code>, and <code>icons</code> sections, v3 unifies them into cohesive <code>input_methods</code> entities with a generic <strong><code>profile</code></strong> abstraction:</p>
<div class="language-yaml codeBlockContainer_WBnB theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_GM9N"><pre tabindex="0" class="prism-code language-yaml codeBlock_gbqj thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_xEsY"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Hyprland Input Method Switcher Configuration</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">input_methods</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">english</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">engine</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> keyboard</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">us</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">display_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> English</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">icon</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 🇺🇸</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">chinese</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">engine</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> msime</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">display_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 中文</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">icon</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 🇨🇳</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">japanese</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">engine</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> rime</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">profile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> jaroomaji</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">display_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 日本語</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">icon</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 🇯🇵</span><br></span></code></pre></div></div>
<h4 class="anchor anchorWithStickyNavbar_uj1B" id="flexible-shorthand-syntax">Flexible Shorthand Syntax<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#flexible-shorthand-syntax" class="hash-link" aria-label="Direct link to Flexible Shorthand Syntax" title="Direct link to Flexible Shorthand Syntax" translate="no">​</a></h4>
<p>For rapid configuration, shorthand strings are fully supported:</p>
<ul>
<li><strong><code>engine:profile</code></strong>: <code>japanese: rime:jaroomaji</code></li>
<li><strong>Plain <code>engine</code></strong>: <code>english: keyboard-us</code> or <code>chinese: msime</code></li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_uj1B" id="100-backward-compatibility">100% Backward Compatibility<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#100-backward-compatibility" class="hash-link" aria-label="Direct link to 100% Backward Compatibility" title="Direct link to 100% Backward Compatibility" translate="no">​</a></h4>
<p>If you have an existing <code>version: 2</code> configuration (used across releases v0.1.0 through v0.5.1), <strong>no manual file edits are required</strong>. The switcher transparently normalizes older configurations in memory upon loading.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_uj1B" id="4-desktop-overlay-support-layer_rules">4. Desktop Overlay Support (<code>layer_rules</code>)<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#4-desktop-overlay-support-layer_rules" class="hash-link" aria-label="Direct link to 4-desktop-overlay-support-layer_rules" title="Direct link to 4-desktop-overlay-support-layer_rules" translate="no">​</a></h3>
<p>Desktop overlays—such as app launchers (e.g. Omarchy Menu, Rofi, Walker) or floating widgets (calculators, emoji pickers)—run as Wayland layer surfaces (<code>zwlr_layer_shell_v1</code>). They never appear in <code>hyprctl clients</code> and cannot be matched by standard window rules.</p>
<p>v0.6.0 introduces <code>layer_rules</code> matched by layer namespace:</p>
<div class="language-yaml codeBlockContainer_WBnB theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_GM9N"><pre tabindex="0" class="prism-code language-yaml codeBlock_gbqj thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_xEsY"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">layer_rules</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> omarchy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">menu</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">input_method</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> english</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> icyleaf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">qalculator</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">input_method</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> english</span><br></span></code></pre></div></div>
<p>When an overlay opens, the switcher activates the corresponding input method. Once closed, input method focus cleanly returns to the underlying active window.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_uj1B" id="5-multi-backend-notifications--embedded-icons">5. Multi-Backend Notifications &amp; Embedded Icons<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#5-multi-backend-notifications--embedded-icons" class="hash-link" aria-label="Direct link to 5. Multi-Backend Notifications &amp; Embedded Icons" title="Direct link to 5. Multi-Backend Notifications &amp; Embedded Icons" translate="no">​</a></h3>
<ul>
<li><strong>17 Embedded SVG Icons</strong>: Flag and layout icons are now bundled directly within the binary and automatically unpacked to <code>~/.local/share/hypr-input-switcher/icons/</code>.</li>
<li><strong>Fallback Notification Daemon Support</strong>: Notification delivery automatically selects available backends with automatic failover across <code>notify-send</code>, <code>hyprctl</code>, <code>dunstify</code>, <code>swaync-client</code>, and <code>mako</code>.</li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_uj1B" id="upgrading-to-v060">Upgrading to v0.6.0<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#upgrading-to-v060" class="hash-link" aria-label="Direct link to Upgrading to v0.6.0" title="Direct link to Upgrading to v0.6.0" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_uj1B" id="arch-linux--omarchy">Arch Linux / Omarchy<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#arch-linux--omarchy" class="hash-link" aria-label="Direct link to Arch Linux / Omarchy" title="Direct link to Arch Linux / Omarchy" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_WBnB theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_GM9N"><pre tabindex="0" class="prism-code language-bash codeBlock_gbqj thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_xEsY"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Update via AUR or pacman</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">yay </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-Syu</span><span class="token plain"> hypr-input-switcher</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_uj1B" id="from-source">From Source<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#from-source" class="hash-link" aria-label="Direct link to From Source" title="Direct link to From Source" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_WBnB theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_GM9N"><pre tabindex="0" class="prism-code language-bash codeBlock_gbqj thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_xEsY"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">git</span><span class="token plain"> clone https://github.com/icyleaf/hypr-input-switcher.git</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> hypr-input-switcher</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">go build </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> ~/.local/bin/hypr-input-switcher ./cmd/hypr-input-switcher</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_uj1B" id="migrating-your-configuration">Migrating Your Configuration<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#migrating-your-configuration" class="hash-link" aria-label="Direct link to Migrating Your Configuration" title="Direct link to Migrating Your Configuration" translate="no">​</a></h3>
<p>Existing configurations continue to work seamlessly. If you wish to migrate your configuration file to the modern v3 format, use the built-in migration utility:</p>
<div class="language-bash codeBlockContainer_WBnB theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_GM9N"><pre tabindex="0" class="prism-code language-bash codeBlock_gbqj thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_xEsY"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Migrate config file to v3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">hypr-input-switcher migrate ~/.config/hypr-input-switcher/config.yaml</span><br></span></code></pre></div></div>
<p>Check out the <a href="https://hypr-input-switcher.ews.im/docs/configuration/v3"><strong>Configuration v3 Guide</strong></a> for complete documentation and examples.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_uj1B" id="detailed-changelog">Detailed Changelog<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#detailed-changelog" class="hash-link" aria-label="Direct link to Detailed Changelog" title="Direct link to Detailed Changelog" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_uj1B" id="features">Features<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">​</a></h3>
<ul>
<li><strong>Engine</strong>: Support arbitrary fcitx5 input method engines (<code>msime</code>, <code>rime</code>, <code>keyboard-us</code>, <code>mozc</code>) via D-Bus <code>SetCurrentIM</code>.</li>
<li><strong>Memory</strong>: Implement per-application input method memory for <code>keep</code> and unvisited windows.</li>
<li><strong>Config</strong>: Introduce Configuration Specification v3 with cohesive <code>input_methods</code> entities and generic <code>profile</code> abstraction.</li>
<li><strong>Config</strong>: Add support for shorthand formats (<code>engine:profile</code> and string engine names).</li>
<li><strong>Migration</strong>: Provide bidirectional normalization and automated migration from v1/v2 to v3.</li>
<li><strong>Layer Shell</strong>: Support <code>layer_rules</code> targeting Wayland desktop overlays by namespace.</li>
<li><strong>Assets</strong>: Embed 17 SVG icons with automatic runtime extraction.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_uj1B" id="bug-fixes">Bug Fixes<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h3>
<ul>
<li><strong>Engine</strong>: Fix bug where non-Rime input methods (e.g. <code>msime</code>) were misidentified as English.</li>
<li><strong>Engine</strong>: Fix bug where switching to non-Rime engines attempted to set invalid Rime schemas.</li>
<li><strong>State</strong>: Fix "English infection" where navigating through code editors reset subsequent <code>keep</code> windows to English.</li>
<li><strong>Daemon</strong>: Fix controller teardown when switching to English layout.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_uj1B" id="documentation">Documentation<a href="https://hypr-input-switcher.ews.im/blog/hypr-input-switcher-0-6-0#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h3>
<ul>
<li><strong>Docs</strong>: Restructure configuration documentation into versioned guides (<code>v3</code>, <code>v2</code>, <code>v1</code>).</li>
<li><strong>ADR</strong>: Add ADR-0001 covering multi-engine switching and per-app memory design.</li>
<li><strong>Blog</strong>: Launch official blog and release announcement series.</li>
</ul>]]></content>
        <author>
            <name>icyleaf</name>
            <uri>https://github.com/icyleaf</uri>
        </author>
        <category label="release" term="release"/>
        <category label="announcement" term="announcement"/>
        <category label="fcitx5" term="fcitx5"/>
        <category label="hyprland" term="hyprland"/>
    </entry>
</feed>