
Honing
A native iPhone app for the Dutch A2 civic integration exam. Spaced repetition over 1,032 cards, a simulator for all five parts, a plan from your exam date.
- Track
- built
- Category
- tool
Tools
- Swift
- SwiftUI
- SwiftData
- Node
A native iPhone app for the Dutch A2 civic integration exam. Solo project, SwiftUI over SwiftData, iOS 17 and up.
Passing the inburgeringsexamen means preparing for five separate parts: reading, listening, writing, speaking, and knowledge of Dutch society. Most learners study for it in the evenings, around work. The available material is scattered, and very little of it tells you whether you are actually ready.
A spaced repetition trainer over 1,032 cards in 35 topics, with seven drill types including listening and speaking. Every new card is taught before it is tested.
A full exam simulator: five parts, four complete forms each, in practice mode or as a timed mock. Practice questions are ordered adaptively, unseen first, then the ones you keep missing. Each part gets a readiness signal and a breakdown per skill.
A study planner that takes your exam date and splits the remaining days into a baseline phase, a building phase and a mock exam phase.
Fourteen graded readers sit beside all of it, with audio, per paragraph translation and comprehension questions, plus seven grammar sections with drills attached.
Sanne is an optional coach that answers questions about Dutch at A2 level. It runs on Apple's on device model and is grounded in a fixed set of verified grammar rules. Where the device cannot run it, the entry point is not shown at all, so the feature is absent rather than present and broken.
Engineering notes
The scheduling engine, the exam planner and the scoring are pure Foundation code, with no UI or database imports, so they run headless. Fifty unit tests cover them.
Content is generated, not hand written. A Node extractor reads the source material and writes three JSON bundles. Card ids stay stable across regenerations, so a content update never resets anyone's progress.
Speech uses two Apple backends behind one protocol: live on device transcription on newer systems, with a fallback for older ones. A single coordinator owns the audio session, so text to speech and the microphone cannot cut each other off.
The Xcode project is generated from a manifest rather than committed, which keeps project changes reviewable in a diff.
The design system uses tokens only. Type scales with the system setting, and contrast on the brand colour was corrected to meet WCAG AA in dark mode.
Privacy was a build constraint, not a policy page. There is no backend, no key in the binary and no analytics, so there is nothing to leak.
In TestFlight, in preparation for App Store release. Roughly 11,000 lines of Swift across 52 files.
Screens


The date is the only input. Everything the app schedules after this counts backwards from it. 


A daily review


The scheduler is printed on the buttons that set it. Four intervals, and the one you press is what decides when the card comes back. 











More apps

Beast Protocol
A native iOS training app for intermediate and advanced lifters. No videos, no photos, no streaks, and a schedule that suggests instead of insisting.
tool · soon · wip · read it
KetoGen
Built to keep keto interesting, not just compliant. Meals from a curated library or generated on-device, with macros the language model never touches.
tool · soon · wip · read it
Bespoke
A pixel art bar for the end of the day. You watch the drink being made, and then you get the real recipe to make it at home.
tool · soon · wip · read it