KeyboardKit 11 - The Final Beta
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.

Important - 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.
Banner Theme
Let’s start with the most important question. What theme will we use for the KeyboardKit 11 version lifecycle?
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.
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.
Major Changes
KeyboardKit 11 uses Swift 6.2 and strict concurrency. This made it possible to remove a lot of dispatch queues and MainActor.run code, which makes the library more stable. This work also involved making more types MainActor, while aiming to keep most of the library unchanged. The KeyboardContext proxy logic is thus moved to a new main actor-bound KeyboardControllerContext, to keep the core context versatile.
KeyboardKit 11 almost doubles the number of supported languages, bringing the total to 111. 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.
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.
Finally, this version removes deprecated code, ends all experiments, and uses LocalizedStringResource for UI components localization.
Plugins
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.
KeyboardKit 11 ships with two plugins - KeyboardKitDictationPlugin and KeyboardKitHostPlugin - as well as a KeyboardKitAutocompletePlugin placeholder that will ship in an upcoming version.
Feature Updates
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.
📦 Package
KeyboardKit 11 uses Swift 6.2 and strict concurrency, and defines brand new plugin products.
- The package now uses Swift 6.2 and strict concurrency.
- The package defines new
KeyboardKit...Pluginproducts. - Many types are now
Sendable, and those that need it@MainActor. - dSyms are now included in the package - no need for a separate download.
🌱 Essentials
KeyboardKit 11 cleans up large parts of the library, and removes parts that were previously soft-deprecated.
Keyboard.BackgroundandKeyboard.BackgroundStyleare now separated.KeyboardContexthas a newlocalePresentationCasethat defaults to capitalized.KeyboardControllerContextis a new context type for controller-specific state.KeyboardInputViewControllerhas a newsetPreferredKeyboardCase()function.KeyboardInputViewController’s setup function can now inject autocomplete engines.KeyboardInputViewController’s setup function can now inject a host application resolver.KeyboardStatehas a newcontrollerContextproperty of typeKeyboardControllerContext.
🧩 Extensions
KeyboardKit 11 adds a bunch of new extensions, and cleans up old ones that are no longer used by the library.
ProcessInfohas a newisLiquidGlassAvailableextension.
💡 Autocomplete
The new KeyboardKitAutocompletePlugin is currently empty, but will be used to define additional autocomplete engines in future KeyboardKit versions.
KeyboardKitAutocompletePluginis a new plugin package.AutocompleteContextno longer uses dispatch queues to update itself.AutocompleteContext’sisLoadinghas been removed.AutocompleteContexthas a newcontrollerThrottleIntervalproperty.AutocompleteEngineis now public and adjusted to align with the plugin.AutocompleteEngineWithDownloadSupportis a new protocol.AutocompleteServicemoves some logic to the engine protocol.AutocompleteServicehas a newsupportedLocalesproperty.AutocompleteServicehas a newwarmUp()function.AutocompleteService.autocomplete(_:updating:)is now async throws.AutocompleteSettings’isAutoLearnEnabledhas been removed.AutocompleteSettingsScreenhas been cleaned up and polished.AutocompleteSuggestionnow defines a new.deleteBackwardsCount.AutocompleteSuggestion’s.isUnknownis renamed toisCurrent.AutocompleteSuggestionSourceis a new enum with known sources.StandardAutocompleteServicewarms up its engine to avoid a launch hangs.StandardAutocompleteServicenow honors the new delete backwards count.KeyboardInputViewControllerwill use the new context throttle to throttle autocomplete operations.
🎤 Dictation
The new KeyboardKitDictationPlugin 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 Info.plist permissions if you use it.
KeyboardKitDictationPluginis a new plugin package.KeyboardKithas ways to inject a dictation engine.DictationEnginedefines a standard implementation in the plugin.DictationMethodis removed, since dictation now uses a single method.DictationVolumeRecorderandDictationSpeechRecognizerare now in the plugin.
🏠 Host Application
The new KeyboardKitHostPlugin 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.
KeyboardKitHostApplicationis a new plugin package.KeyboardKithas ways to inject a host application resolver.
🌐 Localization
KeyboardKit 11 view localization now uses LocalizedStringResource instead of String. This makes it easier to localize these parts, and will let us localize these components in more locales in later versions.
- All screen localization types now use
LocalizedStringResource.
⚙️ Settings
KeyboardKit 11 has rewritten the settings store to work better with Swift concurrency.
KeyboardSettingsuses a new thread-safe store resolver.KeyboardSettingsnow requires adeviceTypewhen created.KeyboardSettingshas newresetStore(for:)andresetStore(forAppGroup:)functions.
🐛 Bug Fixes
KeyboardActionadjusts the presentation for multi-char currencies like “kr”.KeyboardInputViewControllernow performs a new autocomplete when the locale changes.
🚨 Breaking Changes
- All deprecated code has been removed.
DictationMethodhas been removed.DictationSpeechRecognizerhas been removed.DictationVolumeRecorderhas been removed.GestureButtonScrollStatehas been removed.KeyboardApp’s.keyboardSettingsKeyPrefixhas been removed.KeyboardContextmoves proxy logic to controller context.KeyboardContextmoves Liquid Glass logic toProcessInfo.KeyboardContext’s.autocapitalizationTypeOverridehas been.KeyboardExperimenthas no active experiments.KeyboardExperimentContexthas been removed.KeyboardExperimentSettingshas been removed.KeyboardHostApplicationProviderhas been removed.KeyboardInputViewControllerlifecycle functions have been reduced.KeyboardInputViewControllernow syncs to its contexts, not the other way.KeyboardSettings.storeand.storeKeyPrefixare no longer mutable values.KeyboardInputViewController’s.originalTextDocumentProxyis now fully internal.
Release Process
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.
Feedback
We will continue to release refined betas as we bring KeyboardKit 11 closer to release. Make sure to reach out if you run into problems, or if you have any feedback or suggestions.
Conclusion
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.
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.
For more details, see the release notes for a full list of changes. Update now to get access to all improvements.
Discussions & More
If you found this interesting, please share your thoughts on Bluesky and Mastodon. Make sure to follow to be notified when new content is published.