你在 GitHub 上按下發布,新版就出去了。你知道是誰在下載它嗎?他下載的,是你今天發的第幾版?
前 21 篇講了三件事:怎麼對 AI 下指令、改完怎麼確認沒改壞、改了一千多次怎麼不爛掉。這三件事,都發生在我自己的電腦和 CI(每次推上去自動跑的檢查)裡。
從今天起是 Day 1 路線圖的第四段:上線。usage(我做的開源小工具,顯示 Claude Code、Codex 這些 AI 工具用了多少額度)到 10 月 4 日發了 225 個版本,有 19 個 issue(問題回報)是別人開的。今天從第一個別人開的 issue 講起。
5 月 22 日凌晨 0 點 8 分,usage 發了 v0.6.0。這一版加了五種語言的介面,翻譯文字放在一個叫 i18n.json 的檔案裡。
接下來,又陸續發了 v0.6.1 到 v0.6.7。最後一版是下午 5 點 16 分,前後 17 個小時,8 個版本。(這天晚上又發了 4 版,全天一共 12 版。)
每一版都附了一個 usage.app.zip,Mac 使用者下載、解壓縮、打開,就是選單列上的那個小工具。
這 8 個 zip,我最近全部下載回來檢查。裡面都沒有 i18n.json:
$ unzip -l usage.app.zip | grep -c i18n.json
0
v0.6.0 到 v0.6.7,8 個都是 0。打包的設定檔裡,要放進 App 的檔案清單漏了它。
到 10 月 4 日,這 8 個 zip 一共被下載了 44 次(扣掉我這次檢查下載的 8 次)。下載數是累計的,分不出哪幾次發生在 5 月 22 日;但至少有一個人是那天下載的,就是下面這位。
v0.6.7 發出去 19 分鐘後,一位使用者 jack24254029 開了 usage 第一個別人開的 issue(#4),標題是:
0.6.0 以上任一版本都開不了
重現步驟只有兩行:下載 0.6.0 以上任一版本,打開直接跳出 Launch Error(啟動失敗)。
一般人到這裡,只會看到那個視窗。他多做了一步,附了一張截圖:17 點 32 分,他打開終端機,直接執行 App 裡面的程式,把完整的錯誤訊息印了出來:
NotADirectoryError: [Errno 20] Not a directory: '/Applications/usage.app/Contents/Resources/lib/python313.zip/i18n.json'
2026-05-22 17:32:02.976 usage[3115:10421949] Launch error
錯誤訊息指名的就是 i18n.json,而且路徑很怪:程式在 python313.zip 這個壓縮檔「裡面」找它。打包時,程式碼會被壓進這個 zip;程式找翻譯檔的寫法是「找跟我放在一起的那一個」,到了 App 裡,「跟我放在一起」就變成壓縮檔裡面。從專案資料夾直接跑,翻譯檔就在程式旁邊,不會出事。
所以要修兩件事:把翻譯檔放進 App,也讓程式改去 App 的資源資料夾找。issue 開出來 82 分鐘後,修好的 v0.6.8 發出去。issue 在前一分鐘關閉,底下留言:已在 v0.6.8 修復,請下載測試,還有問題再開新 issue。

我把 v0.6.8 的 zip 也拿回來看,翻譯檔在裡面了:
$ unzip -l usage.app.zip | grep i18n.json
13067 05-22-2026 18:57 usage.app/Contents/Resources/i18n.json
只看檔案在不在,看不到第二件事:程式有沒有去對的地方找。Day 8 寫過 9 月的一次「打包後一開就崩」,那次之後的做法是:發版前,打開打包好的 App。5 月這次是同一種錯,比 9 月早了三個半月,那時發版流程裡還沒有「打開它」這一步。能同時抓到兩件事的,就是打開它。
5 月 23 日晚上,同一個人開了第二個 issue(#5):
希望能在 App 內檢查有無新版本,最理想的結果是可以做到自動檢查、自動更新,或是讓使用者設定是否自動檢查、自動更新,也可以提供按鈕立刻檢查版本
最後一句是:「謝謝你的小工具,很好用」。
從他的位置看,這個要求很合理。他前一天的標題寫「任一版本」,代表他不只試了一版。這次他開了 issue,修好時會收到留言通知;沒開 issue 的人,只能自己回 GitHub 看。5 月 22 日一整天(台灣時間),usage 發了 12 版,App 裡沒有任何地方會告訴使用者:有新版了。
回覆這個 issue 時,我列了更新檢查的規劃。其中一條:最近發版太頻繁,所以 24 小時內最多提醒一次,免得使用者每次打開 App 都被跳通知。他看了之後回了一段:
關於釋出新版本的頻率,我的看法是你可以當天收尾的時候評估看看是不是需要釋出新版本,的確是可以不用每次有新功能就發一版
小而頻繁的 commit 是好的,Release 的頻率你可以再評估看看
我從這段讀到的是:commit(存一次程式改動)是我自己的存檔,release(發一個大家能下載的版本)是交到他手上的東西。
5 月 24 日,v0.11.0 加上了更新檢查:打開 App 時去 GitHub 查最新版,有新版跳出視窗,可以「前往下載」「稍後再說」「跳過此版本」。
我把到 9 月 30 日為止的 223 個版本,照台灣時間的發布日子數了一次:
| 期間 | 版本數 | 平均每天 | 一天 3 版以上的天數 |
|---|---|---|---|
| 5/17–5/23(第一週) | 34 | 約 4.9 | 4 |
| 5/24–6/23 | 66 | 約 2.1 | 14 |
| 6/24–9/30 | 123 | 約 1.2 | 16 |
頻率是往下走的,但不是他留言之後馬上降:5 月 27 日,又一天發了 11 版。

如果你的專案在 GitHub 上發版,在專案資料夾裡跑下面這行(要先裝好 GitHub CLI 並登入),會列出你發最多版的 5 天,日期換成台灣時間:
gh release list --limit 500 --json publishedAt \
--jq '.[] | .publishedAt | fromdateiso8601 + 8*3600 | strftime("%Y-%m-%d")' \
| sort | uniq -c | sort -rn | head -5
usage 跑出來是:
12 2026-05-22
11 2026-05-27
11 2026-05-18
6 2026-07-15
5 2026-08-02
publishedAt 是 UTC 時間,+ 8*3600 換成台灣時間。不換的話,5 月 22 日會被數成 10 版:UTC 和台灣差 8 小時,一天從哪裡切開不一樣,數出來就不同(Day 21 的時區,又出現一次)。
數完再看排第一的那天:那天的每一版,都有人下載嗎?下載的人怎麼知道下一版出來了?
發版後,也可以馬上把給使用者的那個檔下載回來,先確認這次新加的檔案在裡面。這只能先篩掉「檔案沒放進去」;程式找不找得到它,還是要打開 App 才知道:
gh release download v0.6.8 -p usage.app.zip
unzip -l usage.app.zip | grep i18n.json
工作單(交給 AI 的任務說明)裡有一格「做完怎麼算對」,Day 4、Day 8 到 Day 21 各在這格加了幾行。上線這一段,從今天這兩行開始(沒用過這張工作單,也可以直接把這兩行交給 AI,當作發版的驗收要求):
做完怎麼算對:
- (Day 4、Day 8 到 Day 21 加的幾行)
- 發版:發出去後馬上把使用者會下載的那個檔下載回來,先確認這次新加的檔案在裡面(貼出 unzip -l 那幾行),再打開打包好的 App,確認能正常啟動;只在自己的專案資料夾跑過不算數
- 同一天要發第二版以上:說明這一版為什麼不能等到當天收工再一起發。沒人回報不代表上一版沒事:5 月 22 日第一個回報,在第一版發出 17 個多小時後才來
當時對我來說,發版是一個存檔點;對下載的人來說,每一版都是他要下載、打開、可能卡住的一次。
5 月 24 日晚上,加了更新檢查的 v0.11.0 發出去 26 分鐘後,又一個不認識的人送來一個修正(PR #6,把改好的程式送來請我合併)。他說 v0.10.0、v0.10.1、v0.11.0 一打開就崩,錯誤訊息的最後一行,跟 #4 一模一樣。明天看這一次。
gh release list:https://cli.github.com/manual/gh_release_list