Kula Karate
Fifteen after-school karate clubs meeting on elementary campuses across Central Austin — and not one building to put in a hero photo. That single fact drove every structural decision on the site.
The insight that shaped the build
A parent looking for this business does not search "karate near me." They search "after school karate at [my kid's school]". So the architecture is one indexable landing page per campus rather than a single page listing all fifteen — and the home page hero is a campus finder, not a photograph. A parent's first question is "do you come to my school?", and the fastest possible answer to that question is worth more than any hero image.
What we built
A zero-dependency static-site generator. node build.js reads four data files and emits the whole site — one entry per club produces a full landing page, a row in the home-page finder, a sitemap entry and course-specific structured data, automatically. Adding a sixteenth club is a data edit, not a development job.
- Design built around belt progression — a white-to-black rank spectrum used as the site's only divider. It's structural rather than decorative, because progression through belts is literally the product.
- Type chosen for the actual reader: a serif for body copy, because parents are reading this, not kids; a mono face for schedules and prices so they read like a gym class board.
- A testimonial system, wired up and empty — the section hides itself entirely until real, permissioned quotes exist.
- A pre-launch validator (
node scripts/validate.js) that gates every deploy, plus a build that reports which clubs still have unconfirmed schedules on every single run.
The three things we refused to do
No scraped reviews. The brief asked to build the site using the client's Yelp reviews. Those reviews are the copyright of the parents who wrote them, and republishing them exposes the client — not the developer — to the consequences. We built the testimonial system instead and supplied an email template for collecting real, permissioned quotes.
No scraped photographs. Same principle, with a sharper edge here: nearly every available image is of a minor. Photographs of other people's children need a signed parental release on file before they appear on a commercial website. The site ships with on-brand generated placeholders at the correct dimensions and a shot list to replace them.
No invented schedules. Fourteen of the fifteen clubs have no confirmed day and time. Filling those in would make the pages look finished — and would put a parent and child at a school door at the wrong hour on the first Tuesday. Those pages render an honest "email us for this semester's schedule" until the client confirms real times.
Why that's the whole point
It would have been faster to ship something that looked complete. The build instead surfaces its own gaps on every run, so the client can see precisely what's outstanding — and nobody discovers a fabricated class time by driving to it.
Status
The site builds clean and the validator passes. It is not launch-ready, and deliberately so: fourteen club schedules and the business's public name-address-phone details are still unconfirmed by the client. Those are the client's to supply, and the build will keep saying so until they are.