A native Android app for learning English words, built on my own: capture a word from any app, get an AI-written article with translations, then learn it with spaced repetition and AI-generated exams.
My role
Independent product: idea, specification, Android architecture, AI integration and development.
Stack
Kotlin
Jetpack Compose
Hilt
Room
Ktor
WorkManager
Gemini API
Anthropic API
The problem
Unknown words appear everywhere — in browsers, chats, screenshots — and copying them into a dictionary breaks the flow. Plain translations are also forgotten quickly without practice.
Architecture
A Kotlin app with a Jetpack Compose UI, ViewModels and a domain layer of use cases and repository interfaces; Hilt wires the data layer: Room for words, progress and exams, an AiClient with Gemini (default) and Anthropic implementations over Ktor, WorkManager for the offline queue, EncryptedSharedPreferences for the API key and a foreground service that watches for new screenshots.
Key decisions
01One AiClient interface, two providers
Why
The app talks to the model only through a domain interface. Gemini and Anthropic are interchangeable implementations — switching providers is a one-line change in dependency injection, and the rest of the app doesn't know which one is used.
02Strict JSON from the model, parsed defensively
Why
Every response must be JSON; the parser strips code fences, retries once on a parse error and then returns a typed error the UI can show — the app never crashes on a bad model answer.
03No AccessibilityService
Why
Capturing words uses only the text-selection menu, image sharing and screenshots, so the app works without the most sensitive Android permission.
Trade-off
Words can't be picked up from screens automatically; the user has to select, share or screenshot.
What I built
Capture words from anywhere: text-selection menu in any app, shared images with crop and AI OCR, and a screenshot watcher with a floating bubble
AI word articles — explanation, Russian and Turkmen translations, examples — with text-to-speech
AI behind one interface with Gemini (default) and Anthropic implementations; the user's own API key is stored encrypted
Leitner spaced repetition, five local quiz types, AI-generated exams and checking of open answers
Offline queue: words added without a network are processed by WorkManager later
Room database with tested migrations, backup export/import, UI in English, Russian and Turkmen