Web route: /signup/
Source: llm-fe/src/llm-fe/pages/SignUp/SignUp.tsx
Reached from Sign in only when self-serve registration is on.
Screenshot
Phone-width capture of https://hesychia.ai/signup/. Analytics consent banner dismissed before capture. Web copy says Stripe because the browser uses Checkout. iOS must use App Store billing instead.
Behavior
Load GET /public/settings/ first. While loading, show “Loading…”.
Registration off (or settings failed): “Self-serve registration is not available right now.” Link back to Sign in. No form.
Registration on: email (required), first name, last name, company / workspace (all optional except email), password (min 8), confirm password (must match).
Submit label on web: “Sign Up & Pay”.
SSO buttons use intent signup for the same Google / Microsoft flags as Sign in.
Link back to Sign in, and a Terms of Service link.
New screen. Wire the form, the registration flag, and an App Store purchase after create. Button copy should not say Stripe.
Part of #1.
Web route: `/signup/`
Source: `llm-fe/src/llm-fe/pages/SignUp/SignUp.tsx`
Reached from Sign in only when self-serve registration is on.
## Screenshot

Phone-width capture of https://hesychia.ai/signup/. Analytics consent banner dismissed before capture. Web copy says Stripe because the browser uses Checkout. iOS must use App Store billing instead.
## Behavior
- Load `GET /public/settings/` first. While loading, show “Loading…”.
- Registration off (or settings failed): “Self-serve registration is not available right now.” Link back to Sign in. No form.
- Registration on: email (required), first name, last name, company / workspace (all optional except email), password (min 8), confirm password (must match).
- Submit label on web: “Sign Up & Pay”.
- SSO buttons use intent `signup` for the same Google / Microsoft flags as Sign in.
- Link back to Sign in, and a Terms of Service link.
- Success stores tokens, loads `/user/get/`, RevenueCat `logIn`.
- `needs_checkout === false` → Dashboard.
- Native (this app): start the store purchase, then open Account even if the purchase is cancelled or fails. Do not send the user to Stripe Checkout.
- Web-only path (do not port): `POST /monetization/checkout/` and redirect to `checkout_url`.
- Errors: 403 “Account registration is currently disabled.”; `email[0]`; `detail`; otherwise “Could not create account. Try again.”
## API
| Call | Purpose |
| --- | --- |
| `GET /public/settings/` | `enable_account_registration`, `oauth.google`, `oauth.microsoft`. |
| `POST /user/create/` | Body `{ email, password, first_name, last_name, company_name }`. Returns `access`, `refresh`, and `needs_checkout`. |
| `GET /user/get/` | Hydrate the account after create. |
| `POST /monetization/checkout/` | Web Stripe only. Body `{ success_url, cancel_url }`. Skip on iOS. |
| RevenueCat purchase | iOS equivalent of checkout. Confirm with `POST /monetization/store/confirm/` (`storeBilling.ts`). Provider badge `revenuecat` + `APP_STORE`. |
SSO start: `{API}/auth/oauth/{provider}/start/?intent=signup`.
## iOS
New screen. Wire the form, the registration flag, and an App Store purchase after create. Button copy should not say Stripe.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Part of #1.
Web route:
/signup/Source:
llm-fe/src/llm-fe/pages/SignUp/SignUp.tsxReached from Sign in only when self-serve registration is on.
Screenshot
Phone-width capture of https://hesychia.ai/signup/. Analytics consent banner dismissed before capture. Web copy says Stripe because the browser uses Checkout. iOS must use App Store billing instead.
Behavior
GET /public/settings/first. While loading, show “Loading…”.signupfor the same Google / Microsoft flags as Sign in./user/get/, RevenueCatlogIn.needs_checkout === false→ Dashboard.POST /monetization/checkout/and redirect tocheckout_url.email[0];detail; otherwise “Could not create account. Try again.”API
GET /public/settings/enable_account_registration,oauth.google,oauth.microsoft.POST /user/create/{ email, password, first_name, last_name, company_name }. Returnsaccess,refresh, andneeds_checkout.GET /user/get/POST /monetization/checkout/{ success_url, cancel_url }. Skip on iOS.POST /monetization/store/confirm/(storeBilling.ts). Provider badgerevenuecat+APP_STORE.SSO start:
{API}/auth/oauth/{provider}/start/?intent=signup.iOS
New screen. Wire the form, the registration flag, and an App Store purchase after create. Button copy should not say Stripe.