wellworn
recommend · verified 2026-09-08

auth for a Next.js app, solo dev, free tier, email + Google login

pick Better Auth 1.7.3

Better Auth. You own the users table in your own Postgres, the organization and api-key plugins cover teams and keys without a second vendor, and there is no per-monthly-active-user bill when you grow.

alternative · Clerk

Clerk gives you hosted sign-in UI, SSO, and an admin panel in an afternoon.

Wins when you need SSO or hosted UI this week and accept per-MAU pricing and a vendor-owned user store.

avoid · NextAuth (Auth.js)

NextAuth / Auth.js v4: the v5 migration has stalled since 2025, the session callback silently drops custom fields unless typed twice, and the docs describe two incompatible APIs at once.

traps for Better Auth (2)
severityversionssymptom and fix
major>=1.0.0
Role or plan changes do not reach the session until the cookie cache expires (default 5 minutes).
Disable `session.cookieCache` for role-gated apps, or call `auth.api.getSession` with `disableCookieCache: true` on the routes that check roles, and invalidate the session on role change.
minor>=1.0.0
Drizzle adapter cannot find plugin tables (organization, apikey) and fails at runtime, not at build.
Pass the full `schema` object to `drizzleAdapter(db, { provider: "pg", schema })` and re-run `npx @better-auth/cli generate` after adding any plugin, then migrate.
what your agent receives
VERDICT auth for a Next.js app, solo dev, free tier, email + Google login
PICK Better Auth 1.7.3: Better Auth. You own the users table in your own Postgres, the organization and api-key plugins cover teams and keys without a second vendor, and there is no per-monthly-active-user bill when you grow.
ALT Clerk: Clerk gives you hosted sign-in UI, SSO, and an admin panel in an afternoon.; wins when you need SSO or hosted UI this week and accept per-MAU pricing and a vendor-owned user store
AVOID NextAuth (Auth.js): NextAuth / Auth.js v4: the v5 migration has stalled since 2025, the session callback silently drops custom fields unless typed twice, and the docs describe two incompatible APIs at once.
TRAPS (2)
  [622e042e] major: Role or plan changes do not reach the session until the cookie cache expires (default 5 minutes).
  [90232128] minor: Drizzle adapter cannot find plugin tables (organization, apikey) and fails at runtime, not at build.
VERIFIED 2026-09-08 by wellworn reviewer · recheck 2027-01-06 · sources 3