Skip to content
Tanvir Ahamed

Japanese learning app with spaced repetition

A Flutter learning application with adaptive review scheduling, vocabulary and kanji study, and transactional progress tracking in Firestore. An ongoing personal project.

Role
Personal project developer
Type
Personal application · In development, 2026
Built with
Flutter, Dart, Riverpod, Firebase Auth, Cloud Firestore, Cloud Functions

Overview

This Japanese learning application brings content study and spaced repetition into one workflow. Learners browse vocabulary and kanji, build a study deck, and review cards according to their due dates and daily new-card allowance.

The engineering focus is the review system: a scheduling engine separated from the UI, repository interfaces for persistence, and coordinated updates to cards, review history, and progress statistics. The application is in development; the timed mock-exam flow and several backend services are not complete.

Problem

A review session needs to balance overdue material with new content. It also needs to record a learner’s response consistently: the next review date, the review log, and daily progress should all reflect the same action.

How it works

  1. Build the queue

    The review screen loads due cards, reads the day’s learning statistics, and introduces new cards within the remaining daily allowance.

  2. Grade and schedule

    A pure Dart scheduler converts a review rating into updated memory state and a next due date. It implements day-based FSRS scheduling with an SM-2 fallback.

  3. Persist the review

    A Firestore transaction writes the updated card, a review log, daily statistics, and the applicable streak update together. User records are stored beneath the authenticated user’s document.

Design decisions

Keep scheduling independent of the interface

The scheduler takes explicit state, a rating, and a timestamp without reading Firebase or Flutter state. Tests cover new cards, lapses, retention, and deterministic behavior, making the scheduling rules easier to inspect independently.

Commit related progress updates together

Grading affects several records. Grouping the writes in a transaction avoids committing a card update without its corresponding review log or daily statistic. This does not by itself resolve simultaneous reviews of the same card on different devices.

Separate exam estimates from official results

The exam-scoring service checks both overall and section thresholds and explicitly marks its output as an estimate. It is a separate domain component; the timed exam screen is not yet wired into a complete exam session.

Limitations and next steps

  • Complete the timed exam session and connect it to the existing scoring service.
  • Implement the remaining reminder, purchase-validation, content-publication, and account-deletion functions before presenting those services as available.
  • Add integration coverage for review persistence and concurrent device updates; the current unit tests focus on scheduling and exam scoring.