
case-study
Flashcards App
A deliberately simple native iOS vocabulary trainer, built on the Oxford 3000 — the English words that matter most, not beginner basics.
- Vocabulary
- Oxford 3000
- German ↔ English
- Personal app
- Swift
- SwiftUI
- iOS
the problem
Why I built it
I wanted to seriously grow my English vocabulary, but the apps I tried all sat at the wrong end of the spectrum. The big ones — Duolingo and friends — are heavily gamified and complex, and most trainers are built for someone starting a language from scratch. For people who already have a solid base and just want to push further, there was almost nothing.
So I set the bar differently: a deliberately simple trainer built on the Oxford 3000 — the 3,000 most important English words. Not standardised, primary-school vocabulary, but the pragmatic, high-value words that actually move the needle. That app didn't exist, so I built it.
There was a second motive. Building my own apps has fascinated me for years, and I wanted to find out what I could actually ship on my own — with AI as my pair — from an empty Xcode project to something I'd reach for every day.
the approach
The product decisions
I built it for exactly one user first: me. It was meant to live locally on my phone, nothing more. That framing kept every decision small — no accounts, no backend, no feature I didn't personally need.
The core is an honest self-check: reveal the card and rate yourself — knew it, unsure, or didn't know. I chose that over a spaced-repetition algorithm on purpose. It was my first app, so I kept the logic as simple as I could. By the time it was polished enough that I considered opening it up to other people, I was far enough along that retrofitting a full spaced-repetition engine no longer made sense.
The flashcards are only the starting point. The same Oxford 3000 words feed five modes in total, each drilling the vocabulary from a different angle: the classic flashcard self-check; a multiple-choice quiz — four options, one answer — with quick rounds and instant feedback; a type-it-out mode where you write the translation yourself, the most honest test of what has actually stuck; a memory game built around finding matching word pairs; and a fast drag-and-drop mode for pairing terms with their translations. Switching between them keeps daily practice from getting stale, and XP carries across all of them.
The dataset is the official Oxford 3000, pulled in as JSON, with a switchable German ↔ English direction. On top sits a light level-and-XP system — really a foundation I didn't fully finish. The idea was to keep learning rewarding over time and to unlock those modes as you level up: you start with the flashcards the app is named after, and the rest open up along the way.
For the interface I went with Apple's translucent “Liquid Glass” look — partly because it was genuinely easy to implement straight in Xcode, and partly because I just find that style beautiful.
what I built
The product
Flashcards is a native iOS app built in SwiftUI and running entirely on-device — no external database, the data simply lives in the app. Going native was the whole point for me: I'm an app person (I'll take a native app over a browser tab every time), and I wanted to know first-hand what building with Swift and Xcode is like.
It ships the Oxford 3000 with switchable direction and five ways to practise — the flashcard trainer plus multiple-choice, type-the-answer, memory and drag-and-drop modes — alongside favourites, custom word lists, a mistake tracker, and a statistics view with accuracy over time, weekly charts and achievements, all tied together by the level/XP scaffolding and wrapped in the Liquid Glass interface.
One honest caveat: I built this before Claude Code and Codex existed, in tandem with ChatGPT — marking up code blocks, having them rewritten, and reading into Swift just enough to steer. That made the process slow and bug-prone, and the architecture underneath is shakier than I'd like. It works, but it's a first-app foundation, and it's the main reason it never made it to the App Store.
outcome
Why it's inactive — and what it taught me
Two things put it on pause. First, Apple's model: without the €100-a-year developer account, a self-installed app has to be re-signed through Xcode every seven days — something I only learned after the fact. That weekly friction — the app quietly disappearing off my phone — is the real reason I didn't use it daily; whenever it was installed, I genuinely used it every day. Second, that shaky first-app foundation, plus the fact that it isn't even in Git yet, is tech debt I want to clean up before taking it further.
The bigger takeaway went straight into my later work. Flashcards was my first full native app, and building it end to end — data model, learning logic, the XP maths, the charts, the whole SwiftUI interface — stretched me well past the web stack I usually reach for. It also cemented something I've leaned on ever since, through Wunderplanning and my current project: with today's tooling you don't need to be a programmer to ship real software — you need to be technically curious and know what you want.
If I revive it — and I probably will — I'll rebuild the foundation properly, this time with Claude Code and Codex, add the notifications it always needed, and finally get it into the App Store.



















