軟體
這頁是程式那一邊。上架的九支在Apps有各自的介紹頁,這裡講的是它們作為一批東西的樣子 —— 以及一個人怎麼同時養著 52 個專案還沒有把自己搞丟。
九支在 App Store 上的#

| App | 一句話 |
|---|---|
| 甘特星球 | 3D 視覺化習慣養成 + 端側 AI 樹洞 |
| 假名私塾 | 五十音學習,含系統鍵盤擴充與手寫辨識 |
| 英語 N+1 | 離線 AI 英語外教,CEFR 自動定級 |
| Python 點線面 | 三維度 Python 教學,內建 Python 3.13 執行環境 |
| 原子在場 | 防深偽錄音存證,雜湊鏈 + 數位簽章 |
| 聽覺旅伴 | DSP 即時合成噪音 + 108 種環境音 |
| 回聲種子 | 記錄思想,做成訓練未來 AI 的數位遺產 |
| 紅樓夢模擬器 | AI 敘事引擎,120 回播放與三種結局比較 |
| 遺忘花園 | 滑動式相片整理,被放下的照片長成廢棄樂園 |
但上架的只是九分之一#
| 類別 | 數量 | 內容 |
|---|---|---|
| 上架 iOS app | 9 | 見上表 |
| 未上架原型 | 28 | AR 遊戲、輸入法、端側 TTS、麻將教學、像素繪圖… |
| 網站 / 服務 | 6 | 含這個網站本身 |
| 共用函式庫 | 5 | 跨 app 互推卡片、共用字型、廣告整合範本… |
| 開發工具 | 4 | 上架截圖產生器、Xcode MCP、設定檔同步… |
| 合計 | 52 |
那 28 個原型不是失敗品,是還沒有理由上架的東西。端側 Stable Diffusion 的可行性驗證、Whisper 離線轉錄的 NPU 效能測試、Qwen3-TTS 的 Swift 移植 —— 這些跑完就知道答案了,答案本身比一個上架的 app 有用。
講一點做法#
一、52 個專案需要一本目錄,而且目錄不能是程式碼。 每個專案在一個獨立的倉庫裡有一張 YAML 卡:它叫什麼、在哪個資料夾、上架了沒、版本多少、Bundle ID 是什麼、對外的宣傳詞怎麼寫。這本目錄不放程式碼,只放指標。有一支驗證腳本會檢查每張卡指到的路徑是不是還在、有沒有重複的 slug、有沒有孤兒。
為什麼要這樣?因為「這個 app 的隱私政策網址是什麼」這個問題,一年會被問到二十次 —— App Store 送審時、寫網站時、app 裡放連結時。答案只能有一個地方,其他地方都從那裡讀。
二、跨 app 的互推是資料,不是程式。 九支 app 會互相推薦彼此。做法不是在每支 app 裡寫死另外八支的清單(那樣每次上架新 app 就要改九個專案),而是這個網站上有一份 JSON,app 啟動時去拉。新增一支 app = 改一份 JSON。
三、共用的東西要真的抽出來。 字型、互推卡片的 SwiftUI 元件、廣告整合的樣板,這三樣被獨立成套件。抽出來的判準很簡單:同一段程式碼要被第三個專案複製貼上的時候,就是該抽的時候。 第二次可以忍,第三次不行。
四、上架材料是產出來的,不是做出來的。 九支 app × 六種語系 × 每種語系數張截圖 —— 這個數字用手做會死人。截圖的排版、文案、機型外框是一份設定檔,跑一支腳本輸出全部。這也是為什麼上表那個「52」不會壓垮我:真正手工的部分被壓到很小。
沒講的部分#
- 那本目錄的欄位設計、以及驗證腳本實際檢查哪些東西
- 端側 AI 那條線:模型怎麼選、怎麼量化、怎麼塞進 App Store 的體積限制裡
- 28 個原型裡哪幾個其實已經可以上架、以及為什麼沒有
- 11 種語系的翻譯流程,以及怎麼確保譯文沒有默默壞掉
這頁講的是「同一件事要做九次」怎麼收斂成「做一次、跑九遍」。你的工作裡如果也有那種九次,委託頁。