Marketing site for hookmeapp.com — a local services marketplace launching in Chicago, built around payment-verified reviews rather than paid placement.
Stack: Vite 8 · TypeScript · Three.js (vanilla, no frameworks) → static build → Cloudflare Pages. Art direction: "The Workshop, photographed" — one WebGL stage for the hero tableau (soft-lacquer tools + verified-seal finale) and a seal reprise at the waitlist; the rest of the page is editorial DOM. All 3D objects are procedural (no external model assets).
npm install
npm run dev # local dev server
npm run build # type-check + build to dist/
npm run preview # preview the production buildpublic/badge.png— the verified-seal emblem artwork (brand asset), struck onto the 3D coin in the hero finale and the waitlist reprise.docs/content-plan.md— what goes on the site, section by section, with drafted copy and[WIKI]flags for claims to verify against the product wiki (wiki.platformtoolsmith.com — Google SSO protected).docs/kimi-k3-prompt.md— the full prompt to paste into Kimi K3 to generate the interactive site (3D hero, WebGL shaders, spring physics, proximity effects).
After generating with Kimi, replace src/main.ts, src/style.css, index.html and add the
modules per the prompt's deliverable list, then npm run build must pass.
Prereq: wrangler CLI (already installed) + a Cloudflare account with the
hookmeapp.com zone.
# 1. Authenticate (interactive — opens a browser)
wrangler login
# 2. Create the Pages project (once)
wrangler pages project create hookme-site --production-branch main
# 3. Build + deploy
npm run build
wrangler pages deploy dist --project-name hookme-site
# 4. Attach the custom domain (or do it in the dashboard)
wrangler pages project list # confirm project
# Dashboard: hookme-site → Custom domains → hookmeapp.com (and www).github/workflows/cloudflare-pages.yml auto-deploys on push to main using the official
Cloudflare Pages action. To enable it, add two repo secrets:
CLOUDFLARE_API_TOKEN— token withCloudflare Pages:Editpermission (dash.cloudflare.com → My Profile → API Tokens)CLOUDFLARE_ACCOUNT_ID— your account ID (dashboard home → right sidebar)
Without the token, the workflow is skipped — manual wrangler pages deploy still works.
functions/api/waitlist.ts handles signups: Turnstile verify → per-IP throttle →
email dedupe → KV write (key = email, so re-subscribes are free to detect).
The widget renders on the form via src/waitlist.ts (sitekey is public; the
secret lives server-side).
# Local dev (test keys already in .dev.vars; dummy token always passes):
npm run build
wrangler pages dev dist
curl -X POST localhost:8788/api/waitlist -H 'Content-Type: application/json' \
-d '{"name":"T","email":"t@example.com","turnstileToken":"XXXX.DUMMY.TOKEN.XXXX"}'Production secrets + bindings (set once on the Pages project, not in git):
| Name | Where | Value |
|---|---|---|
WAITLIST_KV |
binding | KV namespace hookme-waitlist (id in wrangler.toml) |
TURNSTILE_SECRET |
secret | widget secret from dash.cloudflare.com → Turnstile |
WAITLIST_ADMIN_TOKEN |
secret | a long random string you generate |
wrangler pages secret put TURNSTILE_SECRET
wrangler pages secret put WAITLIST_ADMIN_TOKENView/export signups (bearer-token protected):
curl -H "Authorization: Bearer \$WAITLIST_ADMIN_TOKEN" \
https://hookme-site.pages.dev/api/waitlist/admin
curl -H "Authorization: Bearer \$WAITLIST_ADMIN_TOKEN" \
'https://hookme-site.pages.dev/api/waitlist/admin?format=csv'The old mailto: fallback still shows only when the endpoint itself is unreachable.