← Milos Ozegovic

Side project · outside my usual stack

An iPhone keyboard, because I needed one

I build PHP backends for a living. The stock iPhone keyboard kept getting in my way, so I learned enough Swift and iOS to build a replacement and take it through App Store review.

TimelineFirst commit to submission in 3 days
StackSwift, SwiftUI, KeyboardKit
StatusIn App Store review

The problem

The stock iPhone layout didn't suit how I type. Numbers, commas and Serbian letters were each a page switch or a keyboard switch away: no digits row, a comma hidden behind 123, symbols not where I expected them, and š, ć, č, đ and ž on a separate keyboard.

So I built the one I wanted.

Letters page with a row of digits above the letters, and comma and period on either side of the spacebar Long-pressing C shows ć and č ahead of the other accented forms First symbols page with math signs, brackets and punctuation
Letters with a permanent digits row · long-press for Serbian letters · Android-style symbol pages

What it does

That's all. No autocorrect, no suggestions, no accounts, no network code. It's about 300 lines of Swift.

Learning the platform

Most of the work was learning how iOS keyboard extensions behave. A few things I ran into:

LinkingKeyboardKit ships as a closed-source binary framework. It is linked into the container app only, and the keyboard extension finds it at runtime in the app's Frameworks folder: one copy, shared by both.
The digits rowThe library's built-in number toolbar renders blank on iPhone in its free tier, so the digits row is a real layout row, inserted by hand.
The return keyIts action carries the text field's return type, which changes from field to field. Resizing it means matching the kind of action, not a specific value.
Web address fieldsThese already have a key that types a period and offers .com on long-press, so the keyboard leaves its own period out there instead of showing two.
HapticsiOS won't let a keyboard vibrate without Full Access, which also unlocks network access. I made it optional, said in plain words what it's for, and kept the keyboard fully usable without it.

The Xcode project is generated from a short spec with XcodeGen rather than committed, so the build configuration is readable and reviewable, the same way I'd treat infrastructure config anywhere else.

Shipping it

Getting it onto the App Store was its own small project: a container app, because iOS only ships keyboards inside one; screenshots at the required device sizes; a preview video; a privacy policy hosted on GitHub Pages; and review notes explaining exactly what Full Access is used for. I tested it on my own iPhone through TestFlight, and answered App Review's follow-up questions with a screen recording.

It's here because it isn't PHP. When something needs doing outside my usual stack, I learn what's needed and ship it properly.

The source is public: github.com/milosozegovic/simple-ios-keyboard. The app has its own support page, and its privacy policy is short, because there is nothing to collect.

Side project, September 2026. — Back to milosozegovic.com