MinutePad 1分鐘便條紙
以決策紀錄驅動開發的 iOS 便條紙 App,用 CLAUDE.md 當 AI 的產品需求文件

- 我的角色
- 產品定義、功能取捨、訂閱設計、決策紀錄;與 Claude Code 協作開發
- 技術
- SwiftUIWidgetKitStoreKit 2Core DataVision OCRAzure OpenAI
- AI 協作
- Claude CodeAzure OpenAI GPT
- 26
- 決策紀錄 · Docs/DECISIONS.md,含背景・選項・變更條件
- 5
- 目標市場 · 台灣・香港・中國大陸・英語・日文
- NT$49
- Pro 定價 · 月繳;年繳 NT$349
- 3
- 主題色 · 琥珀黃・大地暖系・柔紫,Widget 同步
01問題
生活瑣事的待辦工具大多做得太重:要建專案、填標籤、拖時間軸,結果「記一件事」本身就花掉一分鐘以上。我想要的是另一種極端:新增、排程、完成、刪除,每個動作都在一分鐘內結束;時間可以不設、設「上午/下午/晚上」、或設精確到分鐘;沒做完的事隔天自動出現,不用人搬。
另一個問題是我自己的:這是個人開發者的第一個訂閱制 App,又要同時面向台灣、香港、中國大陸、英語與日文市場。功能範圍、收費分界、隱私承諾,每一個決定都要留下理由,不然三個月後連自己都說不清為什麼。
02使用者與情境
主要使用者是「需要快速記下待辦的人」:上班族、家庭照顧者、任何手上同時有五件小事的人。情境是零碎時間——走路、等車、開會前兩分鐘——所以輸入要快(文字或拍一張照片 OCR)、提醒要準(準時或提前 5/10/15/30 分鐘)、桌面 Widget 要能直接打勾。
第二個使用者是和我一起開發的 AI。Claude Code 每次 session 都從零開始,它需要一份穩定的「這個產品是什麼、不是什麼」。CLAUDE.md 就是寫給它看的產品需求文件。
03限制條件
- 個人開發者:沒有後端團隊,v1.0 不能依賴自建伺服器;資料只存裝置本機,無帳號、無第三方 SDK。
- 訂閱制:免費版要夠好用才有人裝,Pro 要有現在就值得買的理由,但不能把日常記事鎖起來。
- 多市場:繁中、簡中、英、日四種語言的文案與 OCR 辨識語言;配色不能只討好一地。
- AI 成本與安全:AI 排程直接打 Azure OpenAI,金鑰的保護方式必須在上架前解決。
- 文件債:DEVLOG 與使用者調查檔是空的,事後補記的決策日期只能依檔案時間推定,而且要誠實標明。
04方案與取捨
核心機制四個:三種時間粒度(不設/時段/精確)、跨日帶入(複製到今天並軟刪除原記錄,月曆仍看得到昨天)、互動式 Widget(打勾寫進 App Group 佇列,App 回前景時套用,兩個 process 不會同寫一個資料庫)、AI 排程助手(最多五筆,依現在時刻與不可安排時段給建議,每筆都要使用者確認)。
三個最大的取捨:AI 從 Phase 4 提前到 v1.0,但範圍縮成「幫今天沒排的事排時間」;免費/Pro 的線畫在「日常記事免費、省事的自動化收費」——免費每日三次 AI、只排今天與明天,Pro 不限次數並開放不可安排時段、重複任務、後天以後的任務;v1.0 不做 iCloud 同步,先把隱私政策寫成最簡單的「全部在本機」。
關鍵決策
05人機合作方式
我把 CLAUDE.md 當成 AI 的 PRD:定位、功能清單、Pro 定價、檔案索引、上架 checklist,最重要的是「不屬於本專案的功能」——CBT 延宕介入與使用習慣分析屬於另一個產品。程式碼裡曾長出 CBT 建議的雛形,邊界寫下後 AI 不再越界,殘留碼標記待刪。
DECISIONS.md 是第二條線:26 條決策各有背景、選項、決定、變更條件,而且允許推翻——D012 選了 XcodeGen,D015 承認 Xcode 已接管專案檔。
最有說服力的一次是 AI 做錯、人糾正:Claude 為了讓 AI 排程先跑起來,把 Azure 金鑰寫進 Swift。我在納入 git 前的安全檢查抓到,列三個方案裁決其一,Claude 再把金鑰移到不進 git 的 xcconfig 並用兩種情境的 xcodebuild 驗證。邊界靠流程上的檢查點守住,不靠 AI 自律。
人機合作關鍵時刻
用 CLAUDE.md 畫出 AI 的工作邊界
我判斷了什麼
程式碼裡出現了「CBT 小行動建議」和使用習慣分析的雛形。我判斷這些屬於另一個產品(智慧行動記事本),不是 MinutePad 的「操作簡單、省事」定位。我把定位、功能範圍、Pro 分界和「不屬於本專案的功能」寫進 CLAUDE.md,讓它成為給 AI 看的 PRD。
AI 做了什麼
Claude Code 每次 session 先讀 CLAUDE.md,之後的開發都在範圍內;殘留的 suggest(for:) 與 AISuggestionCache 保留為沒有 UI 入口的程式碼,等確認後刪除。
結果
v1.0 範圍穩定:AI 只做「重排今日時間」,CBT 與習慣分析正式移出(DECISIONS D025)。
一句話 給 AI 的需求文件,先寫「不做什麼」比寫「要做什麼」更有效
Widget 打勾要同步回 App
我判斷了什麼
我要求桌面 Widget 可以直接打勾完成,而且一定要同步回 App,但不想讓 Widget 這個獨立 process 直接去寫 Core Data 資料庫。
AI 做了什麼
Claude 用 AppIntent(ToggleTaskIntent)把被點擊的任務 ID 寫進 App Group 的待處理佇列,Widget 端先樂觀顯示;App 回到前景時讀佇列、寫入 Core Data、清空,再把最新清單推回 Widget。
結果
Widget 與 App 之間只靠 App Group UserDefaults 單向推送 + 一個佇列,沒有多 process 寫同一個 store 的風險(DECISIONS D023)。
一句話 跨 process 的同步,先決定誰是唯一的寫入者
AI 走了捷徑:金鑰寫死在原始碼
我判斷了什麼
規劃上 AI 排程要經過 Azure Functions 中轉層保護金鑰(D006)。實作時 Claude 為了讓功能跑起來,直接從 App 打 Azure OpenAI,把金鑰寫進 Secrets.swift。我在把專案納入 git 之前做安全檢查抓到這件事,列出三個方案(ignore 檔案 / xcconfig 注入 / 中轉層),裁決先用 xcconfig,中轉層排進上架前待辦。
AI 做了什麼
Claude 把金鑰移到不進 git 的 Secrets.xcconfig,經 Base.xcconfig 的可選 include 注入 Info.plist,Secrets.swift 改為讀取;沒有 xcconfig 也能編譯,AI 功能會明確回報未設定。兩種情境都用 xcodebuild 驗證。
結果
原始碼與 git history 內無金鑰;被讀過的舊金鑰列為需重發。中轉層列為上架前的已知技術債(DECISIONS D019、D026)。
一句話 AI 會為了「先跑起來」跨過安全邊界,邊界要靠流程上的檢查點守住,不能靠它自律
把 Phase 4 的 AI 提前,但只做一件事
我判斷了什麼
設計文件把 AI 排在 12~24 個月後,內容包含艾森豪矩陣分類和歷史模式分析。我判斷 Pro 需要一個現在就能賣的理由,但沒有使用資料就做矩陣分類是空談。所以把 AI 提前到 v1.0,範圍縮成「幫我把今天沒排的事排進時間」,而且每一筆建議都要我按確認。
AI 做了什麼
Claude 寫了 AIAssistView 與 suggestSchedule:最多選 5 筆,把現在時刻、已佔用時段、不可安排時段餵給模型,要求只回 HH:mm 逐行;解析失敗的那筆顯示「無法取得建議時間」並提供「安排至明日」。
結果
AI 排程成為 Pro 主賣點(免費每日 3 次),艾森豪欄位保留未用(DECISIONS D017、D020)。
一句話 AI 功能先做一件做得準、可驗證的事,再談聰明
被 Xcode 推翻的工具決策
我判斷了什麼
D012 決定用 XcodeGen 管專案檔。但我在 Xcode 裡直接新增了 Widget target 和簽章設定,project.yml 從此落後,沒有人回頭補。整理文件時我選擇承認現實:pbxproj 以 Xcode 為準,並把「不要執行 xcodegen generate」寫成決策。
AI 做了什麼
Claude 在補記 DECISIONS 時發現 project.yml 沒有 Widget target、bundle ID 還是佔位值,寫成 D015 並在 README 的開發環境設定裡警告。
結果
文件與實際工作流一致;新加入的人不會因為跑 xcodegen 把 Widget target 砍掉(DECISIONS D015)。
一句話 決策紀錄要能被推翻,而且推翻也要記下來
06成果
- v1.0 功能完成:便條 CRUD、三種時間粒度、通知提醒、OCR(相簿+拍照,裝置端)、月曆+搜尋、Apple 行事曆匯出、互動式 Widget、跨日帶入、重複任務、不可安排時段、AI 排程助手、StoreKit 2 訂閱。
- 三套主題(琥珀黃/大地暖系/柔紫),切換時 Widget 同步換色。
- 26 條決策紀錄、根 README 文件導覽、CLAUDE.md 邊界宣告,私有 repo 內無金鑰。
- App Store 文案三語草稿(繁中/英/日)與隱私政策草稿完成;截圖已產出。
- 狀態:功能完成、待上架(截圖、隱私政策網址、TestFlight、送審)。
畫面
07如果重來
第一,把 DEVLOG 真的寫起來。這次補記 12 條決策時,日期只能從檔案修改時間推定,「AI 做錯被糾正」的紀錄也只剩最近一次有完整證據。決策紀錄的價值在於當下寫,不在於事後考古。
第二,安全檢查要排在第一行程式碼之前,而不是 git init 之前。金鑰寫死的那一刻,CLAUDE.md 裡如果已經有一條「金鑰只能來自 xcconfig」,AI 就不會走那條捷徑。給 AI 的 PRD 不只要寫「不做什麼功能」,也要寫「不准怎麼做」。
第三,隱私政策草稿說「不傳輸任何資料」,但 AI 排程助手會把任務文字送到 Azure OpenAI。文案和程式碼各自演進,沒有人對過。上架前的隱私政策要從程式碼出發重寫,而不是從願望出發。






