← Work

All Surface Fix

Lead-generation site for a bathtub, countertop and surface refinishing business, wired into my own lead dashboard.

Home page of All Surface Fix

The business was losing leads to competitors with websites, and customers had no way to see past work or request a quote outside business hours. The owner also needed to show fresh before/after photos and real reviews without asking a developer to edit the site every time.

A React + TypeScript single-page app built with Vite, styled with Tailwind, and routed with React Router. Quote requests go through a Vercel serverless function that keeps API keys off the client and forwards each lead to this portfolio's ingest webhook, so it lands in the same dashboard as every other lead I manage. The gallery and reviews come from Supabase and are curated from that dashboard. The owner never touches code to publish a new job photo or a customer review.

  • —Quote form → Vercel serverless function → lead lands in the dswayze.dev dashboard (plus an email notification). The ingest key stays server-side, and a honeypot drops bot submissions
  • —Customers upload before/after photos through a tokenized upload link; I approve them from the dashboard, which compresses them with Sharp and publishes them to Supabase Storage for the live gallery
  • —Customer reviews use the same approve-then-publish flow: submissions are stored unapproved and appear on the site only after approval in the dashboard
  • —Static fallback data for the gallery and reviews, so the site still renders if Supabase is unreachable
  • —Per-route titles and descriptions, plus schema.org HomeAndConstructionBusiness structured data for local search

React 18 · TypeScript · Vite · Tailwind CSS · React Router · Supabase · Vercel Serverless Functions · Sharp