Skip to content
Case study · 2025

Lexicon: Vocabulary App for Android, iOS & Web

An open-source, offline-first vocabulary app built with Kotlin and Compose Multiplatform, backed by a Spring Boot service I built and run.

Lexicon is a vocabulary app for Android, iOS, and the web. You save the words you want to learn, review them in short sessions, and your list stays the same on every device. If you have a long text, a PDF, or a screenshot, AI can pull the words out for you.

It's on Google Play and the App Store.

Why I built it

New words end up scattered across notes apps, flashcard apps, and screenshots, and none of them talk to each other. Typing words in from a PDF or a photo by hand is slow, and progress on one device doesn't show up on another. I wanted one app that keeps everything in one place and does the tedious importing for me.

What's in it

  • One Compose Multiplatform UI shared by Android and iOS.
  • Review sessions that bring words back at the right time, and move them along as you learn them.
  • AI imports from pasted text, uploaded files, or screenshots.
  • Firebase and KMPAuth for sign-in and analytics on every platform.
  • A backend I built with Spring Boot (Kotlin) and PostgreSQL that handles accounts, sync, AI imports and review reminders.

How the code is organized

  • composeApp - app entry point, dependency injection, platform hooks
  • presentation - Compose screens and navigation
  • domain - use cases and models in plain Kotlin
  • data - repositories, the SQLDelight database, Ktor clients, and sync
  • platforms & core - notifications, secure storage, shared helpers
  • design-system, resources, utils, test - shared UI components, assets, helpers, and test utilities

Gallery

Under the hood

Lexicon is where I apply the same principles I use at work: scalable architecture and offline-first design. Everything the UI shows comes from the local database first and syncs with the backend in the background, so the app works without a connection. The code follows Clean Architecture, and state flows one way from repositories to the screens, which keeps review sessions predictable and easy to test.

Contributing

  1. Fork the repository.
  2. Clone it:
    git clone https://github.com/rezaiyan/Lexicon
  3. Copy the default configuration:
    cp local.defaults.properties local.properties
  4. Open it in Android Studio and run the app.