Skip to content
jr/dev
ES
← Back to home

LMS · Membership platform · 2023

WhoIsOutlier

Membership LMS with Stripe in production and AWS S3 presigned URLs.

Role
Full Stack Developer (Freelance)
Period
2023
relational models
9
HMAC-verified webhooks
Stripe
presigned URLs with expiry
S3
Premium landing with iPhone mockup and membership copy.

The product

WhoIsOutlier is a membership LMS built for a YouTuber with a relevant audience. The platform handles Stripe subscriptions, serves multimedia content from AWS S3 with presigned URLs, and organizes material in a three-level hierarchy with per-user progress tracking.

Architecture

Backend in AdonisJS 6 + TypeScript with Lucid ORM against PostgreSQL. Frontend in React 19 + Vite + Tailwind 4 with Zustand for auth and MUI for complex components.

Models

  • User with role (user / admin)
  • Subscription linked to the Stripe account
  • SuperCategoryCategorySubCategory (individual class with S3 assets)
  • Insight (Markdown post with S3 image)
  • Advertisement (banners for members)
  • UserSubCategoryProgress to track progress

Stripe payments

My first Stripe production integration. I implemented:

  • Webhooks with HMAC verification of the stripe-signature header.
  • A charge.succeeded handler that activates or renews the subscription.
  • Subscription cancellation with cleanup of local state.
  • Idempotency to support Stripe retries without duplicating records.

Protected content with S3

UploadService with @aws-sdk/lib-storage for multipart uploads, UUID-based unique names and presigned URLs with configurable expiry to serve content only to active members. This avoids exposing direct URLs that could be shared indefinitely.

Access control

Chained auth() + admin() middleware to protect administrative routes (/api/admin/*). Role control is enforced both in the backend and in the frontend router.

Key takeaways

  • First Stripe integration in production with webhooks and signature verification.
  • First AWS S3 integration — uploads, presigned URLs and bucket policies.
  • First project with AdonisJS — routes, middlewares, Lucid ORM, VineJS validation, Japa testing.
  • Architectural planning of a 9-model relational system before the AI-assistant boom.

Screenshots

Membership landing with iPhone mockup showing content.
Premium landing with iPhone mockup and social proof.
Dark home with grid overlay and signup CTA.
Home with dark identity and a clear signup CTA.
Login form with brand identity.
Minimalist login with clear hierarchy and an actionable primary button.
Register form with validated fields.
Register flow with client-side validation and immediate feedback.