Full-Stack Client Platform

DMTT Academy

A coaching platform built for a private table tennis coach, centered on paid self-paced courses: a block-based content editor, Stripe enrollment, protected Mux video, a Google-auth student portal, and an admin dashboard for students, revenue, and reviews.

Next.js
TypeScript
Stripe
Prisma
Mux
Live Code: Private client repo
DMTT Academy preview

Employer signal

What This Project Shows

This is my first end-to-end project for a paying client, so it shows I can take a real brief from data model to deployed product — including payments, secure media, and the unglamorous launch work.

Problem

What Needed To Be Solved

A coach wanted to sell structured online courses and take private-lesson inquiries without stitching together off-the-shelf tools. The platform had to handle real money, gate paid content reliably, and stay simple enough for one non-technical owner to run.

Approach

How I Built The Solution

I modeled the domain in Prisma (users, courses, modules, content blocks, enrollments) and gated course access on a confirmed Stripe payment recorded by webhook rather than trusting the browser redirect. Paid video streams through Mux with short-lived signed tokens so it cannot be hotlinked, and the whole thing runs on Vercel behind a documented pre-launch checklist.

Outcome

What It Demonstrates

DMTT Academy demonstrates real client delivery: a deployed full-stack product that takes payments, protects paid content, and was carried through a documented launch process for a non-technical owner.

Evidence From Source

Source signal

Course access is computed server-side from `enrollment.paidAt` with an admin bypass, and the Stripe webhook is the source of truth for fulfillment — the client redirect never grants access on its own.

Engineering decision

Public course images are served from a CDN while video is gated behind Mux signed tokens — a deliberate split that protects the paid asset that actually matters instead of pretending screenshots can be prevented.