Espresso 的變數太多:豆子、烘焙度、粉量、研磨度、萃取時間⋯⋯每個參數都會影響風味。想穩定萃取,就得記錄每次的參數,慢慢找到每支豆子的 sweet spot。
紙筆記了幾天就懶了,試過幾個 App 也都不順手。最後決定自己做一個。
用對話蓋出來的
整個開發過程是透過 OpenClaw(開源 AI Agent 框架)完成的。我沒打開 IDE,就是在對話框裡描述需求:
「單頁 HTML,localStorage 存資料,Chart.js 畫圖。」 「豆子名稱要能搜尋。」 「預設值帶入上一杯的參數。」
AI 生成程式碼、我測試、回報問題、它修。來回大約 30 分鐘,從空白檔案到部署上 NAS。
Placeholder 的坑
過程中卡最久的是預設值。需求很簡單:新增記錄時自動帶入上一杯的粉量、研磨度等參數,使用者只改有變動的欄位。
前幾版用 placeholder 顯示預設值。畫面上看得到數字,但 placeholder 只是提示文字,不是 input.value。留空送出時,存進去的是空值,不是畫面上顯示的數字。
來回修了三版才想通:別用 placeholder 模擬預設值,直接把值填進 input。看到什麼就存什麼,沒有歧義。
最佳參數怎麼算
儀表板有一個「各豆子最佳參數」的區塊。一開始是取所有記錄的平均值,但這樣失敗的杯次會拉低數據。
改成:找每支豆子評分最高的記錄,取那些記錄的平均水粉比、研磨度、萃取時間。邏輯很簡單,就是 filter + reduce,但語義上合理多了——你想參考的是最好的幾杯,不是所有杯的平均。
長什麼樣

記錄表單:填完按儲存,預設值自動帶入上一杯

最近 10 杯,每筆可編輯或刪除

儀表板:各豆子最佳參數、研磨度趨勢、評分分佈
功能
- 記錄:豆子、烘焙度、粉量、研磨度、萃取時間、出杯量、粉碗、評分、備註
- 豆子和粉碗都有搜尋(從歷史記錄建 autocomplete)
- 預設值自動帶入,選了歷史豆子會切換成該豆子上次的參數
- 時間快捷鍵:現在 / 5 分前 / 10 分前 / 30 分前 / 1 小時前
- 儀表板:研磨度趨勢、評分分佈、各豆子最佳參數
- JSON 匯入匯出
- 深色主題,手機可用
技術上就是一個 HTML 檔,沒後端。
部署
NAS 上用 nginx:alpine 跑靜態站,透過 Portainer API 建 Docker stack,5 分鐘搞定。
另外加了一個 records.json,讓 AI agent 可以透過 SSH 寫入記錄。這樣在外面也能用對話記參數,頁面打開時會自動合併。
試用
工具放在 這裡,打開就能用,資料存在你的瀏覽器裡。想自己部署也行,就一個 HTML 檔丟進任何 web server。
