一個還不存在的 App,已經有六百萬筆資料躺在使用者手上

一個還不存在的 App,已經有六百萬筆資料躺在使用者手上

發布於
·23 分鐘閱讀
AI開源產品產業觀察創業Web3前端開發SaaS商業投資

TL;DR

  • AT Protocol 不是 Bluesky 的社群協議,它是 web 的身分層加上 JSON 儲存層。Bluesky 只是「證明這架構跑得起來」的樣品屋
  • 每個帳號會拿到一個屬於自己的資料夾。你按的每一個讚、發的每一篇文,都是寫進你自己資料夾裡的一個 JSON 檔案,App 只是同步它
  • 一個叫 Teal FM 的音樂紀錄服務至今只有一張 landing page,但因為 schema 先公開了,已經有六百萬筆播放紀錄躺在使用者的資料夾裡,還有第三方 App 拿去做排行榜
  • 跟 Mastodon 最大的差別:Mastodon 的身分綁在 instance 裡,伺服器關掉你就蒸發。AT Proto 把 hosting 跟 App 拆開,隨時可以搬家
  • 對 AI 來說最爽的一點是協議本身就是 API,不用付錢跟平台買自己的資料
  • 還沒解決的部分很多:影片儲存成本、私密資料、刪除只能靠 App 自願配合

這集在二〇二六年七月二十九日播出的 Syntax.fm,主持人是 Wes Bos 跟 Scott Tolinski,兩個混了很久的全端開發者,節目風格就是兩個工程師邊喝咖啡邊聊技術,一週兩集。

來賓是 Dan Abramov。他自己開場說「我覺得現在沒人認識我了」,這句話大概是全集最不準確的一句。他是 Redux 跟 Create React App 的作者,在 Meta 的 React 團隊待了好幾年,後來去 Bluesky 待了兩年,休了一陣長假,然後在錄這集的前幾週正式加入 Vercel 的 Next.js 團隊。Bluesky 是那個看起來像 Twitter 的社群 App,但這集要講的是它底下那層叫 AT Protocol 的東西,而 Dan 就是從裡面出來的人。

「你有沒有覺得這個世界哪裡不對?」

Dan 用《駭客任務》那句台詞開場,但講的是網路。

如果你的網路記憶夠久,會記得早期那種輕飄飄的感覺:你架個網站、貼點東西、互相連結,不用申請、不用審核。後來社群網站出現,我們終於有了共享空間,但這些共享空間開始長得像「網路裡面的另一個網路」。你的答案在 Stack Overflow、你的 issue 在 GitHub、你的貼文在 Reddit,然後這些平台養肥了之後開始關閉第三方客戶端、到處塞廣告、把 API 標上價格。

而你走不掉。因為走掉就等於把自己創造的東西全部抹掉。

Wes 講了一個很戳的例子。大家都說網路是永恆的,但他的 Photobucket 帳號被刪了,因為對方想逼他付錢才能看二十年前自己那台腳踏車的照片。他的回答是:不付,那你刪吧。

Dan 的框架是:我們把東西放進了別人的盒子,於是那些東西就不在開放網路上了。網路上只剩下一個「投影」,也就是伺服器吐給你的那份 HTML。真正的東西鎖在別的地方。

一人一個資料夾

AT Proto 想解的問題,用一句話講就是:如果那些 JSON 不放在別人的盒子裡,而是直接掛在網路上,會怎樣?

它把兩件事升級成 web 的原生概念。

第一件是身分。你可能有四百個網站的帳號,但你大概只有兩三個 Google 帳號,因為沒人想管四百組密碼。AT Proto 的想法是把這個角色從 Google 手上拿走,變成一個網路標準。你有一個網路帳號,它可以由大公司代管,但你隨時可以換供應商或自己架。這個帳號本體是一份 JSON 文件,裡面只講三件事:我現在的 handle 是什麼(用網域名稱當帳號,但 handle 上面還有一層永久識別碼,所以網域掉了人不會消失)、我的資料存在哪裡、我的公鑰是什麼。

第二件是儲存。今天的網路沒有「每個使用者都有 hosting」這個概念,你要有 hosting 就得自己架站。AT Proto 讓每個帳號都自帶一個可以放 JSON 的資料夾,像 Dropbox 但屬於協議層。

