Repository navigation
Releases: KeyboardKit/KeyboardKit
Release list
11.0.3
This version makes the KeyboardAppHomeScreen support the iPhone Duo.
📱 App
KeyboardAppHomeScreencan now inject a customcontentview builder.KeyboardAppHomeScreencan now inject aselectionandsplitViewColumnVisibility.KeyboardAppHomeScreenItemis a new enum that describes all home screen list menu items.KeyboardAppHomeScreenDetailis a new content view that renders defaultKeyboardAppHomeScreenItemcontent.KeyboardAppHomeScreenSplitViewModeis a new enum that can be used to set how the screen adapts to split view.KeyboardAppHomeScreenStylehas a newsidebarBackgroundColorthat can be used to customize the sidebar background.
⚙️ Settings
KeyboardSettingsScreennow shows a keyboard status section if needed.
🩺 Status
KeyboardStatusSectionStyleis renamed toKeyboardStatusSectionVisibility.KeyboardStatusSectionVisibilityno longer applies the system settings values.
11.0.2
This version makes the KeyboardAppHomeScreen support the iPhone Duo.
📱 App
KeyboardAppHomeScreencan now inject a customcontentview builder.KeyboardAppHomeScreencan now inject aselectionandsplitViewColumnVisibility.KeyboardAppHomeScreenItemis a new enum that describes all home screen list menu items.KeyboardAppHomeScreenDetailis a new content view that renders defaultKeyboardAppHomeScreenItemcontent.KeyboardAppHomeScreenSplitViewModeis a new enum that can be used to set how the screen adapts to split view.KeyboardAppHomeScreenStylehas a newsidebarBackgroundColorthat can be used to customize the sidebar background.
⚙️ Settings
KeyboardSettingsScreennow shows a keyboard status section if needed.
🩺 Status
KeyboardStatusSectionStyleis renamed toKeyboardStatusSectionVisibility.KeyboardStatusSectionVisibilityno longer applies the system settings values.
11.0.1
KeyboardKit 11 uses Swift 6.2 and strict concurrency. This made it possible to remove a lot of dispatch 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 locales, bringing the total to 111. This is made possible by the improved diacritics engines, which now supports combination 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.
KeyboardKit 11 also 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.
Finally, this version removes deprecated code, ends all experiments, and uses LocalizedStringResource for UI components localization.
💡 Biggest Changes
The biggest structural changes in KeyboardKit 11 that will most likely affect you, is how controller-related state has been moved from the keyboard context to the new controller context, and how dictation and host application detection now requires plugins to be enabled.
📦 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 types that need it are now@MainActor. - dSYMs are now included in the package, so there's no need for a separate download.
🌱 Essentials
KeyboardKit 11 cleans up large parts of the library and adds new, powerful diacritic support.
Keyboard.BackgroundStyleis a new, separate background style type.Keyboard.Diacritichas new Apache, Choctaw, Hawaiian, Hebrew, Navajo, and Samoan variants.Keyboard.Diacritichas newcombiningMarkreplacement support.Keyboard.DiacriticInsertionResulthas been renamed toDiacriticReplacement.Keyboard.Diacritic.CombiningMarkis a new type with common combining marks.Keyboard.SpacebarMenuTitlecan now render an image.Keyboard.SpacebarMenuTypehas a newlayoutmenu that switches between the current locale's layout types.Keyboard.SpacebarMenuTypehas a newdockEdgemenu that switches the one-handed keyboard dock edge.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.KeyboardSettings.isUndoManagerEnabledis nowtrueby default.KeyboardStatehas a newcontrollerContextproperty of typeKeyboardControllerContext.KeyboardViewDragGestureOverlayis a new view that maps drag gestures to layout items.KeyboardViewDragGestureOverlayStyleis a new style that can be applied with.keyboardViewDragGestureOverlayStyle(_:).
💥 Actions
KeyboardKit 11 doesn't change the action model in any significant way.
KeyboardActionhas a newisDiacriticActionproperty.
📱 App
KeyboardKit 11 adds new ways to instruct users how to return to the keyboard.
KeyboardAppOpenReasonMessageis a new message struct.KeyboardAppOpenReasonMessageViewis a new message view.
💡 Autocomplete
The new KeyboardKitAutocompletePlugin 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.isLoadingproperty has 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 nowasync throws.AutocompleteSettings.isAutoLearnEnabledhas been removed.AutocompleteSettingsScreenhas been cleaned up and polished.AutocompleteSuggestionhas a newdeleteBackwardsCountproperty.AutocompleteSuggestion.isUnknownhas been renamed toisCurrent.AutocompleteSuggestionSourceis a new enum with known sources.StandardAutocompleteServicewarms up its engine to avoid launch hangs.StandardAutocompleteServicenow honors the new delete backwards count.KeyboardInputViewControllernow uses the new throttle interval to throttle autocomplete operations.
🎤 Dictation
The new KeyboardKitDictationPlugin makes it a lot easier to set up dictation, and isolates permissions to the plugin.
KeyboardKitDictationPluginis a new plugin package.KeyboardKithas new ways to inject a dictation engine.DictationEnginedefines a standard implementation in the plugin.DictationKeyboardOverlaynow enforces theDictationSettings.silenceLimit.DictationMethodhas been removed, since dictation now uses a single method.DictationVolumeRecorderandDictationSpeechRecognizerhave moved to the plugin.KeyboardAppViewcan now inject a dictation engine, instead of.keyboardDictation(withEngine:).PluginDictationEnginefixes some audio session warnings by moving to async AVFoundation APIs.StandardDictationServicehas a newtryToReturnToKeyboardAfterStartingDictation(with:)function.StandardDictationServicehas a newshouldTryToReturnToKeyboardAfterStartingDictationproperty.StandardDictationServicehas been adjusted to apply a new locale if it changes while the session is idle.
🏠 Host Application
The new KeyboardKitHostPlugin contains all host application bundle ID logic, and isolates system API usage to the plugin.
KeyboardKitHostPluginis a new plugin package.KeyboardKithas new ways to inject a host application resolver.
🔣 Layout
This version harmonizes many layouts to keep them consistent across configuration changes.
- Numeric iPad layouts adjust the bottom right keys to enable swipe down.
- All layouts with 3 and 4 input rows now have the same total height.
KeyboardLayouthas newitemFrames,item(at:)andaction(at:)functions.
🌐 Localization
This version adds support for new locales, bringing the total number of supported locales to 111.
- New supported locales:
AfrikaansBasque (France)Basque (Spain)BosnianEnglish (South Africa)EsperantoGalician (Spain)KalaallisutKyrgyzMāoriRomanshSamoanTurkmenYiddishZulu
- New supported Indigenous North American locales:
ApacheBlackfootChickasawChochenyoChoctawComancheKiowaLushootseedMvskokeNez PerceOsageSalishWixarika
- New supported Sámi locales:
Kildin SámiLule SámiPite SámiSkolt SámiSouth SámiUme Sámi
This version also updates locale information and localized input logic.
KeyboardSettingsscreens now usesLocalizedStringResource.Localeno longer defines aflagand its list items just show text.
📄 Proxy
This version removes some task wrappers around async operations.
UITextDocumentProxyhas newdeleteFullDocumentContextfunctions.UITextDocumentProxy.moveTextInputCursorfunctions are now async throws.
⚙️ Settings
KeyboardKit 11 rewrites 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.KeyboardSettingsScreenhas a new top keyboards section that links to the language settings screen.
🇻🇳 Vietnamese
KeyboardKit 11 drastically improves the Vietnamese input support.
Vietnamese.Diacritichas newcombiningMarkandcombiningMarkCharsproperties.Vietnamese.Diacritic.CombiningMarkmirrors the baseKeyboard.Diacritic.CombiningMark.Vietnamese.Diacritic.mũ,mócandtrăngcan now be applied to vowels with tones, e.g.á+a=>ấ.Vietnamese.Diacritic.mũandmóccan now replace each other, e.g.ô+w=>ơ, just likemũandtrăng.VietnameseInputEnginecan now apply tones to full words, e.g.Tuân+sbecomesTuấnandmoi+jbecomesmọi.
💥 Breaking changes
Vietnamese.allDiacriticVariantsFor*andVietnamese.allDiacriticVowelVariantshave been removed.
🐛 Bug Fixes
KeyboardActionadjusts the font for currencies like "kr".KeyboardInputViewControllernow performs autocomplete on locale change.KeyboardLayouthas been fixed for Hawaiian, by applying a proper macron.
🚨 Breaking Changes
DictationMethodhas been removed.DictationSpeechRecognizerhas moved to the dictation plugin.- `Dictation...
11.0.0
KeyboardKit 11 uses Swift 6.2 and strict concurrency. This made it possible to remove a lot of dispatch 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 locales, bringing the total to 111. This is made possible by the improved diacritics engines, which now supports combination 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.
KeyboardKit 11 also 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.
Finally, this version removes deprecated code, ends all experiments, and uses LocalizedStringResource for UI components localization.
💡 Biggest Changes
The biggest structural changes in KeyboardKit 11 that will most likely affect you, is how controller-related state has been moved from the keyboard context to the new controller context, and how dictation and host application detection now requires plugins to be enabled.
📦 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 types that need it are now@MainActor. - dSYMs are now included in the package, so there's no need for a separate download.
🌱 Essentials
KeyboardKit 11 cleans up large parts of the library and adds new, powerful diacritic support.
Keyboard.BackgroundStyleis a new, separate background style type.Keyboard.Diacritichas new Apache, Choctaw, Hawaiian, Hebrew, Navajo, and Samoan variants.Keyboard.Diacritichas newcombiningMarkreplacement support.Keyboard.DiacriticInsertionResulthas been renamed toDiacriticReplacement.Keyboard.Diacritic.CombiningMarkis a new type with common combining marks.Keyboard.SpacebarMenuTitlecan now render an image.Keyboard.SpacebarMenuTypehas a newlayoutmenu that switches between the current locale's layout types.Keyboard.SpacebarMenuTypehas a newdockEdgemenu that switches the one-handed keyboard dock edge.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.KeyboardSettings.isUndoManagerEnabledis nowtrueby default.KeyboardStatehas a newcontrollerContextproperty of typeKeyboardControllerContext.KeyboardViewDragGestureOverlayis a new view that maps drag gestures to layout items.KeyboardViewDragGestureOverlayStyleis a new style that can be applied with.keyboardViewDragGestureOverlayStyle(_:).
💥 Actions
KeyboardKit 11 doesn't change the action model in any significant way.
KeyboardActionhas a newisDiacriticActionproperty.
📱 App
KeyboardKit 11 adds new ways to instruct users how to return to the keyboard.
KeyboardAppOpenReasonMessageis a new message struct.KeyboardAppOpenReasonMessageViewis a new message view.
💡 Autocomplete
The new KeyboardKitAutocompletePlugin 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.isLoadingproperty has 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 nowasync throws.AutocompleteSettings.isAutoLearnEnabledhas been removed.AutocompleteSettingsScreenhas been cleaned up and polished.AutocompleteSuggestionhas a newdeleteBackwardsCountproperty.AutocompleteSuggestion.isUnknownhas been renamed toisCurrent.AutocompleteSuggestionSourceis a new enum with known sources.StandardAutocompleteServicewarms up its engine to avoid launch hangs.StandardAutocompleteServicenow honors the new delete backwards count.KeyboardInputViewControllernow uses the new throttle interval to throttle autocomplete operations.
🎤 Dictation
The new KeyboardKitDictationPlugin makes it a lot easier to set up dictation, and isolates permissions to the plugin.
KeyboardKitDictationPluginis a new plugin package.KeyboardKithas new ways to inject a dictation engine.DictationEnginedefines a standard implementation in the plugin.DictationKeyboardOverlaynow enforces theDictationSettings.silenceLimit.DictationMethodhas been removed, since dictation now uses a single method.DictationVolumeRecorderandDictationSpeechRecognizerhave moved to the plugin.StandardDictationServicehas a newshouldTryToReturnToKeyboardAfterStartingDictationproperty.StandardDictationServicehas a newtryToReturnToKeyboardAfterStartingDictation(with:)function.
🏠 Host Application
The new KeyboardKitHostPlugin contains all host application bundle ID logic, and isolates system API usage to the plugin.
KeyboardKitHostPluginis a new plugin package.KeyboardKithas new ways to inject a host application resolver.
🔣 Layout
This version harmonizes many layouts to keep them consistent across configuration changes.
- Numeric iPad layouts adjust the bottom right keys to enable swipe down.
- All layouts with 3 and 4 input rows now have the same total height.
KeyboardLayouthas newitemFrames,item(at:)andaction(at:)functions.
🌐 Localization
This version adds support for new locales, bringing the total number of supported locales to 111.
- New supported locales:
AfrikaansBasque (France)Basque (Spain)BosnianEnglish (South Africa)EsperantoGalician (Spain)KalaallisutKyrgyzMāoriRomanshSamoanTurkmenYiddishZulu
- New supported Indigenous North American locales:
ApacheBlackfootChickasawChochenyoChoctawComancheKiowaLushootseedMvskokeNez PerceOsageSalishWixarika
- New supported Sámi locales:
Kildin SámiLule SámiPite SámiSkolt SámiSouth SámiUme Sámi
This version also updates locale information and localized input logic.
KeyboardSettingsscreens now usesLocalizedStringResource.Localeno longer defines aflagand its list items just show text.
📄 Proxy
This version removes some task wrappers around async operations.
UITextDocumentProxyhas newdeleteFullDocumentContextfunctions.UITextDocumentProxy.moveTextInputCursorfunctions are now async throws.
⚙️ Settings
KeyboardKit 11 rewrites 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.KeyboardSettingsScreenhas a new top keyboards section that links to the language settings screen.
🇻🇳 Vietnamese
KeyboardKit 11 drastically improves the Vietnamese input support.
Vietnamese.Diacritichas newcombiningMarkandcombiningMarkCharsproperties.Vietnamese.Diacritic.CombiningMarkmirrors the baseKeyboard.Diacritic.CombiningMark.Vietnamese.Diacritic.mũ,mócandtrăngcan now be applied to vowels with tones, e.g.á+a=>ấ.Vietnamese.Diacritic.mũandmóccan now replace each other, e.g.ô+w=>ơ, just likemũandtrăng.VietnameseInputEnginecan now apply tones to full words, e.g.Tuân+sbecomesTuấnandmoi+jbecomesmọi.
💥 Breaking changes
Vietnamese.allDiacriticVariantsFor*andVietnamese.allDiacriticVowelVariantshave been removed.
🐛 Bug Fixes
KeyboardActionadjusts the font for currencies like "kr".KeyboardInputViewControllernow performs autocomplete on locale change.KeyboardLayouthas been fixed for Hawaiian, by applying a proper macron.
🚨 Breaking Changes
DictationMethodhas been removed.DictationSpeechRecognizerhas moved to the dictation plugin.DictationVolumeRecorderhas moved to the dictation plugin.GestureButtonScrollStatehas been removed.KeyboardApp.keyboardSettingsKeyPrefixhas been removed.KeyboardAppHomeScreenseparates keyboard settings from feature settings.KeyboardAppHomeScreensettingsSection*localization and visibil...
10.9.7
This version rebuilds 10.9.6 with Xcode 26.
10.9.6
This version fixes a thread hang when enabling a custom input toolbar in iOS 27.
🏠 Host
KeyboardHostApplicationPickernow specializedKeyboardSettingsPicker.
🐛 Bug Fixes
KeyboardLayoutno longer uses a.previewcontext default parameter, since that now causes a loop.
11.0-b.3
Important
KeyboardKit 11.0 Beta 3 is built with Xcode 27. If you're on Xcode 26 or earlier, use KeyboardKit 11.0 Beta 2.
KeyboardKit 11 uses Swift 6.2 and strict concurrency. This made it possible to remove a lot of dispatch 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 locales, bringing the total to 111. This is made possible by the improved diacritics engines, which now supports combination 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.
KeyboardKit 11 also 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.
Finally, this version removes deprecated code, ends all experiments, and uses LocalizedStringResource for UI components localization.
📦 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 types that need it are now@MainActor. - dSYMs are now included in the package, so there's no need for a separate download.
🌱 Essentials
KeyboardKit 11 cleans up large parts of the library and adds new, powerful diacritic support.
Keyboard.BackgroundStyleis a new, separate background style type.Keyboard.Diacritichas new Apache, Choctaw, Hawaiian, Hebrew, Navajo, and Samoan variants.Keyboard.Diacritichas newcombiningMarkreplacement support.Keyboard.Diacritic.CombiningMarkis a new type with common combining marks.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.KeyboardSettings.isUndoManagerEnabledis nowtrueby default.KeyboardStatehas a newcontrollerContextproperty of typeKeyboardControllerContext.
💥 Actions
KeyboardKit 11 doesn't change the action model in any significant way.
KeyboardActionhas a newisDiacriticActionproperty.
💡 Autocomplete
The new KeyboardKitAutocompletePlugin 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.isLoadingproperty has 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 nowasync throws.AutocompleteSettings.isAutoLearnEnabledhas been removed.AutocompleteSettingsScreenhas been cleaned up and polished.AutocompleteSuggestionhas a newdeleteBackwardsCountproperty.AutocompleteSuggestion.isUnknownhas been renamed toisCurrent.AutocompleteSuggestionSourceis a new enum with known sources.StandardAutocompleteServicewarms up its engine to avoid launch hangs.StandardAutocompleteServicenow honors the new delete backwards count.KeyboardInputViewControllernow uses the new throttle interval to throttle autocomplete operations.
🎤 Dictation
The new KeyboardKitDictationPlugin makes it a lot easier to set up dictation, and isolates permissions to the plugin.
KeyboardKitDictationPluginis a new plugin package.KeyboardKithas new ways to inject a dictation engine.DictationEnginedefines a standard implementation in the plugin.DictationMethodhas been removed, since dictation now uses a single method.DictationVolumeRecorderandDictationSpeechRecognizerhave moved to the plugin.
🏠 Host Application
The new KeyboardKitHostPlugin contains all host application bundle ID logic, and isolates system API usage to the plugin.
KeyboardKitHostPluginis a new plugin package.KeyboardKithas new ways to inject a host application resolver.
🔣 Layout
This version harmonizes many layouts to keep them consistent across configuration changes.
- Numeric iPad layouts adjust the bottom right keys to enable swipe down.
- All layouts with 3 and 4 input rows now have the same total height.
🌐 Localization
This version adds support for new locales, bringing the total number of supported locales to 111.
- New supported locales:
AfrikaansBasque (France)Basque (Spain)BosnianEnglish (South Africa)EsperantoGalician (Spain)KalaallisutKyrgyzMāoriRomanshSamoanTurkmenYiddishZulu
- New supported Indigenous North American locales:
ApacheBlackfootChickasawChochenyoChoctawComancheKiowaLushootseedMvskokeNez PerceOsageSalishWixarika
- New supported Sámi locales:
Kildin SámiLule SámiPite SámiSkolt SámiSouth SámiUme Sámi
- This version removes the
flagproperty for all locales. - Most localization now uses
LocalizedStringResource.
⚙️ Settings
KeyboardKit 11 rewrites 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 font for currencies like "kr".KeyboardInputViewControllernow performs autocomplete on locale change.KeyboardLayouthas been fixed for Hawaiian, by applying a proper macron.
🚨 Breaking Changes
DictationMethodhas been removed.DictationSpeechRecognizerhas moved to the dictation plugin.DictationVolumeRecorderhas moved to the dictation plugin.GestureButtonScrollStatehas been removed.KeyboardApp.keyboardSettingsKeyPrefixhas been removed.KeyboardContextmoves proxy logic toKeyboardControllerContext.KeyboardContextmoves Liquid Glass logic toProcessInfo.KeyboardContext.autocapitalizationTypeOverridehas been removed.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 around.KeyboardInputViewController.originalTextDocumentProxyis now fully internal.KeyboardSettings.storeand.storeKeyPrefixare no longer mutable.Locale.flaghas been removed.Locale.keyboardKitNamehas been removed.
11.0-b.2
Overview
KeyboardKit 11 bumps uses Swift 6.2 and strict concurrency. This helped us removing a lot of dispatch queue and MainActor.run code, which makes the keyboard engine more stable and thread-safe.
This version moves all proxy logic from the KeyboardContext to a new KeyboardControllerContext, which separates main actor state from the rest. This keeps the keyboard context versatile and easier to manage.
This version adds a new plugin architecture that lets us move sensitive code out of the core library. There are currently three plugins - KeyboardKitAutocompletePlugin, KeyboardKitDictationPlugin and KeyboardKitHostPlugin. See more in each feature section.
The plugin model is an exciting new part of KeyboardKit, and will allow us to add an extended ecosystem of capabilities to the SDK, and let you use the parts that you need.
Finally, this version removes deprecated code, ends all ongoing experiments, and makes localization use LocalizedStringResource.
Documentation
The KeyboardKit 11 beta documentation can be downloaded as a DocC archive zip file further down on this page.
Features
Here are some of the new things, separated into features.
📦 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 may remove 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.
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 you need, and you must only add Info.plist permissions if you use the plugin.
- is 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.
🐛 Big 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.
10.9.5
This version fixes a scroll view blur bug in iOS 27.
11.0-b.1
Overview
This version bumps the package to Swift 6.2 and strict concurrency. This helped us removing a lot of dispatch queue and MainActor.run code, which makes the keyboard state and services more stable and safer to use.
This version moves all proxy-based logic from the KeyboardContext to a new KeyboardControllerContext, which separates the keyboard state from the (main actor) controller state. This makes the keyboard context easier to manage.
This version also adds a new plugin architecture that allows us to move sensitive or complex code out of the core library. There are currently two plugins - KeyboardKitDictationPlugin and KeyboardKitHostPlugin. See more below.
The new dictation plugin makes it a LOT easier to set up dictation than before. You don't have to copy code for a speech recognizer since the plugin contains both the standard engine, the recognizer and the volume recorder.
Finally, this version removes deprecated code, ends all ongoing experiments, and makes localization use LocalizedStringResource.
Documentation
The documentation for KeyboardKit 11 beta can be downloaded as a zip file that contains a DocC archive, further down on this page.
Plugins
The host application bundle logic has been extracted to a KeyboardKitHostApplication plugin package, which means that KeyboardKit no longer contains any code that uses Apple system APIs to resolve the host application bundle ID.
The dictation engine, speech recognizer and volume recorder have been moved to a separate KeyboardKitDictation plugin package, which means that the core library no longer requires permissions to be added to Info.plist.
The docs will be updated with information about how to use these plugins. For now, link KeyboardKitHostPlugin to your keyboard extension, KeyboardKitDictationPlugin to your main app, and import them where you need them.
import KeyboardKitHostPluginadds apluginHostApplicationResolverthat can be injected intosetupKeyboardKit(...).import KeyboardKitDictationPluginadds apluginDictationEnginethat can be injected intokeyboardDictation(...).
The plugin model is an exciting new part of KeyboardKit, and will allow us to add an extended ecosystem of capabilities to the SDK, and let you use the parts that you need.
Features
Here are some of the new things, separated into features.
📦 Package
- The package now uses Swift 6.2 and strict concurrency.
- The package defines a new
KeyboardKitHostApplicationplugin. - The package defines a new
KeyboardKitDictationplugin. - 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
Keyboard.BackgroundandKeyboard.BackgroundStyleare now separated.KeyboardControllerContextis a new context type for controller-specific state.KeyboardInputViewControllerhas a newsetPreferredKeyboardCase()function.KeyboardStatehas a newcontrollerContextproperty of typeKeyboardControllerContext.
🧩 Extensions
ProcessInfohas a newisLiquidGlassAvailableextension.
💡 Autocomplete
AutocompleteContextno longer uses dispatch queues to update itself.AutocompleteServicehas a newwarmUp()function.AutocompleteService.autocomplete(_:updating:)is now async throws.AutocompleteSuggestionnow defines a new.deleteBackwardsCount.AutocompleteSuggestion.isUnknownhas been renamed toisCurrent.AutocompleteSuggestionSourceis a new enum with known sources.AutocompleteSuggestionType.unknownhas been renamed tocurrent.StandardAutocompleteServicewarms up its engine to avoid a launch hangs.StandardAutocompleteServicenow honors the new delete backwards count.
🎤 Dictation
KeyboardKitDictationis a new plugin package.KeyboardKithas ways to inject a plugin dictation engine.DictationEngineno longer has a standard engine in the library.DictationMethodis removed since dictation is performed in a single way.DictationVolumeRecorderandDictationSpeechRecognizerare now in the plugin.
🏠 Host Application
KeyboardKitHostApplicationis a new plugin package.KeyboardKithas ways to inject a plugin host application resolver.
🌐 Localization
- All screen localization types now use
LocalizedStringResource.
⚙️ Settings
KeyboardSettingsuses a new thread-safe store resolver.KeyboardSettingsnow requires adeviceTypewhen created.KeyboardSettingshas newresetStore(for:)andresetStore(forAppGroup:)functions.
🚨 Breaking Changes
- All deprecated code has been removed.
DictationMethodhas been removed.DictationSpeechRecognizerhas been removed.DictationVolumeRecorderhas been removed.GestureButtonScrollStatehas been removed.KeyboardApp.keyboardSettingsKeyPrefixhas been removed.KeyboardContextmoves logic toKeyboardControllerContext.KeyboardContext.autocapitalizationTypeOverridehas been removed.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.originalTextDocumentProxyis now fully internal.