Back to projects
Lenso Wheel
Automotive

Lenso Wheel

Marketing site + dealer locator + admin CMS for an automotive aftermarket wheel brand. Built the public site, the admin tool, and the Express + MongoDB API end-to-end.

Next.jsReactTailwind CSSThree.jsReact Three FiberRadix UIZustandExpressMongoDBMongooseAWS LambdaAWS S3JWT

Overview

Overview

Lenso is an aftermarket wheel brand whose customers are dealerships and end-buyers configuring wheels for their vehicles. The site needed a strong visual product experience, a dealer-finder, and a CMS the marketing team could run themselves. I owned the full stack — public site, admin, and a custom Express API. No managed backend (Strapi, Amplify Data, etc.) — I designed the data models and wrote the API from scratch.

What I built

Public website

  • Wheel catalog with filtering by size, fitment, and finishing
  • 3D wheel preview using Three.js / React Three Fiber for interactive product pages
  • Dealership locator with searchable list grouped by region
  • Gallery with before-and-after shots and customer build photos
  • Inquiry form that posts directly into the CMS for the sales team
  • Marketing pages: about, FAQ, industry partnerships, finishing options

Headless CMS

  • CRUD for ~15 content types: wheels, finishings, dealerships, galleries, banners, lineups, sneak peeks, inquiries, and more
  • Drag-and-drop ordering with @dnd-kit for sorting wheels, gallery items, and homepage banners
  • Virtualized lists with react-window for content types with hundreds of rows
  • S3 image upload with preview, replacement, and deletion
  • JWT auth with role checks for editors

Backend API

  • Express + Mongoose REST API with one module per resource
  • Multer + multer-s3 for direct uploads to S3
  • aws-serverless-express wrapper so the same Express app runs on AWS Lambda behind API Gateway
  • JWT issuance, password hashing with bcrypt, query-string parsing for filter / sort / pagination

Tech stack

  • Frontend: Next.js 15 App Router, React 19, Tailwind CSS v4, Radix UI primitives, shadcn-style components
  • 3D: Three.js, React Three Fiber, drei
  • State: Zustand, Axios for HTTP
  • Admin: @dnd-kit for sortable lists, react-window for virtualization
  • Backend: Express, Mongoose, MongoDB Atlas, deployed as AWS Lambda via aws-serverless-express
  • Storage: S3 for assets, multer-s3 for uploads
  • Auth: JWT + bcrypt

My role

End-to-end ownership across three repos: public site, admin CMS, and Express API. Designed all data models, wrote every API endpoint, built the admin UI, and wired up the public site. Worked from a designer's Figma for the marketing pages; everything backend and admin was mine to design and ship.

What I learned

Owning the API end-to-end taught me how much API ergonomics shape admin UX — query-string filtering, consistent pagination, and predictable error shapes meant the admin code stayed thin and readable instead of papering over backend quirks. The 3D viewer was also a lesson in budget: a single optimized GLB and lazy-loaded scene was the difference between a hero feature and a performance regression on mobile.