然後 App 的角色整個反過來。你在 Bluesky 上按讚,實際發生的事情是 App 在你的資料夾底下的 blue sky likes 那格寫了一個 JSON 檔,裡面連結到我資料夾裡的某篇貼文。你在 leaflet 上寫一篇部落格文,那篇文的原始檔案是在你的資料夾裡。App 變成了 CMS,資料庫變成了快取。

那 App 怎麼知道全世界發生了什麼?沒人會去敲一千個 hosting 算讚數,那太慢。所有事件會透過 WebSocket 串流出來,App 只要監聽一條水管,把跟自己有關的紀錄濾出來塞進自己的資料庫就好。

這個結構我覺得最好的類比是 Dan 自己講的 RSS 跟 Google Reader。RSS 是 source of truth,Google Reader 是把它全部吃進來、做排序、做推薦、做全站搜尋的那個 App。AT Proto 就是把這組關係搬到所有類型的內容上。所以那種「回到純時間軸」的懷舊派可以放心,演算法、推薦、垂直排序全部還在,只是它們搬到 App 層去了,而 App 層可以有很多個,你不喜歡這個換那個。

為什麼這次的標準不會像 XMPP 那樣死掉

Wes 問了全集我最喜歡的一個問題。

XMPP 曾經是聊天的通用標準,你可以自己架伺服器跟所有人聊天。然後大家想要表情回應、想要內嵌圖片、想要影片、想要群組、想要過濾,規格跟不上,於是所有人慢慢走掉。RSS 也一樣,多數人現在在 Spotify 上聽 podcast,Spotify 給你 RSS 但實際上不靠 RSS 運作,因為它要放影片,而規格很久都不支援。

每一次我們有這種開放標準,最後都會為了做超出規格的事情而漂走。

AT Proto 的答案是:它不定義 post 是什麼。這是我覺得整個設計裡最聰明的一刀。它不去試著讓全世界同意一篇貼文該有幾個字,而是給你一套叫 Lexicon 的 schema 定義語言,讓每個開發者自己定義型別。Bluesky 說我的 post 是一個物件、有一個最多三百個 unicode 片段的 text 欄位、有語言欄位、有建立時間,那就這樣。像 TypeScript 的型別定義,只是寫成 JSON,而且有工具幫你 codegen 出型別跟 parser。

換句話說,過去的標準是死在「規定太多」。AT Proto 賭的是「規定太少」。它只管檔案系統跟身分,格式讓應用層自己長。

三個開發者湊出來的草根標準

這件事的後果比想像中好看。

有三個在 AT Proto 上做部落格的 App,leaflet、offprint 跟 pocket,各自都有一頁像 Google Reader 的閱讀器。他們想到一件事:如果讀者能在 A App 訂閱 B App 上的部落格,那不是很棒?於是三家坐下來,決定共用同一套 lexicon,把「刊物」(包含品牌色、刊物名稱、作者)、「訂閱關係」跟「貼文」都統一格式,取名叫 standard site。

沒有標準組織、沒有委員會,就是三個開發者自己約好。

然後有趣的事情開始發生。有人做了一個叫 standard reader 的聚合器,去撈全網的 standard site 紀錄,顯示哪些文章在你的社交圈裡被分享得最多。你甚至不用是那三家的使用者,你可以在自己的靜態網站產生器上掛個工具,往自己的資料夾裡寫 standard site 紀錄,那些 App 就看得到你。Bluesky 也直接做了一張特殊的預覽卡,只要分享的連結有對應的 standard site 紀錄,就用你刊物的品牌色來呈現。

Bluesky 不需要跟任何人申請授權才能做這件事。資料本來就在開放網路上。

一個還沒開張的店,已經在做生意

但最超現實的例子是 Teal FM。

有幾個人想做 AT Proto 版的 Last.fm,記錄你聽了什麼歌。這個 App 到目前為止只有一張 landing page,可能有個私測版,本體基本上不存在。

可是他們把 lexicon 丟上 GitHub 了。一個叫 teal fm play 的紀錄格式,代表一次播放,有歌手名、歌名這些欄位。

