August 2, 2026
Closed beta: invite-only signup, per-member spend cap, dependency sweep
- Signup is closed (
enableSignup: false) for the closed-beta window. Two flags move together, and this is the important part:invitationOnlyPluginonly matches/sign-up/email, while Better Auth's magic link auto-creates an unknown user with `emailVerified: true` unlessdisableSignUpis set.magicLink({ disableSignUp: !config.enableSignup })now tracks the config flag — without it the login form's magic-link field would keep minting accounts for any address while public signup _looked_ closed. Reopening signup means flipping both back together. Not a regression: with signup closed,autoSignInturns on andrequireEmailVerificationoff by design — the invitation proves the address. - Per-member scan cap (
PER_MEMBER_SCAN_CAP,apiKeys/lib/member-scan-cap.ts). Members cannot add or edit org API keys (every write requires org admin), so they spend the admin's key — and the free-tier gates only run whenusedOurKeyis true, so under BYOK there was no per-member limit at all andbudgetCapUsddefaults to NULL. The cap therefore keys off the member, not the key source, and applies on both. Gate order: free-tier (managed only) → member cap → budget cap, so a capped member never burns a monthly quota slot. No-ops for cron runs (userIdnull) and for org owners/admins. No migration —scan_sessionalready carriesuserId. - Fixed:
bulk-executere-ran its per-unit preflight only whenusedOurKey, so a single BYOK bulk run could blow straight past the member cap in one batch. It now always re-runs. - All 10 open Dependabot advisories resolved (1 high, 9 moderate). Every one was the same package on the same path —
start-server-and-test > wait-on > axios@1.16.0— with the same fix. Pinnedaxios: "^1.18.0"in thepnpm-workspace.yamloverrides block (resolves to 1.19.0). Dev-only e2e orchestration; nothing shipped was exposed, which is whypnpm audit --prodstayed green the whole time. No code imports axios directly. - Docs:
VERCEL.mdnow covers the launch-day traps it was missing — Hobby _fails the deployment_ on sub-daily crons (it does not silently skip them), production must start with an empty Turso DB (a restoredlocal.dbleaves BYOK rows undecryptable under the newKEYRING_MASTER_KEYand forces a rollup backfill), the expectedcheck:go-live:prodresult, and a new §7b for first login, since with signup closed there is no way into a fresh deployment withoutcreate:user+grant:tier.