LMS Platform
End-to-end ownership: data model, auth, payments, video streaming, and UI — all designed and shipped solo. A full-stack Learning Management System on Next.js 14 App Router. Teachers build courses with rich-text descriptions, video chapters, and attachments; students browse the catalog, enroll for free or via Stripe Checkout, watch videos, and track chapter progress on a personal dashboard.
End-to-end ownership: data model, auth, payments, video streaming, and UI — all designed and shipped solo. A full-stack Learning Management System on Next.js 14 App Router. Teachers build courses with rich-text descriptions, video chapters, and attachments; students browse the catalog, enroll for free or via Stripe Checkout, watch videos, and track chapter progress on a personal dashboard.
- 01 / GOAL
Rebuilt a legacy tutorial codebase into a self-hosted stack: replaced Clerk, Mux, and PlanetScale with Better Auth, a custom video pipeline, and PostgreSQL + Prisma.
- 02 / GOAL
Designed a pluggable storage layer (lib/storage): local disk with HTTP Range streaming for video seeking, or Cloudflare R2 — switched by a single env variable.
- 03 / GOAL
Integrated Stripe Checkout with webhook-driven purchase fulfillment; free courses enroll instantly without payment.
- 04 / GOAL
Built a course builder with drag-and-drop chapter reordering, per-chapter free/paid access, publish validation, and revenue/sales analytics charts.
- 05 / GOAL
Udemy-style access model: any user can teach; every mutation enforces ownership at the query level.
Mutations go through route handlers with client-side revalidation via router.refresh() — a deliberate choice over Server Actions. Optimistic cookie-based auth check in middleware keeps every route private except auth and webhook endpoints. An idempotent seed provisions demo teacher and student accounts with courses, purchases, and progress in one command.