於是有人做了工具,把 Spotify 跟 Apple Music 的播放紀錄同步進使用者自己的資料夾。Dan 說他自己就在寫這些紀錄。結果現在全網已經累積六百萬筆播放紀錄,而且有第三方 App 拿這些資料做出了「大家都在聽誰」的排行榜。

主餐廳還沒開幕,外面的攤販已經先靠它的食譜營業了。這件事在任何封閉平台上都不可能發生,因為封閉平台的資料是它自己的資產,你連進去的門都沒有。這正是Fivetran CEO George Fraser 談 AI Agent 時代的搶資料大戰裡那條戰線的另一面:一邊是 SAP 帶頭鎖 API 把客戶資料關進圍牆,一邊是有人乾脆把整個資料層搬到牆外面去。

那 Mastodon 呢?

Dan 的比喻是 Mastodon 像 WordPress。你在自己的伺服器上裝一份迷你 Twitter,而那份安裝就是整個東西。你的身分住在那個 App 裡面。伺服器從網路上消失,你也跟著消失。

而 instance 之間的溝通,他形容成「互相寄信」。我 follow 你但你在別的 instance,那兩份迷你 Twitter 就開始互相發訊息說「Wes 發了新東西,你們那邊有人在追他,我轉給你」。instance 數量一多,連線關係就變成 N 平方除以二。更荒謬的是,如果兩邊管理員吵架,決定不再互寄信,你就收不到朋友的貼文了。他說這比較像古代中國的封建諸侯,你屬於哪個藩鎮,地圖上就有一塊是你的。

Scott 說他當年最卡的就是「我要選哪個 instance」這一步,光這個門檻就知道沒人會跳過來。

傳統平台MastodonAT Proto
身分歸屬平台的你的 instance 的你的,可搬家
資料原始檔平台資料庫instance 資料庫你的資料夾
換服務的代價全部歸零遷移麻煩、追蹤者可能斷改一個 hosting 欄位
App 生態平台說了算一個 instance 一個 App多個 App 共讀同一份資料
使用者要不要懂原理不用得選 instance不用

Bluesky 當初那篇論文標題就叫「Usable Decentralized Social Media」,可用性是硬性約束。使用者不需要知道底下有協議,該有的體驗照舊,只是 App 之間的邊界會慢慢溶掉。

這是 web3,但只拿了好的那部分

Dan 的原話是「AT Proto 是 web3 的 good parts,而 good parts 不多」。

它跟區塊鏈的關聯基本上只在密碼學那一塊。網路上會有中繼節點(relay),因為 App 開發者只想監聽一條 WebSocket 就好,不想自己爬全網。但你怎麼知道中繼節點沒有偷改內容?解法跟 Git 一樣:簽章跟著資料走,事件流本身是簽過的,你可以驗證它真的來自那把公鑰。所以它的血統更接近 Git 或 BitTorrent,而不是區塊鏈。

至於為什麼不用鏈,Dan 給了一個很乾淨的判斷。在鏈上做社群很沒效率,因為每一次寫入都是往同一個共享隊列附加,那是個瓶頸,而且所有東西 append only,貼錯的東西永遠在那裡。真正的洞見是:社群這件事根本不需要全球排序。而一旦你放棄全球排序這個約束,剩下的東西就自動變回了 web。

所以它是去中心化的,但去中心化的方式跟 web 一樣。你用瀏覽器點連結的時候,不會覺得自己在操作一個去中心化網路,你就只是在點連結而已。這種「不用讓使用者感受到理念」的設計取向,跟Vitalik Buterin 談 Sanctuary Tech那種要對抗「天上的叔叔」的框架其實是同一件事的兩種寫法,只是 AT Proto 選了更無聊也更可能成功的那一條。

沒解決的部分,講清楚比較好

影片。 協議原生支援 blob(二進位檔案),JSON 紀錄用 hash 引用它。但你的 hosting 供應商大概不會很開心幫你存好幾 GB 的影片。Dan 講得很誠實:AT Proto 沒有讓成本變高,但要幫一大堆人存影片,不管你用什麼協議都很貴。Wes 也直接吐槽,一般人不會付錢存自己的影片,他們就是丟上 Facebook,因為免費。

