Free tool · Next.js 16 · App Router
Paste the Next.js error.
Get the fix.
20 App Router errors that AI agents keep causing, each reproduced on Next.js 16. You get what it means, the fix and a prompt to hand back to Cursor or Claude Code.
› 20 errors indexed. Matching runs locally as you type.
- 20 errors
- 5 only fail at next build
- reproduced on Next.js 16.4.3 · React 19.3
- updated
01The usual suspects
Your agent learned Next.js 13. You're on 16.
Server Components by default, async params, cacheComponents, proxy.ts: most examples agents learned from predate all of it. These 10 come up again and again:
- 01useState / useEffect in a Server ComponentThe agent added state or an effect to a
page.tsxorlayout.tsxFix: move the hook into a "use client" component → - 02Event handlers cannot be passed to Client Component propsonClick added to a <button> directly in
page.tsxFix: put the onClick inside a Client Component → - 03"use client" must be placed before other expressionsAn agent inserted imports above
"use client"Fix: move "use client" to line 1 → - 04Module not found: Can't resolve 'fs'fs or path used inside a
"use client"fileFix: keep Node APIs in server code → - 05useSearchParams() should be wrapped in a suspense boundaryA login or search page reads ?error= or ?q= with
useSearchParamsFix: wrap the component in <Suspense> → - 06Next.js encountered runtime / uncached data during prerendering (cacheComponents)const session = await
auth()at the top of a pageFix: <Suspense> around it, or export const instant = false → - 07params.slug is undefined (params is a Promise)The page is typed { params: { slug: string } } (the old shape), so TypeScript doesn't catch itFix: const { slug } = await params →
- 08Hydration failed: server HTML didn't match the clientnew Date(), Date.now() or Math.random() in renderFix: no Date.now / Math.random / window during render →
- 09The "middleware" file convention is deprecatedAn agent added auth or redirects in
middleware.tsFix: rename middleware.ts to proxy.ts → - 10npm ci: package.json and package-lock.json are not in syncAn agent edited the next, react or eslint-config-next version in package.json, or ran npm install next@latest, while fixing something elseFix: pin next, commit the lockfile, use npm ci →
- tell your agent
- Next.js 16, App Router
- Server Components by default
"use client"only for interactivity- await params and
searchParams proxy.ts, notmiddleware.ts- Run
next buildbefore you finish
02Every error, explained
The full list.
useState / useEffect in a Server Component
Error: You're importing a module that depends on `useState` into a React Server Component module. This API is only available in Client Components. To fix, mark the file (or its parent) with the `"use client"` directive.
Every file in the App Router is a Server Component unless it (or a file that imports it) starts with "use client". Hooks like useState, useEffect, useRef and createContext only work in Client Components.
usually because
- The agent added state or an effect to a
page.tsxorlayout.tsx - A component from a tutorial written for the Pages Router
- A context provider placed straight into
layout.tsx
fix
- 1.Move the interactive part into its own file that starts with
"use client" - 2.Keep
page.tsxa Server Component and render the new component from it - 3.Don't mark the whole page
"use client"just to silence the error: you lose server data fetching and metadata
"use client";
import { useState } from "react";
export function Counter() {
const [n, setN] = useState(0);
return <button onClick={() => setN(n + 1)}>{n}</button>;
}Next.js build fails because a Server Component imports a client-only hook. Find the component that uses the hook, move only the interactive part into a new file that starts with "use client", and keep page.tsx and layout.tsx as Server Components. Don't add "use client" to the page itself.
Event handlers cannot be passed to Client Component props
Error occurred prerendering page "/pricing".
Error: Event handlers cannot be passed to Client Component props.
{onClick: function onClick, children: ...}
^^^^^^^^^^^^^^^^
If you need interactivity, consider converting part of this to a Client Component.A Server Component rendered an element with onClick, onChange or any prop starting with "on" set to a function. Functions can't be sent from the server to the browser, so rendering stops.
usually because
- onClick added to a <button> directly in
page.tsx - A Server Component passes onSomething={() => …} to a Client Component
- It often only shows up at
next build, when the page is prerendered
fix
- 1.Move the button (and its handler) into a
"use client"component - 2.Or keep it on the server: use a
<form action={serverAction}>instead of onClick - 3.If the child is already a Client Component, define the handler inside it instead of passing it down
next build fails with "Event handlers cannot be passed to Client Component props". Find the Server Component that sets an on* prop to a function, and either move that element into a "use client" component or replace the handler with a Server Action used as a form action. Show me the diff.
Functions cannot be passed directly to Client Components
Error: Functions cannot be passed directly to Client Components unless you explicitly expose it by marking it with "use server". Or maybe you meant to call this function rather than return it.
Same rule as above for props not named on*: a Server Component passed a plain function (a formatter, a callback, a render prop) to a Client Component.
usually because
- formatPrice={(n) => …} passed from a page to a client chart or table
- A render prop like renderItem from a Server Component
- Passing a function reference when you meant to pass its result
fix
- 1.Pass data, not functions: call the function on the server and pass the result
- 2.Or import the helper directly inside the Client Component
- 3.If it must run on the server when the client calls it, make it a Server Action in a
"use server"file
A Server Component passes a function prop to a Client Component and Next.js refuses to serialize it. Find it, then either pass the computed value instead, import the helper inside the client file, or turn it into a Server Action if it needs server access.
Only plain objects can be passed to Client Components
Error: Only plain objects, and a few built-ins, can be passed to Client Components from Server Components. Classes or null prototypes are not supported.
{v: {c: 5}}
^^^^^^Props going from a Server Component to a Client Component are serialized. Class instances can't be: Prisma Decimal values, SDK objects (a Stripe or OpenAI response object), Mongoose documents, or your own classes.
usually because
- Passing a Prisma row with a Decimal column straight to a client table
- Passing a whole SDK response object instead of the fields you need
- Objects created with Object.create(null)
fix
- 1.Map to plain fields before passing: { id, name, price: Number(row.price) }
- 2.Convert Decimal with
.toNumber()or .toString() - 3.Only pass what the client actually renders
const rows = await db.product.findMany();
- return <Table rows={rows} />
+ return <Table rows={rows.map((r) => ({ id: r.id, name: r.name, price: r.price.toNumber() }))} />Next.js says only plain objects can be passed to Client Components. Find the prop that carries a class instance (Prisma Decimal, an SDK object or a custom class) and map it to plain serializable fields on the server before passing it down.
"use client" must be placed before other expressions
Error: The "use client" directive must be placed before other expressions. Move it to the top of the file to resolve this issue.
The directive only counts as the very first statement in the file. If an import comes first, the file silently stays a Server Component and this error (often with a hook error next to it) appears.
usually because
- An agent inserted imports above
"use client" - A license header or 'use strict' line above it (comments are fine, code isn't)
fix
- 1.Make
"use client"the first line of the file, above all imports - 2.Re-run the build: any hook errors from the same file usually disappear too
Next.js says the "use client" directive must be placed before other expressions. Move it to line 1 of every file where it's below an import, and don't change anything else.
export "metadata" from a "use client" page
Error: You are attempting to export "metadata" from a component marked with "use client", which is disallowed. "metadata" must be resolved on the server before the page component is rendered. Keep your page as a Server Component and move Client Component logic to a separate file.
metadata and generateMetadata only work in Server Components. Once a page has "use client" at the top, it can't export them.
usually because
- The page was turned into a Client Component to fix a hook error
- An agent added SEO metadata to an existing client page
fix
- 1.Remove
"use client"frompage.tsxso it can export metadata - 2.Move the interactive part into a separate
"use client"component and render it from the page
Next.js refuses to export metadata from a "use client" page. Split it: keep page.tsx as a Server Component that exports metadata, and move the interactive code into a new client component file it renders.
async Client Component
Dashboard is an async Client Component. Only Server Components can be async at the moment. This error is often caused by accidentally adding `'use client'` to a module that was originally written for the server.
Client Components can't be async functions. This usually means "use client" was added to a component that awaits data on the server. It can build fine and only fail in the browser.
usually because
"use client"added to an async page or component to fix a hook error- await fetch() or await db… inside a client file
fix
- 1.Keep the async data loading in a Server Component (no
"use client") - 2.Pass the loaded data as props to a small client component for the interactive bits
- 3.In a Client Component, read a promise passed from the server with React's
use()inside<Suspense>
React says a component is an async Client Component. Find it, remove "use client" if it fetches data on the server, and move any hooks or event handlers into a separate client child that receives the data as props.
'server-only' cannot be imported from a Client Component module
Error: You're importing a module that depends on "server-only" into a React Client Component module. This API is only available in Server Components but one of its parents is marked with "use client", so this module is also a Client Component.
A file marked with import "server-only" (on purpose, to keep secrets on the server) ended up in a client bundle. Any file a "use client" file imports becomes client code too.
usually because
- A client component imports a helper from lib/ that reads env secrets or the database
- A shared utils file mixes client-safe helpers and server-only ones
fix
- 1.Don't import that module from the client: call it from a Server Component or Server Action instead
- 2.Split the file: client-safe helpers in one module, server-only code in another
- 3.Keep the
import "server-only"line: it's what caught the leak
Next.js blocks a "server-only" module from a Client Component. Show me the import chain from the "use client" file to that module, then split or move the code so the client only gets what it needs through props or a Server Action. Keep the server-only guard.
Module not found: Can't resolve 'fs'
./src/app/blog/page.tsx:2:1 Error: Module not found: Can't resolve 'fs' > 2 | import fs from "fs";
Code that uses a Node.js API (fs, path, net, tls, child_process) is being bundled for the browser, where those modules don't exist.
usually because
- fs or path used inside a
"use client"file - A client component imports a helper that reads files, or a Node-only package (database drivers, nodemailer)
- A typo in an import path also gives Module not found, for your own files
fix
- 1.Read files or call Node APIs in a Server Component, route handler or Server Action
- 2.Pass the result to the client component as props
- 3.Add
import "server-only"to modules that must never reach the browser
Next.js can't resolve a Node built-in (like fs) in the browser bundle. Trace which "use client" file imports it, move the Node code into a Server Component or Server Action, and add import "server-only" to that module.
PrismaClient is unable to run in this browser environment
Error: PrismaClient is unable to run in this browser environment, or has been bundled for the browser (running in `Chrome`).
A Client Component imports your database client (often through lib/db.ts). Database code can only run on the server.
usually because
- A
"use client"component imports db from @/lib/db - A shared file exports both db queries and client helpers
fix
- 1.Query the database in a Server Component or Server Action and pass the rows down as plain objects
- 2.Add
import "server-only"tolib/db.tsso the build fails early next time
import "server-only";
import { PrismaClient } from "@prisma/client";
export const db = new PrismaClient();Prisma is being bundled into the browser. Find which "use client" file imports the database client, move the query into a Server Component or Server Action, and add import "server-only" to the db module.
Server Actions must be async functions
Error: Server Actions must be async functions.
Every function exported from a file that starts with "use server" (or marked "use server" inline) is a Server Action, and Server Actions have to be async.
usually because
- A plain helper or constant exported from actions.ts
- An agent put
"use server"at the top of a utils file
fix
- 1.Make each exported action async
- 2.Move non-action helpers and constants out of the
"use server"file - 3.Don't use
"use server"to mean "server-only": that's whatimport "server-only"is for
"use server";
- export function save(formData: FormData) {
+ export async function save(formData: FormData) {
// …
}Next.js says Server Actions must be async. In every "use server" file, make exported actions async and move any non-action exports (helpers, constants, types used at runtime) into a separate module.
useSearchParams() should be wrapped in a suspense boundary
⨯ useSearchParams() should be wrapped in a suspense boundary at page "/login". Read more: https://nextjs.org/docs/messages/missing-suspense-with-csr-bailout Error occurred prerendering page "/login".
A Client Component reads the URL query with useSearchParams on a page Next.js prerenders. The query isn't known at build time, so Next.js needs a <Suspense> boundary to render a fallback there. next dev doesn't complain; next build does.
usually because
- A login or search page reads ?error= or ?q= with
useSearchParams - The hook sits in a component used in
layout.tsx, so every page fails
fix
- 1.Wrap the component that calls
useSearchParamsin<Suspense>in its parent - 2.Or read
searchParamsin the page (a Server Component prop) and pass the value down
import { Suspense } from "react";
import { LoginForm } from "./login-form"; // calls useSearchParams()
export default function Page() {
return (
<Suspense fallback={null}>
<LoginForm />
</Suspense>
);
}next build fails: useSearchParams() should be wrapped in a suspense boundary. Find every component that calls useSearchParams and wrap where it's rendered in <Suspense> with a sensible fallback. Don't make the whole page dynamic to work around it.
Next.js encountered runtime / uncached data during prerendering (cacheComponents)
Error: Route "/dashboard": Next.js encountered uncached or runtime data during prerendering.
`fetch(...)`, `cookies()`, `headers()`, `params`, `searchParams`, or `connection()` accessed outside of `<Suspense>` prevents the route from being prerendered…
Ways to fix this:
- [stream] Provide a placeholder with `<Suspense fallback={...}>` around the data access
- [cache] … `"use cache"`
- [block] Set `export const instant = false` to allow a blocking routeWith cacheComponents on (the Next.js 16 model), every route gets a prerendered shell. Reading cookies(), headers(), params, searchParams, auth() or an uncached database or fetch call outside <Suspense> would block that shell, so the build stops and lists three ways out.
usually because
- const session = await
auth()at the top of a page - A database query in a page with no
"use cache"and no<Suspense> - Reading
searchParamsin a layout
fix
- 1.[stream] Move the data access into a child component and wrap it in
<Suspense fallback={…}> - 2.[cache] Add
"use cache"to data that's the same for every visitor (not for cookies or auth) - 3.[block] For fully per-user pages like a dashboard, add
export const instant = false
import { Suspense } from "react";
export default function Page() {
return (
<Suspense fallback={<p>Loading…</p>}>
<Account /> {/* awaits auth() and the DB inside */}
</Suspense>
);
}
// or, for a page that is per-user anyway:
// export const instant = false;next build fails because a route reads runtime or uncached data outside <Suspense> (cacheComponents is on). For this route, move the cookies/auth/DB access into a child component wrapped in <Suspense>, or add "use cache" if the data is the same for everyone, or export const instant = false if the page is fully per-user. Explain which one you picked.
params.slug is undefined (params is a Promise)
Property 'slug' does not exist on type 'Promise<{ slug: string; }>'. · page renders "undefined"Since Next.js 15, params and searchParams are Promises. Code from older tutorials reads params.slug directly. In our Next.js 16.4.3 test build that didn't fail at all: the page just rendered "undefined".
usually because
- The page is typed { params: { slug: string } } (the old shape), so TypeScript doesn't catch it
- Agents trained on Next.js 13/14 examples
- Same for
searchParams,cookies()andheaders(): all async now
fix
- 1.Type params as a Promise and await it in Server Components
- 2.In a Client Component, unwrap it with React's
use(params) - 3.Search the codebase for params. and
searchParams. without an await
export default async function Page({
params,
}: {
params: Promise<{ slug: string }>;
}) {
const { slug } = await params;
// …
}This is a Next.js 16 app, where params, searchParams, cookies() and headers() are async. Find every page, layout, route handler and generateMetadata that reads them synchronously, type them as Promises and await them (or use() in Client Components). List each file you change.
missing generateStaticParams() with output: export
Error: Page "/blog/[slug]" is missing "generateStaticParams()" so it cannot be used with "output: export" config.
A static export has no server, so every dynamic route has to list its pages at build time.
usually because
- A new [slug] or [id] route in a site deployed as static files
- generateStaticParams exists but sits in a
"use client"page
fix
- 1.Export
generateStaticParams()from the page and return every slug - 2.If the route really needs a server (per-user data), drop
output: exportand deploy to a host that runs Next.js
export async function generateStaticParams() {
const posts = await getPosts();
return posts.map((p) => ({ slug: p.slug }));
}next build fails because a dynamic route has no generateStaticParams and the app uses output: export. Add generateStaticParams that returns every value for this route from the same data source the page reads.
next/image hostname is not configured
Error: Invalid src prop (https://avatars.githubusercontent.com/u/1) on `next/image`, hostname "avatars.githubusercontent.com" is not configured under images in your `next.config.js`
next/image only optimizes remote images from hosts you allow. Avatars from GitHub or Google sign-in, Stripe product images and CMS images all need an entry.
usually because
- Showing session.user.image from an OAuth provider
- Images from a CMS, S3 bucket or Supabase Storage
fix
- 1.Add the host to
images.remotePatternsinnext.config.ts - 2.Be specific (protocol, hostname, path) instead of allowing every host
const nextConfig = {
images: {
remotePatterns: [new URL("https://avatars.githubusercontent.com/**")],
},
};next/image rejects a remote hostname. Add a specific images.remotePatterns entry in next.config.ts for this host (protocol, hostname and a path pattern if possible). Don't allow all hosts.
Hydration failed: server HTML didn't match the client
Hydration failed because the server rendered text didn't match the client. As a result this tree will be regenerated on the client. · A tree hydrated but some attributes of the server rendered HTML didn't match the client properties.
React rendered the page on the server, then got different output in the browser. Something in render depends on the time, randomness, the browser or the user's locale.
usually because
- new Date(), Date.now() or Math.random() in render
- if (typeof window !== "undefined") branches, or reading localStorage during render
- toLocaleString() with a different server and browser locale or time zone
- Invalid HTML nesting like <p> inside <p> or <div> inside <p>
- Browser extensions that add attributes to <html> or <body>
fix
- 1.Move browser-only values into
useEffect, or render them in a Client Component loaded withnext/dynamicandssr: false - 2.Format dates with an explicit timeZone, or on the server only
- 3.Fix invalid nesting the error points at
- 4.For extension attributes only:
suppressHydrationWarningon <html> (it only applies one level deep)
React reports a hydration mismatch. Find what renders differently on the server and in the browser (dates, random values, window/localStorage checks, locale formatting, invalid HTML nesting) and fix the cause. Don't add suppressHydrationWarning except for extension attributes on <html> or <body>.
The "middleware" file convention is deprecated
⚠ The "middleware" file convention is deprecated. Please use "proxy" instead. To migrate automatically, run: npx @next/codemod@canary middleware-to-proxy .
Next.js 16 renamed middleware.ts to proxy.ts. Agents keep creating middleware.ts because most examples predate the rename. Proxy runs on the Node.js runtime, and the runtime option isn't allowed in proxy files.
usually because
- An agent added auth or redirects in
middleware.ts - Code copied from Next.js 13–15 or Auth.js v4 examples
fix
- 1.Run
npx @next/codemod@canary middleware-to-proxy .or rename the file and the exported function to proxy - 2.Remove any export const runtime = "edge" from it
- 3.Keep matchers in export const config as before
import { NextResponse, type NextRequest } from "next/server";
export function proxy(request: NextRequest) {
return NextResponse.next();
}
export const config = { matcher: ["/dashboard/:path*"] };This is Next.js 16: middleware.ts is deprecated in favor of proxy.ts. Migrate it (rename the file and the exported function to proxy, keep the matcher config, remove any runtime export) and check nothing else imports the old file.
npm ci: package.json and package-lock.json are not in sync
npm error `npm ci` can only install packages when your package.json and package-lock.json or npm-shrinkwrap.json are in sync. Please update your lock file with `npm install` before continuing.
Someone (often an agent fixing something else) changed the next version in package.json without updating package-lock.json, so a clean install refuses to run. The lockfile is what pins the exact version you tested: a range like ^16.4.3 in package.json allows any later 16.x, so without a committed lockfile each install can build against a different Next.js.
usually because
- An agent edited the next, react or eslint-config-next version in package.json, or ran npm install next@latest, while fixing something else
- package-lock.json is in .gitignore, wasn't committed, or was deleted to "fix" an install error
- next, eslint-config-next and react changed in different commits
fix
- 1.See what's installed: npm ls next react react-dom
- 2.Pin the exact version you last tested (use yours): npm pkg set dependencies.next=16.4.3 devDependencies.eslint-config-next=16.4.3, run npm install to update package-lock.json, then commit both files together
- 3.Use npm ci in CI and deploy builds so installs match the lockfile exactly
- 4.Upgrade on purpose in its own branch: npx @next/codemod@canary upgrade latest, then run the build and tests
npm ls next react react-dom
npm pkg set dependencies.next=16.4.3 devDependencies.eslint-config-next=16.4.3
npm install
git add package.json package-lock.json
git commit -m "Pin next to 16.4.3"
npm ci && npm run buildnpm ci fails because package.json and package-lock.json are out of sync on next. Don't upgrade anything. Find which commit changed the next/react/eslint-config-next versions, restore the last version the app built with, pin it as an exact version (no ^), regenerate the lockfile with npm install, and confirm npm ci && npm run build pass. List every version you changed.
Maximum update depth exceeded
Maximum update depth exceeded. This can happen when a component calls setState inside useEffect, but useEffect either doesn't have a dependency array, or one of the dependencies changes on every render.
A component keeps updating its own state in a loop, so React stops it. It's a React error, but agents cause it often when they wire up effects.
usually because
- setState in a
useEffectwith no dependency array - An object or array created during render used as an effect dependency
- onClick={setOpen(true)} instead of onClick={() => setOpen(true)}
fix
- 1.Give the effect a dependency array, and only list values that really change
- 2.Memoize object or array dependencies, or depend on their primitive fields
- 3.Pass a function to event props instead of calling it
React hit Maximum update depth exceeded. Find the effect or handler that sets state on every render, explain the loop in one sentence, and fix it with correct dependencies or by passing a function instead of calling it.
03Or start from code that already builds
A Next.js 16 SaaS your agent can't easily derail.
Skip the setup. The VibeBoot SaaS Starter gives you auth, Stripe and a database already wired on Next.js 16.4.3, with AGENTS.md and .cursor/rules that keep your agent on the Next.js 16 conventions. $49, one-time.
14-day money-back guarantee · lifetime updates
See everything that's inside →- proxy.ts · already uses the Next.js 16 proxy convention, no
middleware.tsdeprecation warning - cacheComponents on · the dashboard shows the
export const instant = falsepattern, and AGENTS.md explains when to use<Suspense>instead - Agent rules · AGENTS.md, CLAUDE.md and .cursor/rules: Server Components by default,
"use client"only for interactivity - Database on the server · Prisma lives in
lib/db.tsand the rules say to query it only from Server Components or Server Actions - Checks included · npm run typecheck, lint and test (Vitest) scripts, so the agent can verify its own changes
FAQ
Why does my Next.js app work in next dev but fail in next build?
next build prerenders every page it can. That's when Next.js checks things dev mode lets slide: useSearchParams without a <Suspense> boundary, event handlers rendered by Server Components, class instances passed to Client Components, and (with cacheComponents on) cookies(), auth() or database reads outside <Suspense>. Run next build locally before you push.
Why do AI coding agents keep causing these errors?
Most Next.js code they learned from predates the App Router defaults of Next.js 15 and 16: everything is a Server Component unless marked "use client", params and searchParams are Promises, and middleware.ts is now proxy.ts. Telling the agent your exact Next.js version and these rules in AGENTS.md or .cursor/rules prevents most of them.
Should I just add "use client" to the page?
Usually not. It silences hook errors but turns the whole page into client code: you can't export metadata, async data loading breaks (async Client Component) and more JavaScript ships to the browser. Move only the interactive part into its own "use client" file.
Is anything I paste sent to a server?
No. The matcher is plain JavaScript in this page. Nothing you paste is stored or sent anywhere.
Which Next.js version is this for?
The App Router in Next.js 16. Each error was reproduced in a test app on Next.js 16.4.3 · React 19.3 with next build on October 24, 2026, or taken from the error text shipped in the next package. Most entries also apply to Next.js 15.
Sources: errors reproduced with next build on Next.js 16.4.3 · React 19.3, the error text and docs shipped in the next package, and the Next.js docs on Server and Client Components, proxy and hydration mismatches. Checked October 24, 2026. Spotted a mistake? Email [email protected].
Also free: Auth.js error fixer · Stripe webhook fixer · newsletter
$ fixed it? get the next one first
New fixes for what AI agents break, by email.
When we add a fix or a Cursor rule for a new Next.js, Auth.js, Prisma or Stripe break, it goes out in the VibeBoot newsletter. Free, occasional, unsubscribe in one click.
> More free tools
All tools →- VibeBoot DoctorNewPaste any error or your package.json: diagnosis, fix and the rule that prevents it.
- middleware.ts → proxy.tsNewConvert Next.js middleware to Next.js 16 proxy.ts, Auth.js v5 included.
- AGENTS.md checkerNewCheck AGENTS.md for the Next.js 16 managed block, commands and guardrails.
- Access control checkerPaste a route or server action, see what anyone can call.
- Prisma error fixerP2002, P1001, P2021, did not initialize yet: cause and fix.
- Env leak checkerPaste your .env, see which secrets would ship to the browser.
- Stripe webhook fixerPaste a Stripe webhook error, get the cause and the fix.
- Auth.js error fixerMissingSecret, UntrustedHost, redirect_uri: cause and fix.
- AGENTS.md generatorA ready AGENTS.md and CLAUDE.md for your Next.js stack.
- Cursor Rules PackFree downloadScoped .mdc rules for Next.js, Stripe webhooks, access control and more.
- Cursor rules generatorBuild one project.mdc rule for your exact stack.
- AI chatbot cost calculatorCost per message, Pro margin and a safe free-tier cap.