Adding an AI Tutor to a Flashcard App Without Trusting the LLM
A flashcard tests recall, not understanding. Flip the card, read the answer, and the question “did I actually get it?” is answered by you, and you are the least reliable judge in the room. Overconfidence is the default: I kept believing I knew a word while being unable to use it in a sentence, and the app had no way to tell the difference.
I use LexiStack to learn vocabulary and technical concepts for myself, and that gap, between “I recognize this” and “I can use this”, is exactly what a tutor closes. So I built one in: for every card in a study session, the app now asks me to do something with the term, an LLM checks whether my answer actually shows understanding, and if it doesn’t, it explains the gap. The AI never grades the card on its own. It suggests, and I decide.
LexiStack already used an LLM to generate content (card suggestions, deck generation); this was the jump to AI as an interaction layer during the study session. And it raised the question that shaped every decision below: how do you add AI to a feature whose core loop, the review plan that decides when each card comes back, must never break?
from client-side template] B --> C[User types answer] C --> D["POST /api/tutor/cards/{id}/validate"] D --> E{AI available?} E -->|no| F[503, manual session continues] E -->|yes| G[LLM returns verdict + feedback] G --> H[Grade derived server-side
from the verdict] H --> I[Suggested grade highlighted] I --> J[User confirms or overrides] J --> K["POST /api/study/{id}/review
review plan updates"]