私密資料。 現在的協議是以公開資料為前提設計的,你資料夾裡的東西所有人都看得到,有個叫 pds.ls 的工具可以直接輸入任何 handle 去瀏覽別人的資料夾。封閉社團、非公開論壇這些擴充還在做,DM 那種東西他們認為該交給端對端加密協議處理。

刪除。 它是 scrape-first 哲學:既然你擋不住爬蟲,那就承認它,讓所有人平等地爬。Bluesky App 本身就是一個爬蟲。你刪除時,刪除事件會被廣播,守規矩的 App 應該跟著刪(也有 GDPR 壓著),但不守規矩的人當然可以不理。這跟今天有人截圖你的推文一樣,本質上沒有變好也沒有變壞。

Bot 跟 spam。 Wes 提了一個很實務的擔憂:平台抓 bot 靠的是瀏覽器指紋、滑鼠停留時間這些線索,資料層開放之後,這些信號會消失。Dan 的回應有點反轉:如果一筆紀錄不是從主要 App 發出來的,那件事本身就是一個信號。而且開放格式讓 App 之間可以共用 moderation 工具、共用偵測系統、共用黑名單。Tangled(AT Proto 上的 GitHub)已經在做背書系統,你可以用一筆協議紀錄替另一個使用者背書,然後任何 App 都能解讀。

但共享黑名單這件事我完全同意 Wes 的警覺。他自己維護一份免洗 email 網域清單,好幾次有人的正常網域誤入名單,一被下載使用,整間學校的人都註冊不了。他說「我不確定我還想不想負責這個東西」。開放的協作能力是雙面的,好處是大家能一起蓋防護,壞處是誤判也會一起擴散,而且沒人負責。

對 AI 來說,這件事的意義是協議即 API

Dan 提到 Twitter 前陣子宣布 API 降價,他的反應是「你們為什麼要同意付這筆錢,我們變成人質這件事真的很難看」。Wes 當場笑不出來,因為他們幾週前才在討論要做一個追蹤自己貼文數據的東西,然後結論是 Twitter 那邊有點貴。付錢查自己發的東西,這個對話本身就很荒謬。

在 AT Proto 上,協議就是 API。你要我的資料,不需要問任何服務,直接去我的 hosting 下載我的資料夾。有人在做一個叫 hobble 的公開唯讀檔案庫,正在把全網歷史資料撈進去,量級是 TB 級,但你可以把整個網路當成 JSON 下載下來,塞進資料庫,跨產品做 SQL join。

我對這件事的判斷是,這可能是 AT Proto 最終能不能活下來的真正原因,而不是「資料自主權」那套理念。理念說服不了一般人,但 agent 需要一個統一的查詢介面,這件事是有錢味的。過去十年開放協議都輸給封閉平台,因為封閉平台體驗更好。但 AI 時代的使用者有一半不是人,而機器對 walled garden 的耐受度遠低於人類。

順便一提,Dan 現在在 Vercel 忙 Next.js 16.3,他自己說他是個「非常沮喪的 Next.js 使用者」,因為又慢又有 bug。這個版本加了 cache eviction 到磁碟,某些情況下 dev server 的記憶體用量從 20GB 掉到 2GB。另外有個叫 instant navigations 的新功能,強迫你把 suspense boundary 往下推或用 use cache,讓它能自動抽出可重用的 shell,於是 server app 的頁面切換感覺像 SPA。有人會去修 Next.js 的效能,這件事本身就值得高興。

Scott 錄完的感想是他從「以為這只是 Bluesky 底下的協議」變成「開了十八個分頁」。我看完逐字稿的狀態差不多,只是我沒開十八個,我開了六個然後決定先寫這篇。

自行斟酌,共勉之。

這類把技術架構跟產業結構放在一起看的內容我會持續寫,訂閱 wilsonhuang.xyz 就不會漏掉。

Sources:

推薦閱讀

喜歡這篇文章嗎?

訂閱電子報,每週收到精選技術文章與產業洞察,直送你的信箱。

💌 隨時可以取消訂閱,不會收到垃圾郵件