HTML report troubleshooting
A report that works on your machine and breaks everywhere else is not a random event. It is one of about six causes, and the browser console names which one before you start guessing.
Start here: read the console
| Console says | Cause | Page |
|---|---|---|
404 on .css / .js |
Only the entry file travelled | Lost CSS |
CORS error against file:///… |
Opaque local origin | Allure blank · Playwright blank |
Not allowed to load local resource |
file:/// path on a web page |
Local resource blocked |
Refused to … violates … Content Security Policy |
The host's policy | Mixed content vs CSP |
…requested an insecure resource… |
Mixed content | Mixed content |
ERR_FILE_NOT_FOUND on a local link |
File or sibling page isn't there | File not found |
é / ’ where accents should be |
Wrong encoding guessed | Weird characters |
| Nothing — the page just downloads | Wrong Content-Type |
S3 downloads instead of rendering |
| Nothing — the chart box is empty | The library never loaded | Plotly missing |
can't acquire context / Chart is not defined |
Script order or missing library | Chart.js not showing |
attribute d: Expected number, "MNaN…" |
A D3 scale got strings or undefined | D3 not showing |
Initialize failed: invalid dom / empty chart div |
ECharts container missing or 0px tall | ECharts not showing |
Blank pages and missing content
- Allure report opens as a blank page — the XHR-loaded
data/tree, and whyallure openworks - Playwright report is blank or won't open —
show-report, traces, and the CI zip that makes it worse - Plotly chart missing from the exported HTML — the four
include_plotlyjsmodes - Chart.js chart not showing — every console error matched to its fix, plus zero-height containers
- D3 chart not showing — NaN paths, empty selections, and v4/v5/v6 breaking changes
- ECharts chart not showing — zero-height containers, hidden tabs,
echarts.useimports and unregistered maps - CORS error from origin 'null' — why a file:// page can't
fetchits own folder or load modules - Jupyter widgets don't render in the export — what survives without a kernel
- My HTML report lost its CSS — five causes, in order
- The HTML file shows code instead of the page — extension,
Content-Type, or a source-only viewer - Coverage report links 404 on click-through — the directory you left behind
- ERR_FILE_NOT_FOUND in Chrome — moved files, zip previews, missing sibling pages,
#in names
Hosting and delivery
- GitHub Actions artifact HTML won't open — why it is always a zip
- GitLab Pages report 404s — the
public/rule and branch collisions - The CI artifact link expired — four deletion mechanisms, only one of them retention
- S3 downloads your HTML instead of rendering it — the
Content-Typefix - Mixed content blocked — telling it apart from a CSP refusal
- The localhost link doesn't work for others — why, and the two real options
Getting it in front of people
- Images not showing in a sent HTML file — six path mistakes, and how to embed the images
- “Not allowed to load local resource” — a
file:///path inside a web page - The HTML file is too big to email — what is making it large, and what to cut
- Slack won't preview an HTML file — the security reason, and what to post
- Excel “Save as Web Page” breaks when sent — the
_filesfolder, and one file that works - CSV opens wrong in Excel — garbled accents, one column, lost leading zeros
- ’ and é instead of quotes and accents — decoding the garbage, and the one tag that fixes it
- The report is tiny on a phone — the viewport tag, and the fixed widths that survive it
- Outlook blocked the HTML attachment — why phishing filters catch reports, and what gets through
- Background colors missing when printing — the ink-saving default, and
print-color-adjust - Table split across PDF pages — sliced rows, missing headers, clipped columns
- The agent's output is too long to paste — comment and message ceilings
The pattern underneath all of them
Three things make a report work on your machine, and all three are lost in transit:
- The whole output directory is present. Copy the entry file out and every relative reference breaks.
- The origin is permissive. Your local server gave it a real
http://origin;file://on the recipient's laptop does not. - Your network reaches the CDN. Theirs might not, and the viewer they open it in may refuse the request regardless.
Publishing the output directory to a URL restores all three at once: the entry HTML becomes the report body, assets upload alongside it with their relative references rewritten to the uploaded copies, and the whole thing is served over HTTPS from an address that does not depend on anyone's machine being awake.
Interactivity survives — scripts run in a sandboxed iframe
(allow-scripts, no allow-same-origin) — and readers can select the
failing assertion or the suspicious number and comment on it, rather
than screenshotting it into chat (comment on HTML).
Limits: entry HTML 5 MB; assets 25 MB per file, 250 MB and 500 files per report.
Try it
Comma is free — unlimited reports, unlimited commenters, unlimited revision history.
Publish a report that opens for everyone →
Related
- Report types — 190+ per-tool publishing guides
- Publish from CI · Quickstart
- Stop screenshotting reports
- Comma by role — the workflow for consultants, QA, data, security, SRE
- Glossary — CSP, mixed content, MIME types and origins, defined