Guide

The flashcard primitive is checked into the repo. That is why your prototype is shape-stable.

Every article that currently ranks for active recall flashcard apps is selling you a finished app: Anki, Brainscape, FlashRecall, RemNote, Gizmo. The keyword in your search bar is different. The word prototype is in there. You want to build one. mk0r is built around exactly that move, and the reason the first draft does not look randomly different every time is that the visual vocabulary is committed source, not a generated guess.

M
Matthew Diakonov
8 min read
Direct answer, verified 2026-05-05

Open mk0r.com. Below the prompt input, click the chip labelled A flashcard app for language learning (one of four seed prompts on the homepage), or type your own variant in one sentence. The first draft renders in roughly two minutes inside a live preview. The Show Answer + Skip button pair, the centered question card, and the four-segment pagination bar all come from the committed primitive at src/components/landing-content.tsx:243. Iterate from there in plain English (add self-rating buttons, change the deck source, swap to image-front cards). No account, no setup.

The pages that rank for this query are not for you

Run the search yourself. The first page is FlashRecall, Brainscape, Active Recall (the brand), Anki, RemNote, Noji, Gizmo, Memo. All polished products selling a deck library or an AI flashcard generator. None of them write a word about how to prototype the surface of a flashcard app, because they sell the answer, not the workshop. If you typed the word prototype into your query, you are not in the market for any of those tools. You are trying to build one, probably to test a teaching idea, probably for a specific subject that no off-the-shelf deck nails, and probably before committing engineering time to it.

The honest stack for that move has three layers. The first is a clickable surface a real learner can try in five minutes. The second is the scheduling logic (Leitner, SM-2, FSRS) you wire in once the surface is settled. The third is real persistence and an account system, which you only need when somebody asks where their progress went. mk0r is built for the first layer, deliberately. You can prototype layer one in a single afternoon, hand the URL to a friend studying for the MCAT, watch them try to use it, and rip the layout apart twice before lunch.

The committed primitive, line by line

Most AI app makers will draw a flashcard differently every time you ask, because the layout is being invented per request. mk0r is anchored to a specific reference design that lives in the homepage source. The agent has read it. When the prompt mentions flashcards, study cards, or recall, this is the visual vocabulary it reaches for.

// src/components/landing-content.tsx:243 (excerpt)
function StudyCardsMockup() {
  return (
    <div className="w-full h-full bg-blue-50 p-4 flex flex-col items-center justify-center gap-3">
      <div className="text-[10px] font-bold text-blue-900 self-start">JavaScript Basics</div>
      <div className="bg-white rounded-xl p-4 shadow-md w-full text-center border border-blue-100">
        <div className="text-[8px] text-blue-400 mb-2">Question 3 of 20</div>
        <div className="text-[11px] font-medium text-zinc-800 leading-relaxed">
          What is the difference between
          <code className="text-blue-600 bg-blue-50 px-1 rounded">let</code> and
          <code className="text-blue-600 bg-blue-50 px-1 rounded">const</code>?
        </div>
      </div>
      <div className="flex gap-2 w-full">
        <div className="flex-1 bg-blue-500 text-white rounded-lg py-1.5 text-center">
          Show Answer
        </div>
        <div className="flex-1 bg-white text-blue-600 border border-blue-200 rounded-lg py-1.5 text-center">
          Skip
        </div>
      </div>
      <div className="flex gap-1 self-start">
        <div className="w-8 h-1 rounded-full bg-blue-400"/>
        <div className="w-8 h-1 rounded-full bg-blue-400"/>
        <div className="w-8 h-1 rounded-full bg-blue-200"/>
        <div className="w-8 h-1 rounded-full bg-blue-200"/>
      </div>
    </div>
  );
}

Five things to notice. The page background is bg-blue-50, the card is white over border-blue-100. The retrieval gate is the bg-blue-500 Show Answer button paired with a Skip outline. The pagination is exactly four w-8 h-1 rounded-full segments, two filled (bg-blue-400) and two empty (bg-blue-200) in the snapshot. The deck label is in the corner, not the center. None of those are accidents. They are the design budget the agent has agreed to spend before it touches your prompt.

A vague prompt versus the seeded one

The prompt you type matters less than which primitive it lands in. The seeded chip on the homepage routes you straight at the Study Cards primitive. A vague free-form prompt about quizzes can land you on a multiple-choice game pattern instead. Same word, different shape.

One word changes which primitive you get

