LMS · Membership platform · 2023
WhoIsOutlier
Membership LMS with Stripe in production and AWS S3 presigned URLs.
- Role
- Full Stack Developer (Freelance)
- Period
- 2023
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
Userwith role (user/admin)Subscriptionlinked to the Stripe accountSuperCategory→Category→SubCategory(individual class with S3 assets)Insight(Markdown post with S3 image)Advertisement(banners for members)UserSubCategoryProgressto track progress
Stripe payments
My first Stripe production integration. I implemented:
- Webhooks with HMAC verification of the
stripe-signatureheader. - A
charge.succeededhandler 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