Founder · After Hours Data Systems
Independent Mobile App Business
I taught myself mobile development and built around 20 apps, then focused on one profitable product: a paid study app for a professional certification exam. It has sold over 50,000 copies across iOS and Android.
Product development and maintenance
I first released on Android, then brought the retained product to iOS. I later rebuilt it in Flutter and Dart so both platforms share one codebase.
I handle compatibility updates, content, and releases. AI-assisted development also made a full rebuild and a closer review of the study design practical as a solo developer.
Built on how memory works
I designed the study features around retrieval practice, spaced review, and relearning. The app decides what to ask and when, helping students spend less time rereading and more time recalling the material.
Recall first, then explain
Study and practice modes ask students to answer before showing the explanation. A read-through mode remains available, but the app recommends practice that requires recall.
After an answer, the app explains the correct choice. Students can reveal an answer rather than guess; a reveal counts as a miss and brings the question back sooner.
Spaced review
The SM-2 algorithm increases review intervals after correct answers and shortens them after misses. Sessions prioritize overdue reviews, then new questions, then weaker material.
Relearning until it sticks
Missed questions return within the session, and mastery requires correct answers on separate days.
- Within a session A missed or revealed question comes back a few questions later, and keeps coming back until it is answered correctly once. Only the first answer counts toward scores, scheduling, and readiness, because a re-ask is a learning step, not new evidence of what the student knows.
- Across days A question counts as mastered only after correct answers on three separate days, with no miss in between. Mastered questions still return at long intervals, and a miss on one un-masters it. Students upgrading from earlier versions keep the mastery they have already earned, since the long-interval checks catch anything that was only crammed.
Mixed topics
Practice sessions and mock exams mix topics. I also checked the fixed question-bank order and found it was already well mixed, so I kept it to avoid disrupting saved progress.
Readiness students can check
I replaced a predicted exam score with a readiness status based on practice results students can inspect. Each section shows the evidence behind its status and a next step.
- Plain-language status Each exam section reads Getting started, Not ready yet, Almost ready, or Ready to pass, with the figures behind it and the next step to take.
- Recent answers, not lifetime totals Accuracy looks at the student's latest answer to each recently practiced question, so early mistakes they have since learned stop counting against them.
- Only exam conditions can say ready A section reaches Ready to pass only after the student passes two mock exams in a row under exam conditions, with no feedback until the end and the real pass mark.
Measuring whether it works
I added opt-out PostHog analytics to understand study patterns without collecting names, question content, or answers. Location lookup is off, and test devices are excluded. I track time from Getting started to Ready to pass to help evaluate changes to the study experience.
I decided against asking users to report real exam results: people who pass may never reopen the app, making the responses hard to interpret.
How changes are built
I plan changes in GitHub issues, including research, saved-progress compatibility, and required tests. Development uses Claude Code, with automated checks for study logic, upgrades, accessibility, and English and Spanish layouts.
Companion content tooling
Python tools handle content collection, deduplication, and import.
Business operations
I also handle the business: accounting, taxes, store submissions, payments, customer support, and revenue tracking.
Research the design draws on
- Roediger & Karpicke (2006). Test-enhanced learning. Psychological Science, 17(3).
- Dunlosky, Rawson, Marsh, Nathan & Willingham (2013). Improving students' learning with effective learning techniques. Psychological Science in the Public Interest, 14(1).
- Cepeda, Pashler, Vul, Wixted & Rohrer (2006). Distributed practice in verbal recall tasks. Psychological Bulletin, 132(3).
- Rawson, Dunlosky & Sciartelli (2013). The power of successive relearning. Educational Psychology Review, 25(4).
- Roediger & Marsh (2005). The positive and negative consequences of multiple-choice testing. Journal of Experimental Psychology: Learning, Memory, and Cognition, 31(5).
- Butler & Roediger (2008). Feedback enhances the positive effects and reduces the negative effects of multiple-choice testing. Memory & Cognition, 36(3).
- Rohrer & Taylor (2007). The shuffling of mathematics problems improves learning. Instructional Science, 35(6).
- Kornell & Bjork (2008). Learning concepts and categories: Is spacing the "enemy of induction"? Psychological Science, 19(6).
Skills exercised