Membership platform 2026

Be Adonis

Membership platform for men's self-development: a public site and a private training area, The Forge, where paid access is derived only from signature-verified Stripe webhooks.

Be Adonis, desktop view
Be Adonis, mobile view

Be Adonis is a membership platform for men's self-development. It has two parts: a public website that presents the philosophy and the six pillars of the programme and handles registration and checkout, and a private training area called The Forge. Besides the free account there are two paid memberships, The Campaign (€49 a month) and The Vow (€500 once, with lifetime access). All content is in English.

In The Forge, a member lands on a Command Center that shows the single most useful next action instead of a wall of competing tasks. From there come courses with modules, video lessons, notes and captions, practical assignments with evidence submission, and the Execution Lab, with weekly missions, configurable tasks, streaks and an after-action review for each mission. Progress turns into five ranks. There are also live calls with member questions and a replay archive, downloadable resources, search, and notifications in the app and by email. Free members see paid content in a locked state, without the protected material being exposed.

An administration area manages courses, missions, calls, resources, announcements, members and the delivery state of notifications. The site runs in production on Laravel Cloud, behind Cloudflare. Billing ships switched off in the example production configuration and is only meant to be enabled once the tax and legal decisions are signed off. Account closure is a staged process that waits for the confirmed end of the subscription, anonymises the profile and keeps the financial records.

Screens

Up close.

"The complete man is built, not born" section with the numbered list of pillars
Membership plans: The Campaign on black marble beside The Vow on white marble
The Forge command centre for a logged-in member: side navigation, rank and membership, lesson progress and the six pillars
The Forge course library: filters by pillar, level and progress above a grid of course cards
Mobile view of the pillars section
The Forge command centre on mobile, with rank, membership and a continue-lesson card
Design

Visual direction.

The brand is dark and classical. Surfaces are near-black marble with texture, text is bone, and bronze is the only accent, with a blood red and a laurel green kept for states. Headlines use Bodoni Moda in black weight and italics, body text uses Archivo, and JetBrains Mono is kept for labels and numbers. The hero is a pinned 450vh track: the giant title fades on scroll and gives way to three numbered panels on the myth of Adonis. On top of that, the cursor trail, or a tap on a phone, reveals a model beneath the classical statue through CSS masks. Fonts are self-hosted in Latin subsets only, and the motion respects prefers-reduced-motion.

Typography

  • Bodoni Moda
  • Archivo
  • JetBrains Mono

Colours

  • #040302
  • #16100C
  • #ECE7DE
  • #DEA645
  • #932B2A
Technical

Under the hood.

  1. 01

    It is a single server-rendered Laravel 13 application with Blade, Tailwind CSS 4 and Alpine.js. The logic for progress, ranks, streaks, billing, notifications and account closure lives in services. One service answers every access question from a documented mapping of Stripe states, and every credential endpoint is rate limited.

  2. 02

    Payments use Stripe Checkout and the Customer Portal through Laravel Cashier 16. The checkout success page never grants access: membership changes only after a signature-verified webhook. Products are identified by Price IDs, and the server re-validates amount, currency and interval before selling.

  3. 03

    An event ledger with a unique key per event makes webhook processing idempotent under duplicate, concurrent and out-of-order delivery, without storing payloads. The lifetime purchase has its own ledger: a full refund revokes access and a partial one keeps it. The billing:reconcile command repairs drift in the local read model.

  4. 04

    Lesson progress is calculated on the server. The browser reports ordered playback samples, and only continuous watching that fits the server's elapsed time and a speed of up to 2× counts, so seeking ahead earns no credit. A single player component has adapters for YouTube, Vimeo and native video, and private files are served through authenticated routes with the same checks as the lesson page.

  5. 05

    Every notification goes through one pipeline, with a delivery ledger keyed uniquely by user and event. Scheduler re-runs, double clicks and queue retries create no duplicates, and failed sends are retried up to three times. Queues, cache and sessions run on MySQL, with no Redis, and a single worker drains three queues in priority order, starting with account closure. Production email goes out through Mailgun.

  6. 06

    Production runs on Laravel Cloud with MySQL 8.4 and two storage buckets, one private and one public. Readiness commands refuse a release with debug enabled, test-mode Stripe keys, SQLite, a non-delivering mailer or demo data present. The PHPUnit suite runs on in-memory SQLite, and GitHub Actions also runs a separate MySQL 8.4 suite, the frontend build and npm audit. Security headers are served by the application, with the CSP in report-only mode.

Next project MEL Queijadaria Artesanal Website with ordering 2026