04 / 24Next →
Lighting simulator, booking & payments2026

Lumiere

A rebuild of a premium holiday-lighting company's site. Customers preview lights on a photo of their own house, then book and pay by card or with Afterpay instalments through Square.

ContextFreelance & personal builds
Year2026
TypeWeb
StatusCompleted
RoleFull-stack engineering & interaction design

Project media coming soon

Screenshots and demo videos for this case study will appear here.

Overview

Lumiere started as a visually ambitious static site with broken navigation, CDN dependencies and a simulator built around a missing image. I rebuilt it as a component-based Next.js 14 application. Its centrepiece simulator now works on the customer's own photo, and server-side booking supports card payments and Afterpay instalments through Square, with email notifications through Resend.

Next.jsReactSquareResendTailwind CSSWeb AudioSVG
Challenge

The signature feature needed to look convincing on real, arbitrary house photos. Automatic edge detection placed the lights unreliably, and an AI re-render cost seconds and quota for every change. The booking flow also needed real payments without exposing secrets in a static site.

Approach

I moved the site from a static build to a hybrid Next.js app with API routes for bookings and contact. The simulator renders an LED glow along a roofline the user traces and edits on their own photo, with colour presets, brightness, Web Audio feedback and reduced-motion support. The geometry behind it is pure, unit-tested functions. Square's Web Payments SDK tokenises the card in the browser, and the server creates the payment or the Afterpay invoice.

Outcome

The result is a fast, self-contained marketing site whose flagship interaction works on any customer's home and leads directly into a paid booking.

System architecture
01AppNext.js 14 App Router · Tailwind

Home, about, services, contact and simulator routes, with self-hosted fonts, next/image, metadata and a custom 404.

02SimulatorCanvas · SVG · Web Audio

A photo upload and roofline editor with a canvas glow layer using the screen blend mode, a colour wheel, presets and an SVG demo house for first-time visitors.

03GeometryPure ES module · node:test

Object-fit cover transforms, conversion between normalised and canvas coordinates, point simplification and nearest-segment insertion, all tested without a DOM.

04Bookings APISquare SDK · Resend

Inquiry, card-payment and Afterpay-invoice flows, each with server-side validation and email notifications.

Engineering decisions
01

User-traced rooflines over guesswork

Automatic edge detection rarely found a clean roofline on real photos, and an AI image edit took 5–15 seconds and API quota for every colour change. Instead, the user taps points along their roof and can drag, insert or remove them. Points are stored in normalised image space, so the lights stay aligned however the photo is cropped or resized, and the glow re-renders instantly as settings change.

02

Payments only on the server

Card details are tokenised in the browser by Square's SDK, and the API route creates the payment with an idempotency key. The order amount is checked against an allowed range on the server, so a tampered request can't change it. Afterpay goes through a customer, then an order, then a published invoice, so Square emails the instalment plan to the customer.

03

Remove fragile dependencies

The CDN Tailwind build, icon scripts, GSAP and Google Fonts were replaced with compiled CSS, lucide-react, an IntersectionObserver reveal and self-hosted fonts. The site no longer depends on third-party runtime scripts that could fail or slow the first paint.

What I built
01Photo-based lighting simulator with an editable roofline, colour presets, brightness and audio
02Unit-tested geometry for coordinate mapping and point editing
03Square card payments and Afterpay instalment invoices
04Resend notifications for enquiries and bookings
05Unified navigation, repaired routes, self-hosted assets and reduced-motion support
Next projectBanana Cave →