pproenca/dot-skills/better-auth-scaffold

Claude Code and agent skill by pproenca/dot-skills

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

Scaffolds a Better Auth setup in a Next.js (App Router) + Drizzle project — lib/auth.ts, lib/auth-client.ts, the /api/auth/[...all] route handler, middleware.ts, .env.example, and a permissions module. Produces convention-enforced templates for three plugin presets (minimal, social, advanced with twoFactor+magicLink). Trigger even when the user doesn't explicitly say "scaffold" — phrases like "set up Better Auth", "wire up auth", "initialize auth in this project", or "add auth to Next.js" should pull this in. Pairs with the `better-auth` skill, which covers the rules these templates encode.

Install

npx vskill@latest install pproenca/dot-skills/better-auth-scaffold

SKILL.md

Better Auth Scaffold (Next.js + Drizzle)

Parameterized templates for bootstrapping a Better Auth setup in a Next.js App Router project using the Drizzle adapter. Each template enforces the conventions documented in `references/conventions.md` — file layout, plugin ordering, env handling, runtime selection.

When to Apply

Reference these templates when:

  • Starting a new Next.js project that needs authentication
  • Adding Better Auth to an existing Next.js + Drizzle codebase
  • Refactoring a partial Better Auth setup that's missing the catch-all route, middleware, or nextCookies() ordering
  • Generating a per-feature variant (minimal, social, advanced) on top of an existing project

Setup

Required parameters
ParameterRequiredDefaultDescription
presetnominimalminimal (email+password) \social (adds Google + GitHub) \advanced (social + twoFactor + magicLink)
db_provideryes—pg \mysql \sqlite (Drizzle provider)
app_nameyes—Display name (becomes 2FA issuer in authenticator apps when preset=advanced)
Optional parameters
ParameterDefaultDescription
auth_pathlib/auth.tsServer auth module path
client_pathlib/auth-client.tsClient module path
api_route_pathapp/api/auth/[...all]/route.tsCatch-all route handler path
protected_paths["/dashboard"]Routes the middleware guards

If config.json already exists with values, the skill uses those; otherwise it asks the user.

Available Templates

TemplateOutput FileWhen to emit
`auth.ts.template`lib/auth.tsAlways
`auth-client.ts.template`lib/auth-client.tsAlways
`route.ts.template`app/api/auth/[...all]/route.tsAlways
`middleware.ts.template`middleware.tsWhen protected_paths is non-empty
`env.template`.env.exampleAlways
`db-schema-better-auth.ts.template`db/schema/auth.tsAlways (stub — replace with output of better-auth generate)
`db-index.ts.template`db/index.tsWhen the project has no Drizzle client yet
`email.ts.template`lib/email.tsWhen preset=advanced (and the file doesn't already exist)
`sign-in-page.tsx.template`app/sign-in/page.tsxWhen the project has no sign-in page (closes the middleware redirect loop)
`permissions.ts.template`lib/permissions.tsOptional starter for org/admin plugin work

How to Use

  1. Resolve parameters. Read config.json first; for any missing required parameter (db_provider, app_name), ask the user via AskUserQuestion.
  1. Render each template. For each template file:
  • Read the template.
  • Substitute {{placeholder}} values ({{app_name}}, {{db_provider}}, etc.) with the resolved parameter values.
  • Apply PRESET[...] conditional blocks using these rules:
  1. Find every pair of marker lines matching // PRESET[<tags>] and // /PRESET[<tags>] (or /* PRESET[...] */ / # PRESET[...] for non-JS files — same syntax, different comment style).
  2. Parse <tags> as a comma-separated list (e.g. social,advanced).
  3. If the chosen preset value is in <tags> → remove ONLY the two marker lines; keep the lines between them.
  4. If the chosen preset value is NOT in <tags> → remove the ENTIRE block including both marker lines.
  5. Markers may be nested (e.g. PRESET[advanced] inside PRESET[minimal,social,advanced]); process from inside out.
  • For Mustache-style iteration in middleware.ts.template (// {{#protected_paths}} ... // {{/protected_paths}}), repeat the lines between the markers once per item in the list, substituting {{path}} with each value.
  1. Write output files. Before writing, check if the target file already exists:
  • If it doesn't exist → write it.
  • If it exists and is identical → no-op.
  • If it exists and differs → show a diff and ask the user (overwrite / merge / skip).
  1. Run the CLI sequence. After all files are written:

``bash npx @better-auth/cli@latest generate npx drizzle-kit generate npx drizzle-kit migrate ` These commands replace the placeholder db/schema/auth.ts` with the real schema and apply migrations.

  1. Print next steps. Tell the user to:
  • Fill in .env.local (copy from .env.example)
  • Generate a secret: openssl rand -base64 32
  • Register OAuth redirect URIs with each provider console (for social/advanced presets)
  • Implement lib/email.ts to wire transactional email (for advanced preset)

Conventions

Read `references/conventions.md` for the rationale behind every convention these templates encode. Highlights:

  • lib/auth.ts is server-only (import "server-only")
  • nextCookies() is ALWAYS the last plugin in the array
  • Middleware does a cookie-presence check only; real validation in pages
  • All secrets via process.env.*, never inline
  • Sliding-window sessions with cookieCache enabled

Related Skills

  • `better-auth` — Library/API Reference with 42 rules covering setup, sessions, security, plugins, and migration. The templates here are one canonical realization of those rules; read the rule for the underlying reasoning when you need to deviate.

Gotchas

See `gotchas.md` — initialized empty, populated as we discover them.

Security

  • Security scanPassed, 95 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
169
Repository forks
12
7-day trend score
26

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/pproenca/dot-skills/better-auth-scaffold/badge)](https://verified-skill.com/skills/pproenca/dot-skills/better-auth-scaffold)

Something wrong with this skill or its page? Tell us.