Skip to content
Martin Poiroux
Language : Français
Projects · CodeCode · Products · 2026

learn-app

A spaced-repetition revision app, in Expo and React Native. The SM-2 algorithm at the centre, a real-time duel around it, and everything still working without a network.

Revising works badly when you choose what to revise yourself: you go back to what you already know, because it feels good. The classic answer is the SM-2 algorithm, and it is what holds the core of the application. Each question carries an ease factor that starts at 2.5 and never drops below 1.3, an interval and a repetition counter; a correct answer sends the card to one day, then six, then to the previous interval multiplied by its factor; a failed answer sends it back to the next day and resets the counter to zero. Overdue cards go first, and on a tie the hardest one comes out.

Animated diagram: every correct answer pushes the card further out, as in SM-2; a mistake brings it back to tomorrow. Click the scene to fail the next review.
The home screen: the daily challenge, progress and topics.

The grade you give your own answer is the point paper leaves to the program. Here it is not asked of the user: it is derived from the response time relative to the time allowed. Under three tenths of the limit, the answer counts as perfect; beyond half, as correct but laboured. It is a considered trade-off, and the price of an application where you answer fast rather than self-assess after each card.

Around that core, seventeen screens: solo, revision, daily challenge, friends, leaderboards, achievements, and a two-player mode where the game lives in a Firestore document both phones listen to in real time. Two hundred and eighty questions written by hand, across ten themes and three levels, including a series that shows an image rather than a statement.

A timed challenge question.

Offline is not a degraded mode but the default position: questions, results and revision cards are in local cache, results produced without network wait in a sync queue, and the application starts entirely without Firebase, a local guest profile being enough to play.

The correction, with its explanation.

What does not exist, and is better said: question generation by a model. The service is written, the themes and levels are described in full, the prompt is built, but no key is connected and the call raises an explicit error. It is a socket waiting for an appliance, not a feature.

Private project, no public link