AI / Generative AI / Full Stack
LearnForge
LearnForge is my most ambitious build so far: a full tutoring platform where a student uploads their own course content and gets back grounded explanations, generated quizzes and spaced-repetition flashcards. It pairs a Next.js front end with a Django REST Framework backend and a retrieval layer over the student's own documents.
What it is.
Most study tools either give you generic content or make you write your own questions. LearnForge starts from the material a student already has — a course PDF, a set of lecture notes, a recorded lecture — and builds the study loop around that specific content.
The platform handles the whole cycle: ingest and chunk the source material, embed it into a vector store, answer questions with citations back to the source, generate quizzes at a chosen difficulty, and track which topics a learner keeps getting wrong.
02 — The problem
A student revising from a 200-page course handbook has no fast way to check understanding. Generic AI chat answers confidently but drifts away from the syllabus, and hand-writing practice questions is slow enough that most people skip it.
03 — The approach
Ground every answer in the learner's own uploaded material using retrieval-augmented generation, then reuse the same retrieved context to generate quizzes and flashcards — so practice questions and explanations both come from the same source of truth.
What it actually does.
Document, video and audio ingestion
PDFs and notes are parsed and chunked directly; recorded lectures are transcribed with Whisper first so spoken content joins the same index.
Grounded AI tutoring
Questions are answered from retrieved chunks of the learner's material, with the source passage shown alongside the answer.
AI-generated quizzes
Multiple-choice sets are generated per topic and difficulty, with explanations attached to each answer.
Flashcards and spaced review
Key concepts are turned into flashcards so recall practice sits next to the reading material.
Progress tracking
Quiz results are stored per topic so weak areas surface instead of being buried in a single overall score.
JWT authentication
Token-based auth separates each learner's uploads, chat history and progress from everyone else's.
How the pieces fit together.
Next.js client
Course workspace, tutor chat, quiz runner and progress views. Talks to the API over authenticated fetch calls.
Django REST Framework API
Auth, course and document CRUD, quiz lifecycle and progress endpoints. The single place business rules live.
Ingestion pipeline
Extract → transcribe (Whisper, for media) → chunk → embed. Runs behind the API so uploads do not block the request.
ChromaDB vector store
Holds embeddings per course so retrieval is scoped to the material a learner actually uploaded.
LangChain + OpenAI
Orchestrates retrieval, prompt assembly and generation for tutoring answers, quizzes and flashcards.
PostgreSQL
Relational store for users, courses, documents, quiz attempts and progress history.
The stack.
Chosen for the problem, not for the resume.
- Next.jsReactTypeScript
- DjangoDjango REST FrameworkPythonJWT
- OpenAILangChainChromaDBWhisper
- PostgreSQLEmbeddingsVector search
From input to output.
The sequence a single request travels through.
- 01
Ingest
Documents are parsed and media is transcribed so every source ends up as plain text.
- 02
Chunk & embed
Text is split into overlapping chunks and embedded into ChromaDB, namespaced per course.
- 03
Retrieve
A learner's question is embedded and matched against that course's chunks by semantic similarity.
- 04
Generate
Retrieved passages are assembled into the prompt so the model answers from the material rather than memory.
- 05
Assess
The same context generates quiz items; attempts are scored and written back as per-topic progress.
The part that stuck.
Student portfolio, so this section is the point — here is what this build actually taught me.
Chunking strategy changes answer quality more than prompt wording does. Overlapping chunks sized around a paragraph gave far better retrieval than large page-sized splits.
Keeping the vector store namespaced per course avoided the most common RAG failure I hit early on — answers leaking in from an unrelated document.
Django REST Framework's serializers pushed me to define the API contract properly before writing the UI, which saved a lot of rework on the Next.js side.
Transcription is slow enough that it has to be treated as background work; doing it inside the upload request made the interface feel broken.
AI Quiz & MCQ Generator
A full-stack app that turns an uploaded document — or a live web search — into a graded multiple-choice quiz.
Have a project idea?
I'm open to freelance projects, collaborations, internships, and opportunities where I can contribute while continuing to grow.
Usually replies within a day · Lahore, Pakistan · PKT (UTC+5)