I built LEKLearn for people preparing for Poland's Medical Final Examination. The product includes question extraction from PDFs, interactive tests and spaced repetition. It reached 1,000 active users in its first two months and passed 3,000 registrations by September 2026. Registrations are cumulative, not a monthly active-user count.

Reading a question and saving an answer are different promises

A question can remain readable from the cache after the connection disappears. The screen still looks usable. A learner can reasonably assume that answering it will also preserve their progress.

That assumption is where an offline feature becomes a product problem. Marking a question as known and saving an attempt in progress do not carry the same risk when the learner returns on another device.

The conflict is in the meaning of progress

Consider someone who answers questions offline on a phone, then resumes the test on a connected computer. When the phone reconnects, an older snapshot must not silently replace the newer work. Replaying a request does not resolve which version of the attempt should win.

I gave those actions separate behavior. Cached questions and images remain available to read. Changes to known questions can enter a queue for replay. Saving the current test requires a connection, and the interface makes that limit explicit.

A queued change is still pending. The interface cannot treat the start of a replay as proof that the server accepted it, even if the local screen already reflects the learner's choice.

A smaller promise the learner can rely on

In this product, I chose to limit offline saving rather than ask learners to untangle conflicting test attempts. Offline support belongs to specific actions, each with a result the user can understand.

That distinction shaped the interface as much as the storage. The question at each step was what the learner would believe had been saved when they closed the app.

Visit LEKLearn ↗

Working on a product people need to resume and trust?

Describe your case ↗