StudyFlow (مذاكرتي)
StudyFlow turns study effort into measurable progress: subjects, tasks, focused study sessions, exam countdowns and spaced review, in one app that works entirely on the phone. Statistics are progress-oriented, never guilt-based, and every screen works in Arabic and English, right-to-left and left-to-right.
Privacy is a property of the build, not a promise in a policy. The release app has no internet permission, no account, no analytics and no advertising ID, and that is checked in the compiled manifest of every release build rather than in the source. Study data lives in a local database; the only ways it leaves the device are a backup file the user saves themselves, or an event they choose to save in their own calendar app.
What the app does
Each subject has its own colour and an optional weekly study target; Home, the subject list and each subject's page show how much of this week's target is filled.
Study in focused stretches with breaks. Elapsed time is always computed from the session's start, so the timer stays accurate even if the app is closed or the phone restarts.
Assignments and exam dates tied to their subject, with what is due today on Home. An exam, or a task with a due date, can be sent to the phone's calendar app.
Question-and-answer cards per subject, or a pasted list added at once. Cards you know come back less and less often; a card you miss comes back tomorrow.
Study time by day and by subject, the days you studied, your sessions and where your cards stand — plus a short look back and ahead at the start of each week.
No sign-up, no analytics, no advertising ID, no third-party tracking. Save a backup file whenever you like and restore it yourself on a new phone.
How it's built
StudyFlow is feature-first (each feature split into data, domain and presentation), with business rules only in domain use-cases. The domain layer is pure Dart and notifiers never import Flutter; an architecture test fails the build if a layer reaches where it shouldn't. Riverpod manages state above the repositories, GoRouter uses typed routes, and Drift (SQLite) is the local store, with versioned migrations now at schema v4.
Backups are a versioned JSON file that mirrors the database row for row, so a new table needs no per-table export code — and a test fails if any table is neither backed up nor deliberately excluded. Restoring replaces everything and never merges.
See it in action
Real engineering challenges
A build-script commit brought INTERNET back into the release build, and nobody noticed for four days because the source manifest looked right — and a library can merge in a permission no source file mentions. The fix reads the compiled manifest inside every built AAB and APK and fails on any network or advertising-ID permission. It also fails if it cannot find the package name, so a broken read can never pass silently, and CI runs a self-test against fake bundles before trusting it.
Calendar plugins ask for calendar access the app doesn't need. Instead, a small platform channel opens the calendar app's own pre-filled new-event screen — an insert intent on Android, the system event editor on iOS 17+ — so nothing is added unless the user saves it there, and StudyFlow requests no calendar permission at all.
Most review happens in the evening, so a card graded at 21:00 and due "in three days" would only reappear at 21:00. Due dates are midnight of the target calendar day instead, which also keeps daylight-saving changes from ever shifting a card.





