<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://keyboardkit.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://keyboardkit.com/" rel="alternate" type="text/html" /><updated>2026-10-16T14:46:47+00:00</updated><id>https://keyboardkit.com/feed.xml</id><title type="html">KeyboardKit</title><subtitle>KeyboardKit helps you create custom keyboards for iOS and iPadOS, using Swift and SwiftUI. </subtitle><entry><title type="html">Split keyboard support is coming to the iPhone Duo and all iPads</title><link href="https://keyboardkit.com/blog/2026/10/16/split-keyboard-is-coming-to-the-iphone-duo-and-all-ipads" rel="alternate" type="text/html" title="Split keyboard support is coming to the iPhone Duo and all iPads" /><published>2026-10-16T05:00:00+00:00</published><updated>2026-10-16T05:00:00+00:00</updated><id>https://keyboardkit.com/blog/2026/10/16/split-keyboard-is-coming-to-the-iphone-duo-and-all-ipads</id><content type="html" xml:base="https://keyboardkit.com/blog/2026/10/16/split-keyboard-is-coming-to-the-iphone-duo-and-all-ipads"><![CDATA[<p>Support for split keyboard is coming to the iPhone Duo and all iPad devices. The feature ships with KeyboardKit 11.1 and can be enabled by code and user-facing settings.</p>

<h2 id="how-it-works">How it Works</h2>

<p>In 11.1, <code class="language-plaintext highlighter-rouge">KeyboardContext</code> and <code class="language-plaintext highlighter-rouge">KeyboardSettings</code> get a new <code class="language-plaintext highlighter-rouge">isSplitKeyboardEnabled</code> property. The context value can be used to enable split keyboard during the current session, while the setting is persisted.</p>

<p>When split keyboard is enabled, the iPhone Duo will enable the feature when the screen is in open landscape.</p>

<p><img src="/assets/blog/26/1016/duo-landscape.jpg" alt="iPhone Duo with split keyboard" /></p>

<p>Split keyboard is however not available other iPhone devices, nor when the Duo is closed or open in portrait.</p>

<p><img src="/assets/blog/26/1016/duo-portrait.jpg" alt="iPhone Duo in portrait" /></p>

<p>The new split keyboard feature is also available on all iPad devices, in both portrait and landscape orientation.</p>

<p><img src="/assets/blog/26/1016/ipad-portrait.jpg" alt="iPad in portrait" /></p>

<p><img src="/assets/blog/26/1016/ipad-landscape.jpg" alt="iPad in landscape" /></p>

<p>To simplify using the keyboard in split mode while the device is in landscape orientation, the keyboard will switch over to use the portrait design while split keyboard is enabled.</p>

<h2 id="duo-hinge-detection">Duo Hinge Detection</h2>

<p>We are investigating how to get access to the iPhone Duo’s hinge information, which is currently not available to custom keyboard extensions. This would let us automatically enable split mode when the device is folded.</p>

