Browse docs
Make It Yours

Choosing an Auth Provider

Custom JWT works out of the box. Clerk and Better Auth are adapter slots that need their SDK installed. Here is what each really costs.

Updated Aug 2026
On this page

Auth sits behind one adapter. Your screens call useAuth() and useOptionalAuth() and never know which provider is underneath.

What is wired today

# apps/mobile/.env
EXPO_PUBLIC_AUTH_PROVIDER=custom

Custom JWT is the one that works out of the box. It talks to the bundled backend, or to any backend that implements the documented contract, and gives you email and password sign-in, refresh-token rotation, forgot and reset password, social sign-in, and account deletion.

The Create account screen of the running app, with name, email and password fields and a Create account button
The sign-up screen on a clean clone, driven by Custom JWT against the bundled backend. The point of the adapter is that swapping providers changes what happens after the button, not this screen.

Clerk and Better Auth are slots, not switches

In apps/mobile/lib/auth.ts the clerk and better-auth branches are commented out. Setting EXPO_PUBLIC_AUTH_PROVIDER=clerk today does not raise an error and does not switch providers. It falls through to the default and you keep using Custom JWT, silently. We tested this and signed in against the bundled backend with the provider set to clerk.

Switching for real means three steps, not one:

  1. pnpm --filter mobile add @clerk/clerk-expo
  2. uncomment the import and the case 'clerk': branch in apps/mobile/lib/auth.ts
  3. set EXPO_PUBLIC_AUTH_PROVIDER=clerk and your publishable key

Budget an hour. The value of the adapter is that your screens do not change, not that the swap is free.

packages/auth/src/adapters/better-auth.ts is further back still: it is a stub that throws until you finish it. The file tells you what to do.

Social sign-in

Sign in with Apple and Google are wired for Custom JWT. The backend verifies the identity token against Apple's and Google's public keys with jose. That is real server-side verification, not trusting whatever the client sends.

Both need developer accounts and client IDs, and both need a development build. Expo Go cannot include the native modules.

Apple requires account deletion

Any app that lets users create an account must let them delete it (App Store guideline 5.1.1(v)). The boilerplate ships DELETE /me and a delete-account flow, so you pass that check.

No-login apps

Building a calculator, a habit tracker, or an offline tool?

EXPO_PUBLIC_AUTH_ENABLED=false

Restart the dev server. The sign-in wall is gone, the account controls disappear from the home screen, and the (auth) folder is safe to delete. Everything else, offline, analytics, payments, native APIs, keeps working. This one really is a single env var, and we verified it.

Stop reinventing the app shell. Start shipping.

React Native and Expo boilerplate built for Claude Code, Cursor and Copilot. Auth, payments, push and offline sync already wired, with a 37-row map telling your agent where each one lives.

Get it for $59 →