E8 — Public Launch#107
Conversation
…-127) E8 public launch surface: marketing-adjacent routes (/pricing, /about, /help, /status) plus a dismissable CookieNotice banner. Footer updated to expose the new pages alongside existing legal stubs. Member-tier waitlist form on /about posts to /api/waitlist (tolerates 404 pre-launch so the form can ship before the backend handler).
|
Warning You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again! |
|
Warning Rate limit exceeded
You’ve run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (15)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
ECC bundle files are already tracked in this repository. Skipping generation of another bundle PR. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ae28dac5b9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if (!res.ok && res.status !== 404) { | ||
| throw new Error(`HTTP ${res.status}`); | ||
| } | ||
| // 404 is fine pre-launch — we just want the email captured by the | ||
| // browser-level form. Treat as success. | ||
| setStatus('done'); |
There was a problem hiding this comment.
Do not treat missing waitlist endpoint as success
The submit handler marks the waitlist form as done even when /api/waitlist returns 404, which silently drops signups while showing a success message. In this repo there is no /api/waitlist route currently (the only occurrences are in this frontend page), so every submission will appear successful but no email is persisted. This is a production-impacting data-loss path for the launch waitlist flow.
Useful? React with 👍 / 👎.
| price: '$6', | ||
| cadence: 'per month', | ||
| tagline: 'For creators who want more room and the small touches.', | ||
| cta: { label: 'Join the waitlist', to: '/about#waitlist' }, |
There was a problem hiding this comment.
Use hash-scroll handling for waitlist CTA navigation
The Member plan CTA points to /about#waitlist, but the app does not implement any hash-fragment scroll handling (no hash/scroll logic in App.tsx or shared routing utilities), so SPA navigation can land on /about without scrolling to the id="waitlist" section. That breaks the intended one-click funnel from Pricing to the waitlist form and makes conversion depend on manual scrolling.
Useful? React with 👍 / 👎.
…, onboarding (ALO-127) Ships the marketing/legal/onboarding scaffold for E8 public launch: - Pricing page with Free / Creator / Studio tiers + FAQ. - Waitlist signup at /waitlist backed by /api/waitlist (D1 INSERT-OR-IGNORE, per-IP rate limit via existing token-bucket DO, best-effort Resend audience upsert). Public counter at /api/waitlist/count for the marketing page. - Public service status page at /status that polls /api/health every 30s and renders per-component (DB / cache / R2) status. - Public help center / FAQ at /help covering uploading, account management, and content policies. - First-run onboarding modal triggered by signup, dismissed via localStorage. Three steps: welcome → upload → profile. - Cookie notice banner shown once per browser; links to /legal/privacy. - Footer expanded to surface the new pages on every route. - Sitemap updated with /pricing, /help, /waitlist, /status, /legal/*. All routes are lazy-loaded so the home shell stays unchanged. Backend migration 0019_waitlist.sql adds the waitlist table; no impact to existing tables. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
ECC bundle files are already tracked in this repository. Skipping generation of another bundle PR. |
Closes ALO-127.
Ships the public-launch surface (E8) — marketing pages, waitlist, status, help, onboarding, and the cookie notice — backed by a real waitlist API.
What's in the box
Pages
/— homepage updated footer surfaces every public page/about— launch / press page with founding-member waitlist hook/pricing— Free / Creator / Studio tiers with FAQ/waitlist— dedicated public signup form with live counter/help— creator FAQ (Getting started · Account · Policies)/status— polls/api/healthevery 30s, renders DB / cache / R2 statuses/legal/tos,/legal/privacy,/legal/dmca— already shipped, now linked from footerComponents
CookieNotice— first-visit banner, dismissed vialocalStorageOnboarding— first-run 3-step modal triggered by signup, dismissed onceBackend
POST /api/waitlist— D1INSERT OR IGNORE, per-IP token-bucket rate limit (5/hour), best-effort Resend audience upsertGET /api/waitlist/count— public counter (no PII)0019_waitlist.sql— newwaitlisttable/about,/pricing,/help,/waitlist,/status,/legal/*Routing
Signup.tsxConstraints honored
lint:no-providersclean)Verification
npm run lint— clean (incl. AI Gateway guard)npm run type-check— cleannpm test— 497 passed (45 files), incl. 5 new waitlist testsnpm run build— clean (Pricing 3.93kB / Waitlist 3.41kB / Status 3.13kB / Help 4.50kB gzipped)