Missing charset declaration in Vanilla 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 Vanilla JS
Add it as the first line of every page’s <head>, or in your server-side layout partial.
<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.