Shazil Khan
Back to portfolioShopify, Supabase, Next.js

LiteZupp

A Shopify store where every LED bulb has to fit the right classic car, for every light on it.

Role
Sole developer, built from scratch
Timeline
2026
Live
litezupp.com ↗
Stack
Shopify Liquid theme, Admin GraphQL, Supabase (Postgres), Next.js 16 embedded app, Cloudflare Workers and Hyperdrive
Products
LED bulbs and kits for cars built 1907 to 1999
13,602cars in the fitment database, 47 light positions each
162,259car-part pairs, worked out not typed
99.3%cars matched on day one
368variants across 100 products
0extra passwords for the owner

The situation

No Shopify store at all. An old ePages site, and CSV exports from it that disagreed with each other about products, variants and categories.

A licensed bulb database of 13,526 cars by 47 light positions, living in a spreadsheet. Store search that ignored part numbers, because Shopify search does not read metafields. And a launch blocked because checkout showed no shipping rates anywhere.

What I built

  • The store itself: a custom Shopify theme written from scratch, with product, collection, search and cart pages, navigation, policies and content pages.
  • The catalog, rebuilt from the old site's raw exports: 100 products and 368 variants.
  • A vehicle database in Supabase: 13,602 cars, 47 light positions, 289,167 bulb entries. The client owns it and adds their own cars.
  • Fitment worked out, not typed by hand: each car's original bulb numbers joined to each product's cross-reference numbers. 99.3% of cars matched at least one product on day one.
  • A Vehicle Finder by year, make and model on the home, collection and product pages. It reads compiled files in the theme, so it answers instantly.
  • Part-number search. Type 1157 or BA15S and get the bulb that replaces it, ranked by part code, then bulb number, then prefix, then title.
  • The Bulb Book, an app inside the Shopify admin: look up a car, add a kit's cars, fix a wrong match on one light only, add a car, publish to the website, undo. The owner signs in with their Shopify login.
  • A nightly refresh at 1 AM Central that rebuilds the finder and search files, with a red warning in the app if it ever stops.
  • Installation PDFs on the products that need them, product image zoom, a kits menu by car make, and a rebuilt cart with order notes.
InputEach car's original bulb numbers13,602 cars × 47 positions
InputEach product's cross-reference numbersacross 368 variants
Output162,259 car-part pairscompiled into the theme, refreshed nightly
How fitment is worked out instead of typed by hand.

What was hard

No shipping rates, anywhere

Checkout offered nothing in the US, Canada or the UK. Every zone failing at once pointed upstream, not at any one rate. The store's only location had no address, so Shopify had nowhere to ship from. I found it through the storefront shipping-rates endpoint without placing a single order, and fixed it the same day.

A token that died quietly

Every Shopify write from the admin app had been failing for two weeks with no error the owner could see. Shopify's app tokens expire after 24 hours, and the app was holding one fixed token. It now mints a fresh one on demand and caches it for 23 hours.

Search that couldn't see part numbers

Shopify's storefront search does not index metafields, and the cross-reference numbers lived in one. Instead of a paid search app, I compiled a search index into the theme that the header search and the results page both read.