{"id":15527114,"url":"https://github.com/keyboardkit/keyboardkitpro","last_synced_at":"2025-04-05T22:05:19.330Z","repository":{"id":37595496,"uuid":"339336265","full_name":"KeyboardKit/KeyboardKitPro","owner":"KeyboardKit","description":"KeyboardKit Pro lets you create custom keyboard extensions with a few lines of code, using Swift \u0026 SwiftUI.","archived":false,"fork":false,"pushed_at":"2025-04-01T13:01:44.000Z","size":192928,"stargazers_count":124,"open_issues_count":7,"forks_count":8,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-05T22:05:05.529Z","etag":null,"topics":["apple","emoji","ios","keyboard","keyboard-extension","macos","swift","swiftui","tvos","watchos"],"latest_commit_sha":null,"homepage":"https://keyboardkit.com","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","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":null,"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}},"created_at":"2021-02-16T08:49:43.000Z","updated_at":"2025-04-02T11:06:04.000Z","dependencies_parsed_at":"2024-01-05T13:50:37.915Z","dependency_job_id":"a72657a2-792f-4b72-917f-630c9d49e12d","html_url":"https://github.com/KeyboardKit/KeyboardKitPro","commit_stats":{"total_commits":458,"total_committers":1,"mean_commits":458.0,"dds":0.0,"last_synced_commit":"6a0efd0202c836c182e6f05bfae916a895e04090"},"previous_names":[],"tags_count":218,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KeyboardKit%2FKeyboardKitPro","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KeyboardKit%2FKeyboardKitPro/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KeyboardKit%2FKeyboardKitPro/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KeyboardKit%2FKeyboardKitPro/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KeyboardKit","download_url":"https://codeload.github.com/KeyboardKit/KeyboardKitPro/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247406085,"owners_count":20933803,"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","watchos"],"created_at":"2024-10-02T11:04:30.611Z","updated_at":"2025-04-05T22:05:19.322Z","avatar_url":"https://github.com/KeyboardKit.png","language":"Shell","funding_links":["https://github.com/sponsors/danielsaidi"],"categories":[],"sub_categories":[],"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/KeyboardKitPro?color=forestgreen\u0026sort=semver\" alt=\"Version\" /\u003e\n    \u003ca href=\"https://keyboardkit.github.io/KeyboardKit\"\u003e\u003cimg src=\"https://img.shields.io/badge/documentation-read-blue.svg\" alt=\"Documentation\" /\u003e\u003c/a\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/license-commercial-yellow.svg\" alt=\"Documentation\" /\u003e\n\u003c/p\u003e\n\n\n# KeyboardKit Pro\n\n[KeyboardKit][KeyboardKit] 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=\"350\" /\u003e\n\u003c/p\u003e\n\nKeyboardKit Pro extends KeyboardKit with Pro features, such as fully localized keyboards, autocomplete, an emoji keyboard, AI support, integrations, themes, and much more. See the [feature table](#pro-features) below.\n\nKeyboardKit Pro requires a license to be used. You can sign up on the [KeyboardKit website][Website] or the [Gumroad store][Gumroad].\n\n\n\n## Installation\n\nKeyboardKit Pro can be installed with the Swift Package Manager:\n\n```\nhttps://github.com/KeyboardKit/KeyboardKitPro.git\n```\n\nKeyboardKit Pro must only be linked to the main app target. A keyboard extension will still be able to use it by just importing KeyboardKitPro where needed.\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 KeyboardKitPro\n\nextension KeyboardApp {\n\n        static var keyboardKitDemo: KeyboardApp {\n        .init(\n            name: \"KeyboardKit\",\n            licenseKey: \"your-key-here\",                // Required by 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        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\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            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\n## Localization\n\nKeyboardKit supports [72 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 unlocks localized keyboards, layouts, callouts and behaviors for all supported locales.\n\n\n\n## Pro Features\n\n[KeyboardKit][KeyboardKit] provides a free, open-source keyboard engine. KeyboardKit Pro unlocks more powerful pro features:\n\n* 🌱 [Essentials][Essentials] - More essential tools, previews, toolbars, etc.\n* ⌨️ [Essentials-KeyboardView][Essentials-KeyboardView] - Make the keyboard view do a lot more.\n* 🤖 [AI][AI] - Features that are needed for AI.\n* 📱 [App][App] - App-specific screens \u0026 views.\n* 💡 [Autocomplete][Autocomplete] - Local \u0026 remote autocomplete, next word prediction, etc.\n* 🗯 [Callouts][Callouts] - Localized callout actions for all supported locales.\n* 🎤 [Dictation][Dictation] - Dictate text from the keyboard.\n* 😀 [Emojis][Emojis] - A powerful emoji keyboard, search, etc.\n* ⌨️ [External][External] - Auto-detect if an external keyboard is connected. \n* 🏠 [Host][Host] - Identify and open specific host applications.\n* 🔣 [Layout][Layout] - More input sets and layouts for all supported locales.\n* 🌐 [Localization][Localization] - Services \u0026 views for all supported locales.\n* 👁 [Previews][Previews] - Keyboard \u0026 theme previews for in-app use.\n* 📄 [Proxy][Proxy] - Allow `UITextDocumentProxy` to read the full document.\n* 📝 [Text][Text-Input] - Allow users to type within the keyboard.\n* 🍭 [Themes][Themes] - A theme engine with many pre-defined themes.\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 [main repository][KeyboardKit] 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## 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## Commercial License\n\nKeyboardKit Pro requires a license to be used. You can sign up on the [KeyboardKit website][Website] or the [Gumroad store][Gumroad].\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\n[KeyboardKit]: https://github.com/KeyboardKit/KeyboardKit\n[KeyboardKit-App]: https://keyboardkit.com/app\n[Pro]: https://github.com/KeyboardKit/KeyboardKitPro\n[Gumroad]: https://kankoda.gumroad.com\n[License]: https://github.com/KeyboardKit/KeyboardKitPro/blob/master/LICENSE\n\n[Documentation]: https://keyboardkit.github.io/KeyboardKitPro/\n\n[Getting-Started]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/getting-started\n[Essentials]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/essentials\n[Essentials-KeyboardView]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/essentials-keyboardview\n[Essentials-Memory-Management]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/essentials-memory-management\n\n[Actions]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/actions-article\n[AI]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/ai-article\n[App]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/app-article\n[Autocomplete]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/autocomplete-article\n[Buttons]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/buttons-article\n[Callouts]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/callouts-article\n[Device]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/device-article\n[Dictation]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/dictation-article\n[Emojis]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/emojis-article\n[External]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/external-keyboards-article\n[Feedback]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/feedback-article\n[Gestures]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/gestures-article\n[Host]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/host-article\n[Layout]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/layout-article\n[Localization]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/localization-article\n[Navigation]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/navigation-article\n[Previews]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/previews-article\n[Proxy]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/proxy-article\n[Settings]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/settings-article\n[Status]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/status-article\n[Styling]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/styling-article\n[Text-Input]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/text-input-article\n[Themes]: https://keyboardkit.github.io/KeyboardKitPro/documentation/keyboardkitpro/themes-article\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkeyboardkit%2Fkeyboardkitpro","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkeyboardkit%2Fkeyboardkitpro","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkeyboardkit%2Fkeyboardkitpro/lists"}