Keybuild
Build your own keyboard
USD 3.99 · Designed for iPad. Not verified for macOS.
Build your own keyboard!
Touchscreen keyboards don't need to be one-size-fits-all, so let's change that! With Keybuild, you choose the layout, the keys, everything.
Keys can be set up to type whatever you want! Letters, greek letters (ɑ, β, ɣ), maths symbols (π, ∫, ∑), arrows (↑→↓←), or even your favourite emoji can be added and organised depending on your needs.
Create multiple ‘panes’, each containing keys arranged using a stack-based layout, and switch between them with either an automatic menu, or direct links.
Add a small number row to your Qwerty keyboard, or have a try using Azerty or Colemak layouts. Build a keyboard that can keep up with your maths-heavy university course, or specialist profession. Or just make a dashboard for your favourite emoji. Or do all that and more, it's up to you!
This app does its best to supports VoiceOver, and accessibility APIs.
Technical note: This app is 99% SwiftUI, which is as close as you can get while we wait for the ‘SwiftUI Lifecycle’ to come to Custom Keyboard Extensions! SwiftUI powers this app's advanced functionality, as well as some of its more unusual bugs. :)
Disclaimer: This iPad app is available on Apple Silicon Macs, but macOS currently does not support keyboard extensions. Still waiting for that tablet Mac!
more • Makes the Paste option always visible when adding a key, to aid discovery.
• Updated to use iOS 18 SDKs.
• Adds emoji jump option for the unicode picker. (Slow, but doesn’t crash!)
• Various optimisations.
1.7.4 08/10/2024
This update fixes a rare case where key presses might not register.
1.7.3 22/04/2022
Keybuild v1.7.2 - Tall Tales
Keyboard panes can now have individual heights!
This is primarily a bug fix update, but I couldn't help but throw in a cool new feature while in the area.
FEATURES
• A new section for editing pane details has been added to the editor.
- Pane height can now be set on an individual basis.
- Pane titles can now also be edited from the pane editor. Previously this could only be achieved by tapping the name on the pane list.
- The root editor title has changed from "Root Stack" to "Stack Pane" to reflect the fact pane editing options are available. Alternative pane layouts are a future direction.
FIXES
• Fixed an issue where landscape keyboards could size themselves incorrectly on iPhones with a notch.
1.7.2 15/04/2022
FEATURES
• Added cursor hover effects to the modifier controls and keyboard preview.
• The long press setting now has a stepper.
• The unicode picker is now available when editing Text Stacks.
FIXES
• Fixed an issue where keys could trigger twice.
• Removed a stray rectangle around existing modifier buttons.
TWEAKS
• Adding wording to the "Getting started" page text around a recent bug where keyboards can take time to appear.
• Swapped around the add pane item menu, so regular keys are initially shown, and special/layout items are in the submenu.
• The add pane item menu is now ordered a bit more intuitively.
• Renamed "Menu" to "Pane menu" (officially, unofficially that was always the name).
• "Caps Lock" → "Caps lock" for consistency with other names.
• Clarified "Convert to keys" to "Convert to inline keys" for contrast with "Convert to stack".
1.7.1 25/03/2022
Keybuild v1.7.0 - The Modifier Normaliser
FEATURES
• The Shift modifier is now usable for all action types, not just type actions.
• A fancy new UI, for selecting different combinations of modifiers to trigger actions (currently includes shift & long press).
• Pane components can now be copy & pasted around in the editor.
• Added a setting to control the duration after which key repeat or long press actions trigger.
TWEAKS
• Fixed multiple touches on a single key locking up the key. This will hopefully resolve a rare issue where keys would output twice.
• Text stacks now look slightly different in the editor preview. The blue highlight is now more of a background.
• Improved accessibility of the keyboard height text field + stepper control.
PERFORMANCE IMPROVEMENTS
• The expanded form of Text Stacks is now precomputed rather than expanding each layout cycle.
• Action-based keys now only compute their automatic keycap text/symbol once per layout cycle.
• Tweaked the way long press updates the keycap symbol/text.
• The Stack editor preview is now its own view for more targeted SwiftUI layout cycles.
• Special menu keys like Globe & Pane Menu contained non-functional buttons to provide the graphics. Now they just use the graphics directly.
• Trusting SwiftUI a bit more for view diffing.
• The keyboard now reads haptics preferences at the top of the view tree, then adds it to the SwiftUI environment, rather than referencing @AppStorage in each key. (Hoping this is an improvement.)
DEV TRIVIA
• Script build phase users - get your build script file lists right.
• Adding ITSAppUsesNonExemptEncryption to your Info.plist saves selecting a radio button every release.
1.7.0 18/03/2022
This update fixes the autocapitalisation feature.
The logic is now a lot simpler as I've rewritten it using Swift's new async-await feature!
1.6.2 07/03/2022
The VoiceOver once-over!
FEATURES
• Added a Direct Touch Typing mode option to the in-app Settings page, which attempts to recreate the stock iOS keyboard's Touch Typing mode using VoiceOver's Direct Interaction option, for lack of any way to read or apply the system option directly.
• VoiceOver now announces when the active pane changes, to provide confirmation and to match the stock keyboard.
TWEAKS
• The "Toggle Editor" button has changed to "Show/Hide Editor".
• VoiceOver now announces where the editor will appear, when pressing "Show Editor".
• Custom back buttons in the editor panel now have their labels prefixed with "Back to ".
FIXES
• Enable/disable shift preview labels are now the correct way round. Sorry about that!
• Resolved a minor memory leak.
• The keyboard extension now fails safely in a few situations which should never happen.
1.6.1 18/02/2022
FEATURES
• Added a new action - Paste! This action pastes your current clipboard contents when triggered, see below for more gritty details. (Requires full access)
• Key presses are now sent in press-down order when the first key is lifted, to match the stock keyboard. This should help touch-typers! Please leave feedback if this change affects your experience in any way, hopefully for the better!
TWEAKS
• Clarified that Pane Link actions are case-sensitive and navigate to the first matching pane.
• Made Delete action hint VoiceOver-compatible.
GRITTY DETAILS
• The paste action's default keycap will turn grey if no pasteboard content is detected, or if you somehow copied an empty string. To avoid pasteboard access notification spam, this check is only performed when the key is pressed.
• Internally, the paste action reads your clipboard and performs a type action with the contents. This should result in keyboard features working mostly as you'd expect - the shift key will update after a paste for autocaps users, the return key will enable where appropriate, and a more curious feature where double-tapping paste with a space on your clipboard will insert a full stop.
• Adopted some iOS 15 system colours and protocol conformances behind the scenes.
1.6.0 04/02/2022
LONG PRESS TRIGGERS
Keys supporting custom actions now support custom long press actions too! It's as simple as that.
PAN CURSOR ACTION
Just press down on a key with this action set to turn your keyboard into a trackpad for your text cursor, at least until you lift your finger again! It works great in combination with long press triggers.
UPDATED PANE TEMPLATES
• Pan your cursor left/right quickly by holding down on your space bar with the updated pane templates, and continue to use the arrow keys for fine tuning on larger keyboards.
• The keyboard dismissal modes have been merged, making your keyboard less busy. You can now long press on the dismiss keyboard button to enter text selection mode (‘soft dismiss’).
• Globe & pane menu keys have been swapped in templates to better match the stock keyboard, but of course you can swap them right back if you prefer it that way!
THE FUTURE IS HERE
This update requires iOS 15.
1.5.0 28/01/2022
This update is intentionally small. This update adds a size editor at the bottom of a key's edit pane, but consists mainly a number of under-the-hood optimisations to the way stacks lay out their contents, and a backend editor tweak to improve robustness of the app to crashes.
----
I've noticed a crash on iOS 15 where rotating to landscape in the pane editor on iPhone. This is not due to any change on my end, and I get literally no information as to why this crash occurs, so it remains unfixed. Apologies! You can work around this by rotating on the landing screen.
I'd fix it if I could, but honestly trying to work around and restructure my app for inexplicable OS crashes is incredibly demotivating, so I'm going to stick to stuff I can control, like adding features and making the app more bug-resistant, and only add workarounds for critical functionality such as the keyboard itself.
1.4.2 21/01/2022
Fixed an issue when running on iOS 15, so you can now modify layout weights again. Thanks for your patience! Please continue to report bugs!
(Dev note: Apparently SwiftUI's TextField doesn't like CGFloat anymore, but Double works fine. Weird!)
Updated to the iOS 15 SDK, so stuff might look a subtly different. Xcode 13 is great!
----
For those wondering, reasons for the recent update hiatus include:
1. The Xcode beta basically breaking SwiftUI over the summer and trying to debug the issues was a bit of a motivation killer. SwiftUI still seems to be an unstable foundation for an app as complex as this - even Apple seems to be struggling with Shortcuts this year.
2. Bit less time & energy over the last couple of months. (But then lockdown's been ending here in the UK, and I've been easing myself back into life as usual! Yay!)
3. Anticipation for app development on iPad is also a bit of a factor, just knowing I could be coding a good portion of this app on my primary device in a few months… So excited…
There's still more in development, I've got plenty of features I'd like to add. I'm aiming for long-term support & maintenance at absolute minimum, hence this update which is a very targeted bug-fix, as what I've got locally might not be ready for a few more weeks.
1.4.1 19/10/2021
REDESIGNED EDITOR
• Adds a dedicated button above the preview to select the root stack of a pane, and a custom, persistent up navigation button to the editor panel.
• What you see is now what you get. The preview's inline triple-dot buttons, which were both fiddly to tap, and could throw off your layout, are no more, being replaced by the features above.
• Convert a text-stack to either inline keys or a key stack, no matter where you selected it from! The limitations are lifted.
• Delete a key, right from its edit panel! No more navigating up to the container to delete.
• The edit panel now shows by default, to help you get straight into your edits.
• New fancy pointer effects for the buttons above the preview area.
TWEAKS
• The edit panel now gracefully slides in & out.
• Modernised the edit panel with a large title style.
• The new pair of buttons above the preview area are a little larger, so you can be a little less precise.
• Triple dot buttons are sus, you never know what they'll do. The button to toggle the edit panel on iPhone is now a little circled pencil!
• Low level optimisations - keys now skip their layout pass if nothing has changed, which hopefully helps performance a bit.
• Added Return to the ‘Add key’ menu, for discoverability. This creates a Type key pre-set with a newline signal.
BUG FIXES
• Ever noticed the thin grey divider for the edit panel on iPad doesn't actually extend to the top of the screen? Now it does.
• Fixed the preview area no longer showing updates when the user rotates from iPhone portrait to landscape… Unfortunately, this means the visual launch glitch has to make a return on the launch screen. Boo!
COMMENTS
I'd rather have continued using the native NavigationView in the editor, but it was leading to all sorts of problems:
• Navigation context was lost on rotation. SwiftUI can't figure out, or be told, that the editor has just moved and isn't a brand new view.
• Tapping a new view to edit from the preview, would just swap out the root of the navigation stack without closing any pushed views.
For these reasons, it was not just easier, but also more reliable and flexible to just create my own navigation system. It does have its downsides - I spend a few hours trying to make transition animations work without luck! Sorry if anyone preferred the old system, I'll be returning to a native one as soon as SwiftUI provides a solution the above issues.
1.4.0 06/06/2021
TWEAKS
• The ‘Done’ button to close the edit panel when presented as an overlay has been renamed to ‘Close’, as pressing Edit would result in both buttons being called ‘Done’ which seems a tad confusing.
• Pane menus now have a section divider between ‘Keybuild Settings…’ and the actual panes, for better visual clarity.
FIXES
• Fixed the UI glitching between two designs on launch, by specifying a fixed style in code. Finally!
• Fixed a crash which could occur at sizes where the edit panel is displayed as an overlay. Hopefully this fixes the source of the few general instability reports I've received!
• Disabled autocaps in the stack item relative size field, to improve access to number keys for common layouts.
• Partial fix for a case where text fields could visually revert to their previous value. There seems to be a rare SwiftUI navigation bug which my app's layout runs into affecting iPhones in portrait (technical note: compact-width size classes), and this bug stems from my workaround for that bigger bug, so I should at least be able to limit the impact of any bugs to just that scenario going forward, if not find a better workaround eventually.
• Key previews in the edit panel header should now display with the correct text case.
BEHIND THE SCENES
• Updated to Swift 5.4.
• More updates to the tests, for a work-in-progress setup to automatically run tests on new code.
• Better organised code files.
• Rewrote the logic for the UI for keys, to allow me to extend it with new interactions more easily in the future.
• Rewrote some of the backend editor logic to be easier to work with, and more extensible to support new layout types.
1.3.1 03/05/2021
NEW ACTION - URL LINKS
• This update introduces URL links! These let you open a website, Shortcut, or URL scheme right from your keyboard.
• To aid discovery, the Key Picker menu when adding to a stack has been revamped to include Key variants, configured with all available action types.
MORE SETTINGS
• Give your keyboard more room with the new keyboard height setting! Perfect for your new number row.
• The full-stop shortcut is here, triggered with a double-tap of the space bar (which means any key that types " ").
ACCESSIBILITY IMPROVEMENTS
• Jump right to the app from the Pane Menu, with the new "Keybuild Settings…" option. Just to complete the globe key parallels.
• The contrast for key presses is increased, so you can type with more certainty.
• Lots more views have accessibility labels now, so voiceover & voice control support should be significantly improved.
• New features are now grouped in the update notes for readability… What do you mean “that doesn't count”?
BUG FIXES
• Help page padding now applies just to the text, rather than the entire scrollable area.
BEHIND THE SCENES
• I've decomposed a few of the editor's views. This makes working with the code easier, but may introduce bugs. Keep me posted!
• I've also reworked the system for storing keyboard settings. To be technical, I've centralised default values and made the system type-safe.
• Removed a List nested in another List. This didn't seem to be doing anything…
• Added support for ‘opening documents in place’. This should make no practical difference for imports, and is necessary for macOS Catalyst support (editor-only of course), which may be added one day if I can resolve the bugs.
• Sorry about the sudden gap in updates! I was taken out for a few weeks by illness.
• Hyped to add cursor hover effects in a future update for iOS 14.5, which apparently fixes the pervasive ghosting issues in SwiftUI!
Note - Due to an iCloud Drive mishap, I lost a portion of my code changes for v1.3.0 and had to re-write them. I've now taken additional measures to help ensure this doesn't happen again. This release should behave exactly the same as v1.3.0, but includes that re-written code.
1.3.0b 09/04/2021
NEW ACTION - URL LINKS
• This update introduces URL links! These let you open a website, Shortcut, or URL scheme right from your keyboard.
• To aid discovery, the Key Picker menu when adding to a stack has been revamped to include Key variants, configured with all available action types.
MORE SETTINGS
• Give your keyboard more room with the new keyboard height setting! Perfect for your new number row.
• The full-stop shortcut is here, triggered with a double-tap of the space bar (which means any key that types " ").
ACCESSIBILITY IMPROVEMENTS
• Jump right to the app from the Pane Menu, with the new "Keybuild Settings…" option. Just to complete the globe key parallels.
• The contrast for key presses is increased, so you can type with more certainty.
• Lots more views have accessibility labels now, so voiceover & voice control support should be significantly improved.
• New features are now grouped in the update notes for readability… What do you mean “that doesn't count”?
BUG FIXES
• Help page padding now applies just to the text, rather than the entire scrollable area.
BEHIND THE SCENES
• I've decomposed a few of the editor's views. This makes working with the code easier, but may introduce bugs. Keep me posted!
• I've also reworked the system for storing keyboard settings. To be technical, I've centralised default values and made the system type-safe.
• Removed a List nested in another List. This didn't seem to be doing anything…
• Added support for ‘opening documents in place’. This should make no practical difference for imports, and is necessary for macOS Catalyst support (editor-only of course), which may be added one day if I can resolve the bugs.
• Sorry about the sudden gap in updates! I was taken out for a few weeks by illness.
• Hyped to add cursor hover effects in a future update for iOS 14.5, which apparently fixes the pervasive ghosting issues in SwiftUI!
1.3.0 06/04/2021
Features
• Auto-capitalisation is here, to save you a tap! If you prefer things the way they were, it can be disabled in the new Behaviour section of the in-app Settings. (Pay no heed to all these colourful British spellings)
• Haptics are joined by input clicks! Clickety-clack. This will match your setting for the stock keyboard by default.
• The Settings page now features a handy text field for testing out your keyboard with all these new settings.
• Keyboard performance improvements, and fixes a bug which could cause the keyboard to appear stretched following device rotation.
• Big wording changes to Getting Started and Settings, along with handy links to the app's permissions settings.
• Speaking of, Getting Started referred to the ‘Restore Qwerty’ option in the + menu, which would add Qwerty straight to the top of the list if you get stuck. That option actually didn't exist; now it does.
• Keyboard performance improvements.
Bug fixes
• Fixes a bug which could cause the keyboard to appear stretched following rotation.
• Caps Lock, like Shift, now supports multi-touch - you can hold down the key with one finger to enter a temporary shift mode, type using other keys, then lift. If no keys are pressed while the button is held, caps lock enables as normal. This is technically a bug fix. Does anyone even use this feature on the stock keyboard?
• Relatedly, it was possible to double-tap the editor's shift button to enter caps lock mode. Now it just acts as a shift mode on/off button.
v1.2.1
• v1.2.0 added some logic to hide the haptics options for unsupported devices. However, I had to infer support from a newer API than the one I use to generate haptics, and it turns out the two didn't match up, resulting in the option being incorrectly hidden on some older devices. I've rolled back the change.
1.2.1 04/03/2021
Features
• Auto-capitalisation is here, to save you a tap! If you prefer things the way they were, it can be disabled in the new Behaviour section of the in-app Settings. (Pay no heed to all these colourful British spellings)
• Haptics are joined by input clicks! Clickety-clack. This will match your setting for the stock keyboard by default.
• The Settings page now features a handy text field for testing out your keyboard with all these new settings.
• Keyboard performance improvements, and fixes a bug which could cause the keyboard to appear stretched following device rotation.
• Big wording changes to Getting Started and Settings, along with handy links to the app's permissions settings.
• Speaking of, Getting Started referred to the ‘Restore Qwerty’ option in the + menu, which would add Qwerty straight to the top of the list if you get stuck. That option actually didn't exist; now it does.
• Keyboard performance improvements.
Bug fixes
• Fixes a bug which could cause the keyboard to appear stretched following rotation.
• Caps Lock, like Shift, now supports multi-touch - you can hold down the key with one finger to enter a temporary shift mode, type using other keys, then lift. If no keys are pressed while the button is held, caps lock enables as normal. This is technically a bug fix. Does anyone even use this feature on the stock keyboard?
• Relatedly, it was possible to double-tap the editor's shift button to enter caps lock mode. Now it just acts as a shift mode on/off button.
1.2.0 02/03/2021
Version 1.1 is here!
Added in this release:
• A new Unicode picker - your personalisation options just got a lot wider.
• Haptics! A frequent request which can now be enabled in new settings screen. Requires Full Access to be enabled in Settings.
• A revamped front page, with links out to Getting Started, Settings, and the new Symbol Browser!
• Clarifications for a few behaviours in the UI.
Fixes:
• Fixed a bug where navigation links in the editor would get stuck, preventing you from returning to subviews from whence you came.
Not fixed quite yet:
• There's a design glitch on the iPhone Panes list, which would have been fixed in this release, but it turned out using any other List Style somehow prevents the preview updating in the editor, so I reverted it at the last minute. I might have another go at this in a later update.
*v1.1.1 adds a note that Full Access is required for haptic feedback to function.*
1.1.1 15/02/2021
Version 1.1.0 is here!
Added in this release:
• A new Unicode picker - your personalisation options just got a lot wider.
• Haptics! A frequent request which can now be enabled in new settings screen.
• A revamped front page, with links out to Getting Started, Settings, and the new Symbol Browser!
• Clarifications for a few behaviours in the UI.
Fixes:
• Fixed a bug where navigation links in the editor would get stuck, preventing you from returning to subviews from whence you came.
Not fixed quite yet:
• There's a design glitch on the iPhone Panes list, which would have been fixed in this release, but it turned out using any other List Style somehow prevents the preview updating in the editor, so I reverted it at the last minute. I might have another go at this in a later update.
1.1.0 14/02/2021
This one's a reliability update, with fixes for some of the main issues reported on /r/Keybuild.
Niceties:
• Increased the keyboard's font size a bit, to better match the stock keyboard.
• Pane Menus no longer show the active pane. Duh!
• Swipe to clear text fields! SwiftUI doesn't support that little ⊗ button in text fields, so this big red Delete button will have to do.
• Updated accessibility labels in a few places (for VoiceOver / Voice Control). Currently the app isn't accessibility friendly, but the UI tests should help me gradually improve things on that front.
Bug fixes:
• Disabled the ‘No Selection’ screen for now, as a quick-fix. It will be back, but next time only where it's needed!
• Disabled autocorrect in the key editor text fields. Since generally you want to type characters rather than light prose, I figured it'd just get in the way.
• Fixed an issue that got SwiftUI all worried. You might find the keyboard is now a little more stable after using key repeats.
Process:
• I've made a start on a UI test suite, which should help prevent regressions in terms of basic navigation, adding/removing items in lists, and any other app functionality. This will evolve as I identify more bugs.
1.0.3 31/01/2021
Fixes a second bug which could render the key editor undismissable when navigating to a sub-editor. Thanks for your patience on this one, and please let me know of any more bugs you encounter in this version over at /r/Keybuild, the reports really help!
1.0.2 26/01/2021
Fixes a bug which could render the key editor undismissable for some users.
1.0.1 25/01/2021
Adds a "key repeat" option for regular action-based keys, which is now the default for "Delete" and "Move cursor" actions.
1.0.0 18/01/2021
Fix the keyboard height to update correctly when the device rotates.
0.9.1 17/01/2021
• Makes the Paste option always visible when adding a key, to aid discovery.
• Updated to use iOS 18 SDKs.
• Adds emoji jump option for the unicode picker. (Slow, but doesn’t crash!)
• Various optimisations.
more Version 1.7.4 08/10/2024
Data Not Collected The developer does not collect any data from this app.