Missing charset declaration in Next.js
With no explicit <meta charset="utf-8">, the browser falls back to a guessed encoding and can render “café” as “café” or drop emoji entirely. Worse, if the tag appears late in a large <head>, the browser may have to restart parsing. It is invisible in dev on modern servers that send a charset header, then breaks on a static host that does not.
Framework fixes
Symptoms
How VibeCheck catches it
In your widget · Problems
Missing charset declaration
To your coding agent · MCP
agent › get_detected_issues
→ { detector: "web-essentials", issue: "Missing charset declaration", threshold: "No element matching <meta charset> in the document head" }
The same string in your widget and in your agent’s context — no screenshot, no copy-paste.
Root causes
The fix for Next.js
Next.js injects <meta charSet="utf-8"> automatically for App Router pages — you normally do not add it. If VibeCheck still flags it, you have overridden the document with a custom app/_document that dropped it; restore the charset there.
<meta charSet="utf-8" />Steps
- Open your document head
- Add
<meta charset="utf-8">as the first child of<head> - Verify accented text and emoji render correctly on a static host
FAQ
- Do I need the long
<meta http-equiv="Content-Type">form? - No. The short
<meta charset="utf-8">has been valid HTML5 for over a decade and is preferred. Keep it as the first tag in<head>. - It works locally — why does VibeCheck still flag it?
- Your dev server may send a
charsetin the HTTP header, masking the missing tag. A static host or file:// open won’t, so declare it in the HTML to be safe everywhere.