Skip to content

docs(readme): the demo plays at the top, with sound - #207

Open
wine-fall wants to merge 2 commits into
mainfrom
zachg-0904--readme-demo
Open

docs(readme): the demo plays at the top, with sound#207
wine-fall wants to merge 2 commits into
mainfrom
zachg-0904--readme-demo

Conversation

@wine-fall

Copy link
Copy Markdown
Owner

A radio you cannot hear is a README nobody can evaluate. The repo had no demo of any kind — no video, no gif, no audio — so judging murmur meant installing Node 24, ffmpeg, yt-dlp, a Claude subscription and a voice endpoint first. Nobody does that for a project they have not heard.

The player goes above the fold, right after the one-line pitch, with controls and without autoplay, so a click gives the voice.

Why the video is hosted, not committed

Three routes were tried. Only one can work, and the reason is GitHub's own CSP:

media-src github.com user-images.githubusercontent.com secured-user-images.githubusercontent.com
          private-user-images.githubusercontent.com
          github-production-user-asset-6210df.s3.amazonaws.com gist.github.com github.githubassets.com
Route Result
Release asset releases/download/… 302s to release-assets.githubusercontent.com — absent from the allowlist
Commit the mp4, use a raw URL raw.githubusercontent.com is also absent — and a 5MB binary is carried by every clone forever
Attachment CDN ✅ redirects to github-production-user-asset-6210df.s3.amazonaws.com, which is on the list

An attachment uploaded but never posted does not persist — the first URL minted this way returned a plain 404. The asset is durable only once a comment carrying it exists, so it lives on #206.

poster and playsinline are dropped by GitHub's markdown sanitizer (checked with gh api /markdown); src, controls, muted and width survive. GitHub adds muted itself, which is why the caption tells the reader to turn the sound on.

The file is 5.1MB — the original 1080p recording re-encoded at CRF 30, which a mostly-static dark terminal takes without visible loss (checked on a text crop at 1:45).

Verification

Server side, all confirmed:

  • curl on the asset: 206, content-type: video/mp4, valid ISO Media header
  • both hosts in the redirect chain are on the media-src allowlist
  • the <video> element renders in the README with controls — screenshot taken on the branch
  • zero securitypolicyviolation events fire

Not confirmed, and owed to a human: actual playback. The automated browser used for this session will not buffer video at all — it fails identically on a direct top-level navigation to the S3 URL, with no GitHub page and no CSP involved. That points at the harness, not at this change, but it means the one thing that matters was not proven by me.

Before merging, please open the branch README, click play, and confirm you hear the host.

AI coding brief

Original request. The user is promoting murmur overseas and had two stars. They supplied a demo video and asked for it to go in the README. They also asked to confirm the promotion sequence: Reddit and HN karma first, Show HN last.

Manual interventions. One permission gate: minting a durable attachment URL requires posting a public comment on the repo, so the user was asked before anything was posted, and chose #206 over a dedicated issue. Two decisions taken without asking: re-encoding to 5.1MB rather than committing 16.4MB, and renaming the asset after the first upload exposed the internal name murmur-demo-small.mp4 in the player's title bar.

Retro. Reading the media-src header before trying anything would have skipped the release-asset attempt entirely — one curl -I contained the whole answer. The costlier mistake was trusting a probe over the evidence: injected JavaScript reported the video failing three times and each result was treated as a fact about the change, when the harness itself was the variable. A direct navigation to the raw asset — the control case that isolated it — should have been the second step, not the ninth.

🤖 Generated with Claude Code

https://claude.ai/code/session_01P6pPTjtKyjcz4rbDKBPVNe

wine-fall and others added 2 commits September 4, 2026 14:33
A radio you cannot hear is a README nobody can evaluate. The repo had no
demo of any kind — no video, no gif, no audio — so judging murmur meant
installing Node 24, ffmpeg, yt-dlp, a Claude subscription and a voice
endpoint first. Nobody does that for a project they have not heard.

The player goes above the fold, before the prose, with `controls` and
without `muted` so a click gives the voice — which is the product.

The source is GitHub's attachment CDN, not the repo: a 5.1MB mp4 in git
would be carried by every clone forever. A release asset was the first
attempt and does not work — `releases/download/...` 302s to
release-assets.githubusercontent.com, which is absent from github.com's
CSP `media-src`, so the player is blocked in a rendered README. The
attachment host is on that allowlist.

`poster` and `playsinline` are dropped by GitHub's markdown sanitizer
(checked against `gh api /markdown`), so the first frame — the title
card — is the poster.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P6pPTjtKyjcz4rbDKBPVNe
The first attachment URL was minted by an upload that was never posted, so
it 404'd — GitHub keeps the asset only once a comment carrying it exists.
This one is served for real: 206, content-type video/mp4.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P6pPTjtKyjcz4rbDKBPVNe
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant