StudyFlashcards app PRD: spaced-repetition learning, shipped in two weekends
A working spaced-repetition flashcard app needs three things: decks, a study session, and a scheduling algorithm that surfaces the right cards on the right days. Anki is the gold standard; Quizlet is the polished alternative; both have rough spots. StudyFlashcards v1 fills a clean gap: web-first, free, with a simplified SM-2 algorithm that's accurate enough for self-study and simple enough to ship in two weekends.
What this is
A StudyFlashcards app PRD captures the data model for decks and cards, the spaced-repetition scheduling logic (a simplified SM-2 variant), the daily study flow, and the progress views that help users see retention over time. The v1 targets students and self-learners who tried Anki and bounced because of the desktop-first UI, or used Quizlet and outgrew its limited algorithm. Success at v1 means 40 weekly active users studying at least 3 sessions per week.
Compared to alternatives
| Option | Best for | Trade-off |
|---|---|---|
| Lovable | Schema + CRUD + study session UI in one shot | Custom keyboard shortcuts need a Cursor pass after |
| Cursor + Drizzle + Next.js | Full control over the SRS algorithm and keyboard UX | Slowest to v1; budget 30+ hours |
| Bolt with Next.js | Stack control + tighter dev loop than Lovable | Wire Supabase by hand |
| Anki | Free, battle-tested, desktop-first | UI is dated; sync requires AnkiWeb account |
| Quizlet | Polished, mobile-first, free tier | Algorithm is "leitner light"; serious learners outgrow it |
| Mochi | Hosted SRS with markdown notes | Paid; less popular |
A real example
Product Requirements Document — StudyFlashcards v1
TL;DR
A web app where students create decks, add flashcards, and study with spaced repetition. After each card, the user rates recall (again, hard, good, easy) and the app schedules the next review using a simplified SM-2 algorithm. Target: 40 WAU within 60 days. Differentiator from Anki: web-first, clean UI, no sync setup; differentiator from Quizlet: real spaced repetition (not Leitner).
Goals (business):
- 40 WAU within 60 days
- 60% of weekly users complete 3+ study sessions per week
- Self-funded; no paid tier in v1
Goals (user):
- Create a deck of 20 cards in under 10 minutes
- Daily 15-minute study session that surfaces exactly the right cards
- See retention curve per deck after 2 weeks of use
Personas:
- Priya, medical student: memorizing pharmacology; tried Anki but found the UI off-putting
- Kenji, self-learner: learning Japanese vocabulary; uses Quizlet but wants better scheduling
Functional requirements (P0):
- P0-1. Auth: email + magic link. Acceptance: signup-to-first-card under 3 minutes.
- P0-2. Create / edit / delete decks. Each deck has a name and an optional description. Acceptance: a user can name a deck, save it, and add cards in under 30 seconds.
- P0-3. Create cards with front + back (plain text, no images in v1). Acceptance: 20-card deck creation in under 10 minutes.
- P0-4. Study session that surfaces today's due cards (any card with
next_review_at <= now). Acceptance: session loads cards in correct order (most-overdue first). - P0-5. Simplified SM-2 scheduling: after each card, user rates recall (4 options); the algorithm updates
interval_days,ease_factor, andnext_review_at. Acceptance: scheduling math matches SM-2 reference behavior for the 4 rating paths. - P0-6. Daily streak: count consecutive days with at least one completed session. Acceptance: streak handles timezone correctly.
Functional requirements (P1):
- P1-1. Retention chart per deck (% recalled correctly over time).
- P1-2. Cram mode: study a deck regardless of due dates.
UX flow: 4 screens.
- Sign-in
- Deck list (name, card count, due-today count)
- Deck editor (add / edit / delete cards)
- Study session (one card at a time, keyboard shortcuts: space to flip, 1-4 to rate)
Success metrics:
- 60% of new users complete a study session on day 1
- 40% of week-2 users return for week-3
- Streak math has zero off-by-one errors across 100 test sessions
- SM-2 algorithm output matches reference values within 1 day on a 100-card test
Technical considerations:
- Stack: React + Supabase (Lovable defaults) or Next.js + Drizzle + Neon if going the Cursor route
- Deploy: Vercel
- SM-2 algorithm: implement the simplified variant inline; ~20 lines of TypeScript
- Timezone: store user IANA tz; calculate "today" server-side
Lovable appendix — Supabase schema:
profiles(id uuid → users.id, timezone text)decks(id uuid, user_id uuid, name text, description text)cards(id uuid, deck_id uuid, user_id uuid, front text, back text, created_at timestamptz)reviews(id uuid, card_id uuid, user_id uuid, rating int, interval_days numeric, ease_factor numeric, reviewed_at timestamptz, next_review_at timestamptz)card_stateview: latest review per card withnext_review_atfor the "today's due cards" query- RLS: user_id = auth.uid() everywhere
SM-2 simplified algorithm (TypeScript signature):
function nextReview(rating: 1|2|3|4, prev: { interval: number; ease: number }):
{ interval: number; ease: number; nextReviewAt: Date }
Behavior:
- rating 1 (again): reset interval to 1 day, decrease ease by 0.2 (min 1.3)
- rating 2 (hard): interval × 1.2, decrease ease by 0.15
- rating 3 (good): interval × ease
- rating 4 (easy): interval × ease × 1.3, increase ease by 0.15
Out of scope (v1):
- Shared decks or community decks
- Image / audio cards (text-only)
- Mobile native app (web is PWA-installable)
- Cloze deletion or LaTeX rendering
- Deck import from Anki .apkg files
How to use this
- Pick Lovable if you want the v1 fast. Pick Cursor + Next.js if you care more about long-term control over the SRS algorithm and keyboard UX.
- Implement SM-2 simplified, not full SM-2. The full algorithm has edge cases that don't matter at v1 scale. Simplified ships in 20 lines and is accurate enough.
- Test the algorithm before the UI. Write a unit test for the 4 rating paths against reference values. SRS bugs erode user trust fastest.
- Get keyboard shortcuts right. Power users will rate hundreds of cards per session; mouse-only is unacceptable. Space to flip, 1 to 4 to rate.
- Show due-cards count on the deck list. It's the single most useful piece of feedback. "12 cards due today" is the call to action.
- Don't ship shared decks in v1. It's a multi-week feature (browse, search, fork, attribution) and shifts the product into community territory before the core loop is proven.
FAQ
Is SM-2 still the right algorithm in 2026?
For an MVP, yes. SM-2 is well-understood, has reference implementations, and produces results within 5% of FSRS (the newer algorithm) for typical learners. FSRS is more accurate but harder to implement correctly. Ship SM-2 in v1; upgrade to FSRS in v2 if users care.
Why no image cards?
Image cards add complexity (storage, upload UX, layout, accessibility) without proving the core hypothesis. The core hypothesis is "students will study daily with the right scheduling." Validate that with text cards first; add images in v2 if users specifically request them.
Should I import from Anki?
Tempting but skip it in v1. Anki's .apkg format is messy; the import code is ~500 lines and the value is real only for users with existing Anki decks (a small slice of total users). Add it in v2 once you know who you're serving.
How do I handle leech cards (cards the user fails repeatedly)?
V1: surface them at the top of the deck after 8 lapses. The user can decide to delete, edit, or keep studying. V2: automatic suggestion to break the card into smaller pieces. Don't over-engineer leech handling in v1; users tolerate showing leeches more often than expected.
What's the right pricing model?
V1: free, no paid tier. The product needs to prove retention before charging. V2 (if retention works): $4 to $6/mo for power-user features like advanced stats, larger deck limits, and cloze deletion. Free tier stays useful so the network effect of recommendations holds.