
Who
I wanted a wedding DJ site for Western North Carolina that put package prices on the page instead of hiding them behind “request a quote.”
Couples in Asheville, Boone, and Highlands still get Instagram DMs and PDF menus. I wanted a one-pager: soundtrack promise up top, three packages with numbers, availability form at the bottom, admin board for whoever answers the phone.
This is for engaged couples shopping entertainment, for venues that need a real link, and for operators who will ship Convex inquiries before they mount a full SaaS auth stack on a marketing page.
What
Live at djsidethree.com. Private repo HurleyUS/djsidethree.com. Package djsideThree 0.1.0, Bun, Next.js 16.2.6, React 19, Tailwind 4, purple/pink on black.
Lockfile reality: Convex, Resend, PostHog, Stripe, Phosphor, Zod, React Hook Form, next-themes. README still lists Clerk/Sentry/Radix from the scaffold era. Those got cut or never shipped in the live tree.

What the page actually sells:
- Ceremony from $500. sound, two wireless mics, prelude/processional/recessional, officiant coordination
- Reception from $1,200 (Most Popular). four-hour DJ, lighting, MC, requests, cocktail hour, backup gear
- Full Day from $1,500. ceremony + reception, up to eight hours, upgraded lighting, rehearsal/timeline help

Inquiry path: #contact form to Zod client validation to Convex inquiries.create (future date check, normalize email, 3/email/hour server rate limit, Resend notification schedule). Client also throttles resubmits to 60 seconds. Testimonials pull approved Convex rows or fall back to three static couple quotes. /admin shows New / Contacted / Booked / Total. On 2026-09-08 capture: all zeros and skeleton rows (no live inquiry data in that session).

Honesty: hero claims 200+ weddings / 5.0 / 10+ years are marketing copy. Footer phone is (828) 555-0123. Stripe is a dependency and a Cursor rule, not a deposit checkout on the page. Clerk identity checks remain in Convex admin functions after the Clerk provider was removed. The admin board is not secure by UI hope.
Where
Public product: www.djsidethree.com (apex 307s to www). Vercel alias djsidethree-com.vercel.app. Routes: /, /admin. Single-page anchors: #services #packages #testimonials #contact.
Code stays private under HurleyUS. Host Vercel; Blacksmith/prebuilt CI path in May; HEAD sets X-Robots-Tag: index, follow.
When
2026-01-08. Scaffold Next + Convex + Tailwind. Same day: OPPORTUNITIES/PLAN, then complete DJ landing MVP. hero, services, packages, testimonials, contact, plus seed script, Resend path, and admin dashboard. That is the product surface.
2026-02-06 to 13. Next 16 / React 19, Tailwind v4 CSS import fix, Convex generated types, dark mode defaults, build/design-rule cleanup.
2026-02-21-22. Hardening week: inquiry auth checks + validation, focus rings, label associations, mobile hamburger, skeletons, Phosphor instead of lucide, Zod + rate limiting, Turnstile CAPTCHA, Server Component extract for static sections, Clerk middleware on /admin.
2026-02-27. Plot twist: fix: remove Clerk, Turnstile, and Sentry, fix production 500 error (be461fc). Auth/CAPTCHA/error-tracking chrome was cheaper to delete than to keep misconfigured in prod.
Late Feb to early March. P1 security follow-ups, inquiry rate limit 3/email/hour, env validation fail-fast.
May. Seven “Standardize Blacksmith CI gates” commits plus deploy URL verification. CI theater, little marketing surface change.
2026-08-08. HEAD 2c804ad. robots index/follow header. Forty-three commits on the clock.
Why
A wedding DJ site that hides price and inquiry behind “book a call” is a brochure. I wanted packages and a form in production first.
When Clerk + Turnstile + Sentry 500’d the marketing page, I cut them. Zod, rate limits, Phosphor, and the Convex inquiry shape stayed. Deposits and real admin auth can earn their way back. The soundtrack page should not die for missing keys.
Would you keep an unprotected /admin board after ripping Clerk, or is a single shared secret / Convex auth identity the next Saturday morning?
