Missing charset declaration in React
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 React
Vite/CRA React apps declare it in index.html as the first head tag.
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>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.