/ tech-stacks / Best Tech Stack for an Online Course Platform as a Solo Developer
tech-stacks 6 min read

Best Tech Stack for an Online Course Platform as a Solo Developer

The best tech stack for building an online course platform as a solo developer - frameworks, databases, hosting, and tools.

Best Tech Stack for an Online Course Platform as a Solo Developer

Online education is a $400+ billion market and still growing. Building a course platform as a solo developer means competing with Teachable, Thinkific, and Udemy, but there's plenty of room for niche platforms, white-label solutions, or platforms with unique features those giants don't offer. The technical challenge is managing video content, tracking progress, handling payments, and delivering a smooth learning experience without a team of 50 engineers.

Here's the stack that makes it manageable for one person.

Layer Pick
Frontend Next.js (React)
Backend Next.js API routes + tRPC
Database PostgreSQL (via Prisma)
Video Mux or Cloudflare Stream
File Storage Cloudflare R2
Auth NextAuth.js (Auth.js)
Payments Stripe
Hosting Vercel

Frontend: Next.js

A course platform has two distinct frontend needs: a marketing site (course listings, landing pages, SEO-optimized content) and a learning app (video player, progress tracking, quizzes, discussion). Next.js handles both elegantly.

Course landing pages should be server-rendered for SEO. When someone searches "learn Python online," your course page needs to rank. Next.js server components give you fast, crawlable pages with dynamic pricing and enrollment counts.

The learning dashboard is a client-heavy application. Video playback, progress bars, note-taking, and quiz interactions all need real-time state management. Use React state for the lesson player and sync progress to your backend on meaningful events (lesson completed, video paused, quiz submitted). Don't sync every second of playback.

For the video player, Video.js or Plyr are solid open-source options. Both support HLS streaming, custom skins, and playback speed controls. Your video hosting service (Mux or Cloudflare Stream) will provide HLS URLs that these players consume directly.

Backend: Next.js API Routes + tRPC

Keeping everything in one Next.js project is the right call for a solo developer. Your backend handles:

  • Course management - CRUD for courses, modules, lessons
  • Enrollment - Track who bought what, manage access
  • Progress tracking - Lesson completion, quiz scores, certificates
  • Video - Signed URL generation for secure video access
  • Payments - Stripe webhooks for purchases and subscriptions

tRPC gives you end-to-end type safety between frontend and backend. When you change a course API response, TypeScript errors show up immediately in your components. For a solo developer maintaining everything, this prevents an entire category of bugs.

For authenticated video access, generate signed URLs or use your video provider's token-based authentication. Never expose raw video URLs to the client since your entire business depends on content protection.

Database: PostgreSQL + Prisma

Your data model for a course platform is relational by nature: courses have modules, modules have lessons, users have enrollments, enrollments have progress records. PostgreSQL with Prisma is the natural fit.

Key tables: users, courses, modules, lessons, enrollments, lesson_progress, quiz_submissions, certificates. The relationships between these are straightforward foreign keys.

Host on Neon for the free tier and serverless scaling, or Supabase if you want real-time features (live comment sections, collaborative notes).

One important schema decision: store lesson progress as individual records, not as a JSON blob on the enrollment. You'll want to query things like "which lessons have the highest drop-off rate" and "what percentage of enrolled users completed module 3." Separate records make these queries simple.

Video: Mux or Cloudflare Stream

Video is the most expensive and complex part of a course platform. Don't try to build your own transcoding pipeline. Use a managed service.

Mux is the premium choice. It handles upload, transcoding to HLS (adaptive bitrate), thumbnail generation, and provides a beautiful player component. Their per-minute pricing is transparent: $0.007/min for encoding, $0.007/min for streaming. For a platform with 100 hours of content and moderate viewership, expect $50-100/month.

Cloudflare Stream is the budget-friendly alternative at $5/month for 1,000 minutes of stored video and $1/1,000 minutes of delivered video. For a solo developer starting out, this is significantly cheaper.

Both provide signed URL access, so you can restrict video viewing to enrolled students.

Auth: NextAuth.js

NextAuth.js (now Auth.js) handles authentication with minimal configuration. Set up email/password and social logins (Google, GitHub) in under an hour. It integrates cleanly with Prisma for session and user storage.

For a course platform, you'll also need role-based access: students, instructors, and admins. Extend the NextAuth session with a role field and check it in your middleware and API routes.

Payments: Stripe

Stripe is the clear winner for course payments. You'll use:

  • Checkout Sessions for one-time course purchases
  • Subscriptions for all-access membership models
  • Connect if you allow other instructors to sell (marketplace model)

Stripe handles tax calculation, invoicing, refunds, and global payment methods. The webhook integration with Next.js API routes is straightforward. Listen for checkout.session.completed events to grant course access.

Nice-to-Haves

  • Resend for transactional emails (welcome, enrollment confirmation, completion)
  • Upstash Redis for rate limiting and caching popular course data
  • Vercel Blob for course resource files (PDFs, slides, code downloads)
  • react-pdf for in-browser PDF viewing of supplementary materials
  • OpenAI for AI-powered quiz generation from lesson transcripts

Monthly Cost Breakdown

Service Cost
Vercel (Pro) $20/month
Mux or Cloudflare Stream $5-100/month
Neon Postgres (free tier) $0
Cloudflare R2 (files) ~$1-3/month
Stripe 2.9% + 30c per transaction
Domain $1/month
Total ~$27-125/month + Stripe fees

The variable cost is video. Start with Cloudflare Stream at $5/month and upgrade to Mux when you need advanced analytics or a better player experience.

Conclusion

The best stack for a solo developer building a course platform: Next.js with tRPC for the full-stack application, PostgreSQL with Prisma for structured course data, Mux or Cloudflare Stream for video hosting, Stripe for payments, and Vercel for deployment.

The critical decision is video hosting. Don't self-host video. Don't transcode on your own servers. The encoding, delivery, and DRM complexity will consume all your development time. Use Mux or Cloudflare Stream, focus on building a great learning experience, and let the managed services handle the infrastructure that's genuinely hard to get right.