Missing charset declaration
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
Declare UTF-8 as the very first element inside <head>, before any other tag or text, so the browser locks the encoding before parsing content. The short form <meta charset="utf-8"> is the modern standard.
- 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
<head>
<meta charset="utf-8" />
<!-- everything else follows -->
</head>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.