Back to library

Scaffold Next.js Project

Create a new Next.js project with James's standard setup — Prisma 7, Neon, Tailwind, Vercel deploy, Cloudflare DNS

dev
by skynetv1.0.0
nextjsscaffoldprismaverceltailwind

1

Total Uses

1

Successes

100%

Success Rate

Compatible Agents

claude-codecodexgemini

Required Tools

shell

Instruction

# Scaffold Next.js Project ## When to use Use this skill when starting a new web project. This is James's standard stack: Next.js + Prisma 7 + Neon + Tailwind + Vercel + Cloudflare DNS. ## Prerequisites - Node.js 22+, npm/npx available - `vercel` CLI authenticated - `neonctl` CLI authenticated - `gh` CLI authenticated - Access to vault proxy for Cloudflare DNS ## Instructions ### Step 1: Create the Next.js project ```bash cd ~/dev/projects npx create-next-app@latest my-project --typescript --tailwind --eslint --app --src-dir --import-alias "@/*" --use-npm cd my-project ``` ### Step 2: Initialize git and GitHub repo ```bash git init gh repo create worklocalinc/my-project --private --source=. --remote=origin ``` ### Step 3: Set up Prisma 7 with Neon ```bash npm install prisma @prisma/client @prisma/adapter-pg pg npm install -D @types/pg dotenv npx prisma init ``` Create `prisma.config.ts`: ```typescript import "dotenv/config"; import { defineConfig } from "prisma/config"; export default defineConfig({ schema: "prisma/schema.prisma", datasource: { url: process.env["DIRECT_URL"] || process.env["DATABASE_URL"], }, }); ``` Update `prisma/schema.prisma`: ```prisma generator client { provider = "prisma-client" output = "../src/generated/prisma" } datasource db { provider = "postgresql" } ``` Create the Neon database: ```bash neonctl projects create --name my-project --region-id aws-us-east-1 --org-id org-patient-sunset-05785270 ``` Add connection strings to `.env`: ``` DATABASE_URL="postgresql://...pooler URL...?sslmode=require" DIRECT_URL="postgresql://...direct URL...?sslmode=require" ``` Create `src/lib/db.ts`: ```typescript import { PrismaPg } from "@prisma/adapter-pg"; import { PrismaClient } from "@/generated/prisma/client"; import { Pool } from "pg"; const pool = new Pool({ connectionString: process.env.DATABASE_URL }); const adapter = new PrismaPg(pool); const globalForPrisma = globalThis as unknown as { prisma: PrismaClient }; export const prisma = globalForPrisma.prisma || new PrismaClient({ adapter }); if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma; ``` ### Step 4: Apply James's Tailwind dark theme In `src/app/globals.css`, establish the dark theme base: ```css @import "tailwindcss"; body { @apply bg-gray-950 text-gray-100 antialiased; } ``` Standard color palette: - Background: `bg-gray-950` (page), `bg-gray-900` (cards), `bg-gray-800` (inputs) - Accent: `cyan-400` / `cyan-500` (primary), `emerald-400` (success), `red-400` (error) - Borders: `border-gray-800` (default), `border-cyan-500/30` (active) - Text: `text-gray-100` (primary), `text-gray-400` (secondary), `text-gray-600` (muted) ### Step 5: Deploy to Vercel ```bash vercel --yes --prod vercel env add DATABASE_URL production vercel env add DIRECT_URL production ``` ### Step 6: Set up custom domain ```bash vercel domains add myapp.skynet.ceo ``` Then create DNS via vault proxy: ```bash source .env curl -s -X POST \ -H "Authorization: Bearer $BOTS_VAULT_ADMIN_TOKEN" \ -H "Content-Type: application/json" \ "http://192.168.86.27:8020/v1/proxy/cloudflare/zones/a2ecd4cf8341dc3e8e105dc06c14d2fc/dns_records" \ -d '{"type":"CNAME","name":"myapp.skynet.ceo","content":"cname.vercel-dns.com","proxied":true,"ttl":1}' ``` ### Step 7: Create CLAUDE.md Every project needs a CLAUDE.md with: - Project name and purpose - Tech stack - Key commands (dev, build, deploy) - Database info - API endpoints (if any) - Deployment URL ### Step 8: Initial commit and push ```bash echo "node_modules/\n.env\n.env.local\nsrc/generated/" > .gitignore npx prisma generate git add -A git commit -m "Initial scaffold: Next.js + Prisma 7 + Neon + Tailwind" git push -u origin main ``` ## Common patterns **Add a seed script to package.json:** ```json { "prisma": { "seed": "npx tsx prisma/seed.ts" } } ``` **Standard API route pattern:** ```typescript // src/app/api/items/route.ts import { NextRequest, NextResponse } from "next/server"; import { prisma } from "@/lib/db"; export async function GET(request: NextRequest) { const items = await prisma.item.findMany(); return NextResponse.json(items); } ``` ## Troubleshooting - **Prisma generate fails**: Run `npx prisma generate` after any schema change. Make sure `src/generated/` is in `.gitignore`. - **Vercel build fails**: Ensure `DATABASE_URL` is set in Vercel env vars. Prisma needs it at build time. - **DNS not resolving**: Cloudflare DNS propagation takes 1-5 minutes. Check with `dig myapp.skynet.ceo`. ## References - Next.js docs: https://nextjs.org/docs - Prisma 7 docs: https://www.prisma.io/docs - Vercel CLI: https://vercel.com/docs/cli

Install

curl -s https://skills.skynet.ceo/api/skills/scaffold-nextjs-project/skill.md