The Verdict
"The Easiest Yes" — Director's Cut
Three rival full-site concepts went through a three-lens judge panel. The conversion lens and the engineering lens both scored The Easiest Yes 9/10; the wow lens picked the cinematic Sunrise Cut. Cross-lens totals: Easiest Yes 25 · Sunrise Cut 21 · Midway 18. The hybrid takes the winner's chassis and steals the film's cinematography — which costs almost nothing on the GPU.
The Easiest Yes: priced Register CTA in the first viewport, city triage at section 2, objection-kill at 3, surgical 3D at exactly four moments, sticky bar always showing "$X until [date]", poster-first mobile, config-driven dates/registrar/pricing.
From The Sunrise Cut: the sky becomes a dawn→golden-hour clock spanning the whole page; DM Mono race-clock timestamps as section title cards; bloom & light keyframed to peak at the sun-crest and medal beats; the cup accumulates its story — bib → medal → coffee; a brew-gauge rail as tap-to-jump nav.
From the Midway: the Pace-O-Meter (DOM/SVG objection-killer with a shareable "Certified: Chatty" card) and the Crew Cup (your crew's name rendered live onto the 3D cup's sleeve).
Scroll time-reversal, raymarched liquid interior (gradient fallback ships first), cornhole physics, verlet ribbon — wow that doesn't survive a mid-range phone or the mid-August clock.
| Concept | Wow / Brand | Conversion | Feasibility | Total |
|---|---|---|---|---|
| The Sunrise Cut — a scroll-scrubbed race-morning film | 9 | 6 | 6 | 21 |
| The Sunrise Midway — Brewster's race expo | 6 | 7 | 5 | 18 |
| The Easiest Yes — registration machine in a sunrise coat | 7 | 9 | 9 | 25 |
Why the split resolves this way: the highest-converting visitor is a spouse on an iPhone inside the Instagram in-app browser, and registration opens ~mid-August. The two lenses that measure those realities agreed. The film's best ideas ride along for free.
What the current site is costing you
The live site is a 4-page Wix build with ~60 words of real text on the homepage, zero H1 tags, and its tagline trapped inside a PNG where Google can't read it. Five conversion killers, in order:
- "REGISTER NOW" doesn't register. The homepage button links to the San Diego page — three-plus clicks and a full page load before anyone reaches a form.
- Orlando is a dead-end. The priority race is an unclickable "COMING SOON" card. No page, no waitlist, no notify-me — four months out, every interested visitor bounces with nothing to do.
- No pricing anywhere. San Diego's price increases July 26 — the single best urgency lever in the category — and the site never mentions it. No countdown exists.
- Zero real photography. Every image site-wide is a raw ChatGPT export, with default filenames as alt text. An event selling community shows not one real human.
- A six-year-old race leads every page. "2020 | Fort Lauderdale" is the first heading on all four pages — reading as abandoned, not heritage.
Also missing: FAQ, course map, refund policy, gallery, testimonials, sponsor logos, social links, email capture, Event schema. Contact is a Gmail address. One correction to our own brief: registration actually runs on RunSignup, not Active.com — Active only hosts the 2020 results.
What the research says
Craft bar: Cumulus Coffee (Awwwards SOTD — a 3D scroll-scrubbed coffee machine in nearly our palette) is the closest blueprint; Bunta Beer proves the pattern ships at one-developer scale; Igloo Inc shows custom shader craft is what separates award tiers.
The page, section by section
One persistent Three.js scene — sky dome, cup, lighting — lives behind the entire page. DOM scrolls normally over it; only three short pins exist (hero, medal, pour). Every section opens on a DM Mono race-clock timestamp.
Composition ships as approved; the load sequence is rebuilt: poster frame + tagline + priced CTA ("Register — $30 until Sep 15") paint first, WebGL cross-fades in after. Ghost link: "Not ready? Get the price-increase alert." The domain finally gets an H1: The World's Easiest 5K.
The cup's sleeve relabels itself live per city while the sky tints — marine cool (SD), neutral (Irvine), Florida amber (Orlando). SD: price + deadline + direct deep link. Orlando pre-open: "Put me on the First Pour list" capture → GoHighLevel. Screen-record bait that doubles as navigation.
Kills the "I can't run a 5K" objection: walkers/strollers/no-cutoff tiles and the Pace-O-Meter — a DOM/SVG dial that rates your pace "Certified: Chatty" and mints a share card with the register hook baked in. "Last place gets the loudest cheers — and the same bottomless cup."
The signature fusion: six stops from 6:15 check-in to 8:45 awards, and each stop visibly raises the sun — scrolling is fast-forwarding race morning. Desktop scrubs; mobile gets a vertical timeline with smoothed per-stop sky jumps (a time-lapse, near-zero cost). No competitor sells the day as a story.
A top-3 race-selection factor every concept forgot: a stylized 2.5-mile lake-loop SVG over the sky palette with parking, restrooms, and pickup markers. (Don't print "certified 3.1" until USATF certification is confirmed.)
The page's only new geometry: a procedural medal with your city and date on its canvas-texture face. Scroll scrubs a full rotation with a glint pass; desktop gets drag-to-spin with inertia and a double-tap flip (city etched on the back). One tap composites a #MedalMonday share PNG. Real medal and tee photos flank it. Category first.
Two buddy cups ease in beside the hero. Type your crew's name — it renders live onto the cup's kraft sleeve — export and drop it in the group chat next to the checkout link. Group stepper shows the 4+ discount. "Somebody in your group chat has to make this happen. It's you. It was always going to be you." Plus a bring-your-run-club block.
Real photos (the Sep 26 San Diego capture day is a launch dependency), Brewster's finished voiced video with captions, and a spouse-voice testimonial leading the quotes: "I signed my husband up. He forgave me at the coffee table." Organizer bio + domain email + live IG embed.
Nothing between the eye and the numbers but one soft ember pulse. First Pour $30 → Fresh Brew $40 → Last Call $50 → Day-Of $55, every date printed, honest countdown to the next increase only. Kids tier reserved pending Michael. "Prices go up on the dates listed. That's the whole trick. There is no other trick."
Joke-then-facts contract: Brewster's one-liner first, the straight answer always beneath. Walking, strollers, dogs, parking, packet pickup (including pick-up-for-the-crew), the November-Florida rain plan, refunds, timing ("timed if you care, ignored if you don't"), accessibility. FAQPage schema. "Get roasted… then get running."
The Liquid Motivation payoff, kept exactly once: the cup tilts and pours a particle ribbon into a second cup whose fill level reveals the final Register block. A toast, a payoff, and a CTA in one shot. Beneath it: "We'll email you 48 hours before the price goes up. That's it. No newsletter-ing."
Site-wide systems
- Sticky Register bar — plain DOM, never waits on WebGL, always shows "$X until [date]," inherits the countdown in a tier's final 72 hours.
- Brew-gauge progress rail — a filling cup that doubles as tap-to-jump navigation; #pricing lands settled for impatient ad traffic.
- Per-CTA attribution (utm_content) with a standing rule: if clicks skew entirely to the sticky bar, the page gets an edit, not a defense.
- The cup accumulates its story — bib at the city pick, medal after the reveal, coffee at the pour — via cheap event-driven label swaps, never scrubbed.
- Beyond the homepage: per-city landing pages for ad traffic, a real Partners page (the $500–$2,500 prospectus is an active sales motion with a Sept 19 print deadline — and the Title tier's promised "top logo on site" needs a reserved slot), and a designed post-race state (results, finisher photos, recap, Tampa Mar 2027 tease).
Engineering: extending the approved hero
The hero's bones are right — one progress scalar drives everything, ~8 draw calls, GPU-resident steam. The full site stays procedural end to end (~10–15 draw calls, zero 3D file downloads). Before scaling, the code review's debt gets paid:
- Shot-object refactor — tick() currently hard-codes cup/camera formulas and would fight GSAP. One master scrubbed timeline tweens a shared "shot" object; camera rides a spline. This unlocks every section above.
- Self-host all vendors — today Three, GSAP, and Lenis load from three different CDNs with no integrity hashes; one CDN hiccup kills scrolling on a page whose job is registrations.
- Delta-normalized smoothing — motion currently runs ~2.4× faster on a 144Hz monitor. It must be deterministic on whatever screen Michael reviews on.
- Context-loss handler, inert hidden CTAs, font-gated loader — the invisible-button tab-order bug and the unbranded-sleeve flash are launch blockers; WebGL context loss (common in in-app browsers) downgrades gracefully to the CSS sunrise.
- Mobile budget — pixel-ratio clamped to 1.25–1.5 (halves bloom cost invisibly), no pins except a shortened hero, three device tiers with a permanent poster pipeline on low-end — every CTA, price, and form works with 3D off. QA inside the actual Instagram in-app browser is a hard release gate.
- Measurement — five Meta Pixel events, with Purchase firing on the registrar's confirmation page via pixel + Conversions API. Without that, Meta optimizes toward clickers instead of buyers and paid CAC typically runs 2–4× worse — the closing argument for confirming RunSignup.
- Feature-flag shipping — hero, city selector, ladder, FAQ, captures, sticky bar are launch-blocking; every 3D flourish lands behind a flag, cut-safe by construction against the mid-August clock.
Four gates to lock with Michael first
Live site: Nov 14. Newest internal plan: Nov 7 (tentative, park unconfirmed). An older calendar had Orlando in Feb 2027. Rule: the site says "November 2026" everywhere, the date is one config value, and no day-of-month gets baked into artwork until the permit confirms.
The live SD funnel already runs on it. RunSignup gives confirmation-page Purchase tracking, per-cart fees that favor family signups, and native referral rewards. The site's registrar layer is a one-line config either way.
The site's central promise appears in no event document (SD page says "coffee at the finish"; the Orlando plan says "coffee + donuts"). If it IS unlimited, we quantify it against the genre's one-stingy-cup norm. If not, the copy changes before it becomes a liability.
Category norm ($10 off youth at Track Shack; under-4 free at Bubble Run) and the family buyer's checkout math depends on it — four bibs at draft prices is $120–160. Reserve a ladder row.
Housekeeping alongside: author the refund/weather policy (it doesn't exist yet — and November Florida is real hurricane season), finalize the mascot's name (Brewster is the house pick), packet-pickup mechanics, the Wix→Cloudflare migration plan with 301s and @roastedrun5k.com email, privacy/terms, and an SMS "text me before the price goes up" capture — likely out-converts email for Instagram traffic.
Build order vs. the clock
The conversion core, launch-blocking: hero fixes + poster pipeline, city selector with the Orlando First Pour capture (the waitlist should exist this week — it's the cheapest win on the board), price ladder, FAQ, sticky bar, deep links, pixel + GA4, per-city pages, Partners page, and the four gate decisions.
The set-pieces, each behind a feature flag: medal reveal, Race Morning sky scrub, Crew Cup, Pace-O-Meter, sound design.
Content-capture day as a project milestone: photographer + shot list — crowds, medals, coffee moments, spouse testimonials on camera. This feeds Orlando's proof section six weeks before its race day.
Final Pour set-piece ships, medal-reveal marketing beat, course-preview content, price-bump urgency pushes.
Daily countdown states; then the post-race flip: results, finisher photos, UGC recap, and the Tampa (Mar 2027) rollover tease. A race site lives half its life after the gun.