Skip to content
Agentmart
Submit a tool

better-auth-scaffold

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…

Skill by pproenca

IndexedMIT★ 218
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/pproenca-better-auth-scaffold

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

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.

Use cases: frontend, backend, security

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/better-auth-scaffold

What's inside

Skill name
better-auth-scaffold
Description
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.
License
MIT
Instructions
100 lines in SKILL.md · view on GitHub

Files (15)

  • SKILL.md
  • auth-client.ts.template · assets/templates/
  • auth.ts.template · assets/templates/
  • db-index.ts.template · assets/templates/
  • db-schema-better-auth.ts.template · assets/templates/
  • email.ts.template · assets/templates/
  • env.template · assets/templates/
  • middleware.ts.template · assets/templates/
  • permissions.ts.template · assets/templates/
  • route.ts.template · assets/templates/
  • sign-in-page.tsx.template · assets/templates/
  • config.json
  • gotchas.md
  • metadata.json
  • conventions.md · references/

SKILL.md (first lines)

# 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`](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

| Parameter | Required | Default | Description |
|---|---|---|---|
| `preset` | no | `minimal` | `minimal` (email+password) \| `social` (adds Google + GitHub) \| `advanced` (social + twoFactor + magicLink) |
| `db_provider` | yes | — | `pg` \| `mysql` \| `sqlite` (Drizzle provider) |
| `app_name` | yes | — | Display name (becomes 2FA issuer in authenticator apps when preset=advanced) |

### Optional parameters

| Parameter | Default | Description |
|---|---|---|
| `auth_path` | `lib/auth.ts` | Server auth module path |
| `client_path` | `lib/auth-client.ts` | Client module path |
| `api_route_path` | `app/api/auth/[...all]/route.ts` | Catch-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

| Template | Output File | When to emit |
|---|---|---|
| [`auth.ts.template`](assets/templates/auth.ts.template) | `lib/auth.ts` | Always |
| [`auth-client.ts.template`](assets/templates/auth-client.ts.template) | `lib/auth-client.ts` | Always |
| [`route.ts.template`](assets/templates/route.ts.template) | `app/api/auth/[...all]/route.ts` | Always |
| [`middleware.ts.template`](assets/templates/middleware.ts.template) | `middleware.ts` | When `protected_paths` is non-empty |
| [`env.template`](assets/templates/env.template) | `.env.example` | Always |
| [`db-schema-better-auth.ts.template`](assets/templates/db-schema-better-auth.ts.template) | `db/schema/auth.ts` | Always (stub — replace with output of `better-auth generate`) |
| [`db-index.ts.template`](assets/templates/db-index.ts.template) | `db/index.ts` | When the project has no Drizzle client yet |
| [`email.ts.template`](assets/templates/email.ts.template) | `lib/email.ts` | When `preset=advanced` (and the file doesn't already exist) |
| [`sign-in-page.tsx.template`](assets/templates/sign-in-page.tsx.template) | `app/sign-in/page.tsx` | When the project has no sign-in page (closes the middleware redirect loop) |
| [`permissions.ts.template`](assets/templates/permissions.ts.template) | `lib/permissions.ts` | Optional 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`.

2. **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.

3. **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).

4. **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.

5. **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`](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`](../better-auth/SKILL.md) — 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`](gotchas.md) — initialized empty, populated as we discover them.

From pproenca/dot-skills, MIT.

More from pproenca/dot-skills

Signals

Stars
218
Forks
19
Open issues
3
Last commit (this folder)
Jul 5, 2026 (3 months ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from pproenca

Cite this page

better-auth-scaffold skill. Agent Mart. https://agentmart.dev/skills/pproenca-better-auth-scaffold (last updated 2026-10-24)