Generic quiz framing. The agent often picks a multiple-choice game pattern: four buttons under the question, score in the corner, no Show Answer step. That is a knowledge-check UX, not an active-recall UX. Useful for some products, wrong for what you asked.

  • Multiple-choice buttons replace the retrieval gate
  • No Show Answer step, the answer is one of the four buttons
  • Score-in-the-corner pattern instead of finite session pager

What active recall actually means in the UI

Active recall is not a layout. It is the discipline of forcing retrieval before revelation. In a UI that respects it, the answer is unreachable until the learner has had to think. Re-reading is the failure mode every well-designed flashcard app is built to prevent. The session loop has five beats; the first draft from mk0r covers four of them, and the fifth is one prompt away.

The five beats of one card

🌐

See the question

Centered card on bg-blue-50, header chip says Question 3 of 20. The reader has nowhere to peek. The answer is not in the DOM yet.

2

Try to recall

The retrieval pause is the whole point of active recall. The UI does nothing here. The reader thinks. Five to fifteen seconds.

Click Show Answer

The committed bg-blue-500 button. Tapping it reveals the back of the card. The retrieval gate is what separates active recall from rereading.

4

Self-rate (in v2)

Default first draft has Skip here. Iterate to four buttons (Again, Hard, Good, Easy) and the deck reorders. That is the Leitner upgrade you wire in second.

Advance the pager

Fourth segment of the four w-8 h-1 rounded-full pager fills in. Card N+1 enters. Session ends when the bar is solid.

The first three beats are non-negotiable. Without them you do not have an active-recall app, you have a slideshow. The fourth beat (self-rating) is what separates a session from a study system: ratings let you reorder the deck and bring weak cards back sooner. The fifth beat (the pager) is what gives the session a shape, so the learner sees an end and feels rewarded for finishing.

Variants you can ask for, without leaving the primitive

Subject does not have to disturb the layout. The Show Answer gate, the centered card, and the pager all hold for any deck. What you change is the content slot on the front and the back. Six common shapes that work without leaving the committed primitive:

Language vocabulary

The seeded prompt on the homepage. Front: a word in the target language. Back: gloss, IPA, an example sentence. Ask for a Show Romanization toggle if the script is non-Latin.

Medical anatomy

Image on the front, label on the back. Ask for an unlabelled diagram of the brachial plexus and a structured answer with origin, course, branches.

Code drills

Question is a code snippet, answer is the output or the bug. Useful for interview prep on JavaScript array methods, Python comprehensions, SQL window functions.

Kanji and characters

Front shows the character, back shows reading + meaning + a mnemonic. Ask for a mode that flips: front shows English, back shows the character.

Music theory

Show a chord on a staff or a fretboard. Answer reveals name, function, and one common progression it appears in.

Custom imports

Paste in a CSV of question + answer rows and ask for a deck that uses them. The primitive does not change; the data layer does.

The honest gap: scheduling is not in the first draft

Anki, FlashRecall, and RemNote have decades of compound iteration on the scheduling algorithm. SM-2 (the original SuperMemo algorithm), the more recent FSRS, the simpler Leitner box system: these are the engines that decide which card you see next. mk0r will not draft a real spaced-repetition scheduler in your first prompt, and you should not pretend it did. What you have after that first draft is the surface a learner can use, with mock state and an in-order deck.

The clean way to upgrade is to ask in a second prompt. Start with a Leitner-style loop because it is the cheapest honest scheduling: "Replace Skip with four self-rating buttons (Again, Hard, Good, Easy). Cards I rate Again come back at the end of this session. Cards I rate Easy do not come back. Persist ratings to localStorage." You will get a working session-level scheduler that survives page reloads. When that stops being enough (probably when somebody studies for two weeks and asks where their schedule lives), wire in a real SM-2 or FSRS implementation. By that point your operator UI is settled, which is the entire reason you prototyped the surface first.

The mistake is the inverse: building a scheduler before you know what the card looks like, what the rating buttons say, or whether your learners will tolerate self-rating at all. Most people will not. Watch one MCAT student look annoyed at the Hard button, and the schedule you spent three days building is the wrong one.

One concrete prompt to start

If you want a starting point that consistently lands in the Study Cards primitive instead of the multiple-choice quiz pattern, paste this verbatim and iterate:

