Skip to content

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.