The problem
For years TIPP10 was the program people learned touch typing with. Its macOS version stopped working with Catalina. What is available instead runs in the browser or asks for a subscription.
There is also a point that is easy to miss with a typing tutor: the program sees every single keystroke. Some solutions ask for far reaching system permissions, others send the input straight to a server.

How it works
- 01Rebuilt in Swift and SwiftUI, with its own exercise texts rather than borrowed content.
- 02Keystrokes are only evaluated inside the app window. There are no global event taps, so neither accessibility nor input monitoring permissions are requested.
- 03The system keyboard layout is detected. Exercises, on-screen keyboard and finger hints follow it, and it can be switched by hand.
- 04Everything stays on the machine. Settings and statistics live in the user preferences, the app creates no files of its own.
The decisions behind it
Two decisions shape how the app is built and checked.
Evaluation inside the app window only. A global event tap would be the convenient route, but it requires permissions that go too far for a typing tutor. Staying inside the window costs some effort in edge cases and avoids the permission prompt entirely.
Launch arguments for visual checks. The app can be driven without a mouse: open a specific lesson, type by itself, jump into a statistics tab. It runs on a volatile store while doing so, leaving the real learning statistics untouched.

Where it stands
The app runs on macOS 26, is signed locally at build time and needs no paid developer account. The repository is public and one command builds it.
It is covered by 94 tests in 13 suites. Together with the launch arguments, a change to the interface can be reviewed in minutes instead of clicking through the app.
No developer account, no special permissions, no connection to the outside.
Learnings
An interface that can be driven by launch arguments is checked faster than any click-through. The effort paid off on the second round already.
