跳至主要內容
技術

GitHub README 動態 demo 的 5 種策略:從 GIF 到自架 CDN

GitHub README 動態 demo 的 5 種策略:從 GIF 到自架 CDN
一個人做產品 第 16 / 18 篇

先備知識:這篇假設你已經有一個排得不錯的 README 骨架(centered hero、badges、章節順序)。如果還沒,建議先讀 《GitHub README 排版術:把開源專案首頁變成 landing page》 補基礎。

在 GitHub README 呈現動態 demo,其實有 5 種策略

上一篇 《把 30 秒產品介紹塞進 GitHub README 的最後一哩》 結尾說:「user-attachments 是 GitHub <video> 唯一能 inline 播放的路。」

但那個結論有個前提:你想用 <video> 標籤 inline 播放

如果放寬這個前提,會發現「在 GitHub README 呈現產品動態 demo」其實有 5 條截然不同的路,每條都有自己的取捨。

這篇我把它們整理成決策樹,給:

  • 不想被 GitHub web UI 卡 60 秒的人
  • README 要在 npm registry / VSCode preview 也能正常顯示的人
  • demo 是 terminal 場景的人
  • 影片超過 Free 方案 10MB 上限(付費方案 100MB)的人

策略 1:動畫 GIF(萬用無腦)

把 MP4 轉成 GIF,用 <img> 標籤嵌入。

# 一行流程:30 秒影片轉 720p、10fps GIF
ffmpeg -i input.mp4 -vf "fps=10,scale=720:-1:flags=lanczos" -loop 0 demo.gif

# 進階:用 gifski 壓得更小(brew install gifski)
ffmpeg -i input.mp4 -vf "fps=10,scale=720:-1" -f image2pipe -vcodec ppm - | \
  gifski -o demo.gif --fps 10 -

README 嵌入:

![Demo](docs/demo.gif)

優點:

  • ✅ 任何 markdown viewer 都顯示(GitHub、npm registry、VSCode preview、Reddit、Notion 全部)
  • ✅ 完全自動化,純 CLI flow
  • ✅ Auto-play,不用點

缺點:

  • ❌ 檔案大:30 秒 720p GIF 通常 5-15MB
  • ❌ 沒有音訊
  • ❌ 畫質受 256 色限制,漸層/陰影會出現色帶
  • ❌ 強制 loop 播放,讀者讀文字時持續干擾

適合: 短 demo(≤ 10 秒)、純視覺場景、最大相容性優先。

策略 2:GitHub user-attachments(上篇結論)

打開 github.com 編輯 README,把 MP4 直接「拖」進文字框。GitHub 上傳到自家 CDN 產生:

https://github.com/user-attachments/assets/{UUID}

完整流程在上一篇講過,這裡只列取捨。

優點:

  • ✅ 真正的 <video> 播放器(含 scrubber、音訊、全螢幕、loop 控制)
  • ✅ 串流播放,不用整段下載
  • ✅ GitHub 自家 CDN,全球節點快

缺點:

  • ❌ 沒有 API,只能 web UI 拖放
  • ❌ 單檔上限視方案而定:Free 10MB、Pro/Team/Enterprise 100MB
  • 只在 github.com 顯示。npm registry、VSCode preview、Reddit 看到的是空白 / 損壞圖示

適合: 影片在上限內(Free ≤ 10MB / 付費 ≤ 100MB)、能接受 60 秒手動、主要受眾在 github.com。

策略 3:外部 CDN(Netlify Drop / Cloudflare R2)

自己 host MP4 到會正確回傳 Content-Type: video/mp4 的 CDN,README 用 <video src="https://..."> 直接引用。

最快上手的選項:

  • Netlify Drop:把 public/ 資料夾拖到 app.netlify.com/drop,30 秒拿到 URL
  • Cloudflare R2:免費 10GB、0 出口流量費,要設定 bucket + 綁網域
  • 已經有 GitHub Pages 或自架網站 → 直接放進 public/ 就好

驗證 Content-Type 正確(這是關鍵,CDN 設錯就不能 stream):

$ curl -sI https://your-cdn.example.com/promo.mp4 | grep -iE "content-(type|disposition)"
content-type: video/mp4
# 沒有 content-disposition: attachment ← 這行不能出現

README 嵌入:

<video src="https://your-cdn.example.com/promo.mp4"
       poster="docs/poster.jpg"
       width="700" controls></video>

優點:

  • ✅ 完全自動化(CI 推送就更新)
  • ✅ 無檔案大小限制
  • ⚠️ 平台相容性有限:在 GitHub Pages / 自架網站 / 支援 raw HTML 的 viewer 可正常播放;但 github.com README 不會顯示(GitHub sanitizer 會 strip 掉指向非 githubusercontent.com 的 <video> 標籤);npm registry / VSCode preview 不保證支援
  • ✅ 真正的播放器 + 音訊(限支援 raw HTML 的環境)

缺點:

  • ❌ 多一個服務要維護
  • ❌ 流量爆掉要付錢(Netlify 自 2025-09 起新帳號改為 credit 制、免費 300 credits/月,舊制 legacy 帳號才是固定 100GB/月,實際額度以 Netlify 當前 pricing 為準;建議直接用 R2 的 10GB + 0 出口流量費較單純)
  • ❌ 自訂網域可能要設 CORS 才能跨來源 stream

適合: 影片大、要 100% 自動化、有現成 CDN 可用,且目標是 GitHub Pages / 自架網站(而非 github.com README 本身)。

策略 4:YouTube / Vimeo 縮圖連結(SEO 加分)

