Repository navigation
Land FW-601, FW-602, FW-603 on preview (with billing) - #47
Merged
Merged
Conversation
The header on the landing page and /pricing gets an account slot beside the GitHub button: - Signed out, it reads Sign in, linking to /login. - Signed in, it shows the account's initial and address. A menu says who is signed in and offers Account, Console and Sign out. An account still on the waitlist gets Waitlist instead of Console. Signing out stays on the page and puts focus on Sign in; a sign-out that fails says so in the menu. - The landing page is prerendered with no session, so the slot keeps one width and shows nothing until the service answers. Someone signed in never sees Sign in flash by, and the links never move. If the service can't be asked, it offers Sign in. Below 1100px the slot narrows to the initial and the GitHub button to its mark, so the links fit as before. Below 851px the menu hangs from the header's right edge so it stays inside the window. The "How it works" menu's close-on-outside-press, Escape and tab-out handling moves into a useDismiss hook that both menus use, and its panel motion into lib/panel.ts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Accounts kept only an email address, so the header could only show
that. Now an account can have a name:
- api: migration 0003 adds users.name, and the user the service
describes carries it (null until given). /auth/verify takes an
optional name, which names a new account or one without a name yet,
and never replaces one. A new POST /auth/profile sets or clears it
for the signed-in account. A name is trimmed, its runs of spaces made
one, and up to 80 characters; control characters and bidirectional
overrides are refused, before the code is tried, so a bad name
doesn't use up a try. The admin listing carries names too.
- site: /signup asks for an optional name above the address. /account
has a Name field to change or clear it. The header shows the name,
with the initials of its first and last words ("AL"), and the menu
shows the name above the address; without a name, both show the
address as before. The console's footer and the admin page show it
too. The in-browser demo keeps the name with its session.
Tests: api/test/profile.test.mjs covers giving, keeping, changing and
clearing a name, what's refused, the session and origin checks, and
the admin listing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pillOutline sits on shadcn's default Button variant, whose hover:bg-primary/80 it never overrode, so under the pointer an outlined button (Sign out on /account, Resend code and Use another address while signing in, Save name) turned near-black with its dark text unreadable. It now keeps its fill, and only its border darkens, as intended. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The service's SIGNUP_MODE is now "open", so whoever signs in uses the console, and accounts that were waiting are let in too. The waitlist stays in the code: setting it back to "waitlist" brings it back. The site stops talking about a waitlist and early access: - The landing page's last section is Get started (#get-started), with "Get started free" for /signup. The header links to it as Sign up (as short as Waitlist was, so the links still fit one row at phone widths), and the footer as Get started. - /pricing says to start on Free and that paid plans aren't billed yet. The Free, Launch and Scale cards say Get started, and the FAQ says you can sign up now. - /signup's lead says the account opens the console again. - The admin page opens on All while sign-up is open, since nobody waits, and Remove's question no longer says the account goes back on the waitlist. The API tests now follow the deployed setting, and the waitlist tests turn the waitlist on themselves. api/README.md says sign-up is open and how to put the waitlist back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Renumber the profile-name migration to 0004: preview already has 0003_billing.sql, and two 0003 migrations would apply in name order by accident. Keep both the billing routes and /auth/profile, and show the Name form above the billing card on /account.
Keep the landing Pricing section, with Get started after it, and both Pricing and Get started in the header and footer. Drop #43's "paid plans aren't billed yet" copy: Paygate billing is live, so /pricing now says to start on Free and upgrade when needed. The billing suite pins SIGNUP_MODE to waitlist, since its waiting-account case relied on the old deployed default. Rebuild docs/.
This was referenced Nov 14, 2026
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.
Lands #44 (FW-601, header sign-in), #45 (FW-602, profile name) and #43 (FW-603, open sign-up) on preview in that order. Their branches conflicted with the Paygate billing work (#46), and the contributor's fork can't take pushes from here. Each PR's own commits are kept unchanged, so GitHub marks all three as merged when this lands.
Fixes made while merging
0003_profile_name.sql→0004_profile_name.sql. Preview already has0003_billing.sql; two0003files would only apply in the right order by accident./pricingnote: "Start on Free. Upgrade when you need more"/pricingor/account./account: the Name form (FW-602) sits above the billing card./billing/*routes and/auth/profile.<user>in the README documentsnamealongside the billing docs.SIGNUP_MODE: "waitlist". Its "waiting accounts can't buy" case relied on the old deployed default, which Open sign-up: new accounts go straight to the console (FW-603) #43 switches toopen.docs/rebuilt.Checks
npm --prefix api run check: 86/86 pass.npm --prefix site run check: typecheck, 24/24 tests and the build all pass./pricingCTAs go to/signupand the new copy shows.After merge, in this order
npm --prefix api run migrate:remote(addsusers.name)npm --prefix api run deploy(open sign-up,/auth/profile)Deploying the Worker before the migration breaks sign-in, because the new code reads
users.name.