**Why** — operator wanted to throttle new signups while reviewing each one manually. Built three-mode signup gate + manual approval queue. **Schema (`signup_mode_waitlist` migration):** - New singleton table `public.app_config` (id boolean primary key default true) with `signup_mode text` in {open, closed, waitlist}. Default 'open'. RLS: read by super-admin only. - `public.users` gains `pending_approval boolean default false`, `approved_at timestamptz`, `approved_by uuid references users(id)`. - BEFORE INSERT trigger `set_pending_on_signup()` flips `pending_approval = true` when current mode = 'waitlist'. - 4 SECURITY DEFINER admin RPCs: `admin_get_signup_mode()`, `admin_set_signup_mode(mode)`, `admin_list_pending_users()`, `admin_approve_user(user_id)`. All revoked from anon/authenticated/public, granted to service_role. **UI:** - `/admin` overview gains a `Signup mode` card with three buttons (Open / Waitlist / Closed). Inline switching via POST `/api/admin/signup-mode`. - `/admin/users` rebuilt with two tabs: `All users (N)` (existing list) + `Pending approval`. The pending tab lazy-loads via GET `/api/admin/users/pending`. Each row has an `Approve` action calling POST `/api/admin/users/{id}/approve`. - New `/pending` page for users blocked by waitlist — shows hourglass + "waiting for admin approval" + sign-out link. - `/c` page gate: on every visit, server-side checks `public.users.pending_approval`; true → redirect to `/pending`. **Bilingual** — full `admin.signup_*` + `admin.users_tab_*` + `admin.users_approve` + `pending.*` namespaces in en + he. **Net** — operator can now flip Angi between "fully open", "waitlist", and "closed signup" without redeploy. Waitlist users land on a clear holding page until approved; admin sees them in a dedicated tab + approves with one click.
- /admin/users two tabs: All + Pending approval with one-click approve
- Signup mode card on /admin overview
- 4 SECURITY DEFINER admin RPCs (get/set mode, list pending, approve user)
- pending_approval column on users + before-insert trigger
- app_config table + signup_mode toggle (open / closed / waitlist)
- ANGI_VERSION 1.7.321 → 1.7.322 (chat + web)
- Bilingual: admin.signup_* + users_tab_* + pending.* namespaces
- /pending page + /c gate redirects pending users