E-Learning Platform
A full-stack e-learning platform where students browse, enroll in, and track progress through structured video courses.
- Role
- Solo developer — full-stack build
- Timeline
- 2025
- Status
- Completed — personal project
- Team
- Solo project
Tools
Overview
Built end to end as a personal project — students can browse a course catalog, enroll, and track their progress through structured video lessons. The platform includes a secure admin panel for managing courses, students, and enrollment analytics, with role-based authentication separating admin and student access.
The Problem
Most course platforms I'd used either buried progress tracking behind a paywall or made instructors manage everything through spreadsheets. I wanted to see what a lean version of that admin experience could look like if I owned both the student and admin surfaces end to end.
Architecture
Frontend
Next.js App Router pages for the course catalog and video player, styled with Tailwind CSS and ShadCN/UI components.
API layer
Next.js route handlers exposing REST endpoints for enrollment, progress, and admin CRUD operations.
Auth
JWT-based sessions with role claims, checked in middleware to separate admin and student routes.
Data
MongoDB collections for courses, lessons, enrollments, and progress, queried via Mongoose models.
Key Features & My Role
- Course browsing, enrollment, and structured video-based progress tracking
- Role-based authentication separating admin and student access
- Secure admin panel for managing courses, students, and analytics
- Forms built with React Hook Form and a ShadCN/UI component library
Video Walkthrough
Video walkthrough coming soon
Outcomes & Results
- Shipped a working student + admin flow from a blank repo in about six weeks of evenings and weekends.
- Used it as a sandbox to get comfortable with role-based auth patterns before applying them at work.
- Became the reference implementation I point to when explaining JWT-based access control.
Reflection
The admin panel took longer than the student-facing side — CRUD screens are deceptively time-consuming to get right. If I rebuilt this today I'd reach for a schema-driven admin generator instead of hand-rolling every form.