← Work

Interactive / Web

Product Customizers

One in-browser product-customizer engine (real-time 3D preview, a 2D artwork editor, and print-ready PDF export), reskinned per client (Bose, Bunzl).

Year
2024 - 2025
Role
Front-End Designer & Engineer
Tools
SvelteKitThrelteThree.jsKonvapdf-lib
  • ONE ENGINE
  • MANY CLIENTS
  • VERCEL
Bose QC earbuds sleeve customizer — 3D box, 2D canvas editor, and PDF export.

At a glance

Engine
One shared codebase
Deployed
Bose · Bunzl (GCI base)
Tests
Playwright E2E
Output
Print-ready PDF

The problem

Clients want their customers to personalize a product, say a printed box or a piece of apparel, and see it before they buy, without a designer in the loop. And whatever the customer designs has to come out the other end as a print-ready file the floor can actually run. Building that once is hard; rebuilding it from scratch for every client is worse.

The approach

I built one reusable customizer engine in SvelteKit and productized it across clients. Customers personalize in real-time 3D, edit artwork on a 2D canvas with real-world (inch) measurements, and export a print-ready PDF, all in the browser with no backend. The same engine gets reskinned per client: Bose (3D product boxes for QC earbuds and headphones) and Bunzl (apparel), swapping the product domain while the core stays put.

Production detail

The heart of it is a dual-canvas system: a Threlte / Three.js 3D viewer and a Konva 2D editor kept in real-time sync, so edits on the flat canvas update the 3D model’s textures live. Placement is measured in real inches, so what the customer positions on screen matches what prints. A color-grading pass on the 3D render produces photoreal product mockups. Export runs through pdf-lib / jsPDF to a print-ready PDF entirely client-side, the same prepress-first instinct behind rustybara. State lives in Svelte stores (no database), per-product data models drive dynamic, shareable product routes (30+ box variants for Bose, apparel for Bunzl), and the flows are covered by Playwright end-to-end tests.

Outcome

One engine, deployed per client on Vercel: Bose and Bunzl in production, with GCI as the base template. Same skeleton, swapped product domain, the customizer that productizes itself. Both are linked above, and the Bunzl instance is embedded below to try directly.

Try it live

The Bunzl customizer, running live. The Bose instance is access-protected, so it's linked ↗ rather than embedded.