<p>Until then, we will add a context menu to the space bar, that allows users to toggle split keyboard mode from the space bar. This will also be available from the dismiss keyboard button.</p>]]></content><author><name>danielsaidi</name></author><category term="layout" /><summary type="html"><![CDATA[Support for split keyboard is coming to the iPhone Duo and all iPad devices. The feature ships with KeyboardKit 11.1 and can be enabled by code and user-facing settings.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://keyboardkit.com/assets/blog/26/1016/image.jpg" /><media:content medium="image" url="https://keyboardkit.com/assets/blog/26/1016/image.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">iOS Keyboard Extensions Can’t Detect the iPhone Duo Fold</title><link href="https://keyboardkit.com/blog/2026/10/14/ios-keyboard-extensions-can-t-detect-the-iphone-duo-fold" rel="alternate" type="text/html" title="iOS Keyboard Extensions Can’t Detect the iPhone Duo Fold" /><published>2026-10-14T05:00:00+00:00</published><updated>2026-10-14T05:00:00+00:00</updated><id>https://keyboardkit.com/blog/2026/10/14/ios-keyboard-extensions-can-t-detect-the-iphone-duo-fold</id><content type="html" xml:base="https://keyboardkit.com/blog/2026/10/14/ios-keyboard-extensions-can-t-detect-the-iphone-duo-fold"><![CDATA[<p>The iPhone Duo is almost here, and iOS 27.1 brings new APIs for apps to adapt to its hinge. We wanted to give KeyboardKit the same capabilities, but keyboard extensions can’t seem to detect the fold.</p>

<h2 id="iphone-duo-changes">iPhone Duo Changes</h2>

<p>As we write in our <a href="/blog/2026/09/20/iphone-duo-and-keyboardkit">previous article about the iPhone Duo</a>, KeyboardKit must be adjusted for iPhone Duo and its various form factors. Besides keys and font sizes, keyboards should also split when the Duo is folded.</p>

<p><img src="/assets/blog/26/0920/2-native-folded.jpg" alt="A split iPhone Duo keyboard" /></p>

<p>A keyboard extension must therefore check if it’s running on an iPhone Duo, and if so adjust the key sizes. If the hinge information indicates that the device is folded, it should split in two halves.</p>

<p>However, it seems that keyboard extensions can’t detect the hinge information. Below are details of what we’ve tried, what works in an app, and what doesn’t work in a keyboard extension.</p>

<h2 id="new-hinge-apis">New Hinge APIs</h2>

<p>iOS 27.1 adds some ways to find out how the device is folded, for instance:</p>

<ul>
  <li><strong>Hinge state</strong> – <code class="language-plaintext highlighter-rouge">UIHingeInteraction</code> in UIKit and <code class="language-plaintext highlighter-rouge">.onHingeChange</code> in SwiftUI. Both report the hinge state (<code class="language-plaintext highlighter-rouge">closed</code>, <code class="language-plaintext highlighter-rouge">partiallyOpen</code>, <code class="language-plaintext highlighter-rouge">fullyOpen</code>) and an angle.</li>
  <li><strong>Reserved regions</strong> – <code class="language-plaintext highlighter-rouge">UIView.reservedRegions</code> and <code class="language-plaintext highlighter-rouge">GeometryProxy.reservedRegions</code> with the <code class="language-plaintext highlighter-rouge">.division</code> kind describes where the screen is divided by the fold.</li>
</ul>

<p>This is exactly what a keyboard extension needs to adjust its keys around the fold. To explore what information a keyboard extension receives, we built a small test app with a KeyboardKit-based keyboard.</p>

<h2 id="test-project">Test Project</h2>

<p>Test project’s main app target checks the hinge state and division regions with SwiftUI. The keyboard extension checks the same thing in two ways: from the input controller (UIKit), and from the keyboard view (SwiftUI).</p>

<p>We haven’t uploaded the project, but you can <a href="mailto:info@keyboardkit.com">reach out</a> if you want to give it a try, and we’ll give you access to it.</p>

<h2 id="test-results">Test Results</h2>

<p>In the image below, we can see how the iPhone Duo behaves when it’s closed and the outer display is in use:</p>

<p><img src="/assets/blog/26/1014/duo-closed.jpg" alt="A Duo that is closed" /></p>

<p>As you can see, the app shows that the hinge is closed and that there are no reserved division regions, while the keyboard doesn’t have any information.</p>

<p>When the iPhone Duo is semi-open in a folded state, the app updates accordingly, while the keyboard extension still has no information:</p>

<p><img src="/assets/blog/26/1014/duo-folded.jpg" alt="A Duo that is folded" /></p>

<p>Finally, with the Duo fully open, the app still updates accordingly, while the keyboard still has no information:</p>

<p><img src="/assets/blog/26/1014/duo-open.jpg" alt="A Duo that is open" /></p>

<p>The app works as expected. It gets <code class="language-plaintext highlighter-rouge">partiallyOpen</code> when folded, and <code class="language-plaintext highlighter-rouge">fullyOpen</code> when flat. It also gets an active division region for the fold when the device is half-open, and none when it’s flat. Everything updates live as the hinge moves.</p>

<p>The keyboard extension gets nothing.</p>

<p>According to the documentation, the hinge handler is always called with the initial state, and with a <code class="language-plaintext highlighter-rouge">nil</code> hinge if the view isn’t in a hierarchy that provides hinge updates. In the keyboard extension it’s never called at all, not even with <code class="language-plaintext highlighter-rouge">nil</code>. We also tried adding the interaction to the extension window instead of its view, with no luck.</p>

<h2 id="implications">Implications</h2>

<p>The native keyboard knows exactly where the fold is, and splits its keys around it when the device is folded half-open. Third-party keyboards can’t seem to do the same, which means they will look and feel worse than a native keyboard on a folded iPhone Duo.</p>

<p>These results are from the iPhone Duo simulator with iOS 27.1 (Xcode 27.1 RC). We haven’t been able to test on a physical device yet, and will update this post if a device behaves differently.</p>

<h2 id="conclusion">Conclusion</h2>

<p>We have filed a feedback with Apple, asking for this information to be made available to keyboard extensions as well. If you file a feedback, please refer to <code class="language-plaintext highlighter-rouge">FB25187339</code>. Duplicates help Apple prioritize.</p>

<p>You can follow the progress in <a href="https://github.com/KeyboardKit/KeyboardKit/issues/1095">this GitHub issue</a>.</p>]]></content><author><name>danielsaidi</name></author><category term="apple-bugs" /><summary type="html"><![CDATA[The iPhone Duo is almost here, and iOS 27.1 brings new APIs for apps to adapt to its hinge. We wanted to give KeyboardKit the same capabilities, but keyboard extensions can’t seem to detect the fold.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://keyboardkit.com/assets/blog/26/1014/image.jpg" /><media:content medium="image" url="https://keyboardkit.com/assets/blog/26/1014/image.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The KeyboardKit app is being redesigned for the iPhone Duo</title><link href="https://keyboardkit.com/blog/2026/10/09/the-keyboardkit-app-is-being-redesigned-for-the-iphone-duo" rel="alternate" type="text/html" title="The KeyboardKit app is being redesigned for the iPhone Duo" /><published>2026-10-09T05:00:00+00:00</published><updated>2026-10-09T05:00:00+00:00</updated><id>https://keyboardkit.com/blog/2026/10/09/the-keyboardkit-app-is-being-redesigned-for-the-iphone-duo</id><content type="html" xml:base="https://keyboardkit.com/blog/2026/10/09/the-keyboardkit-app-is-being-redesigned-for-the-iphone-duo"><![CDATA[<p>With KeyboardKit 11 out, we have started preparing the <a href="/app">KeyboardKit app</a> for iPhone Duo. Let’s take a look at how the app adapts to the Duo’s different form factors, and how these changes improve the app on iPad.</p>

<h2 id="the-settings-app">The Settings app</h2>

<p>Since the <a href="/app">KeyboardKit app</a> behaves just like the iOS Settings app, it made sense to look at how that app behaves on the Duo, and approach it the same way.</p>

<p>When the iPhone Duo is closed, the Settings app uses a navigation stack and pushes new screen onto the stack.</p>

<p><img src="/assets/blog/26/1009//duo-settings-closed.jpg" alt="Settings app on a closed iPhone Duo" /></p>

<p>However, when the iPhone Duo is open or folded, the Settings app switches to a navigation stack, with a sidebar to the left and the selected settings screen to the right.</p>

<p><img src="/assets/blog/26/1009//duo-settings.jpg" alt="Settings app on an open iPhone Duo" /></p>

<p>Unlike the default iOS split view behavior, this sidebar is always open, and the toolbar sidebar toggle is hidden, so this is the configuration we’ll go with as well.</p>

<h2 id="iphone-duo">iPhone Duo</h2>

<p>When the iPhone Duo is closed, the KeyboardKit app behaves just like on a regular iPhone. The main menu is presented as a list, and tapping an item pushes the selected settings screen onto the navigation stack.</p>

<p><img src="/assets/blog/26/1009//duo-closed.jpg" alt="KeyboardKit app on a closed iPhone Duo" /></p>

<p>When the device is folded, the app switches to a split view, with the sidebar always open. The two screens are placed on each side of the fold to keep interactive elements away from the fold, as Apple recommends.</p>

<p><img src="/assets/blog/26/1009//duo-split.jpg" alt="KeyboardKit app on a folded iPhone Duo" /></p>

<p>When the Duo is folded fully open, the sidebar becomes narrower, which gives the selected screen more space. This is closer to how the app behaves on iPad, although the Duo still places the status bar to the right.</p>

<p><img src="/assets/blog/26/1009//duo-open.jpg" alt="KeyboardKit app on an open iPhone Duo" /></p>

<p>As you can see, the app feels right at home on the Duo, regardless of how it’s folded, instead of just stretching out the iPhone layout over the bigger screen.</p>

<p>You may also notice that we redesign the main menu when it lives inside the sidebar, where all menu items are listed without sections (except app-specific ones at the bottom).</p>

<h2 id="ipad">iPad</h2>

<p>As part of this change, we also redesign the iPad app to use the same split view configuration as the iPhone Duo.</p>

<p><img src="/assets/blog/26/1009//ipad.jpg" alt="KeyboardKit app on iPad in landscape" /></p>

<p>Since the iPhone Duo in open mode share the same navigation model as the iPad, any improvements we make for one device will benefit the other.</p>

<h2 id="conclusion">Conclusion</h2>

<p>The iPhone Duo forces us to rethink how our apps behave on different form factors. The <a href="/app">KeyboardKit app</a> will follow the conventions of the native Settings app, to get a consistent experience on all devices.</p>

<p>Some work still remains. For instance, the keyboard preview must be placed outside the split view, since the it doesn’t provide enough space. We must also adjust the keyboard itself to the Duo, as described in <a href="https://keyboardkit.com/blog/2026/09/20/iphone-duo-and-keyboardkit">this post</a>.</p>

<p>We hope to have both the app and the keyboard ready shortly after the Duo has been released.</p>]]></content><author><name>danielsaidi</name></author><category term="app" /><summary type="html"><![CDATA[With KeyboardKit 11 out, we have started preparing the KeyboardKit app for iPhone Duo. Let’s take a look at how the app adapts to the Duo’s different form factors, and how these changes improve the app on iPad.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://keyboardkit.com/assets/blog/26/1009/image.jpg" /><media:content medium="image" url="https://keyboardkit.com/assets/blog/26/1009/image.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">KeyboardKit 10.9 fixes a thread hang in iOS 27</title><link href="https://keyboardkit.com/blog/2026/10/01/keyboardkit-10-9-fixes-some-thread-hangs-in-ios-27" rel="alternate" type="text/html" title="KeyboardKit 10.9 fixes a thread hang in iOS 27" /><published>2026-10-01T05:00:00+00:00</published><updated>2026-10-01T05:00:00+00:00</updated><id>https://keyboardkit.com/blog/2026/10/01/keyboardkit-10-9-fixes-some-thread-hangs-in-ios-27</id><content type="html" xml:base="https://keyboardkit.com/blog/2026/10/01/keyboardkit-10-9-fixes-some-thread-hangs-in-ios-27"><![CDATA[<p>KeyboardKit 10.9.6 and 10.9.7 fixes an elusive thread hang in iOS 27. Make sure to upgrade to this version if you plan on staying on KeyboardKit 10 for a while.</p>

<h2 id="the-problem">The problem</h2>

<p>We have started getting bug reports from users of the <a href="/app">KeyboardKit app</a>, that the main app and keyboard could freeze randomly.</p>

<p>We had massive problems reproducing this freeze, and everyone we asked to download and test the app did so without any problems.</p>

<p>After receiving a bug report that the issue also manifested itself in the demo app, on iPad 13”, we could narrow down the scope and reproduce the bug. Turns out that a layout change caused an infinite loop.</p>

<h2 id="the-reason">The reason</h2>

<p>The reason for the freeze was the library augmenting a keyboard layout by adding an additional input toolbar.</p>

<p>When augmenting the layout, the library did so with a default layout configuration. This creates a temporary, observable state that is only used to read settings.</p>

<p>This used to work, but in iOS 27 this seems to have changed behavior, and now causes the observable state to update, which causes the keyboard to redraw, which causes the layout to once again be augmented.</p>

<h2 id="the-solution">The solution</h2>

<p>After locating this problem, we could easily sove it by removing the default configuration parameter value. We will remove these default context parameter values and require an explicit configuration to be passed in.</p>

<p>The fix has been out in production for a few days, and all app users have now reported that they can use the app without any hangs.</p>

<h2 id="conclusion">Conclusion</h2>

<p>KeyboardKit 10.9.6 fixes this problem, but was accidentally built with Xcode 27. If you are still on Xcode 26, the 10.9.7 patch update is rebuilt with Xcode 26.6.</p>]]></content><author><name>danielsaidi</name></author><category term="releases" /><summary type="html"><![CDATA[KeyboardKit 10.9.6 and 10.9.7 fixes an elusive thread hang in iOS 27. Make sure to upgrade to this version if you plan on staying on KeyboardKit 10 for a while.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://keyboardkit.com/assets/blog/26/1001/image.jpg" /><media:content medium="image" url="https://keyboardkit.com/assets/blog/26/1001/image.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">KeyboardKit 11 is out</title><link href="https://keyboardkit.com/blog/2026/10/01/keyboardkit-11-is-out" rel="alternate" type="text/html" title="KeyboardKit 11 is out" /><published>2026-10-01T05:00:00+00:00</published><updated>2026-10-01T05:00:00+00:00</updated><id>https://keyboardkit.com/blog/2026/10/01/keyboardkit-11-is-out</id><content type="html" xml:base="https://keyboardkit.com/blog/2026/10/01/keyboardkit-11-is-out"><![CDATA[<p>KeyboardKit 11 is out! This major version upgrade is ported to Swift 6.2, and has support for 110+ languages, improved diacritics, new autocomplete &amp; dictation features, a new plugin architecture, and swipe typing tools.</p>

<p><img src="/assets/versions/11_0.jpg" alt="KeyboardKit header image" /></p>

<h2 id="tldr">TL;DR</h2>

<p>The biggest structural changes in KeyboardKit 11, that will most likely affect you, are the Swift 6.2 transition, and how controller state moves from the keyboard context to a new main actor controller context, plus how dictation and host app detection use a new plugin architecture to move sensitive code out of the main library.</p>

<h2 id="package-updates">Package Updates</h2>

<p>KeyboardKit 11 uses Swift 6.2. This made it possible to remove a lot of dispatch and <code class="language-plaintext highlighter-rouge">MainActor.run</code> code, which makes the library more stable. This work involved making more types <code class="language-plaintext highlighter-rouge">MainActor</code>, while keeping most of the library unchanged. The controller state is therefore moved from the <code class="language-plaintext highlighter-rouge">KeyboardContext</code> to a new main actor-bound <code class="language-plaintext highlighter-rouge">KeyboardControllerContext</code>, to keep the core context versatile.</p>

<p>The package is also built in a new way that embeds the dSYMs inside the XCFramework. This means that they will automatically be embedded in your app when submitting it to the App Store. No more manual downloads!</p>

<p>The package also ships three new plugins for autocomplete, dictation, and host application, which you can read more about further down.</p>

<h2 id="new-locales">New Locales</h2>

<p>KeyboardKit 11 almost doubles the number of supported locales, bringing the total to <code class="language-plaintext highlighter-rouge">111</code>. This was made possible by the improved diacritics engine, which now supports combining marks. As part of this, we have also improved the layout engine and harmonized many layouts, to keep them consistent across configuration changes, and fixed a bunch of incorrect swipe down actions on iPad.</p>

<p>This includes <code class="language-plaintext highlighter-rouge">13</code> indigenous North American locales (<code class="language-plaintext highlighter-rouge">Apache</code>, <code class="language-plaintext highlighter-rouge">Blackfoot</code>, <code class="language-plaintext highlighter-rouge">Chickasaw</code>, <code class="language-plaintext highlighter-rouge">Chochenyo</code>, <code class="language-plaintext highlighter-rouge">Choctaw</code>, <code class="language-plaintext highlighter-rouge">Comanche</code>, <code class="language-plaintext highlighter-rouge">Kiowa</code>, <code class="language-plaintext highlighter-rouge">Lushootseed</code>, <code class="language-plaintext highlighter-rouge">Mvskoke</code>, <code class="language-plaintext highlighter-rouge">Nez Perce</code>, <code class="language-plaintext highlighter-rouge">Osage</code>, <code class="language-plaintext highlighter-rouge">Salish</code>, and <code class="language-plaintext highlighter-rouge">Wixarika</code>), <code class="language-plaintext highlighter-rouge">6</code> Sámi locales (<code class="language-plaintext highlighter-rouge">Kildin Sámi</code>, <code class="language-plaintext highlighter-rouge">Lule Sámi</code>, <code class="language-plaintext highlighter-rouge">Pite Sámi</code>, <code class="language-plaintext highlighter-rouge">Skolt Sámi</code>, <code class="language-plaintext highlighter-rouge">South Sámi</code>, and <code class="language-plaintext highlighter-rouge">Ume Sámi</code>), and <code class="language-plaintext highlighter-rouge">15</code> other locales (<code class="language-plaintext highlighter-rouge">Afrikaans</code>, <code class="language-plaintext highlighter-rouge">Basque (France)</code>, <code class="language-plaintext highlighter-rouge">Basque (Spain)</code>, <code class="language-plaintext highlighter-rouge">Bosnian</code>, <code class="language-plaintext highlighter-rouge">English (South Africa)</code>, <code class="language-plaintext highlighter-rouge">Esperanto</code>, <code class="language-plaintext highlighter-rouge">Galician (Spain)</code>, <code class="language-plaintext highlighter-rouge">Kalaallisut</code>, <code class="language-plaintext highlighter-rouge">Kyrgyz</code>, <code class="language-plaintext highlighter-rouge">Māori</code>, <code class="language-plaintext highlighter-rouge">Romansh</code>, <code class="language-plaintext highlighter-rouge">Samoan</code>, <code class="language-plaintext highlighter-rouge">Turkmen</code>, <code class="language-plaintext highlighter-rouge">Yiddish</code>, and <code class="language-plaintext highlighter-rouge">Zulu</code>).</p>

<p>We noticed that submitting these fully functional locales to the App Store causes a warning for unsupported locales. Since they are working within the library, we will investigate if we can silence this warning.</p>

<h2 id="plugins">Plugins</h2>

<p>KeyboardKit 11 adds a new plugin architecture, which lets us move sensitive code, like permissions and system API usage, out of the core library. This plugin model is an exciting new part of KeyboardKit, and will let us build more capabilities and integrations outside of the core SDK, and let you decide which plugins you want to use.</p>

<p>For instance, the <code class="language-plaintext highlighter-rouge">KeyboardKitDictationPlugin</code> contains all you need to enable dictation, and contains all the code that requires permissions. Also, the <code class="language-plaintext highlighter-rouge">KeyboardKitHostPlugin</code> has all the sensitive code needed to resolve the host application, which means that you can choose if you want to include it in your app.</p>

<p>The plugin architecture is an exciting new part of KeyboardKit, and will allow us to build more complex features and integrations outside of the main library, and shield the core library from sensitive code.</p>

<h2 id="swipe-typing">Swipe Typing</h2>

<p>Although KeyboardKit doesn’t include a swipe typing engine, KeyboardKit 11 adds new layout tools and a new <code class="language-plaintext highlighter-rouge">KeyboardViewDragGestureOverlay</code> that makes it possible to swipe over the entire keyboard. You should be able to use these tools to provide a swipe typing engine with enough information to enable it in your app.</p>

<h2 id="feature-updates">Feature Updates</h2>

<p>Besides these large updates, KeyboardKit 11 has MANY other feature-specific updates. Please see the <a href="https://github.com/KeyboardKit/KeyboardKit/releases/tag/11.0.0">release notes</a> for a full list of changes.</p>

<h2 id="conclusion">Conclusion</h2>

<p>KeyboardKit 11 is by far our biggest release ever! It builds upon the many drastic improvements made to the library in the 10.9 minor version lifecycle, and sets a solid foundation for the year to come.</p>

<p>We are so excited to release this next major version, and can’t wait to hear what you think. Don’t hesitate to <a href="mailto:info@keyboardkit.com">reach out</a> with your feedback, and please see the <a href="https://github.com/KeyboardKit/KeyboardKit/releases/tag/11.0.0">release notes</a> for a full list of changes.</p>]]></content><author><name>danielsaidi</name></author><category term="releases" /><summary type="html"><![CDATA[KeyboardKit 11 is out! This major version upgrade is ported to Swift 6.2, and has support for 110+ languages, improved diacritics, new autocomplete &amp; dictation features, a new plugin architecture, and swipe typing tools.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://keyboardkit.com/assets/versions/11_0.jpg" /><media:content medium="image" url="https://keyboardkit.com/assets/versions/11_0.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">KeyboardKit 11 - The Final Beta</title><link href="https://keyboardkit.com/blog/2026/09/27/keyboardkit-11-the-final-beta" rel="alternate" type="text/html" title="KeyboardKit 11 - The Final Beta" /><published>2026-09-27T05:00:00+00:00</published><updated>2026-09-27T05:00:00+00:00</updated><id>https://keyboardkit.com/blog/2026/09/27/keyboardkit-11-the-final-beta</id><content type="html" xml:base="https://keyboardkit.com/blog/2026/09/27/keyboardkit-11-the-final-beta"><![CDATA[<p>KeyboardKit 11 Beta 3 is out! This is the last beta before the scheduled October 1 release of KeyboardKit 11, and introduces support for 111 languages. Give it a try and <a href="mailto:info@keyboardkit.com">let us know what you think</a>.</p>

<p><img src="/assets/versions/11_0-b.jpg" alt="KeyboardKit header image" /></p>

<p><strong>Important</strong> - KeyboardKit 11 Beta 3 is built with Xcode 27. Use Beta 2 if you’re on Xcode 26. The KeyboardKit 11 release will be built with Xcode 26, for maximum compatibility.</p>

<h2 id="banner-theme">Banner Theme</h2>

<p>Let’s start with the most important question. What theme will we use for the KeyboardKit 11 version lifecycle?</p>

<p>After KeyboardKit 10’s focus on Earth, we have discussed a new theme for KeyboardKit 11. We usually release ten versions (11.0-11.9), so perhaps something with ten “things”? We could go with the human hand or foot, but that would only be exciting for the first five versions (joke). Surely, we can do better.</p>

<p>KeyboardKit 11 will therefore take us back to space, but this time closer to home than KeyboardKit 9. This time, we’ll blast through the solar system, starting at our magnificent Sun and ending up at Pluto. And before we start discussing everything in KeyboardKit 11… yes, we count Pluto as a planet. So should you.</p>

<h2 id="major-changes">Major Changes</h2>

<p>KeyboardKit 11 uses Swift 6.2 and strict concurrency. This made it possible to remove a lot of dispatch queues and <code class="language-plaintext highlighter-rouge">MainActor.run</code> code, which makes the library more stable. This work also involved making more types <code class="language-plaintext highlighter-rouge">MainActor</code>, while aiming to keep most of the library unchanged. The <code class="language-plaintext highlighter-rouge">KeyboardContext</code> proxy logic is thus moved to a new main actor-bound <code class="language-plaintext highlighter-rouge">KeyboardControllerContext</code>, to keep the core context versatile.</p>

<p>KeyboardKit 11 almost doubles the number of supported languages, bringing the total to <code class="language-plaintext highlighter-rouge">111</code>. This was made possible by the improved diacritics engine, which now supports combination marks. We have also improved the layout engine and harmonized many layouts, to keep them consistent across configuration changes, and fixed a bunch of incorrect swipe down actions on iPad.</p>

<p>KeyboardKit 11 also adds a new plugin architecture, which lets us move sensitive things like permissions and system API usage, out of the core library. The plugin model is an exciting addition to KeyboardKit that will let us add more capabilities and integrations outside of the core SDK, and making any use of features that require permissions or special APIs an intentional developer choice.</p>

<p>Finally, this version removes deprecated code, ends all experiments, and uses <code class="language-plaintext highlighter-rouge">LocalizedStringResource</code> for UI components localization.</p>

<h2 id="plugins">Plugins</h2>

<p>Another big change is the new plugin architecture that allows us to move sensitive or complex code out of the library, as well as 3rd party integrations.</p>

<p>KeyboardKit 11 ships with two plugins - <code class="language-plaintext highlighter-rouge">KeyboardKitDictationPlugin</code> and <code class="language-plaintext highlighter-rouge">KeyboardKitHostPlugin</code> - as well as a <code class="language-plaintext highlighter-rouge">KeyboardKitAutocompletePlugin</code> placeholder that will ship in an upcoming version.</p>

<h2 id="feature-updates">Feature Updates</h2>

<p>While many features have been adjusted to the concurrency changes mentioned above, you should still feel at home with the overall structure, which doesn’t change all that much.</p>

<h3 id="-package">📦 Package</h3>

<p>KeyboardKit 11 uses Swift 6.2 and strict concurrency, and defines brand new plugin products.</p>

<ul>
  <li>The package now uses Swift 6.2 and strict concurrency.</li>
  <li>The package defines new <code class="language-plaintext highlighter-rouge">KeyboardKit...Plugin</code> products.</li>
  <li>Many types are now <code class="language-plaintext highlighter-rouge">Sendable</code>, and those that need it <code class="language-plaintext highlighter-rouge">@MainActor</code>.</li>
  <li>dSyms are now included in the package - no need for a separate download.</li>
</ul>

<h3 id="-essentials">🌱 Essentials</h3>

<p>KeyboardKit 11 cleans up large parts of the library, and removes parts that were previously soft-deprecated.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">Keyboard.Background</code> and <code class="language-plaintext highlighter-rouge">Keyboard.BackgroundStyle</code> are now separated.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardContext</code> has a new <code class="language-plaintext highlighter-rouge">localePresentationCase</code> that defaults to capitalized.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardControllerContext</code> is a new context type for controller-specific state.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardInputViewController</code> has a new <code class="language-plaintext highlighter-rouge">setPreferredKeyboardCase()</code> function.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardInputViewController</code>’s setup function can now inject autocomplete engines.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardInputViewController</code>’s setup function can now inject a host application resolver.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardState</code> has a new <code class="language-plaintext highlighter-rouge">controllerContext</code> property of type <code class="language-plaintext highlighter-rouge">KeyboardControllerContext</code>.</li>
</ul>

<h3 id="-extensions">🧩 Extensions</h3>

<p>KeyboardKit 11 adds a bunch of new extensions, and cleans up old ones that are no longer used by the library.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">ProcessInfo</code> has a new <code class="language-plaintext highlighter-rouge">isLiquidGlassAvailable</code> extension.</li>
</ul>

<h3 id="-autocomplete">💡 Autocomplete</h3>

<p>The new <code class="language-plaintext highlighter-rouge">KeyboardKitAutocompletePlugin</code> is currently empty, but will be used to define additional autocomplete engines in future KeyboardKit versions.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">KeyboardKitAutocompletePlugin</code> is a new plugin package.</li>
  <li><code class="language-plaintext highlighter-rouge">AutocompleteContext</code> no longer uses dispatch queues to update itself.</li>
  <li><code class="language-plaintext highlighter-rouge">AutocompleteContext</code>’s <code class="language-plaintext highlighter-rouge">isLoading</code> has been removed.</li>
  <li><code class="language-plaintext highlighter-rouge">AutocompleteContext</code> has a new <code class="language-plaintext highlighter-rouge">controllerThrottleInterval</code> property.</li>
  <li><code class="language-plaintext highlighter-rouge">AutocompleteEngine</code> is now public and adjusted to align with the plugin.</li>
  <li><code class="language-plaintext highlighter-rouge">AutocompleteEngineWithDownloadSupport</code> is a new protocol.</li>
  <li><code class="language-plaintext highlighter-rouge">AutocompleteService</code> moves some logic to the engine protocol.</li>
  <li><code class="language-plaintext highlighter-rouge">AutocompleteService</code> has a new <code class="language-plaintext highlighter-rouge">supportedLocales</code> property.</li>
  <li><code class="language-plaintext highlighter-rouge">AutocompleteService</code> has a new <code class="language-plaintext highlighter-rouge">warmUp()</code> function.</li>
  <li><code class="language-plaintext highlighter-rouge">AutocompleteService.autocomplete(_:updating:)</code> is now async throws.</li>
  <li><code class="language-plaintext highlighter-rouge">AutocompleteSettings</code>’ <code class="language-plaintext highlighter-rouge">isAutoLearnEnabled</code> has been removed.</li>
  <li><code class="language-plaintext highlighter-rouge">AutocompleteSettingsScreen</code> has been cleaned up and polished.</li>
  <li><code class="language-plaintext highlighter-rouge">AutocompleteSuggestion</code> now defines a new <code class="language-plaintext highlighter-rouge">.deleteBackwardsCount</code>.</li>
  <li><code class="language-plaintext highlighter-rouge">AutocompleteSuggestion</code>’s <code class="language-plaintext highlighter-rouge">.isUnknown</code> is renamed to <code class="language-plaintext highlighter-rouge">isCurrent</code>.</li>
  <li><code class="language-plaintext highlighter-rouge">AutocompleteSuggestionSource</code> is a new enum with known sources.</li>
  <li><code class="language-plaintext highlighter-rouge">StandardAutocompleteService</code> warms up its engine to avoid a launch hangs.</li>
  <li><code class="language-plaintext highlighter-rouge">StandardAutocompleteService</code> now honors the new delete backwards count.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardInputViewController</code> will use the new context throttle to throttle autocomplete operations.</li>
</ul>

<h3 id="-dictation">🎤 Dictation</h3>

<p>The new <code class="language-plaintext highlighter-rouge">KeyboardKitDictationPlugin</code> makes it a LOT easier to set up dictation. You don’t have to copy any code since the plugin contains everything, and must only add <code class="language-plaintext highlighter-rouge">Info.plist</code> permissions if you use it.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">KeyboardKitDictationPlugin</code> is a new plugin package.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardKit</code> has ways to inject a dictation engine.</li>
  <li><code class="language-plaintext highlighter-rouge">DictationEngine</code> defines a standard implementation in the plugin.</li>
  <li><code class="language-plaintext highlighter-rouge">DictationMethod</code> is removed, since dictation now uses a single method.</li>
  <li><code class="language-plaintext highlighter-rouge">DictationVolumeRecorder</code> and <code class="language-plaintext highlighter-rouge">DictationSpeechRecognizer</code> are now in the plugin.</li>
</ul>

<h3 id="-host-application">🏠 Host Application</h3>

<p>The new <code class="language-plaintext highlighter-rouge">KeyboardKitHostPlugin</code> contains all host application bundle ID logic, including all sensitive system API usages. This means that the system API usage is not completely opt-in for developers.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">KeyboardKitHostApplication</code> is a new plugin package.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardKit</code> has ways to inject a host application resolver.</li>
</ul>

<h3 id="-localization">🌐 Localization</h3>

<p>KeyboardKit 11 view localization now uses <code class="language-plaintext highlighter-rouge">LocalizedStringResource</code> instead of <code class="language-plaintext highlighter-rouge">String</code>. This makes it easier to localize these parts, and will let us localize these components in more locales in later versions.</p>

<ul>
  <li>All screen localization types now use <code class="language-plaintext highlighter-rouge">LocalizedStringResource</code>.</li>
</ul>

<h3 id="️-settings">⚙️ Settings</h3>

<p>KeyboardKit 11 has rewritten the settings store to work better with Swift concurrency.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">KeyboardSettings</code> uses a new thread-safe store resolver.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardSettings</code> now requires a <code class="language-plaintext highlighter-rouge">deviceType</code> when created.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardSettings</code> has new <code class="language-plaintext highlighter-rouge">resetStore(for:)</code> and <code class="language-plaintext highlighter-rouge">resetStore(forAppGroup:)</code> functions.</li>
</ul>

<h3 id="-bug-fixes">🐛 Bug Fixes</h3>

<ul>
  <li><code class="language-plaintext highlighter-rouge">KeyboardAction</code> adjusts the presentation for multi-char currencies like “kr”.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardInputViewController</code> now performs a new autocomplete when the locale changes.</li>
</ul>

<h3 id="-breaking-changes">🚨 Breaking Changes</h3>

<ul>
  <li>All deprecated code has been removed.</li>
  <li><code class="language-plaintext highlighter-rouge">DictationMethod</code> has been removed.</li>
  <li><code class="language-plaintext highlighter-rouge">DictationSpeechRecognizer</code> has been removed.</li>
  <li><code class="language-plaintext highlighter-rouge">DictationVolumeRecorder</code> has been removed.</li>
  <li><code class="language-plaintext highlighter-rouge">GestureButtonScrollState</code> has been removed.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardApp</code>’s <code class="language-plaintext highlighter-rouge">.keyboardSettingsKeyPrefix</code> has been removed.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardContext</code> moves proxy logic to controller context.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardContext</code> moves Liquid Glass logic to <code class="language-plaintext highlighter-rouge">ProcessInfo</code>.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardContext</code>’s <code class="language-plaintext highlighter-rouge">.autocapitalizationTypeOverride</code> has been.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardExperiment</code> has no active experiments.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardExperimentContext</code> has been removed.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardExperimentSettings</code> has been removed.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardHostApplicationProvider</code> has been removed.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardInputViewController</code> lifecycle functions have been reduced.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardInputViewController</code> now syncs to its contexts, not the other way.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardSettings.store</code> and <code class="language-plaintext highlighter-rouge">.storeKeyPrefix</code> are no longer mutable values.</li>
  <li><code class="language-plaintext highlighter-rouge">KeyboardInputViewController</code>’s <code class="language-plaintext highlighter-rouge">.originalTextDocumentProxy</code> is now fully internal.</li>
</ul>

<h2 id="release-process">Release Process</h2>

<p>We are aiming to release KeyboardKit 11 on October 1st, after iOS 27, macOS 27, and Xcode 27 have been released, with some extra time to gather developer feedback.</p>

<h2 id="feedback">Feedback</h2>

<p>We will continue to release refined betas as we bring KeyboardKit 11 closer to release. Make sure to <a href="mailto:info@keyboardkit.com">reach out</a> if you run into problems, or if you have any feedback or suggestions.</p>

<h2 id="conclusion">Conclusion</h2>

<p>KeyboardKit 11 is a big update, and while the concurrency updates are the most prominent change, there are a bunch of things in this release that make it the strongest major update so far.</p>

<p>KeyboardKit 11 sets the direction for the year to come. We hope that you’ll like it and look forward to another exciting major version year. We have so much planned, and can’t wait to share it with you.</p>

<p>For more details, see the <a href="https://github.com/KeyboardKit/KeyboardKit/releases/tag/11.0-b.3">release notes</a> for a full list of changes. Update now to get access to all improvements.</p>]]></content><author><name>danielsaidi</name></author><category term="releases" /><category term="essentials" /><category term="autocomplete" /><category term="dictation" /><category term="host-app" /><category term="localization" /><category term="plugins" /><category term="settings" /><summary type="html"><![CDATA[KeyboardKit 11 Beta 3 is out! This is the last beta before the scheduled October 1 release of KeyboardKit 11, and introduces support for 111 languages. Give it a try and let us know what you think.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://keyboardkit.com/assets/versions/11_0-b.jpg" /><media:content medium="image" url="https://keyboardkit.com/assets/versions/11_0-b.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">A gentle reminder to upgrade to the latest version</title><link href="https://keyboardkit.com/blog/2026/09/23/a-gentle-reminder-to-upgrade-keyboardkit-to-the-latest-version" rel="alternate" type="text/html" title="A gentle reminder to upgrade to the latest version" /><published>2026-09-23T05:00:00+00:00</published><updated>2026-09-23T05:00:00+00:00</updated><id>https://keyboardkit.com/blog/2026/09/23/a-gentle-reminder-to-upgrade-keyboardkit-to-the-latest-version</id><content type="html" xml:base="https://keyboardkit.com/blog/2026/09/23/a-gentle-reminder-to-upgrade-keyboardkit-to-the-latest-version"><![CDATA[<p>With iOS 27 out and with new devices on the way, this is a gentle reminder to upgrade to the <a href="https://github.com/KeyboardKit/KeyboardKit">latest version</a> of KeyboardKit, to fix some problems in the most recent iOS versions.</p>

<h2 id="ios-264---host-application-problems">iOS 26.4 - Host application problems</h2>

<p>By being able to identify the <a href="/faq#terminology">host application</a> a custom keyboard can customize itself for the app that’s using it, and can allow the <a href="/faq#terminology">main application</a> to navigate back to the keyboard, for instance after starting dictation.</p>

<p>The host application bundle ID resolver suddenly stopped working in iOS 26.4. This affected many keyboards, including those that don’t use KeyboardKit. As described in <a href="/blog/2026/08/24/evaluating-a-new-host-application-approach">this post</a>, KeyboardKit 10.9 made this work again.</p>

<h2 id="ios-27---swiftui-gesture-lag">iOS 27 - SwiftUI gesture lag</h2>

<p>As described in <a href="/blog/2026/09/09/gesture-problems-in-ios-27-public-beta">this post</a>, keyboard gestures started lagging in iOS 27. A press action is sometimes delayed until release, or after a ~1s delay. Since the action still triggers, things may seem to work, but typing feels “off”.</p>

<p>KeyboardKit 10.9.4 fixed this by rebuilding the gesture engine from scratch. The new engine feels a lot snappier and keeps the same public API, which means that you get the fix without changing any code.</p>

<h2 id="ios-272-beta---layer-geometry-crashes">iOS 27.2 Beta - Layer geometry crashes</h2>

<p>A developer recently <a href="https://github.com/KeyboardKit/KeyboardKit/issues/1092">reported</a> that their keyboard extension crashed after typing a few words on iOS 27.2 beta, with a <code class="language-plaintext highlighter-rouge">CALayerInvalidGeometry</code> exception caused by a SwiftUI layer with <code class="language-plaintext highlighter-rouge">NaN</code> bounds.</p>

<p>The crash had no application frames at all, which made it very hard to attribute. It turns out that upgrading from KeyboardKit 10.3 to 10.9.5 fixed the problem, without any code changes.</p>

<h2 id="swiftui-freezes">SwiftUI freezes</h2>

<p>Previously working code has begun freezing on later versions of iOS. For instance, enabling the additional input toolbar would trigger an infinite loop, which would result in a blank keyboard.</p>

<p>The input toolbar freeze was caused by a default init parameter, which has been in the code for a very long time. KeyboardKit 10.9.6 fixes this freeze by instead passing in an explicit value.</p>

<h2 id="keyboardkit-11">KeyboardKit 11</h2>

<p>With KeyboardKit 11 being scheduled to release on October 1st, upgrading your application to use the latest version of KeyboardKit will make it a lot easier to migrate to KeyboardKit 11.</p>

<h2 id="conclusion">Conclusion</h2>

<p>KeyboardKit keeps up with changes in iOS so that you don’t have to. Upgrade to the <a href="https://github.com/KeyboardKit/KeyboardKit">latest version</a> to make sure that your keyboard works as well as possible on the latest iOS versions.</p>

<p>If you run into any problems when upgrading, don’t hesitate to <a href="mailto:info@keyboardkit.com">reach out</a>.</p>]]></content><author><name>danielsaidi</name></author><category term="general" /><summary type="html"><![CDATA[With iOS 27 out and with new devices on the way, this is a gentle reminder to upgrade to the latest version of KeyboardKit, to fix some problems in the most recent iOS versions.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://keyboardkit.com/assets/blog/26/0923/image.jpg" /><media:content medium="image" url="https://keyboardkit.com/assets/blog/26/0923/image.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">iPhone Duo and KeyboardKit</title><link href="https://keyboardkit.com/blog/2026/09/20/iphone-duo-and-keyboardkit" rel="alternate" type="text/html" title="iPhone Duo and KeyboardKit" /><published>2026-09-20T05:00:00+00:00</published><updated>2026-09-20T05:00:00+00:00</updated><id>https://keyboardkit.com/blog/2026/09/20/iphone-duo-and-keyboardkit</id><content type="html" xml:base="https://keyboardkit.com/blog/2026/09/20/iphone-duo-and-keyboardkit"><![CDATA[<p>iPhone Duo is here, and with it a bunch of new concepts and form factors. This post takes a quick look at what it will mean for KeyboardKit.</p>

<h2 id="iphone-duo">iPhone Duo</h2>

<p>Since you most probably already know most about the <a href="https://www.apple.com/iphone-duo/">iPhone Duo</a>, we won’t go through it in detail, but in short it’s a smaller device that compensates for it’s shorter height by moving the status bar to the right.</p>

<p><img src="/assets/blog/26/0920//duo-closed.jpg" alt="iPhone Duo Closed" /></p>

<p>The iPhone Duo can then be folded out into twice it’s size, which brings it closer to an iPad in size and behavior.</p>

<p><img src="/assets/blog/26/0920//duo-folded.jpg" alt="iPhone Duo Folded" /></p>

<p>Let’s look at how the Duo’s native keyboard behaves, and compare it to how KeyboardKit behaves on the Duo.</p>

<h2 id="closed-keyboard">Closed Keyboard</h2>

<p>When the Duo is closed, the keyboard is more or less what you’d expect, although a couple of things stand out.</p>

<p><img src="/assets/blog/26/0920//1-native-closed.jpg" alt="Native Keyboard" /></p>

<p>Notice how the globe and dictation buttons are added to the keyboard’s bottom row. This is a new behavior for iPhone, where FaceID devices add these buttons outside the keyboard area. Let’s compare it with KeyboardKit.</p>

<p><img src="/assets/blog/26/0920//1-kk-closed.jpg" alt="KeyboardKit Keyboard" /></p>

<p>While the keyboard looks good, it still behaves like on a regular device and doesn’t add these two buttons to the bottom row. Since the Duo also doesn’t add them, we end up without the buttons altogether. This must be fixed.</p>

<h2 id="folded-keyboard">Folded Keyboard</h2>

<p>When the Duo is folded, we can immediately see a big difference - the keyboard is split around the screen fold!</p>

<p><img src="/assets/blog/26/0920//2-native-folded.jpg" alt="Native Keyboard" /></p>

<p>Apple strongly recommends moving interactive elements away from the fold, and the keyboard is no exception. Also notice that the globe and dictation buttons are now outside the keyboard. Let’s compare with KeyboardKit.</p>

<p><img src="/assets/blog/26/0920//2-kk-folded.jpg" alt="KeyboardKit Keyboard" /></p>

<p>Since KeyboardKit still behaves like on a regular device, it renders with the landscape configuration, which leads to smaller keys. It also doesn’t split the keyboard in two, but it <em>does</em> get the globe and dictation buttons.</p>

<h2 id="open-keyboard">Open Keyboard</h2>

<p>When the Duo is folded open, things start to behave like normal again. We get a solid landscape keyboard with the globe and dictation buttons placed outside the keyboard.</p>

<p><img src="/assets/blog/26/0920//3-native-open.jpg" alt="Native Keyboard" /></p>

<p>However, notice how the rows are a bit uneven, with different width. Let’s compare it with the old design, which is still used in the KeyboardKit keyboard.</p>

<p><img src="/assets/blog/26/0920//3-kk-open.jpg" alt="KeyboardKit Keyboard" /></p>

<p>This works, but the keyboard behaves like on a regular device, with shorter keys, smaller font, and with all rows except the second being even in width.</p>

<h2 id="conclusion">Conclusion</h2>

<p>The iPhone Duo forces us all to adjust our apps to its new form factors, and KeyboardKit is no different. We will tweak the keyboard layout and sizes to the new configurations, and start looking at a split layout.</p>

<p>This work will begin after the KeyboardKit 11 release, which is scheduled for October 1. After that, we hope to get support out shortly after the Duo has been released.</p>]]></content><author><name>danielsaidi</name></author><category term="general" /><summary type="html"><![CDATA[iPhone Duo is here, and with it a bunch of new concepts and form factors. This post takes a quick look at what it will mean for KeyboardKit.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://keyboardkit.com/assets/blog/26/0920/image.jpg" /><media:content medium="image" url="https://keyboardkit.com/assets/blog/26/0920/image.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Autocomplete changes in iOS 27</title><link href="https://keyboardkit.com/blog/2026/09/15/autocomplete-changes-in-ios27" rel="alternate" type="text/html" title="Autocomplete changes in iOS 27" /><published>2026-09-15T06:00:00+00:00</published><updated>2026-09-15T06:00:00+00:00</updated><id>https://keyboardkit.com/blog/2026/09/15/autocomplete-changes-in-ios27</id><content type="html" xml:base="https://keyboardkit.com/blog/2026/09/15/autocomplete-changes-in-ios27"><![CDATA[<p>iOS 27 is finally out, and it affects the tool we use to implement autocomplete in KeyboardKit. The tool supports 5 brand new locales, improves 2 locales, changes many others…and sadly breaks 3 locales.</p>

<h2 id="background">Background</h2>

<p>KeyboardKit’s autocomplete engine is built on top of Apple’s on-device technologies, which means that the set of languages that it can autocomplete is determined by the OS, not by KeyboardKit.</p>

<p>When Apple adds or removes languages from the on-device tools, KeyboardKit’s autocomplete changes with it. This is mostly a good thing, since KeyboardKit evolves with the platform, but it also means that things can break.</p>

<p>iOS 27 makes a few such changes, both good and bad, that affects KeyboardKit without any changes on our end.</p>

<h2 id="new-locales">New Locales</h2>

<p>iOS 27 adds support for the following locales:</p>

<ul>
  <li>🇵🇭 <code class="language-plaintext highlighter-rouge">en_PH</code> - English (Philippines)</li>
  <li>🇯🇵 <code class="language-plaintext highlighter-rouge">ja_JP</code> - Japanese</li>
  <li>🇰🇷 <code class="language-plaintext highlighter-rouge">ko_KR</code> - Korean</li>
  <li>🇨🇳 <code class="language-plaintext highlighter-rouge">zh_Hans</code> - Chinese (Simplified)</li>
  <li>🇹🇼 <code class="language-plaintext highlighter-rouge">zh_Hant</code> - Chinese (Traditional)</li>
</ul>

<p>Japanese, Korean, and Chinese are big additions, since these are some of the most requested languages that we are yet to support. While autocomplete is not the same as a full input support, it’s a big step forward.</p>

<h2 id="improved-locales">Improved Locales</h2>

<p>iOS 27 improves autocomplete for the following locales:</p>

<ul>
  <li>🇧🇬 <code class="language-plaintext highlighter-rouge">bg</code> - Bulgarian</li>
  <li>🇮🇱 <code class="language-plaintext highlighter-rouge">he_IL</code> - Hebrew (Israel)</li>
</ul>

<p>While these locales were supported before, we find suggestions &amp; corrections to be noticeably better in iOS 27.</p>

<h2 id="broken-locales">Broken Locales</h2>

<p>Unfortunately, iOS 27 breaks autocomplete for the following locales:</p>

<ul>
  <li>🇬🇷 <code class="language-plaintext highlighter-rouge">el</code> - Greek</li>
  <li>🇭🇺 <code class="language-plaintext highlighter-rouge">hu</code> - Hungarian</li>
  <li>🇮🇸 <code class="language-plaintext highlighter-rouge">is</code> - Icelandic</li>
</ul>

<p>These languages still work in iOS 26 and earlier, but no longer returns any suggestions in iOS 27. Since this is a system change, there’s nothing KeyboardKit can do to restore the support, other than to report it to Apple.</p>

<p>If your keyboard targets any of these languages, you may want to verify how your keyboard behaves in iOS 27, and consider a remote autocomplete service or a custom <code class="language-plaintext highlighter-rouge">AutocompleteService</code> as a fallback.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Since KeyboardKit’s local autocomplete relies on the system text checker, the language support keeps changing with each new iOS version. This means things will improve over time, but that things may also break.</p>

<p>If you notice any other changes in iOS 27, or have any feedback on the <a href="https://github.com/KeyboardKit/KeyboardKit/releases/tag/11.0-b.1">KeyboardKit 11 beta</a>, please <a href="mailto:info@keyboardkit.com">reach out</a>.</p>]]></content><author><name>danielsaidi</name></author><category term="autocomplete" /><category term="apple-bugs" /><summary type="html"><![CDATA[iOS 27 is finally out, and it affects the tool we use to implement autocomplete in KeyboardKit. The tool supports 5 brand new locales, improves 2 locales, changes many others…and sadly breaks 3 locales.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://keyboardkit.com/assets/blog/26/0915/image-autocomplete.jpg" /><media:content medium="image" url="https://keyboardkit.com/assets/blog/26/0915/image-autocomplete.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">KeyboardKit 11 Documentation</title><link href="https://keyboardkit.com/blog/2026/09/15/keyboardkit-11-documentation" rel="alternate" type="text/html" title="KeyboardKit 11 Documentation" /><published>2026-09-15T05:00:00+00:00</published><updated>2026-09-15T05:00:00+00:00</updated><id>https://keyboardkit.com/blog/2026/09/15/keyboardkit-11-documentation</id><content type="html" xml:base="https://keyboardkit.com/blog/2026/09/15/keyboardkit-11-documentation"><![CDATA[<p>The first KeyboardKit 11 documentation is now available as a downloadable DocC documentation archive from the <a href="https://github.com/KeyboardKit/KeyboardKit/releases/tag/11.0-b.1">beta release page</a>.</p>

<h2 id="documentation-changes">Documentation Changes</h2>

<p>The KeyboardKit 11 documentation is updated with regards to the removed, deprecated code, and all the new features in the next major KeyboardKit release.</p>

<p>For instance, the documentation has been updated with information on how to enable host application resolving with the new <code class="language-plaintext highlighter-rouge">KeyboardKitHostPlugin</code> and dictation with the new <code class="language-plaintext highlighter-rouge">KeyboardKitDictationPlugin</code>.</p>

<p>Since the SDK is simplified in KeyboardKit 11, the updated documentation also removes some developer guides, and instead simplifies the information and puts it directly in the feature article.</p>

<h2 id="expected-release">Expected Release</h2>

<p>The <a href="https://docs.keyboardkit.com">online documentation</a> is still built for KeyboardKit 10, but the updated documentation will replace it as soon as KeyboardKit 11 is released.</p>

<p>We expect to release KeyboardKit 11.0 on October 1st. Don’t hesistate to <a href="mailto:info@keyboardkit.com">reach out</a> if you have any feedback on the <a href="https://github.com/KeyboardKit/KeyboardKit/releases/tag/11.0-b.1">beta release</a> or the new documentation.</p>]]></content><author><name>danielsaidi</name></author><category term="documentation" /><summary type="html"><![CDATA[The first KeyboardKit 11 documentation is now available as a downloadable DocC documentation archive from the beta release page.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://keyboardkit.com/assets/blog/26/0915/image.jpg" /><media:content medium="image" url="https://keyboardkit.com/assets/blog/26/0915/image.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>