All work

Case study 03 / 06

DoYouEvenLift

Log Your PRs, Show Them Off

A place where lifters log their squat, bench, and deadlift records and show them off on a public page built to be shared. Every PR gets a barbell drawn with the right plates, and the same drawing becomes the link preview wherever the page is pasted.

Project
DoYouEvenLift
Year
2026
Role
Design & development
Stack
Next.js 16, React 19, Drizzle ORM, PostgreSQL, Better Auth, Stripe
DoYouEvenLift – Log Your PRs, Show Them Off screenshot
Fig. 01DoYouEvenLift, 2026

01/Problem

The problem

A personal record lives in a notes app, a spreadsheet, or a training log nobody else can read. Bragging about a lift means typing the number into a chat, where it looks like a claim with nothing behind it and gets buried within the hour.

The workout trackers that exist are built for training: sets, programs, volume, weekly charts. None of them treat the PR as the product, and none of them give a lifter one link that shows the three numbers that matter and looks good when it lands in a feed.

  • PRs with nowhere to live: a record sits in a notes app or a spreadsheet nobody else can read, and gets shared as a number typed into a chat.

  • Trackers built for training: sets, programs, and volume charts, none of which treat the PR as the product or give it a link.

  • Nothing to back it up: a claimed lift with no date, no proof video, and no way to compare it against anyone at a different bodyweight.

  • Links that land flat: a profile URL pasted into Instagram or Discord shows a generic preview instead of the numbers that matter.

DoYouEvenLift: research and exploration
Fig. 02DoYouEvenLift: research and exploration

02/Approach

Goals and approach

DoYouEvenLift does three things. A lifter claims a handle and gets a page at doyouevenlift.app/handle. They log a record as one weight and one date, in kilograms or pounds, with an optional proof video. They paste the link anywhere and the page shows up as a card in Instagram, Discord, or the group chat, or gets downloaded as a story.

Everything else is derived from the records rather than entered by hand. A PR is the heaviest single, an estimated one-rep max only appears when a multi-rep set beats it, a total adds the three PRs, a tier from Beginner to Elite comes from the PR as a multiple of bodyweight, and a DOTS score is computed once a full total exists. The page leads with the lift that earns it: the highest tier first, then the bigger bodyweight multiple.

Every lift gets an isometric scene of its station, with the bar loaded from the plates the lifter actually owns in Olympic colours. Free accounts get all of it. A one-time Pro purchase unlocks every theme and plate variation, and nothing ever gets revoked.

  • A page in a minute: claim a handle, log one number and one date, and the bar loads itself.

  • Derive everything from the records: PR, estimated 1RM, total, tier, and DOTS are never entered by hand.

  • Make the link the product: a card and a story rendered from the same drawing as the page, in the lifter's own theme.

  • Full logging for free, cosmetics paid once and owned forever, and no subscription anywhere.

DoYouEvenLift: the solution in use
Fig. 03DoYouEvenLift: the solution in use

03/Architecture

How it is built

A single Next.js 16 App Router application on Vercel, with Neon Postgres in an EU region through Drizzle, Better Auth for identity, and Stripe Checkout in payment mode with a hand-written webhook and an entitlements table. React 19 with the React Compiler, GSAP for the page entrance, and Tailwind v4. The lift catalogue, tier thresholds, themes, and variations are TypeScript registries with text ids, so adding a lift is one entry with no migration.

Each lift visual is one function that builds an SVG string on the server. The page injects it inline and animates its groups, and the card, the story, and the per-lift story embed the same string as an image through Satori, so the two surfaces cannot drift. Satori's rasteriser has no fonts, so every plate number is a glyph outline from a generated module rather than a text element. Weight is stored as integer grams alongside the unit it was entered in, and displayed in the viewer's preferred unit.

The public page is cached per username with a cache tag and expired only when the owner writes; the owner's own view, which includes hidden lifts, is never cached and never reaches a visitor. The app shell never awaits the quick-log data: the promise streams into the log sheet behind a Suspense boundary, so settings pages do not wait on lift queries. Rate limits are Postgres-backed because the serverless runtime has no memory to share. Usernames can change, with the old handle held and redirected for thirty days.

Domain code lives in five modules matching the vocabulary of a CONTEXT.md, routes stay thin, and nine architecture decision records explain the choices. Fifty-five test files run against PGlite with the real migrations, and legal pages ship as bilingual static TSX with the French version prevailing.

  • Lifts, tiers, themes, and variations as TypeScript registries with text ids, so a new lift is one entry with no migration.

  • One server-rendered SVG per lift, animated inline on the page and embedded as an image in the card, the story, and the per-lift story.

  • A public page cached per username behind a cache tag, expired only when the owner writes, and a shell that streams quick-log data instead of awaiting it.

  • Stripe Checkout with a hand-written webhook granting entitlements, Postgres-backed rate limits, and GDPR export and deletion as product features.

DoYouEvenLift: system architecture
Fig. 04DoYouEvenLift: system architecture

04/Results

What happened

DoYouEvenLift is live at doyouevenlift.app. A lifter gets a page in a minute, logs a PR as one number and one date, and the bar loads itself. The link becomes a card in every feed it is pasted into, drawn from the same SVG as the page, and downloads as a story for phone posts. Tiers, totals, and DOTS come out of the records with nothing typed in twice, and a single Pro payment makes the page theirs for good.

Visit doyouevenlift.app

Ninibot

Ask me anything about Nicolas Laforet and his work.