Skip to content
← All projects

Case study · Product · 2026

Beginners Academy

My own live course website. I teach Java, Selenium and REST Assured to complete beginners, and the site runs everything around it: sign-up, payments, class access and certificates.

  • Next.js
  • TypeScript
  • Tailwind
  • Supabase
  • Razorpay
The Beginners Academy home page

The problem

A live course needs more than a landing page. Visitors have to find the course, enrol, pay, get the class link, watch recordings and finally prove they finished, and the owner has to run all of it alone.

How it works

  1. 01

    Next.js 15 (App Router) with public pages that are static and cached, so they load fast and cost almost nothing to serve.

  2. 02

    Supabase Postgres and Auth, with Row Level Security on every table so the database itself decides who can read or change what.

  3. 03

    Razorpay Orders API and a webhook for payments, plus PDF invoices and certificates generated in code.

  4. 04

    Scheduled jobs for class reminders, and server actions that validate every input with zod and are rate limited.

Decisions worth explaining

The database decides the price

Checkout charges only the amount a database function calculates. The browser never sends an amount, so a tampered request cannot change what someone pays.

Access is granted only after a verified payment, and only once

A payment grants course access after its signature is verified, and the step is idempotent, so a retried webhook cannot create duplicates.

Security is tested, not assumed

More than 360 SQL security checks run on an in-memory Postgres, and guard tests fail the build if an admin action has no auth check or a table has no RLS policy.

Optional services fail soft

Email, WhatsApp and the sheet export are best effort. The enrolment is saved first, so an outage at a provider never loses a student.

What I learned

  • Put money rules in the database, so there is one source of truth.
  • Write guard tests for the mistakes you are most likely to make later, such as forgetting an auth check.
  • Save first, notify second: users forgive a late email, not a lost request.

Want something like this built?

Tell me what you need and I will reply within a day.