SUR-218 — Outstanding work after 2026-04-23 handoff
SUR-218 — Outstanding work after 2026-04-23 handoff
The Astro marketing handoff is live. Cutover, dashboard config, and bundling are done; what remains is small, well-scoped follow-ups.
Linear: SUR-218 · Plan:
~/.claude/plans/sur-218-along-with-a-ancient-pebble.md
Done
- Edge Function
waitlist-signupdeployed (honeypot + rate limit) - Astro site live at
surfc.app - React app live at
app.surfc.app - Supabase dashboard —
app.surfc.app+surfc.appadded to redirect URLs - Supabase config.toml — function registration + redirect URLs
- Lighthouse CI + link check (warn-only thresholds for now)
- Playwright suite (30 tests, mocked endpoint, Termly auto-blocked)
- Modal scrim
[hidden]CSS bug fix - TWA manifest repointed at
app.surfc.appand AAB rebuilt locally - Bubblewrap artifacts (twa-manifest.json, gradle wrapper, etc.) gitignored
- SUR-227 follow-ups filed as inline
TODO(SUR-227)comments - PostHog wired into Astro marketing (2026-04-23) — CDN-loaded init in
BaseLayout.astro,waitlist_submitted/waitlist_duplicatecaptures inWaitlistForm.astro, anddata-ctaattribution on Nav / Hero / ClosingCta / WaitlistFormSign in+Request invitationCTAs (firesapp_cta_clicked). -
PUBLIC_SUPABASE_ANON_KEYdecision (2026-04-23) — Netlify has it set; the defensiveif (anonKey) headers.apikey = anonKeypath inWaitlistForm.astrostays..env.exampledocumentation unchanged. The key is safe to expose (anon role + RLS). -
surfc/netlify.tomlpolicies cleanup (2026-04-23) — the two legacy/policies/*.html → clean URLredirects removed, replaced with a single/policies/* → https://surfc.app/policies/:splat301 bounce. Placed before the SPA catch-all. - TWA / assetlinks verification (2026-04-23) —
assetlinks.jsoncheck confirmed passing by Deji. Keystore SHA-256 still matches the value in public/.well-known/assetlinks.json; the file is reachable athttps://app.surfc.app/.well-known/assetlinks.json.
Outstanding
All SUR-218 follow-ups are complete. Remaining items belong to separate Linear issues — see below.
Gotchas worth remembering
-
Bubblewrap vendors a 32-bit JDK. Default Gradle heap (
-Xmx1536m) can’t reserve the address space and the build dies with “Could not reserve enough space for 1572864KB object heap” even on a 32 GB machine. Fix: setorg.gradle.jvmargs=-Xmx768min the (gitignored)gradle.propertiesafter every freshbubblewrap init. Long-term fix: install a 64-bit JDK 17 and pass--jdkPath="C:\Program Files\…\jdk-17.x.x"to bubblewrap. -
Edge Function rate limiter uses an in-memory per-worker
Map, not Deno KV (plan deviation, accepted at PR-time). A bot fanning out across workers bypasses the per-IP limit; honeypot is the primary filter for that case.
Downstream issues (not part of SUR-218)
- SUR-215 — strip
LandingPage/WaitlistScreenfromsurfc/src/App.jsxnow that marketing lives atsurfc.app. Unblocked. - SUR-219 — split
.hiw-*and.wl-*rules out ofsurfc/src/styles.css. Unblocked. - SUR-227 — Lighthouse follow-ups (color contrast on
/waitlist, render-blocking Google Fonts + CLS, cache headers on icons / og-image). Filed as inlineTODO(SUR-227)comments atsurfc-web/src/layouts/ BaseLayout.astro,surfc-web/netlify.toml, andsurfc-web/src/components/ WaitlistForm.astro— grepTODO(SUR-227)to surface the full list.