{"id":13995331,"url":"https://github.com/KeyboardKit/KeyboardKit","last_synced_at":"2025-07-22T21:32:38.059Z","repository":{"id":37399519,"uuid":"66043404","full_name":"KeyboardKit/KeyboardKit","owner":"KeyboardKit","description":"KeyboardKit is a Swift SDK that lets you create fully customizable keyboards with a few lines of code, using SwiftUI.","archived":false,"fork":false,"pushed_at":"2024-11-26T17:47:03.000Z","size":76801,"stargazers_count":1517,"open_issues_count":34,"forks_count":231,"subscribers_count":29,"default_branch":"master","last_synced_at":"2024-11-26T18:36:35.848Z","etag":null,"topics":["apple","emoji","ios","keyboard","keyboard-extension","macos","swift","swiftui","tvos","visionos","watchos"],"latest_commit_sha":null,"homepage":"https://keyboardkit.com","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KeyboardKit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["danielsaidi"]}},"created_at":"2016-08-19T01:43:45.000Z","updated_at":"2024-11-26T17:47:07.000Z","dependencies_parsed_at":"2024-01-18T18:50:55.755Z","dependency_job_id":"a1b5822b-0a4e-4067-9195-3a6221d838bd","html_url":"https://github.com/KeyboardKit/KeyboardKit","commit_stats":{"total_commits":3037,"total_committers":30,"mean_commits":"101.23333333333333","dds":"0.021731972341126116","last_synced_commit":"09a0aabfbcc23d36b963678358a5c4c43d37f235"},"previous_names":[],"tags_count":250,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KeyboardKit%2FKeyboardKit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KeyboardKit%2FKeyboardKit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KeyboardKit%2FKeyboardKit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KeyboardKit%2FKeyboardKit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KeyboardKit","download_url":"https://codeload.github.com/KeyboardKit/KeyboardKit/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":226821000,"owners_count":17687359,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apple","emoji","ios","keyboard","keyboard-extension","macos","swift","swiftui","tvos","visionos","watchos"],"created_at":"2024-08-09T14:03:21.155Z","updated_at":"2025-07-22T21:32:38.046Z","avatar_url":"https://github.com/KeyboardKit.png","language":"Swift","readme":"\u003cp align=\"center\"\u003e\n    \u003cimg src=\"Resources/Icon.png\" alt=\"Project Icon\" width=\"250\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/v/release/KeyboardKit/KeyboardKit?color=forestgreen\u0026sort=semver\" alt=\"Version\" /\u003e\n    \u003cimg src=\"https://img.shields.io/badge/swift-5.9-orange.svg\" alt=\"Swift 5.9\" /\u003e\n    \u003cimg src=\"https://img.shields.io/badge/platform-SwiftUI-blue.svg\" alt=\"Swift UI\" title=\"Swift UI\" /\u003e\n    \u003ca href=\"https://keyboardkit.github.io/KeyboardKit\"\u003e\u003cimg src=\"https://img.shields.io/badge/documentation-web-blue.svg\" alt=\"Documentation\" /\u003e\u003c/a\u003e\n    \u003cimg src=\"https://img.shields.io/github/license/KeyboardKit/KeyboardKit\" alt=\"MIT License\" /\u003e\n\u003c/p\u003e\n\n\n# KeyboardKit\n\nKeyboardKit lets you create amazing [custom keyboard extensions][About] with a few lines of code, using Swift \u0026 SwiftUI.\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src =\"Resources/Demo.gif\" width=450 /\u003e\n\u003c/p\u003e\n\nKeyboardKit extends Apple's limited keyboard APIs with more capabilities. It can be extended with [KeyboardKit Pro][Pro], which unlocks localized keyboards, autocomplete, an emoji keyboard, AI support, themes, and much more.\n\n\n\n## Installation\n\nKeyboardKit can be installed with the Swift Package Manager:\n\n```\nhttps://github.com/KeyboardKit/KeyboardKit.git\n```\n\nKeyboardKit must then be linked to all targets that will use it.  \n\n\n\n## Getting Started\n\nThe easiest way to set up KeyboardKit is to first create a `KeyboardApp` value for your app:\n\n```swift\nimport KeyboardKit\n\nextension KeyboardApp {\n\u0013\n        static var keyboardKitDemo: KeyboardApp {\n        .init(\n            name: \"KeyboardKit\",\n            licenseKey: \"your-key-here\",                // Needed for KeyboardKit Pro!\n            appGroupId: \"group.com.keyboardkit.demo\",   // Sets up App Group data sync\n            locales: .keyboardKitSupported,             // Sets up the enabled locales\n            autocomplete: .init(                        // Sets up custom autocomplete  \n                nextWordPredictionRequest: .claude(...) // Sets up AI-based prediction\n            ),\n            deepLinks: .init(app: \"kkdemo://\", ...)     // Defines how to open the app\n        )\n    }\n}\n```  \n\nNext, let your `KeyboardController` inherit ``KeyboardInputViewController`` instead of `UIInputViewController`:\n\n```swift\nclass KeyboardController: KeyboardInputViewController {}\n```\n\nThis unlocks additional functions and capabilities, and adds `services` and observable `state` to the controller. \n\nNext, override `viewDidLoad()` and call `setup(for:)` to set up the keyboard extension for your app:\n\n```swift\nclass KeyboardViewController: KeyboardInputViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        // Set up the keyboard with the app we created above\n        setup(for: .keyboardKitDemo) { result in\n            // If `result` is `.success`, the setup did succeed.\n            // This is where you can setup custom services, etc.\n        }\n    }\n}\n```\n\nThis 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.\n\nTo replace or customize the standard ``KeyboardView``, just override `viewWillSetupKeyboardView()` and let it call `setupKeyboardView(_:)` with the view that you want to use:\n\n```swift\nclass KeyboardViewController: KeyboardInputViewController {\n\n    override func viewWillSetupKeyboardView() {\n        setupKeyboardView { [weak self] controller in // \u003c-- Use weak or unknowned self!\n            KeyboardView(\n                state: controller.state,\n                services: controller.services,\n                buttonContent: { $0.view },\n                buttonView: { $0.view },\n                collapsedView: { $0.view },\n                emojiKeyboard: { $0.view },\n                toolbar: { $0.view }\n            )\n        }\n    }\n}\n```\n\nTo set up your main app with the same keyboard configuration, just wrap the content view in a `KeyboardAppView`:\n\n```swift\n@main\nstruct MyApp: App {\n\n    var body: some Scene {\n        WindowGroup {\n        \n            // Here we use the keyboard app we created above\n            KeyboardAppView(for: .keyboardKitDemo) {\n                ContentView()\n            }\n        }\n    }\n}\n```\n\nFor more information, see the [getting started guide][Getting-Started] and [essentials][Essentials] articles.\n\n\n\n## Localization\n\nKeyboardKit supports [75 locales][Localization]:\n\n🇺🇸 🇦🇱 🇦🇪 🇦🇲 🇦🇿 🇧🇾 🇧🇩 🇧🇬 🇦🇩 🏳️ \u003cbr /\u003e\n🏳️ 🇭🇷 🇨🇿 🇩🇰 🇳🇱 🇧🇪 🇦🇺 🇨🇦 🇬🇧 🇺🇸 \u003cbr /\u003e\n🇪🇪 🇫🇴 🇵🇭 🇫🇮 🇫🇷 🇨🇦 🇧🇪 🇨🇭 🇬🇪 🇩🇪 \u003cbr /\u003e\n🇦🇹 🇨🇭 🇬🇷 🇺🇸 🇮🇱 🇭🇺 🇮🇸 🏳️ 🇮🇩 🇮🇪 \u003cbr /\u003e\n🇮🇹 🇰🇿 🇹🇯 🇹🇯 🇹🇯 🇱🇻 🇱🇹 🇲🇰 🇲🇾 🇲🇹 \u003cbr /\u003e\n🇲🇳 🏳️ 🇳🇴 🇳🇴 🇮🇷 🇵🇱 🇵🇹 🇧🇷 🇷🇴 🇷🇺 \u003cbr /\u003e\n🇷🇸 🇷🇸 🇹🇯 🇸🇰 🇸🇮 🇪🇸 🇦🇷 🇲🇽 🇸🇪 🇰🇪 \u003cbr /\u003e\n🇹🇷 🇺🇦 🇺🇿 🇻🇳 🏴󠁧󠁢󠁷󠁬󠁳󠁿 \u003cbr /\u003e\n\nKeyboardKit only includes localized strings, while [KeyboardKit Pro][Pro] unlocks localized keyboards, layouts, callouts and behaviors for all supported locales.\n\n\n\n## Features\n\nKeyboardKit provides a free, open-source keyboard engine. [KeyboardKit Pro][Pro] unlocks more powerful pro features.\n\n* 🌱 [Essentials][Essentials] - Essential models, services, utilities \u0026 views.\n* ⌨️ [Essentials-KeyboardView][Essentials-KeyboardView] - A native-looking, customizable keyboard.\n* 💥 [Actions][Actions] - Trigger \u0026 handle keyboard-related actions.\n* 📱 [App][App] - Set up your app, keyboard, sync settings, etc.\n* 🗯 [Callouts][Callouts] - Show input \u0026 secondary action callouts.\n* 🖥️ [Device][Device] - Identify device type, capabilities, etc.\n* 😀 [Emojis][Emojis] - Emojis, categories, versions, skin tones, etc.\n* 🔉 [Feedback][Feedback] - Trigger audio \u0026 haptic feedback.\n* 👆 [Gestures][Gestures] - Handle a rich set of gestures on any key.\n* 🔣 [Layout][Layout] - Define and customize dynamic keyboard layouts.\n* 🌐 [Localization][Localization] - Additional locale-related utilities.\n* 🗺️ [Navigation][Navigation] - Open urls and other apps from the keyboard.\n* 👁 [Previews][Previews] - Extensive SwiftUI preview support.\n* 📄 [Proxy][Proxy] - Extend the text document proxy with more capabilities.\n* ⚙️ [Settings][Settings] - Provide keyboard settings \u0026 link to System Settings.\n* 🩺 [Status][Status] - Detect if a keyboard is enabled, has full access, etc.\n* 🎨 [Styling][Styling] - Style your keyboard to great extent.\n\n\n\n## Documentation\n\nThe [online documentation][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.\n\n\n\n## Demo App\n\nThe `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. \n\nThe app has two keyboards - a `Keyboard` that uses KeyboardKit and a `KeyboardPro` that uses KeyboardKit Pro.\n\n\u003e [!IMPORTANT]\n\u003e 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.\n\n\n\n## KeyboardKit App\n\nDownload the [KeyboardKit app][KeyboardKit-App] from the App Store to try KeyboardKit without having to write any code or build the demo app from Xcode.\n\n\n\n## Support This Project\n\nKeyboardKit is open-source and completely free, but you can support the project by becoming a [GitHub Sponsor][Sponsors], upgrading to [KeyboardKit Pro][Pro] or [get in touch][Email] for freelance work, paid support etc.\n\n\n\n## Contact\n\nFeel free to reach out if you have questions or if you want to contribute in any way:\n\n* Website: [keyboardkit.com][Website]\n* E-mail: [info@keyboardkit.com][Email]\n* Bluesky: [@keyboardkit.bsky.social][Bluesky]\n* Mastodon: [@keyboardkit@techhub.social][Mastodon]\n\n\n\n## License\n\nKeyboardKit is available under the MIT license. See the [LICENSE][License] file for more info.\n\n\n\n[Email]: mailto:info@keyboardkit.com\n[Website]: https://keyboardkit.com\n[Bluesky]: https://bsky.app/profile/keyboardkit.bsky.social\n[Mastodon]: https://techhub.social/@keyboardkit\n[Sponsors]: https://github.com/sponsors/danielsaidi\n\n[About]: https://keyboardkit.com/about\n[Gumroad]: https://kankoda.gumroad.com\n[KeyboardKit-App]: https://keyboardkit.com/app\n\n[KeyboardKit]: https://github.com/KeyboardKit/KeyboardKit\n[Pro]: https://github.com/KeyboardKit/KeyboardKitPro\n[Documentation]: https://keyboardkit.github.io/KeyboardKit/\n[License]: https://github.com/KeyboardKit/KeyboardKit/blob/master/LICENSE\n\n[Getting-Started]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/getting-started-article\n[Essentials]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/essentials-article\n[Essentials-KeyboardView]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/essentials-keyboardview\n[Essentials-Memory-Management]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/essentials-memory-management\n\n[Actions]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/actions-article\n[AI]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/ai-article\n[App]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/app-article\n[Autocomplete]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/autocomplete-article\n[Buttons]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/buttons-article\n[Callouts]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/callouts-article\n[Device]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/device-article\n[Dictation]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/dictation-article\n[Emojis]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/emojis-article\n[External]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/external-keyboards-article\n[Feedback]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/feedback-article\n[Gestures]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/gestures-article\n[Host]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/host-article\n[Input]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/input-article\n[Layout]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/layout-article\n[Localization]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/localization-article\n[Navigation]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/navigation-article\n[Previews]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/previews-article\n[Proxy]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/proxy-article\n[Settings]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/settings-article\n[Status]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/status-article\n[Styling]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/styling-article\n[Themes]: https://keyboardkit.github.io/KeyboardKit/documentation/keyboardkit/themes-article\n","funding_links":["https://github.com/sponsors/danielsaidi"],"categories":["Swift"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKeyboardKit%2FKeyboardKit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FKeyboardKit%2FKeyboardKit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKeyboardKit%2FKeyboardKit/lists"}