gh-x-html — GitHub Finally Plays Your Videos (and Your Playwright Reports)
gh-x-html is live on GitHub — load unpacked, Chrome Web Store listing in review gh-x-html for HTML showcases. I built it because I post videos in GitHub issues all day. A Playwright recording of a UI bug. A screen capture of the new flow. A 12-second clip of the broken modal. Today those go to Google Drive, get a shareable link, get pasted as a markdown link, and then every reviewer clicks out, waits for Drive to load, watches, comes back. Friction stacks. Reviews drag. The fix is dumb: render the video where it was posted.Same content. As markdown, then as gh-x-html.
This is the comparison that matters. Same Q2 release status — same numbers, same options, same decision — written two ways. Left: the best plain markdown can do in a GitHub comment. Right: the same content as an x-html fence. Both screenshots came out of issue #5, same browser tab.
The markdown side is the ceiling of what GitHub natively renders for this content. Headings, bullets, an unstyled table, checkboxes for the vote, and a literal “Sparkline cannot be rendered in markdown — readers must imagine the curve” disclaimer. That’s not a strawman; that’s actually the best the format can do.
The HTML side is the same information as a sandboxed iframe — color, shape, position, motion all doing real work. Decision time drops from a scroll-and-re-read to a single glance.
What it does, in one frame
Without gh-x-html
- External video → markdown link → Drive → context switch
- Playwright HTML report → zip → upload elsewhere → email link
- Rich status board → screenshot → blurry → out of date the next day
- Live demo → recording → upload → link → click → wait
With gh-x-html
- External
.mp4/.webm/.mp3URLs play inline — sandboxed iframe escapes GitHub's CSP - Drop a Playwright HTML report into an
x-htmlfence; reviewer scrolls through it inside the PR - Status dashboards, ADR mockups, design comps — render live in the comment they were posted in
- Author-allowlist gated. Sandboxed iframe. No GitHub cookies leak to fence scripts
What the fence can do — one real example
This is one fenced code block in one GitHub issue comment. Inside it: a Q2 release dashboard with animated progress bars, a sparkline of 30-day request volume, a chip picker, a decision table with the recommended row highlighted, a dependency-flow diagram, and an Acknowledge CTA — all rendered inside a sandboxed iframe with no allow-same-origin (opaque origin, no GitHub cookies):
Tight crop on just the rendered fence:
Without the extension, every reviewer sees this exact same content as a wall of HTML source. The sanitizer wins, the meaning is lost.
The use cases I actually built it for
x-html fence. Failures, screenshots, traces — all browsable inside the PR. No Vercel deploy preview, no Drive link.r2.dev/clip.mp4. Paste the URL. Reviewer scrolls to it, sees the bug play. Zero context switch.When markdown still fits — when gh-x-html wins
| Comment content | Best with | Why |
|---|---|---|
| Quick reply / discussion | plain markdown | One paragraph. No need to open the rendering machinery. |
| Code diff inline | plain markdown | GitHub already does this beautifully. Don't reach for HTML. |
| Video of a bug / regression / new feature | gh-x-html | Third-party .mp4 URLs play inline. The viewer never leaves the issue. |
| Playwright report / test trace | gh-x-html | The whole report renders in the PR — failures, screenshots, traces, all browsable. |
| Status dashboard / release board | gh-x-html | Real color, real pills, a sparkline. Beats a stale bullet list. |
| ADR / design walkthrough | gh-x-html | Diagram + table + code excerpts in one glanceable artifact. The decision lands faster. |
The trust model, in one paragraph
The extension only rewrites comments authored by GitHub logins in your local allowlist (stored in chrome.storage.sync, seeded with your own login on install). The sandboxed iframe is allow-scripts allow-popups allow-popups-to-escape-sandbox — never allow-same-origin, which would be a sandbox escape. Author scripts can run inside the iframe but the iframe is an opaque origin: no GitHub cookies, no parent DOM access, no top-frame navigation. Full reasoning in ADR-0002 and ADR-0003.
Install + try it
git clone https://github.com/ninyawee/gh-x-html
# chrome://extensions → Developer mode → Load unpacked → pick the directory The allowlist seeds with your GitHub login on first install. Open any issue or PR, drop an x-html fence in a comment, reload — your fence becomes a live rendered iframe. Add coworkers via the popup as you onboard the team.
A Chrome Web Store listing is in review; install via “Load unpacked” until then.
![]()
— Ben
Repo: ninyawee/gh-x-html · Showcase issue: #4 — flex what gh-x-html can do · Sibling: in-html