KeyboardKit lets you create amazing custom keyboard extensions with a few lines of code, using Swift & SwiftUI.
KeyboardKit extends Apple's limited keyboard APIs with more capabilities. It can be extended with KeyboardKit Pro, which unlocks localized keyboards, autocomplete, an emoji keyboard, AI support, themes, and much more.
KeyboardKit can be installed with the Swift Package Manager:
https://github.com/KeyboardKit/KeyboardKit.git
KeyboardKit must then be linked to all targets that will use it.
The easiest way to set up KeyboardKit is to first create a KeyboardApp
value for your app:
import KeyboardKit
extension KeyboardApp {
ďż˝
static var keyboardKitDemo: KeyboardApp {
.init(
name: "KeyboardKit",
licenseKey: "your-key-here", // Needed for KeyboardKit Pro!
appGroupId: "group.com.keyboardkit.demo", // Sets up App Group data sync
locales: .keyboardKitSupported, // Sets up the enabled locales
autocomplete: .init( // Sets up custom autocomplete
nextWordPredictionRequest: .claude(...) // Sets up AI-based prediction
),
deepLinks: .init(app: "kkdemo://", ...) // Defines how to open the app
)
}
}
Next, let your KeyboardController
inherit KeyboardInputViewController
instead of UIInputViewController
:
class KeyboardController: KeyboardInputViewController {}
This unlocks additional functions and capabilities, and adds services
and observable state
to the controller.
Next, override viewDidLoad()
and call setup(for:)
to set up the keyboard extension for your app:
class KeyboardViewController: KeyboardInputViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Set up the keyboard with the app we created above
setup(for: .keyboardKitDemo) { result in
// If `result` is `.success`, the setup did succeed.
// This is where you can setup custom services, etc.
}
}
}
This will make keyboard settings sync data between the main app and its keyboard if the KeyboardApp
defines an appGroupId
, set up KeyboardKit Pro if it defines a licenseKey
, set up dictation and deep links, etc.
To replace or customize the standard KeyboardView
, just override viewWillSetupKeyboardView()
and let it call setupKeyboardView(_:)
with the view that you want to use:
class KeyboardViewController: KeyboardInputViewController {
override func viewWillSetupKeyboardView() {
setupKeyboardView { [weak self] controller in // <-- Use weak or unknowned self!
KeyboardView(
state: controller.state,
services: controller.services,
buttonContent: { $0.view },
buttonView: { $0.view },
collapsedView: { $0.view },
emojiKeyboard: { $0.view },
toolbar: { $0.view }
)
}
}
}
To set up your main app with the same keyboard configuration, just wrap the content view in a KeyboardAppView
:
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
// Here we use the keyboard app we created above
KeyboardAppView(for: .keyboardKitDemo) {
ContentView()
}
}
}
}
For more information, see the getting started guide and essentials articles.
KeyboardKit supports 73 locales:
đşđ¸ đŚđą đŚđŞ đŚđ˛ đ§đž đ§đŹ đŚđŠ đłď¸ đłď¸ đđˇ
đ¨đż đŠđ° đłđą đ§đŞ đŚđş đ¨đŚ đŹđ§ đşđ¸ đŞđŞ đŤđ´
đľđ đŤđŽ đŤđˇ đ¨đŚ đ§đŞ đ¨đ đŹđŞ đŠđŞ đŚđš đ¨đ
đŹđˇ đşđ¸ đŽđą đđş đŽđ¸ đłď¸ đŽđŠ đŽđŞ đŽđš đ°đż
đšđŻ đšđŻ đšđŻ đąđť đąđš đ˛đ° đ˛đž đ˛đš đ˛đł đłď¸
đłđ´ đłđ´ đŽđˇ đľđą đľđš đ§đˇ đˇđ´ đˇđş đˇđ¸ đˇđ¸
đšđŻ đ¸đ° đ¸đŽ đŞđ¸ đŚđˇ đ˛đ˝ đ¸đŞ đ°đŞ đšđˇ đşđŚ
đşđż đťđł đ´ó §ó ˘ó ˇó Źó łó ż
KeyboardKit only includes localized strings, while KeyboardKit Pro unlocks localized keyboards, layouts, callouts and behaviors for all supported locales.
KeyboardKit provides a free, open-source keyboard engine. KeyboardKit Pro unlocks more powerful pro features.
- đą Essentials - Essential models, services, utilities & views.
- â¨ď¸ Essentials-KeyboardView - A native-looking, customizable keyboard.
- đĽ Actions - Trigger & handle keyboard-related actions.
- đą App - Set up your app, keyboard, sync settings, etc.
- đŻ Callouts - Show input & secondary action callouts.
- đĽď¸ Device - Identify device type, capabilities, etc.
- đ Emojis - Emojis, categories, versions, skin tones, etc.
- đ Feedback - Trigger audio & haptic feedback.
- đ Gestures - Handle a rich set of gestures on any key.
- đŁ Layout - Define and customize dynamic keyboard layouts.
- đ Localization - Additional locale-related utilities.
- đşď¸ Navigation - Open urls and other apps from the keyboard.
- đ Previews - Extensive SwiftUI preview support.
- đ Proxy - Extend the text document proxy with more capabilities.
- âď¸ Settings - Provide keyboard settings & link to System Settings.
- 𩺠Status - Detect if a keyboard is enabled, has full access, etc.
- đ¨ Styling - Style your keyboard to great extent.
The online documentation has a thorough getting-started guide, a detailed article for each feature, code samples, etc. You can also build it from the source code to get better formatting.
The Demo
folder has a demo app that shows how to set up the main keyboard app, show keyboard status, provide in-app settings, link to system settings, apply custom styles, etc.
The app has two keyboards - a Keyboard
that uses KeyboardKit and a KeyboardPro
that uses KeyboardKit Pro.
Important
The demo isn't code signed and can therefore not use an App Group to sync settings between the app and its keyboards. As such, the KeyboardPro
keyboard has keyboard settings in the keyboard as well.
Download the KeyboardKit app from the App Store to try KeyboardKit without having to write any code or build the demo app from Xcode.
KeyboardKit is open-source and completely free, but you can support the project by becoming a GitHub Sponsor, upgrading to KeyboardKit Pro or get in touch for freelance work, paid support etc.
Feel free to reach out if you have questions or if you want to contribute in any way:
- Website: keyboardkit.com
- E-mail: info@keyboardkit.com
- Bluesky: @keyboardkit.bsky.social
- Mastodon: @keyboardkit@techhub.social
KeyboardKit is available under the MIT license. See the LICENSE file for more info.