Repository navigation
feat(site): open signup replaces the waitlist - #185
Merged
Merged
Conversation
Shared validation in lib/signup.ts mirrors POST /api/auth/signup (OPEN-SIGNUP.md 2.3): full name, email, job role enum with 'other' free text, optional X/LinkedIn profile URLs normalized to the accepted shapes, plan from the enum. The route validates, drops honeypot hits with the same 202, rate limits per IP (5 per 10 min, valid submissions only) and proxies to the public endpoint with Origin https://nan.builders and the client IP. Every upstream success is the same 202; 400 field errors are sanitized; 429 passes through; anything else is an opaque 502. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The hero form now creates an account: full name, email, job role (with 'Other' free text revealed on demand), optional X and LinkedIn profiles, honeypot, required markers, per-field errors and a 'check your inbox' success state. Still a vanilla script, no island; ?plan= (and the legacy ?premium=1) is carried into the payload. Copy rewritten in EN and ES. Removes the waitlist route, its client/server libs, the Resend confirmation email and their tests. cloud-api now sends the English magic link, so RESEND_* and CLOUD_API_WAITLIST_KEY are unused here. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pricing tiers link to cloud.nan.builders/signup?plan=premium|inference| community and the workspaces block gets a plan=workspace CTA. The nav shows 'Create account' next to Login. Models, footer and 404 point at the hero signup form. /community drops its payment-first form for a CTA to signup?plan=community (form, route, lib and tests deleted). Privacy covers the account profile data and the 7-day purge of unconfirmed accounts; terms no longer mention a waitlist. A guard test keeps any waitlist copy out, except the events reserve pool. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Web search (/v1/search and the MCP server that only exposed it) was removed in #100 and /docs/mcp already 301s to agent-setup. Pin it: no page, doc, dictionary, OpenAPI path or public file may mention it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ARCHITECTURE.md and README.md now document /api/signup (contract, validation, honeypot, rate limit, response mapping), the vanilla hero form, the plan-aware signup links, the free lifecycle state, path-based EN/ES, the current structure, and the env vars the site no longer reads (RESEND_*, CLOUD_API_WAITLIST_KEY). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…op band With the new Create account button the Spanish nav overflowed 66px at 861px, 28px at 900px and 28px right after the old 1100px band. The compact band now runs to 1240px with tighter spacing and smaller auth buttons; measured no horizontal scroll at 861-1300px in EN and ES. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…country - The hero form has method="post" action="/api/signup", so if the script fails the browser never GETs the data into a URL. That form post gets a plain-text 415 pointing at the platform signup; the body is never read or echoed (a redirect to cloud.nan.builders would be blocked by the page's form-action 'self'). - /api/signup parses the Content-Type media type and requires exactly application/json instead of a substring match. - cf-ipcountry is forwarded to cloud-api next to the client IP (only a well-formed two-character code), for the billing region at verify. - The blocked email domain/TLD lists are exported and pinned by a test so they stay in sync with cloud-api. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- mail.com is a real email provider: removed from the blocked-domain list (cloud-api drops it too). The pinned list test is updated. - A no-JS form post to /api/signup now gets a small static HTML page instead of plain English text: dark like the site, no JS, its own CSP (default-src 'none'), in Spanish when posted from /es or, with no same-origin Referer, when Accept-Language prefers it. It explains the form needs JavaScript and links to cloud.nan.builders/signup. The request body is still never read or echoed; the status stays 415. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The landing stops feeding a waitlist and sends people to create an account.
/api/signup, which validates, rate-limits per IP, has a honeypot, and proxies to cloud-apiPOST /api/auth/signup, forwardingcf-connecting-ipandcf-ipcountry.?planis carried through.cloud.nan.builders/signup?plan=…, a workspaces CTA, and a nav "Create account"./communityloses its pay-first form.ARCHITECTURE.mdandREADME.mdrewritten.Tests
npm run buildandastro checkOK; vitest 83 files / 2447 tests green. Visual check: desktop/mobile, ES/EN.Blocking reviews (QA, UX, Security): approved.
Deploy notes
OPEN_SIGNUP=true; the signup endpoint is only mounted with the flag on.CLOUD_API_URLis still required.RESEND_API_KEY,RESEND_FROM_EMAILandCLOUD_API_WAITLIST_KEYare no longer used and can be removed from the Worker secrets.🤖 Generated with Claude Code