Back to blogs
2025-08-05
3 min read
SmartClass – AI‑Powered Roadmaps & YouTube Learning for Students
An AI assistant that converts goals into step‑by‑step roadmaps, curates YouTube lectures, and tracks learning progress. Covers architecture, retrieval, ranking, and UX decisions.
SmartClass – AI‑Powered Roadmaps & YouTube Learning for Students
SmartClass helps students turn outcomes (e.g., “learn Full‑Stack”) into actionable roadmaps, pairing each step with high‑quality YouTube lectures and practice tasks.
Project Name and Context
- Project: SmartClass (learning assistant)
- Audience: Students and self‑learners targeting practical outcomes
- Why: Abundance of content, shortage of structured paths
Functionality and Purpose
- Roadmap generation from a goal and skill level
- Curated lectures with quality filters (duration, engagement, recency)
- Practice tasks per node with difficulty ramp
- Progress tracking and reminders
- Offline notes and flashcards
Problem It Solves
- Reduces overwhelm; replaces random tutorials with structured tracks
- Finds current, credible videos that actually teach
- Encourages consistency via reminders + visible progress
Tech Stack Used
- Frontend: Next.js 15, Tailwind CSS, Zustand
- Backend: Node.js (API), PostgreSQL (progress), Redis (queues/cache)
- AI/RAG: OpenAI/LLM, vector store (pgvector/Weaviate), rerankers
- Ingestion: YouTube Data API v3, periodic refresh
How I Built It (or Am Building It)
Ingestion & Indexing
// fetch videos by topic, apply quality filters, store embeddings
for (const topic of topics) {
const videos = await yt.search(topic, { max: 50 });
const curated = videos.filter((v) => v.duration < 60 && v.views > 5000);
await embedAndUpsert(
curated.map((v) => ({
id: v.id,
title: v.title,
desc: v.description,
}))
);
}
Roadmap Synthesis
// prompt + tools -> DAG of concepts with prerequisites
const roadmap = await llm.plan({ goal: "Full‑Stack Web", level: "beginner" });
// normalize to nodes/edges, attach evaluation rubrics
Retrieval & Ranking
// hybrid search: dense + lexical + rerank
const candidates = await searchVideos(node.topic);
const reranked = await rerank(candidates, node.learningOutcome);
return pickTop(reranked, 3);
Progress Tracking
CREATE TABLE progress (
user_id UUID,
node_id TEXT,
status TEXT CHECK (status IN ('todo','doing','done')),
updated_at TIMESTAMPTZ DEFAULT now(),
PRIMARY KEY (user_id, node_id)
);
Unique Implementations or System Design
- DAG‑based roadmap with prerequisite checks
- Hybrid retrieval (dense + BM25) then learning‑outcome rerank
- Cold‑start filters: duration, engagement, recency, channel trust score
- Practice rubric to validate completion objectively
Realistic Challenges or Tradeoffs
- Ranking drift if you don’t refresh embeddings and signals
- YouTube API quotas; batch and cache aggressively
- Subjectivity in “quality” → use explicit signals + user feedback
- Motivation: build gentle nudges, not nagging
What I Learned or Improved
- Treat AI as an orchestrator; keep data models explicit
- Clear UX beats clever prompts—visibility drives completion
- Reliability: background jobs, retries, and observability from day one