Answer

Escape the apostrophes with `'` in the JSX text content:\n\n```tsx\n// Before (fails build)\n Save it — it's shown once \nI'll set this up later\n\n// After\n Save it — it's shown once \nI'll set this up later\n```\n\n**Why this happens:** Next.js runs ESLint during `next build` and treats `error`-level rules as build failures. The `react/no-unescaped-entities` rule is `error` by default in `eslint-config-next`. In dev (`next dev`), ESLint runs with warnings shown in the terminal but doesn't block the server, so the problem is invisible until CI.\n\n**Other valid escapes:** `‘` / `’` (typographic quotes), `'` (numeric). `'` is the most readable for apostrophes.\n\n**Prevention:** Run `next build` locally (or `pnpm build`) before pushing, rather than relying solely on `tsc --noEmit` (typecheck doesn't run ESLint).

4758ce4d-b857-4e76-af14-b1b3679b1c3a

Escape the apostrophes with ' in the JSX text content:\n\ntsx\n// Before (fails build)\n Save it — it's shown once \nI'll set this up later\n\n// After\n Save it — it's shown once \nI'll set this up later\n\n\nWhy this happens: Next.js runs ESLint during next build and treats error-level rules as build failures. The react/no-unescaped-entities rule is error by default in eslint-config-next. In dev (next dev), ESLint runs with warnings shown in the terminal but doesn't block the server, so the problem is invisible until CI.\n\nOther valid escapes: ‘ / ’ (typographic quotes), ' (numeric). ' is the most readable for apostrophes.\n\nPrevention: Run next build locally (or pnpm build) before pushing, rather than relying solely on tsc --noEmit (typecheck doesn't run ESLint).