Kado is an open-source spaced repetition flashcard app built with Kotlin Multiplatform for Android and iOS. It helps you learn and retain knowledge using your choice of SM2 or FSRS scheduling algorithms, with support for rich text cards, Anki deck imports, and a companion ESP32 hardware device.
Spaced Repetition & Review
- SM2 and FSRS scheduling algorithms with per-deck selection
- Four-button rating system (Again / Hard / Good / Easy) with interval preview
- 3D card flip animation with crossfade content transitions
Deck Management
- Create and manage flashcard decks with daily new card limits
- Deck partitioning — split large decks into sub-decks for focused study
- Deck cloning and reversed deck creation
- Bulk editing with saved find/replace rules (plain text and regex)
Card Content
- Rich text / HTML rendering (bold, italic, colors, headings, lists)
- Image support in cards
- Adjustable card font scaling
- Import Anki
.apkgdecks with template rendering and media extraction
Customization & Platform
- Dark and light themes
- Localization (English, Spanish)
- Text-to-speech for card pronunciation (Android)
- Tablet-friendly layout
- Kotlin Multiplatform — shared logic across Android and iOS
Analytics & Hardware
- Learning statistics — calendar heatmap, daily review history with cumulative trend, rating breakdowns, and hour-of-day distribution, filterable by deck and 30d / 90d / 1y range
- Sync decks to an ESP32 hardware device over WiFi
- Getting Started — Installation, creating decks, reviewing cards
- Feature Reference — Detailed documentation for all features
- ESP32 Hardware Guide — Device setup, communication protocol, .ald format
You can download the latest Android APK from the Releases page.
iOS builds require building from source via Xcode (see below).
./gradlew :androidApp:assembleDebugOpen the iosApp/ directory in Xcode and run from there.
This project enforces code quality through automated tooling:
| Tool | Purpose | Command |
|---|---|---|
| ktlint | Kotlin linter & formatter | ./gradlew ktlintCheck |
| detekt | Static analysis | ./gradlew detekt |
| Kover | Code coverage | ./gradlew :composeApp:koverHtmlReport |
./hooks/enable_hooks.shThis installs:
- pre-commit — runs ktlint + detekt (blocks commit on violations)
- pre-push — runs unit tests + version tag validation (blocks push on failure)
./gradlew ktlintFormat./gradlew :composeApp:testAndroidHostTest./gradlew :composeApp:koverHtmlReport
open composeApp/build/reports/kover/html/index.html| Directory | Purpose |
|---|---|
composeApp/ |
Shared KMP module (commonMain + platform actuals) |
androidApp/ |
Android app entry point |
iosApp/ |
iOS Xcode project |
Kado supports syncing flashcard decks to an ESP32-based hardware device for offline review. See the ESP32 Hardware Guide for the device communication protocol, .ald format specification, and setup instructions.
If Kado is useful to you, consider supporting its development:
This project follows GLP v3. See the LICENSE file for details.