GitHub 不會 render YouTube <iframe> embed(HTML sanitizer 把 iframe 整個 strip 掉),但可以放縮圖連結,點擊跳到 YouTube。

[![Watch the demo](https://img.youtube.com/vi/VIDEO_ID/maxresdefault.jpg)](https://youtu.be/VIDEO_ID)

YouTube 自動提供四種縮圖(直接拿,不用自己截):

解析度URL
1280×720https://img.youtube.com/vi/{ID}/maxresdefault.jpg
640×480https://img.youtube.com/vi/{ID}/sddefault.jpg
480×360https://img.youtube.com/vi/{ID}/hqdefault.jpg
320×180https://img.youtube.com/vi/{ID}/mqdefault.jpg

優點:

  • ✅ SEO 加分:影片本身被 Google 索引
  • ✅ 無流量成本(YouTube CDN 全球)
  • ✅ 同支影片可重用:README + Twitter + Threads + 官網
  • ✅ 有觀看數據可追蹤(YouTube Analytics)

缺點:

  • ❌ 點擊跳走 README,使用者離開原頁
  • ❌ 品牌綁定 YouTube(前後可能有廣告)
  • ❌ 需要 Google 帳號 / YouTube channel

適合: 產品行銷導向、做完一支影片想多平台重用、在乎 SEO。

策略 5:Asciinema(terminal demo 專用)

不是影片,是 terminal 事件流的「重播」。錄製和播放都是純文字事件,檔案 KB 級別。

# 安裝
brew install asciinema

# 錄製(按 Ctrl+D 結束)
asciinema rec demo.cast

# 上傳到 asciinema.org(首次會要求登入)
asciinema upload demo.cast
# → 拿到 https://asciinema.org/a/XXXXXX

README 嵌入(SVG 縮圖連到播放頁):

[![asciicast](https://asciinema.org/a/XXXXXX.svg)](https://asciinema.org/a/XXXXXX)

優點:

  • ✅ 檔案極小(30 秒錄製通常 5-20KB)
  • 文字可以選取複製——讀者直接複製你 demo 裡的指令
  • ✅ 純 SVG 縮圖在 README 完美顯示
  • ✅ 可自架 player(不想依賴 asciinema.org 的話)
  • ✅ 開源工具:asciinema / asciinema-player

缺點:

  • ❌ 只能錄 terminal,無法錄 GUI demo
  • ❌ 縮圖點擊跳走(跟 YouTube 策略類似)

適合: CLI 工具 demo、Shell 教學、DevOps 流程示範。

決策樹:你該選哪個

你的 demo 是 terminal CLI 場景?
├─ 是 → 策略 5:Asciinema
└─ 否

    影片超過方案上限(Free >10MB / 付費 >100MB)或 demo 超過 30 秒?
    ├─ 是 → 策略 3:外部 CDN
    └─ 否

        音訊重要嗎?
        ├─ 是 → 策略 2(user-attachments)或 3(CDN)
        └─ 否

            想要 100% 純 CLI flow,不能手動?
            ├─ 是 → 策略 1:GIF(最相容)或 3(CDN,最乾淨)
            └─ 否

                想要 SEO 加分 + 多平台重用?
                ├─ 是 → 策略 4:YouTube 縮圖
                └─ 否 → 策略 2:user-attachments(最省事)

一張表看完所有取捨

策略檔案大小自動化跨平台相容音訊適合場景
1. GIF大(5-15MB)✅ 純 CLI✅ 全部短 demo、最大相容
2. user-attachmentsFree ≤10MB / 付費 ≤100MB❌ 60 秒手動⚠️ 只 github.com影片在上限內、主要在 GitHub
3. 外部 CDN不限✅ 全自動⚠️ github.com 不顯示大檔案、GitHub Pages/自架網站
4. YouTube 縮圖0(外部)✅ 上傳一次✅ 全部想 SEO + 多平台重用
5. Asciinema極小(KB)✅ 純 CLI✅ 全部terminal demo 專用

我自己的選擇(實戰案例)

完整踩雷紀錄在 《把 30 秒產品介紹塞進 GitHub README 的最後一哩》——我做 TypeLate 這次選了策略 2(user-attachments),原因很簡單:

  • 影片只有 2MB,遠低於 Free 方案 10MB 上限
  • 主受眾就在 github.com(README 就是首頁)
  • 60 秒手動可以接受(一支影片只上一次)

但如果未來:

  • 影片變長到 30MB → 改策略 3(Cloudflare R2 host)
  • 想推到 Product Hunt → 加策略 4(YouTube)多平台
  • 變成純 CLI 工具 → 策略 5(Asciinema)取代

5 種策略不是互斥的,可以混用。例如:策略 2 給 GitHub 訪客真播放器,同時策略 4 給 YouTube SEO,策略 1 給 npm registry 看到 GIF——一支影片打三個通路。

TL;DR

GitHub README 的動態 demo 不只 <video> 一條路:

  1. GIF:相容性王者,但檔案大、無音訊
  2. user-attachments:真播放器,但上限視方案(Free 10MB / 付費 100MB)+ 60 秒手動
  3. 外部 CDN:100% 自動化、無限制,但要多維護一個服務
  4. YouTube 縮圖:SEO 加分,但點擊跳走 README
  5. Asciinema:terminal 專用,KB 級別,文字可複製

選哪個看你的 demo 內容、自動化需求、跨平台需求三軸權衡。

至於為什麼值得花力氣做這支 demo 影片,可參考 《為什麼一支 30 秒影片是 OSS 上架最大的槓桿》

留言討論

esc
輸入關鍵字搜尋文章...
查看收藏 →