A flashcard app for active recall study.
Front: a question or term, centered on the card.
Back: the answer, revealed only after the user clicks Show Answer.
Header chip: deck name (top left), Question N of total (above the question).
Card: white, soft shadow, rounded, centered on a soft blue page.
Below the card: Show Answer (filled blue) and Skip (white outline) side by side.
Bottom: a four-segment progress bar that fills as the session advances.
Session: 20 cards, in order, no scheduling yet. End screen says "Done" with a Restart button.
Style: clean, generous whitespace, blue accent, no emoji, mobile-first.

The prompt is opinionated on purpose. It names the primitive, names the retrieval gate, and forbids the multiple-choice fallback. The agent will draft the deck with mock content (probably JavaScript basics, because that is what the reference uses) and you swap the deck in the next turn. If you want a kanji deck, say so on prompt two. If you want self-rating, say so on prompt three. The layout will hold while the content slots flex.

Want a hand sketching the deck shape and the rating loop?

Book a 20-minute call. Bring the subject and a sample of the cards you have in your head; leave with a clickable prototype URL and a list of the scheduling decisions worth making next.

Frequently asked questions

Frequently asked questions

What does mk0r actually generate when I ask for a flashcard app?

A real Vite + React + Tailwind project (in VM mode) or a single-file HTML app (in Quick mode), running in a sandbox preview iframe. The first draft uses the committed Study Cards primitive from src/components/landing-content.tsx:243: a centered question card on a soft-blue background, a Show Answer + Skip button pair, and a four-segment pagination bar. Mock data unless you ask for real persistence.

Why is mk0r's first flashcard draft consistent when other AI builders give me a different layout every time?

Because the primitive is checked into the repo. The agent's system prompt nudges flashcard prompts toward the StudyCardsMockup component pattern: blue palette, Question N of total chip, Show Answer (filled) + Skip (outline) button pair, four w-8 h-1 rounded-full pagination segments. Other tools roll the dice on each generation, which is why your second prompt produces a different UI than your first. Shape-stability matters more than novelty for a prototype you want to test with users.

Does the first draft actually implement active recall, or is it just a card flip?

It implements the retrieval gate (you must click Show Answer before the answer reveals, which is the core active-recall move) and the session shape (a finite N-of-total run). It does not ship the Anki-style self-rating buttons (Again, Hard, Good, Easy) by default, because those imply scheduling state. Add them in the next prompt: 'Replace Skip with four self-rating buttons (Again, Hard, Good, Easy) and reorder the deck so cards I rated Again come back first.' That gets you a Leitner-style loop without writing the SM-2 scheduler.

Can I prototype a vocabulary, code, anatomy, or kanji deck, or only language?

Any subject. The seeded button on the homepage is 'A flashcard app for language learning' because language is the most common entry, but the primitive is subject-agnostic. Type 'A flashcard app for medical school anatomy with an image on the front and a label on the back' or 'A flashcard app for JavaScript array methods with the question as a code snippet.' The Show Answer + Skip + pagination shape stays; the content slots flex to fit.

Do I need to sign up to try this?

No. mk0r generates a session key in localStorage on first visit (crypto.randomUUID, src/app/(landing)/page.tsx) and uses it to claim a sandbox. You can describe a flashcard app, watch the first draft stream into the preview, iterate two or three times, and get a shareable preview URL without an email. Signup matters only if you want the project to persist across devices.

What about the spaced repetition algorithm, FSRS or SM-2?

Out of scope for a first-draft prototype. The first draft is the surface a learner sees: a card, a retrieval gate, a progress indicator, a finite session. Scheduling is engine work that lives behind that surface. Once the operator UI is settled (after one or two real users have clicked through it), ask mk0r to add a localStorage-backed scheduler with intervals doubling on Good and resetting on Again. That gets you a Leitner-style loop, which covers the common case. SM-2 and FSRS are an upgrade you wire in when you outgrow that.

Can I export the source and continue the project locally?

Yes. Every file the agent writes lives in a real Vite + React + TypeScript + Tailwind v4 project inside the VM at /app. Download the source, push to your own repo, open it in Cursor or VS Code, and keep going. The active recall prototype is meant to be a starting point, not a lock-in.

Where in the source is the flashcard primitive defined?

src/components/landing-content.tsx, function StudyCardsMockup at line 243. It is also referenced in the SHOWCASE array at line 334 ('Study Cards', 'Flashcard system with spaced repetition and progress tracking'). The seed prompt button 'A flashcard app for language learning' is at src/app/(landing)/page.tsx:1193, one of four prompt chips below the homepage input.

mk0r.AI app builder
© 2026 mk0r. All rights reserved.