← All projects

Tower Optical Website

A static Astro site for the company's main public-facing presence, plus a standalone checkout for premium viewers available for sale

OwnedLive2026

Astro · Vercel

toweropticalco.com →

reserve.toweropticalco.com →the standalone checkout

What it is

The public site for The Tower Optical Company, one of the two businesses I own, rebuilt from WordPress and Elementor as a static Astro site on the company's own brand guide. Alongside it sits a standalone single-page checkout for viewers retired from public service and sold direct, hosted separately because a multi-megabyte self-contained page cannot live inside a page builder.

The homepage, rebuilt on the company's brand guide — the same content and the same URLs as the WordPress site it replaced.

What it does

Twenty-two URLs moved without moving: the titles, meta descriptions, canonicals and social tags from the live WordPress site were frozen into a JSON file treated as a contract, and a parity script re-checks every URL against it after each build. Journal posts stay at the root level, exactly where they were indexed. Analytics run two ways: GA4, plus a first-party collector that stores no cookies and no IP addresses and feeds a password-gated internal dashboard: a funnel with its biggest drop marked, read depth, traffic sources, and percentages suppressed below thirty observations so a slow week cannot be read as a signal. The checkout page treats card reservation and an invoice-and-a-conversation as equal paths, and leads on provenance — where a given machine stood and what was done to it.

Destinations, further down the homepage.
Release № 1 as it stands today: four machines, one already sold, each priced and described by where it actually stood. Card reservation and an invoice conversation get equal weight in the hero, because a five-figure object is not reliably an impulse checkout.

How it's built

Astro on Vercel, no CMS: pages are components, journal posts are markdown in git. Trailing-slash rules, redirects and a noindex header live in the Vercel config, so launch day is a short list of toggles rather than a migration. The collector is a serverless function over Upstash Redis with allowlisted fields, a 180-day TTL, and an always-204 response.

Working with Claude

Before a line of the new site existed, the old one was frozen into a baseline directory: rendered HTML, headers, extracted text, metadata. Every build since has been checked back against it by script rather than by eye. That order was the point. Years of indexed URLs sat behind this rebuild on a site that pays for itself through inbound quote requests, so search traffic, not design, was what could actually break. The other thing worth recording is what did not get done. Four overlapping posts were left alone because consolidating them without Search Console data is a guess, and no pricing, revenue split or testimonial was invented to fill a section that looked thin.