Awesome-omni-skill create-auth
Skill for creating auth layers in TypeScript/JavaScript apps using Better Auth.
install
source · Clone the upstream repo
git clone https://github.com/diegosouzapw/awesome-omni-skill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/development/create-auth" ~/.claude/skills/diegosouzapw-awesome-omni-skill-create-auth && rm -rf "$T"
manifest:
skills/development/create-auth/SKILL.mdsource content
Create Auth Skill
Guide for adding authentication to TypeScript/JavaScript applications using Better Auth.
For code examples and syntax, see better-auth.com/docs.
Decision Tree
Is this a new/empty project? ├─ YES → New project setup │ 1. Identify framework │ 2. Choose database │ 3. Install better-auth │ 4. Create auth.ts + auth-client.ts │ 5. Set up route handler │ 6. Run CLI migrate/generate │ 7. Add features via plugins │ └─ NO → Does project have existing auth? ├─ YES → Migration/enhancement │ • Audit current auth for gaps │ • Plan incremental migration │ • See migration guides in docs │ └─ NO → Add auth to existing project 1. Analyze project structure 2. Install better-auth 3. Create auth config 4. Add route handler 5. Run schema migrations 6. Integrate into existing pages
Installation
Core:
npm install better-auth
Scoped packages (as needed):
| Package | Use case |
|---|---|
| WebAuthn/Passkey auth |
| SAML/OIDC enterprise SSO |
| Stripe payments |
| SCIM user provisioning |
| React Native/Expo |
Environment Variables
BETTER_AUTH_SECRET=<32+ chars, generate with: openssl rand -base64 32> BETTER_AUTH_URL=http://localhost:3000 DATABASE_URL=<your database connection string>
Add OAuth secrets as needed:
GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET, GOOGLE_CLIENT_ID, etc.
Server Config (auth.ts)
Location:
lib/auth.ts or src/lib/auth.ts
Minimal config needs:
- Connection or adapterdatabase
- For email/password authemailAndPassword: { enabled: true }
Standard config adds:
- OAuth providers (google, github, etc.)socialProviders
- Email verification handleremailVerification.sendVerificationEmail
- Password reset handleremailAndPassword.sendResetPassword
Full config adds:
- Array of feature pluginsplugins
- Expiry, cookie cache settingssession
- Multi-provider linkingaccount.accountLinking
- Rate limiting configrateLimit
Export types:
export type Session = typeof auth.$Infer.Session
Client Config (auth-client.ts)
Import by framework:
| Framework | Import |
|---|---|
| React/Next.js | |
| Vue | |
| Svelte | |
| Solid | |
| Vanilla JS | |
Client plugins go in
createAuthClient({ plugins: [...] }).
Common exports:
signIn, signUp, signOut, useSession, getSession
Route Handler Setup
| Framework | File | Handler |
|---|---|---|
| Next.js App Router | | → export |
| Next.js Pages | | → default export |
| Express | Any file | |
| SvelteKit | | |
| SolidStart | Route file | |
| Hono | Route file | |
Next.js Server Components: Add
nextCookies() plugin to auth config.
Database Migrations
| Adapter | Command |
|---|---|
| Built-in Kysely | (applies directly) |
| Prisma | then |
| Drizzle | then |
Re-run after adding plugins.
Database Adapters
| Database | Setup |
|---|---|
| SQLite | Pass or instance directly |
| PostgreSQL | Pass instance directly |
| MySQL | Pass pool directly |
| Prisma | from |
| Drizzle | from |
| MongoDB | from |
Common Plugins
| Plugin | Server Import | Client Import | Purpose |
|---|---|---|---|
| | | 2FA with TOTP/OTP |
| | | Teams/orgs |
| | | User management |
| | - | API token auth |
| | - | API docs |
| | | WebAuthn |
| | - | Enterprise SSO |
Plugin pattern: Server plugin + client plugin + run migrations.
Auth UI Implementation
Sign in flow:
orsignIn.email({ email, password })signIn.social({ provider, callbackURL })- Handle
in responseerror - Redirect on success
Session check (client):
useSession() hook returns { data: session, isPending }
Session check (server):
auth.api.getSession({ headers: await headers() })
Protected routes: Check session, redirect to
/sign-in if null.
Security Checklist
-
set (32+ chars)BETTER_AUTH_SECRET -
in productionadvanced.useSecureCookies: true -
configuredtrustedOrigins - Rate limits enabled
- Email verification enabled
- Password reset implemented
- 2FA for sensitive apps
- CSRF protection NOT disabled
-
reviewedaccount.accountLinking
Troubleshooting
| Issue | Fix |
|---|---|
| "Secret not set" | Add env var |
| "Invalid Origin" | Add domain to |
| Cookies not setting | Check matches domain; enable secure cookies in prod |
| OAuth callback errors | Verify redirect URIs in provider dashboard |
| Type errors after adding plugin | Re-run CLI generate/migrate |