Project 03 / 03No longer live
RecallAI
AI study helper: a RAG pipeline over uploaded documents that generates quizzes and flashcards.
Problem
Re-reading notes is passive and slow. RecallAI turns uploaded study material into practice: a retrieval-augmented generation pipeline indexes the documents and generates quizzes and flashcards grounded in what the student actually uploaded.
Architecture
- Next.js and React application deployed on Vercel.
- Firebase for storage and data.
- OpenAI and LangChain for the generation pipeline; Sentence Transformers for document embeddings.
- Clerk for authentication and Stripe for payments.
Key decisions & trade-offs
- Retrieval-augmented generation over fine-tuning. Questions stay grounded in the uploaded documents and new material works immediately; the trade-off is that answer quality depends on retrieval quality.
- Managed services (Firebase, Clerk, Stripe, Vercel) instead of self-hosting. Fast to ship and nothing to operate, in exchange for vendor lock-in.
Security, cost & testing
- Identity and payments are delegated: Clerk holds sessions and credentials and Stripe holds card data, so the application never stores either.
- Uploaded documents and the generated quizzes and flashcards live in Firebase, scoped to the signed-in user.
- Cost scales with use rather than with time: Vercel and Firebase have no idle infrastructure to pay for, and OpenAI is billed per generation.
- The gap is measurement. Retrieval and generation changes were judged by hand; an evaluation set of documents with expected questions is the first thing I'd add.
What I'd do differently
- Build the evaluation set before the prompt. A fixed corpus with expected questions and answers turns every retrieval or generation change into a score instead of an opinion.
- Version the chunking and embedding choices. Chunk size, overlap, and the embedding model are product decisions in a RAG app; recording them with the index makes a change comparable and reversible.
- Keep the thin-interface discipline. Delegating auth, payments, and storage to Clerk, Stripe, and Firebase was right for speed; wrapping each behind a small module would make the lock-in a choice rather than a fact.