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.



