Client work
The prices were a screenshot.
A fencing club in Maplewood had a Wix site. It worked, in the sense that it existed. The problem was underneath.
I crawled all twenty one content pages before writing a line of code. The pricing page stopped me. The rates were real and current, effective January 1. They were also a screenshot. Someone had built a rate sheet, exported it as an image, and uploaded the image. The schedule page did the same thing, so the coach by day grid was a picture of a table.
Which means the two things every visitor actually comes for, what it costs and when you can show up, were invisible to Google and unreadable by a screen reader. A parent using VoiceOver got nothing. A parent searching for what fencing lessons cost in Maplewood also got nothing.
What the rebuild did
Astro 5 and Tailwind v4, twenty three pages, near zero JavaScript. That part is unremarkable, and that’s the point. It’s a static club site. It should be boring.
The work that mattered was recovery. I pulled sixty five images off the old site at full resolution and transcribed the pricing and schedule out of the screenshots into real HTML tables. Beginner classes are 240 dollars a month, 220 for a second sibling. Intermediate is 360. The schedule now says in text, in the document, where a crawler can reach it, that Alex Hernandez Paul coaches épée and that sabre runs under Doddo, Bivins and Perrier. The original screenshots stayed on as downloadable fallbacks, because the club still hands those out at the door.
I also found around a hundred and seventy auto generated tournament pages carrying near duplicate content, which is Wix doing SEO damage on autopilot. Those didn’t come across.
The chatbot that isn’t RAG
The site has an assistant. My first instinct was a vector store, because that’s the reflex now. Then I counted. The entire NJFA knowledge base, every coach, all six program rungs, the 2026 pricing, the schedule, three policies, equipment lists, forms and contact details, comes to a few thousand tokens. It fits in a system prompt with room to spare.
So there’s no database, no embeddings, no retrieval. One Gemini Flash call per question with the facts inline, behind a serverless route that holds the key so the browser never sees it. If the club grows to hundreds of pages I’d revisit that. Today a vector store would be one more thing to maintain in exchange for nothing.