三十天前這是 Karpathy 的一則 gist。現在是一個上線收費、原始碼公開的產品,網域在 wikibrain.app。前面二十九篇把中間那段路寫完了。最後一天不開新功能,把整條路收起來,留下幾條重來還會照做的決定。

這一篇由上往下走一遍,每一段只停一次。
開頭那幾篇把 gist 變成可跑的東西。六條準則拆成三層與三個操作,再寫成程式與 agent 迴圈。後來才真的丟來源進去,看概念頁自己長出來。那時候還沒有登入,也還沒有錢,但複利那條線已經看得見:差別在第二份來源進來的時候,有沒有東西可以回去改。
接著是讓它跟別人共用而不互踩。MCP 與工具描述把規則交出去,樂觀鎖擋人跟 agent 同時寫入的衝突,wiki 連結存成邊,前端用 Vite、圖譜與 i18n 把知識庫變成每天打得開的介面。匯入網頁之後,SSRF 與間接提示詞注入逼出同一條界線:能畫邊界的就擋連線目的地,畫不出來的就限制能力,自動執行寫不進 schema/。
再往後是身分、接線與營運。better-auth 與加密存放的 API key、Claude.ai 的 OAuth、Docker 與 Railway、Cloudflare 與 Resend、備份與還原演練、無頭渲染的公平池、本機假端點測模型來回。開源選 AGPL,分享與匯出讓人帶得走;保留期與刪帳號回答資料該不該消失。最後才是生意:沒有公司的前提下選 Paddle,再把固定成本與抽成算成打平人數。
篇序不是一開始就定好的。有些題目是被問題推出來的:壓測之前我以為序列化就夠安全,開源之前我以為營運資料可以跟程式碼住一起。寫進連載的,多半是已經踩過一次的坑。
圖上最厚的一格是 agent 迴圈:迴圈本身、實際跑一次、擋注入、加密 API key。使用者每天真正在看的前端只有三篇。
這個比例是被難度推出來的。前端做錯了看得見,改一次就好;agent 那一層做錯了不會報錯,它只是安靜地產出比較差的頁面,你要三個月後回頭看知識庫的時候才發現。寫得多,是因為那一層最容易寫錯,而且最不容易當場發現。
圖上第四層只有一個框:資料存取只有一個入口,src/notes.ts。加工作區隔離時,每一句 SQL 都要多一個 workspace_id。加方案閘門時,寫入前要先檢查額度。統一錯誤訊息時,每一則都要帶中英雙語。三件事都只改同一個檔案。
如果那時候路由各自寫 SQL,每一件都是一次全庫搜尋。重來的話,這一條還是會在第一週就定下來。
圖上①②層與③層之間那條線,學費交得最多。第一版的 SSRF 防護檢查使用者貼進來的網址,十進位 IP、八進位 IP、0.0.0.0、DNS 重綁定、轉址,每一種都繞得過,我被抓到兩次。正確的位置是連線的那一刻檢查即將連去的目的地。
間接提示詞注入是同一條線的另一面。那裡沒有內網對外網這種明確邊界,一句話是不是指令取決於讀它的是誰,所以改成限制能力:自動執行根本寫不進 schema/,外部網域的圖片在瀏覽器那一層就載不起來。能畫出邊界的就擋邊界,畫不出來的就限制能力。
無頭瀏覽器很吃記憶體,所以我下意識把它排成一條佇列,一次只跑一頁,以為保守就是安全。壓測的數字說不是。一個人丟五十個網址進來,其他人的匯入要等將近兩分鐘,而那兩分鐘裡記憶體用量幾乎不動。延遲在多人系統裡會傳染,記憶體不會。換成有上限的公平池之後,鄰居的等待從 26.8 秒掉到 4.3 秒。我優化了一個看得見的指標,延遲卻堆在一個當時沒有量的指標上。
這是唯一一個重來一定會改流程的決定。開源的時候才發現,服務商的帳號信箱與價格被編在一支原始碼裡。那是營運資料,不是程式。清掉它要回頭改 git 歷史,把一個檔案拆成程式與資料兩半。清檔案本身幾步就做完。難的是那時候整個 repo 的結構已經假設了反正都是我自己的。界線畫得晚,就得回頭拆已經長在一起的東西。
協定裡有標準答案的部分用別人寫好的:better-auth、Paddle、MCP SDK 都是;產品邏輯才自己寫。圖上每一格看起來份量差不多,實際上有些格子我只寫了四十行設定。
接上外部服務在圖上是一行字,實際上是整個系列裡最耗時的一段。DNS 生效、寄件網域驗證、OAuth 同意畫面審核、金流帳號開通,每一項都要等,而且等的時候不能做別的。
我請人用全新帳號從註冊開始跑,抓到的三個阻礙全部是我自己測永遠不會碰到的,因為我會下意識走自己設計的路。
生意那一段也不在架構圖上。沒有公司能不能收全球的卡、抽成之後幾個付費使用者才打平,決定的是這條路走不走得下去。固定成本大約六美元、月繳實收大約五美元,打平只要兩個選擇月繳的人;那個數字比我預期的低,是因為訂閱裡沒有模型費。
這是 vibe coding 的 side project,以 LLM Wiki 當成題目,試著做一次完整的開發與上線流程。從 gist 的六條準則,一路走到收費、開源與商業模式的試算。
服務在 wikibrain.app,程式碼在 GitHub,AGPL-3.0,docker compose up 就跑得起來。前面每一篇講的程式碼都能在那裡翻到完整的上下文,包括我寫錯又改掉的那些,git 歷史都還在。謝謝讀到這裡的你。