Releases: KeyboardKit/KeyboardKit
Release list
10.7.0-beta.1
This version adds undo functionality to the keyboard engine, which makes it possible to undo text insertions, deletions, and autocompletions in chunks. This is currently opt-in. Enable the undoManager experiment to try it out.
This version also adds many more pickers and settings for various keyboard models, including a brand new KeyboardActionPicker. This will let us harmonize the settings tools, and avoid having to write separate code for each model.
This version also flattens the remaining namespaces, to complete the extensive namespace transition earlier than initially planned, to give us all time to migrate before KeyboardKit 11.
🌱 Essentials
Keyboard.DockEdgehas a new.nonecase.Keyboard.DockEdgenow implementsKeyboardSettingsPickerValue.Keyboard.InputToolbarTypenow implementsKeyboardSettingsPickerValue.Keyboard.InputTypenow implementsKeyboardSettingsPickerValue.Keyboard.KeyboardCasenow implementsKeyboardSettingsPickerValue.Keyboard.KeyboardTypenow implementsKeyboardSettingsPickerValue.Keyboard.LayoutTypenow implementsKeyboardSettingsPickerValue.Keyboard.ReturnKeyTypenow implementsKeyboardSettingsPickerValue.Keyboard.SpacebarLongPressBehaviornow implementsKeyboardSettingsPickerValue.Keyboard.SpacebarMenuTypehas a new.nonecase.Keyboard.SpacebarMenuTypenow implementsKeyboardSettingsPickerValue.KeyboardControllerhas a newundoLastRecordedDocumentChangefunction.KeyboardControllerhas a newopenMainAppandopenMainAppDeepLinkfunctions.
⚡️ Actions
KeyboardAction.openMainAppand.undoare new actions.KeyboardAction.PickerValueis a newKeyboardSettingsPickerValue.StandardKeyboardActionHandlerhas a newundoLastRecordedDocumentChangefunction.
🧪 Experiments
Experiment.undoManageris a new experiment that lets you enable the new undo feature.
📜 Licenses
LicenseErrorAlerthas been redesigned to be more informative.
📄 Proxy
TextDocumentUndoChangeis a new type to describe a text document change.TextDocumentUndoManageris a new class for undoing text document changes.
⚙️ Settings
Keyboard.DockEdgePickeris a new picker component.Keyboard.InputToolbarTypePickeris a new picker component.Keyboard.InputTypePickeris a new picker component.Keyboard.KeyboardCasePickeris a new picker component.Keyboard.KeyboardTypePickeris a new picker component.Keyboard.LayoutTypePickeris a new picker component.Keyboard.ReturnKeyTypePickeris a new picker component.Keyboard.SpacebarLongPressBehaviorPickeris a new picker component.Keyboard.SpacebarMenuTypePickeris a new picker component.KeyboardActionPickeris a new picker component.
🎨 Styling
Image.keyboardArrowBackwardis a new image.Image.keyboardArrowForwardis a new image.Image.keyboardCaseis a new image builder.Image.keyboardEscapeis a new image.Image.keyboardFunctionis a new image.Image.keyboardInputTypeis a new image builder.Image.keyboardSpaceis a new image.Image.keyboardSystemSettingsis a new image.Image.keyboardTypeis a new image builder.Image.keyboardUrlDomainis a new image.
🐛 Bug fixes
KeyboardLocaleSettingsScreennow applies the correct layout type.
📦 Namespace Changes
Autocomplete.AutocorrectionDisabledToContextModiferhas been renamed toKeyboardKit.AutocorrectionDisabledModifer.Autocomplete.DisabledAutocompleteServicehas been renamed toKeyboardKit.DisabledAutocompleteService.Autocomplete.NextWordPredictionMethodhas been renamed toAutocompleteMethod.Autocomplete.NextWordPredictionRequestTypehas been renamed toAutocompleteMethod.Autocomplete.NextWordPredictionTypePickerhas been renamed toAutocompleteMethodPicker.Autocomplete.Resulthas been renamed toAutocompleteResult.Autocomplete.RemotePredictionRequesthas been renamed toRemoteAutocompleteRequest.Autocomplete.SettingsScreenhas been renamed toAutocompleteSettingsScreen.Autocomplete.SettingsScreenLocalizationhas been renamed toAutocompleteSettingsScreenLocalization.Autocomplete.SettingsScreenSectionshas been renamed toAutocompleteSettingsScreenSections.Autocomplete.SettingsScreenVisibilityhas been renamed toAutocompleteSettingsScreenVisibility.Autocomplete.StandardAutocompleteServicehas been renamed toKeyboardKit.StandardAutocompleteService.Autocomplete.Suggestionhas been renamed toAutocompleteSuggestion.Autocomplete.SuggestionTypehas been renamed toAutocompleteSuggestionType.Autocomplete.TextReplacementDictionaryhas been renamed toAutocompleteReplacementDictionary.Autocomplete.Toolbarhas been renamed toAutocompleteToolbar.Autocomplete.ToolbarScrollModehas been renamed toAutocompleteToolbarScrollMode.Autocomplete.ToolbarStylehas been renamed toAutocompleteToolbarStyle.Autocomplete.ToolbarItemhas been renamed toAutocompleteToolbarItem.Autocomplete.ToolbarItemStylehas been renamed toAutocompleteToolbarItemStyle.Autocomplete.ToolbarSeparatorhas been renamed toAutocompleteToolbarSeparator.Autocomplete.ToolbarSeparatorStylehas been renamed toAutocompleteToolbarSeparatorStyle.Callouts.Actionshas been renamed toKeyboardCalloutActionsCallouts.ActionsBuilderhas been renamed toKeyboardCalloutActions.BuilderCallouts.ActionsBuilderParamshas been renamed toKeyboardCalloutActions.BuilderParamsCallouts.ActionCallouthas been renamed toKeyboardActionCalloutCallouts.CalloutStylehas been renamed toKeyboardCalloutStyleCallouts.InputCallouthas been renamed toKeyboardInputCalloutDictation.AuthorizationStatushas been renamed toDictationAuthorizationStatusDictation.BarVisualizerhas been renamed toDictationBarVisualizerDictation.BarVisualizerStylehas been renamed toDictationBarVisualizerStyleDictation.DictationMethodhas been renamed toDictationMethodDictation.DictationStatehas been renamed toDictationStateDictation.DisabledDictationEnginehas been renamed toDisabledDictationEngineDictation.DisabledDictationServicehas been renamed toDisabledDictationServiceDictation.DisabledSpeechRecognizerhas been renamed toDisabledDictationSpeechRecognizerDictation.Indicatorhas been renamed toDictationIndicatorBadgeDictation.IndicatorStylehas been renamed toDictationIndicatorBadgeStyleDictation.ProgressViewhas been renamed toDictationKeyboardOverlayDictation.ProgressViewLocalizationhas been renamed toDictationKeyboardOverlayLocalizationDictation.ProgressViewStylehas been renamed toDictationKeyboardOverlayStyleDictation.ServiceErrorhas been renamed toDictationServiceErrorDictation.SettingsScreenhas been renamed toDictationSettingsScreenDictation.SettingsScreenLocalizationhas been renamed toDictationSettingsScreenLocalizationDictation.SettingsScreenSectionshas been renamed toDictationSettingsScreenSectionsDictation.SpeechRecognizerResulthas been renamed toDictationSpeechResultDictation.StandardDictationEnginehas been renamed toStandardDictationEngineDictation.StandardDictationServicehas been renamed toStandardDictationServiceDictation.StandardVolumeRecorderhas been renamed toStandardDictationVolumeRecorderDictation.VolumeRecorderhas been renamed toDictationVolumeRecorderDictation.VolumeResulthas been renamed toDictationVolumeResultDictation.VolumeVisualizerhas been renamed toDictationVolumeVisualizerDictation.VolumeVisualizerStylehas been renamed toDictationVolumeVisualizerStyleEmoji.ColonSearchhas been renamed toEmojiColonSearch.Emoji.KeyboardSearchFieldhas been renamed toEmojiSearchFieldEmojiKeyboard.Configurationhas been renamed toEmojiKeyboardConfigurationEmojiKeyboard.Sizeshas been renamed toEmojiKeyboardSizesEmojiKeyboard.Statehas been renamed toEmojiKeyboardStateEmojiKeyboard.Stylehas been renamed toEmojiKeyboardStyleExperimenthas been renamed toKeyboardExperiment.Experiment.SettingsScreenhas been renamed toKeyboardExperimentSettingsScreen.Experiment.SettingsScreenLocalizationhas been renamed toKeyboardExperimentSettingsScreenLocalization.Experimentshas been renamed toKeyboardExperimentSettings.ExperimentContexthas been renamed toKeyboardExperimentContext.Feedback.Audiohas been renamed toKeyboardAudioFeedback.Feedback.AudioConfigurationhas been renamed toKeyboardAudioFeedbackConfiguration.Feedback.AudioEnginehas been renamed toKeyboardAudioFeedbackEngine.Feedback.DisabledFeedbackServicehas been renamed toDisabledKeyboardFeedbackService.Feedback.Haptichas been renamed toKeyboardHapticFeedback.Feedback.HapticConfigurationhas been renamed toKeyboardHapticFeedbackConfiguration.Feedback.HapticEnginehas been renamed toKeyboardHapticFeedbackEngine.Feedback.StandardFeedbackServicehas been renamed toStandardKeyboardFeedbackService.Feedback.Togglehas been renamed toKeyboardFeedbackToggle.FeedbackContexthas been renamed toKeyboardFeedbackContext.FeedbackServicehas been renamed toKeyboardFeedbackService.FeedbackSettingshas been renamed toKeyboardFeedbackSettings.FontContexthas been renamed toKeyboardFontContext.FontSettingshas been renamed toKeyboardFontSettings.Fonts.UnicodeFonthas been renamed toKeyboardUnicodeFont.Fonts.UnicodeFontOptionhas been renamed toKeyboardUnicodeFontOption.- `Ke...
10.6.0
This version minimizes the number of on-launch redraws to minimize launch flickering, and makes it possible to swipe up and down on the spacebar to move the cursor in greater steps.
This also version starts reducing namespace nesting, as described in issue 1045. Expect less nesting and more surface-level types, with renaming guides to help you migrate.
Finally, since the host application bundle ID keeps returning nil in iOS 27, we have deprecated the KeyboardInputViewController hostApplicationBundleId property, and updated the documentation with alternate ways to handle this.
🌱 Essentials
Keyboard.SpacebarDragGestureHandlercan now handle vertical movement.Keyboard.SpacebarDragGestureOffsetis a new enum for spacebar dragging.Keyboard.SpacebarDragSensitivitynow defines a horizontal and a vertical step value.KeyboardInputViewControllerminimizes the number of on-launch redraws to minimize flickering.
🏠 Host
KeyboardHostApplicationPickernow specializesKeyboardSettingsPicker.
🔣 Layout
KeyboardLayoutconvertbaseLayoutbuilder to an initializer.KeyboardLayoutconvertiPhoneLayoutandiPadLayoutbuilders to instance members.KeyboardLayoutupdates the keyboard switcher placement on iPads running iOS 18 and earlier.KeyboardLayout.DeviceConfigurationapplies updated edge insets on iPads running iOS 18 and earlier.
📦 Namespace Changes
KeyboardLayout.DeviceConfigurationhas been renamed toKeyboardLayoutConfiguration.KeyboardLayout.Itemhas been renamed toKeyboardLayoutItem.KeyboardLocale.ContextMenuhas been renamed toKeyboardLocaleContextMenuModifier.KeyboardLocale.ListItemhas been renamed toKeyboardLocaleListItem.KeyboardLocale.SettingsScreenhas been renamed toKeyboardLocaleSettingsSettingsScreen.KeyboardLocale.SettingsScreenLocalizationhas been renamed toKeyboardLocaleSettingsScreenLocalization.KeyboardLocale.SettingsScreenPickershas been renamed toKeyboardLocaleSettingsScreenPickers.KeyboardLocale.SettingsScreenVisibilityhas been renamed toKeyboardLocaleSettingsScreenVisibility.KeyboardSettings.SettingsScreenhas been renamed toKeyboardSettingsScreen.KeyboardSettings.SettingsScreenLocalizationhas been renamed toKeyboardSettingsScreenLocalization.KeyboardSettings.SettingsScreenPickershas been renamed toKeyboardSettingsScreenPickers.KeyboardSettings.SettingsScreenSectionshas been renamed toKeyboardSettingsScreenSections.KeyboardSettings.SettingsScreenVisibilityhas been renamed toKeyboardSettingsScreenVisibility.KeyboardSettings.Pickerhas been renamed toKeyboardSettingsPicker.KeyboardSettings.PickerValuehas been renamed toKeyboardSettingsPickerValue.KeyboardStatus.Labelhas been renamed toKeyboardStatusLabel.KeyboardStatus.LabelStylehas been renamed toKeyboardStatusLabelStyle.KeyboardStatus.Sectionhas been renamed toKeyboardStatusSection.KeyboardStatus.SectionLocalizationhas been renamed toKeyboardStatusSectionLocalization.KeyboardStatus.SectionStylehas been renamed toKeyboardStatusSectionStyle.KeyboardTheme.Collectionhas been renamed toKeyboardThemeCollection.KeyboardTheme.SettingsScreenhas been renamed toKeyboardThemeSettingsScreen.KeyboardTheme.SettingsScreenLocalizationhas been renamed toKeyboardThemeSettingsScreenLocalization.KeyboardTheme.SettingsScreenStylehas been renamed toKeyboardThemeSettingsScreenStyle.KeyboardTheme.SettingsScreenThemeshas been renamed toKeyboardThemeSettingsScreenThemes.Proxy.FullDocumentReaderConfigurationhas been renamed toDocumentReaderConfiguration.Proxy.FullDocumentReaderErrorhas been renamed toDocumentReaderError.Proxy.FullDocumentReaderResulthas been renamed toDocumentReaderResult.Proxy.SelectionEdgehas been renamed toKeyboard.TextSelectionEdge.
👁️ Previews
KeyboardPreviews.ActionHandleris renamed toPreviewKeyboardActionHandler.KeyboardPreviews.AutocompleteServiceis renamed toPreviewAutocompleteService.KeyboardPreviews.InputViewControlleris renamed toPreviewKeyboardInputViewController.KeyboardPreviews.TextDocumentProxyis renamed toPreviewTextDocumentProxy.
📄 Proxy
DocumentReaderis a new protocol, informally implemented byUITextDocumentProxy.UITextDocumentProxyhas new sentenceoffsetvariables.
⚙️ Settings
KeyboardSettingsPickernow supports an optional selection binding..keyboardSettingsPickerTitle(for:_:)is a newKeyboardSettingsPickerview modifier..keyboardSettingsPickerValueTitle(for:_:)is a newKeyboardSettingsPickerview modifier.
🩺 Status
KeyboardStatusInspectoris a new tool for inspecting the keyboard system status.
🗑️ Deprecations
- The
KeyboardInputViewControllerhostApplicationBundleIdhas been deprecated. - The
KeyboardInputnamespace is deprecated and will be removed in KeyboardKit 11. - The
KeyboardLocalenamespace is deprecated and will be removed in KeyboardKit 11. - The
KeyboardPreviewsnamespace is deprecated and will be removed in KeyboardKit 11. - The
KeyboardStatusnamespace is deprecated and will be removed in KeyboardKit 11. - The
KeyboardStylenamespace is deprecated and will be removed in KeyboardKit 11. - The
Proxynamespace is deprecated and will be removed in KeyboardKit 11.
10.5.1
This version updates some license information.
9.9.1
This version patches the host application bundle ID code to not crash.
Note that the code will still return nil on iOS 26.4 and later.
10.5.0
KeyboardKit 10.5 is out! This release adds Arabic (PC) support and adds new accessibility settings to increase the font weight and key height. It also adds new iOS 26.4 emojis, improves autocomplete, and much more.
🌱 Essentials
KeyboardControllerhas a newresetKeyboardInputTypefunction.
♿️ Accessibility
KeyboardAccessibilityis a new namespace.KeyboardAccessibilityContextis a new observable context.KeyboardAccessibilitySettingsis a new type with persistent settings.KeyboardThemehas a newadjusted(for:)that applies accessibility settings.
💡 Autocomplete
Autocomplete.TextReplacementDictionary.additionalAutocompletionsis a new list.Autocomplete.TextReplacementDictionary.additionalAutocorrectionshas more values.Autocomplete.SettingsScreenhas a new toggle that can hide the autocomplete toolbar.Autocomplete.StandardAutocompleteServicewill now filter out duplicate suggestions.AutocompleteContext.autocompleteDictionaryis a new dictionary with custom completions.AutocompleteSettingshas a newisToolbarEnabledsetting that can be used to hide the toolbar.KeyboardViewwill automatically hide the autocomplete toolbar ifisToolbarEnabledisfalse.
🔣 Layout
KeyboardLayoutnow adds additional edge insets on Liquid Glass iPad devices.KeyboardLayoutnow places the keyboard switcher firstmost on Liquid Glass iPad devices.KeyboardLayout.DeviceConfigurationnow has an additionaledgeInsetspadding property.
🌐 Localization
KeyboardLocaleis a new namespace for locale-specific types.Localehas a new.arabic_pclocale, with layouts and callouts.Locale.Dictionarynow implementsSendable.
😀 Emojis
EmojiKeyboardnow supports new iOS 26.4 emojis.EmojiKeyboardnow supports skin tones in emoji search.KeyboardInputViewControllernow cancels emoji search when the cursor moves.
📄 Proxy
UITextDocumentProxyhas a newmoveTextInputCursorToRefreshContext(sleepInterval:)function.
🎛️ Settings
Keyboard.SettingsScreenhas been moved toKeyboardSettings.Keyboard.LocaleSettingsScreenhas been moved toKeyboardLocale.
🎨 Styling
KeyboardActionslightly increases the standard image font weight.KeyboardActionslightly increases the standard lowercase font weight.KeyboardViewredesigns swipe down actions to look a bit more like native.
🗑️ Deprecations
View.localeSettingsScreenLocalizationhas been renamed tokeyboardLocaleSettingsScreenLocalization.View.localeSettingsScreenVisibilityhas been renamed tokeyboardLocaleSettingsScreenVisibility.
🐛 Bug fixes
KeyboardLayoutCacheadjusts layout cache to avoid missing input switcher on iPhone SE.
10.4.1
This version fixes some bugs and adds a preview of a new way to handle setting values and pickers.
The new KeyboardSettings.Picker view can be used to harmonize the various setting pickers, and adds a new localization method which will make the various screen pickers and localization tools obsolete, or at least smaller.
🌱 Essentials
Keyboard.InputToolbarTypeimplementsPickerValue.Keyboard.InputToolbarTypePickeris a new typealias.
🎛️ Settings (BETA)
KeyboardSettingshas a new, genericPickerview.KeyboardSettingshas a newPickerValueprotocol..keyboardSettingsPickerValueTitle(...)is a new view modifier can be used to localize these pickers.
🐛 Bug fixes
Keyboard.SettingsScreennow displays anoneoption for the input toolbar type.KeyboardLayoutfixes a bug that cased the input toolbar to become too tall on iPad.KeyboardSettingsnow uses the.frequentcategory for the input toolbar emoji keys.StandardAutocompleteServicefixes a Safari casing bug for English next word predictions.
🗑️ Deprecations
DragGestureHandlerhas been moved intoKeyboard.Gestureshas been merged with theKeyboardnamespace.KeyboardSettings.InputToolbarTypehas been moved toKeyboard.
10.4.0
This version fixes random slow keyboard launches by postponing costly operations until the keyboard has appeared.
This version also adjusts the hostApplicationBundleId logic to handle that this property becomes nil in iOS 26.4 and later. You can now set it with code or let users pick or specify a host application from the keyboard.
You can read more about this change here. If not being able to automatically resolve the host application affects your app in a negative way, we strongly recommend reaching out to Apple with the Feedback Assistant.
🌱 Essentials
Keyboard.Stateinjects a newkeyboardAppContextinto the environment.KeyboardControllerhas a newopenMainAppUrl(_:withReason:)function.KeyboardInputViewControllerpostpones autocomplete to speed up launch.
⚡️ Actions
KeyboardActionhas a new.openMainAppaction.KeyboardActionhas a new KeyboardApp-based.openMainAppbuilder.KeyboardActionhas a new standard release action for.openMainApp.
📱 App
KeyboardAppContextis a new app-specific context.KeyboardAppContext.reasondefines an app launch reason.KeyboardAppSettingshas new, internal app-specific settings.KeyboardAppViewresets the context reason when sent to the background.
💡 Autocomplete
Autocomplete.ToolbarScrollModeis a new enum that defines toolbar scroll modes..autocompleteToolbarScrollMode(...)is a new view modifier that can be used to enable scrolling.
🏠 Host
- The
hostApplicationBundleIdhas been documented to not work in iOS 26.4. - The new
KeyboardHostApplication.Pickercan be used to pick aKeyboardHostApplication.
10.3.1
This version updates some license information.
10.3.0
This version adds support for on-device next word prediction, using Apple's Foundation Models. This is available on iPhone 15 Pro and later, iOS 26.1 and later. Note that this is a very(!) new technology that is slower and less accurate than other autocomplete features. You can help improving it by providing feedback.
This version also tweaks the license validation to be much faster than before, which also results in less flickering when setting up the keyboard extension. It also improves layout rendering by enabling layout caching by default. The old experiment has been converted to a proper dynamic KeyboardSettings setting. We hope you'll like these new changes.
This version also adds a new KeyboardSettings setting to visualize the dynamic text tap areas, to make it possible for developers to verify this dynamic behavior.
🌱 Essentials
KeyboardInputViewControllerhas a newviewWillSetupKeyboardKit()function.
⚡️ Autocomplete
Autocomplete.NextWordPredictionMethodhas a new.localmethod.Autocomplete.SettingsScreenhas a new next word prediction toggle.Autocomplete.SettingsScreenSectionshas a redesigned next word prediction section.Autocomplete.StandardAutocompleteServicecan now perform local next word prediction.AutocompleteSettings.nextWordPredictionMethodnow uses the.localmethod by default.
🧪 Experiments
Experimenthas been refactored to make it easier to enable experiments.
🔉 Feedback
FeedbackContexthas a newregisterCustomAudioFeedback(...)function.FeedbackContexthas a newregisterCustomHapticFeedback(...)function.
🔣 Layout
KeyboardLayout.DeviceConfiguration.standardPhonenow uses a 51 point row height in iOS 26.
🤝 Licenses
KeyboardInputViewControllervalidates licenses much faster than before.Keyboard.ToggleToolbarnow shows thetoolbarif no license is registered.
🎛️ Settings
KeyboardSettingshas a newisLayoutCachingsetting.KeyboardSettingshas a newisPredictiveTextVisualizationActivesetting.
🐛 Bug fixes
Keyboard.LocaleSettingsScreennow handles changes to added locales better.KeyboardInputViewControllerwill now make an initial autocomplete on launch.
🗑️ Deprecations
Autocomplete.NextWordPredictionRequestTypehas been renamed toNextWordPredictionMethod.AutocompleteSettings.nextWordPredictionRequestTypehas been renamed to match this change.Experimentshas been simplified, and is no longer used to enable and disable experiments.Experiment.layoutCachinghas been deactivated, and no longer has any effect on the engine.Experiments.activeandExperiment.isActiveis replaced withExperiment.activeExperiments.
10.2.2
This version improves the controller's host bundle ID logic with hopes of reducing random crashes.
This version also reduces the number of input set calculations for every layout that is generated.
🏠 Host
- The
KeyboardInputViewControllerhostApplicationBundleIdhas been rewritten to hopefully avoid crashes, or at least provide better crash information.
🔣 Layout
- The
KeyboardLayout.baseLayout(...)now only calculates the relevant input set, reducing the input set calculations with 2/3 for each layout generation.
🐛 Bug fixes
- The incorrect upper-cased shift color in dark mode is fixed on pre iOS 26 iPhones.
