Changes: - Add FAL_KEY and GEMINI_API_KEY to .env.example - Update picture-it to use ~/.config/opencode/.env (unified creds) - Remove shodh-memory skill (no longer used) - Remove alphaear-* skills (deprecated) - Remove thai-frontend-dev skill (replaced by website-creator) - Remove theme-factory skill - Add mql-developer skill (MQL5 trading) - Add ecommerce-astro skill (Astro e-commerce) - Add website-creator skill (Next.js + Payload CMS) - Update install script for new skills
5.7 KiB
name, description, tags, category
| name | description | tags | category | |||||
|---|---|---|---|---|---|---|---|---|
| payload-nextjs-turbopack-fix | Fix Payload CMS white screen / module load errors when using Next.js 16 with Turbopack |
|
software-development |
Payload CMS + Next.js 16 Turbopack White Screen Fix
Symptom
Payload CMS admin shows white screen or "initializing" forever. Console/network tab shows:
Error: Failed to load external module @payloadcms/db-mongodb-XXXXXXXXXXXX
ResolveMessage: Cannot find module '@payloadcms/db-mongodb-XXXXXXXXXXXX'
Or server returns HTTP 500 on /admin/create-first-user or /admin.
Root Cause
Next.js 16 defaults to Turbopack in dev mode. Payload CMS 3.x (specifically @payloadcms/db-mongodb) is NOT compatible with Turbopack's module resolution — it uses Webpack-specific module IDs that Turbopack can't resolve.
Fix Steps
Step 1: Verify MongoDB is running
ss -tlnp | grep -E '27019|27017'
pgrep -a mongo
MongoDB must be running on the expected port. Check .env for MONGODB_URL.
Step 2: Remove Next.js 16-only experimental options from next.config.ts
When downgrading from Next 16 → 15, remove any experimental.turbo config that was added for Next 16. In Next.js 15 this option doesn't exist and generates a warning:
// WRONG in Next.js 15 — 'turbo' is not a known ExperimentalConfig key
experimental: {
turbo: undefined,
},
// CORRECT — remove experimental.turbo entirely for Next.js 15
Step 3: Downgrade Next.js to 15.x (15.5.x)
cd /path/to/moreminimore-next
bun add next@15.5.15 react@19.0.0 react-dom@19.0.0
Next.js 15 uses Webpack by default in dev mode, which is fully compatible with Payload CMS.
Why not just disable Turbopack?
- Next.js 16 has NO
--no-turboflag (error: unknown option) NEXT_TURBOPACK=0env var does NOT disable Turbopack in Next 16 (still starts with Turbopack)experimental.turbo: undefinedin next.config.ts does NOT disable it in Next 16- Downgrade to Next.js 15.x is the only viable option
Step 3: Verify version
cat node_modules/next/package.json | grep '"version"'
Should show 15.5.x (not 16.x).
Step 4: Clear cache and restart
pkill -9 -f next 2>/dev/null
rm -rf .next
bun run dev
Step 5: Verify admin loads
Navigate to http://localhost:3000/admin — should show Payload login screen.
Compatibility Matrix
| Next.js | Bundler | Payload CMS | Status |
|---|---|---|---|
| 16.x | Turbopack (default) | 3.x | BROKEN |
| 16.x | Webpack (flag) | 3.x | No flag available |
| 15.5.x | Webpack (default) | 3.x | WORKS |
| 14.x | Webpack | 3.x | WORKS |
Additional Dev Server Issues (Lessons Learned)
Server crashes after "Ready in Xms"
Even with Next.js 15.5.15, the dev server may crash silently right after "Ready" message. Two known causes:
1. output: 'standalone' in next.config.ts
This causes Next.js to crash immediately after starting in dev mode. Remove it:
// WRONG — causes crash after "Ready" in dev mode
const nextConfig: NextConfig = {
output: 'standalone', // REMOVE THIS
...
}
// CORRECT — no output option in dev
const nextConfig: NextConfig = {
// (no output key)
...
}
2. NEXT_TURBOPACK=0 in dev script
This env var can cause issues even on Next.js 15. Remove it:
// WRONG
"dev": "cross-env NODE_OPTIONS=--no-deprecation NEXT_TURBOPACK=0 next dev"
// CORRECT
"dev": "cross-env NODE_OPTIONS=--no-deprecation next dev"
Restart with clean .next cache after making changes:
pkill -9 -f next; sleep 1
rm -rf .next
bun run dev
Server starts but port 3000 shows nothing / 404
If ss -tlnp | grep 3000 shows the port is listening but the site returns 404:
- Check if there's a compiled
.nextcache from a previous version — alwaysrm -rf .nextbefore restarting - Verify MongoDB is running:
pgrep -a mongo - Check server logs:
cat /tmp/moredev.log
Blog Posts Migration (Astro MD → Payload CMS)
Script location: src/scripts/migrate-posts.ts
Key approach:
- Use absolute paths for
configPathandblogDir(avoid relative path resolution issues with ESM) - Use dynamic imports for Payload config to avoid bundling issues
- Store content as plain text (strip markdown syntax with regex replacements)
- Check for existing posts by slug before creating (idempotent)
cd /home/kunthawat/moreminimore-next
npx tsx src/scripts/migrate-posts.ts
What to check if still broken
-
sharp module: If you see
Failed to load external module sharp-XXX, checknode_modules/sharpexists:ls node_modules/sharpIf missing:
bun add sharp -
MongoDB connection: Ensure
MONGODB_URLin.envmatches running mongod port -
Port conflict: If port 3000 is in use:
pkill -9 -f next; pkill -9 -f bun ss -tlnp | grep 3000 -
Dev server process shows "Killed" but server is still running: The
bun run devforeground process may get killed by the shell even when the Next.js server starts successfully. Always check port 3000 directly:ss -tlnp | grep 3000 pgrep -a next-serverIf port 3000 is listening, the server IS running — ignore the "Killed" message.
-
TypeScript lint errors from node_modules: The
next lintoutput shows many TS errors fromnode_modules/(e.g.,@types/react,next/dist/...). These are non-blocking noise — they don't prevent the dev server from running or the admin from loading. Ignore them.
Key Takeaway
Next.js 16 + Turbopack is incompatible with Payload CMS 3.x database adapters. Always downgrade to Next.js 15.5.x when using Payload with MongoDB adapter.