3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Next.js + Supabase × Claude Code で認証付きCRUDアプリの雛形を10分で作る実践

3
Posted at

Next.js + Supabase の組み合わせは、個人開発者・学習者にとって最強の組み合わせの1つです。
Claude Codeと組み合わせると、認証付きCRUDアプリの雛形を10分で立ち上げられます

本記事では、私が実際に毎週のように使っている「Next.js + Supabase 初期構築テンプレート」を、
Claude Codeにどう指示すれば良いかも含めて紹介します。

ゴール

以下の機能を持つアプリを10分で立ち上げる:

  • メール/パスワード認証(Supabase Auth)
  • ログイン後のダッシュボード(Server Component)
  • Todo の CRUD 操作(作成・一覧・更新・削除)
  • Row Level Security(他ユーザーのデータは見えない)

前提

  • Node.js 20+ インストール済み
  • Supabaseプロジェクト作成済み(URLとANON_KEYを控えておく)
  • Claude Code インストール済み

Step 1: プロジェクト作成(1分)

npx create-next-app@latest todo-app --typescript --tailwind --app
cd todo-app
npm install @supabase/supabase-js @supabase/ssr

Step 2: CLAUDE.md の準備(2分)

プロジェクトルートに CLAUDE.md を作成:

# プロジェクト: Todo App

## 技術スタック
- Next.js 16 (App Router)
- Supabase (Auth + DB + RLS)
- Tailwind CSS

## コーディング規則
- Server Components を優先、必要な箇所のみ Client Components
- 認証チェックは middleware.ts で実施
- DB操作は Server Actions で実行(クライアントから直接DBアクセスしない)
- any型を使わない
- 環境変数は必ず process.env 経由、ハードコードしない

## ファイル配置
- `src/features/auth/` - 認証関連
- `src/features/todo/` - Todo機能
- `src/lib/supabase/` - Supabaseクライアント

Claude Code は CLAUDE.md を自動で読み込むため、「Next.js 16 は App Router で」等を毎回指示する必要がなくなります

Step 3: Supabase クライアント生成(1分)

Claude Code にこう指示:

CLAUDE.md に従って、src/lib/supabase/ に server.ts と client.ts を作ってください。
@supabase/ssr の createServerClient と createBrowserClient を使います。
環境変数は NEXT_PUBLIC_SUPABASE_URL と NEXT_PUBLIC_SUPABASE_ANON_KEY を使います。

生成されるもの:

// src/lib/supabase/server.ts
import { createServerClient } from '@supabase/ssr'
import { cookies } from 'next/headers'

export async function createClient() {
  const cookieStore = await cookies()
  return createServerClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
    {
      cookies: {
        getAll: () => cookieStore.getAll(),
        setAll: (cookies) => cookies.forEach(({ name, value, options }) => {
          cookieStore.set(name, value, options)
        })
      }
    }
  )
}

Step 4: DBスキーマを Supabase で作成(2分)

Claude Code に SQL を生成させる:

todos テーブルを作成するSQL migration を書いてください。
- id (uuid, primary key)
- user_id (uuid, foreign key to auth.users)
- title (text, not null)
- completed (boolean, default false)
- created_at (timestamptz)

RLS を有効にして、自分の行のみ select/insert/update/delete 可能にしてください。

生成される SQL をSupabase管理画面のSQL Editorに貼り付けて実行。

Step 5: 認証ページと Todo ページを生成(3分)

Claude Code にまとめて指示:

CLAUDE.mdに従って以下を実装してください:
1. /login ページ(メール/パスワード入力フォーム、Server Action で signInWithPassword)
2. /dashboard ページ(Server Component、todos 一覧と追加フォーム)
3. middleware.ts(未認証なら /login にリダイレクト)
4. Server Actions で todo の作成・削除・完了切り替え
5. Tailwind CSS で最低限の見た目

Claude Code は CLAUDE.md の規則に沿って、Server Components 優先・Server Actions 使用・環境変数ハードコード禁止を守ったコードを生成してくれます。

Step 6: 動作確認(1分)

npm run dev

http://localhost:3000/login でサインアップ → /dashboard で Todo の追加・削除が動けば完成。

ハマりポイントと対処

1. Supabase のメール認証でメールが届かない

テスト中はSupabase管理画面の「Auth > Users」から直接ユーザーを作成するのが早い。
本番運用時は SMTP設定を忘れずに。

2. middleware.ts で無限リダイレクトになる

middleware.ts 内で /login 自体を除外する matcher 指定を忘れがち:

export const config = {
  matcher: ['/((?!login|_next/static|_next/image|favicon.ico).*)']
}

3. RLS のテストは必ず2アカウントで

RLSは「自分で自分のデータを見る」テストだけだと気づけない穴がある。
必ず別のテストユーザーを作って「他人のデータが見えないこと」を確認する。

まとめ

Next.js + Supabase + Claude Code の組み合わせで、

  • 認証付き
  • RLSでセキュリティ確保
  • CRUD操作

を持つアプリの雛形が10分で立ち上がります

ポイントは、CLAUDE.md にプロジェクト規則を書いておくこと。
これをやっておくだけで、Claude Code が毎回「正しい」コードを書くようになります。

個人開発のスタート地点として、この構成は本当に強力です。


この構成を使った個人開発・学習サポートを MENTA で提供しています → https://menta.work/plan/20251
YouTubeでもAI駆動開発の情報を発信中 → https://www.youtube.com/channel/UC1rXVD9WYsQPQEWZyd-A1KA/

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?