OC Owen Young Clippings — Bilingual Study EditionOwen Young · Clip 精读
All ↩目录 ↩
#08owenyoung - clipOwen Young · 2026-01-21 · overreacted.io

A Social Filesystem社交文件系统

What if your follows and likes were just files you owned?如果你的关注和点赞,只是你拥有的文件呢?

01

Concise Summary简洁概述

Abramov argues social apps abandoned the filesystem's core promise — that what you create belongs to you, not the tool — and shows how AT Protocol restores it by turning every post, follow, and like into a portable JSON record you own.

The piece matters because it reframes decentralization not as a political ideal but as an engineering pattern already proven by file formats: app-agnostic data lets bad apps die and good ones inherit the data for free.

Abramov 认为社交应用抛弃了文件系统最核心的承诺——你创造的东西属于你,而非属于工具——并展示 AT Protocol 如何通过把每条帖子、关注、点赞都变成你拥有的可迁移 JSON 记录,来重新兑现这个承诺。

这篇文章的意义在于把「去中心化」从政治理想重新定义为一种已被文件格式验证过的工程模式:与应用无关的数据结构,让烂应用可以被淘汰,好应用能直接继承既有数据。

02

Infographic信息图

1→6
record fields whittled down from a raw JSON post to just 2 (text, createdAt)
一条帖子的字段从原始 JSON 精简到仅剩 2 个(text、createdAt)
3 层
structural layers: record → lexicon → collection (namespaced by reverse-domain)
三层结构:记录 → 词典 → 集合(用反向域名做命名空间)
678,850
scrobble plays shown by a teal.fm demo built on an API that doesn't exist
teal.fm 演示展示的 678,850 次播放记录——而对应 API 根本不存在
📁

Files outlive apps

文件比应用长寿

A file format is an API: any app that speaks SVG can render it without asking Excalidraw for permission. Abramov generalizes this — data should be app-agnostic, so a bad app can always be replaced by a better one that reads the same files.

文件格式即 API:任何认得 SVG 的应用都能渲染它,无需向 Excalidraw 申请权限。Abramov 把这个直觉推广开——数据应当与应用无关,这样一个烂应用总能被读取同一批文件的更好应用取代。

🗂️

The 'folder of everything'

万物文件夹

Imagine every Instagram follow, Tumblr post, and HN upvote as a file in one personal folder, and the app as a thin renderer of that folder rather than the owner of a private database. Writing to the folder — e.g. deleting a follow-file — changes the app's live state.

设想每一次 Instagram 关注、Tumblr 发帖、HN 点赞都是个人文件夹里的一个文件,应用只是这个文件夹的渲染层,而非私有数据库的所有者。直接对文件夹写入——比如删掉一个「关注」文件——就能改变应用里的实际状态。

🏷️

Namespacing via domains, not committees

用域名而非委员会来命名空间

Instead of forcing every app author to agree on one definition of 'post,' AT Protocol namespaces record types by reverse-domain (com.tumblr.post vs com.twitter.post), so apps diverge freely and interoperate only where they choose to.

AT Protocol 不强迫所有开发者对「帖子」达成统一定义,而是用反向域名给记录类型分命名空间(com.tumblr.post 对比 com.twitter.post),应用之间可以自由分歧,只在愿意的地方互通。

🚫

No lexicon police

没有词典警察

Anyone can write garbage into another app's collection; the receiving app just treats every record as untrusted input, validates against its lexicon, and drops what fails — the same defensive posture as handling an untrusted POST body.

任何人都能往别的应用集合里写垃圾数据;接收方的做法是把每条记录都当作不可信输入,用词典校验,校验失败就丢弃——和处理不可信的 POST 请求体是同一套防御逻辑。

The argument, step by step
论证推进链条
1
Start from the personal-computing intuition: files belong to the user, not the app that created them, and formats let unrelated apps interoperate.
从个人计算的直觉出发:文件属于用户而非创建它的应用,格式让互不相识的应用得以协作。
2
Ask why social apps never adopted this — posts, follows, and likes live locked inside proprietary databases instead of user-owned files.
追问为什么社交应用从未采纳这一点——帖子、关注、点赞都被锁在专有数据库里,而非用户自有的文件中。
3
Propose the 'folder of everything': a personal directory that is the live source of truth, which apps read and write to rather than own.
提出「万物文件夹」构想:一个作为真实数据来源的个人目录,应用对其读写,而非占有它。
4
Work through how to encode a single post as a record — stripping author, counts, and derived fields down to only what the creator actually authored.
具体推演如何把一条帖子编码为记录——剥离作者信息、互动计数等衍生字段,只留下创作者真正生产的内容。
5
Introduce lexicons (schema) and reverse-domain-namespaced collections so different apps can define 'post' differently without central coordination.
引入词典(模式定义)与反向域名命名空间的集合,让不同应用可以各自定义「帖子」而无需中心化协调。
6
Show it running in production via AT Protocol/Bluesky examples — third-party feeds, teal.fm scrobbling, and cross-app GraphQL queries over the same records — proving 'everyone-app' beats 'everything-app.'
以 AT Protocol/Bluesky 的实例证明其已投入生产运行——第三方信息流、teal.fm 打卡、跨应用对同一记录做 GraphQL 查询——印证「万能生态」胜过「万能应用」。
03

Detailed Summary详细解读

Abramov opens with a nostalgic but load-bearing premise: files were designed so that what you create outlives the software you used to create it. A file format functions as an open API — any compliant app can read an SVG without asking Excalidraw's permission — which decouples creation from custody. He extends this intuition, usually confined to 'personal computing,' to ask why 'social computing' apps like Instagram or Reddit never inherited it: your follows and likes live trapped inside a company's database rather than in files you control.

He then proposes the thought experiment at the essay's core: a 'folder of everything,' a personal directory where every social action across every app — a Tumblr post, an Instagram follow, an HN upvote — exists as a file. Crucially this isn't an export or archive; it's the live source of truth, so deleting a file unfollows someone and creating three post-files cross-posts to three communities. Apps become responsive renderers of the folder rather than owners of a private cache.

To make this concrete, he walks through encoding a single tweet as a record, progressively stripping fields: author info is removed because it belongs in a separate profile file; reply/repost/like counts are removed because they're derived from other people's data, not the author's own. What remains — just text and createdAt — is the minimal, honest representation of what the user actually authored. This is the essay's methodological core: distinguishing what a user creates from what an app merely computes about them.

He then solves the naming and versioning problems familiar from any distributed system: record keys use clock-mixed timestamps to avoid collisions across devices, and lexicons (a custom schema language, since TypeScript and JSON Schema fall short) enforce format stability — new optional fields can be added, but a field's requiredness can never change, preserving forward and backward compatibility the way file-format versioning does.

The namespacing solution is the piece's most elegant move: rather than forcing every developer into a committee to agree on one universal definition of 'post,' collections are namespaced by reverse-domain (com.tumblr.post vs com.twitter.post), so divergent products can coexist without central coordination — and there's no 'lexicon police,' since apps always treat incoming records as untrusted input and validate on read, exactly like a POST body.

He closes with production evidence rather than speculation: a teal.fm scrobbling demo shows 678,850 plays even though the teal.fm product and API don't actually exist yet — anyone can write to its lexicon and any app can read it. Third-party Bluesky feeds like 'For You' by an independent developer become first-class citizens because, in the Atmosphere, 'third-party is first-party.' The argument lands on a memorable inversion: an everyone-app beats an everything-app.

文章开篇看似怀旧却是全文的地基:文件的设计初衷,就是让你创造的东西比创造它的软件活得更久。文件格式相当于一个开放 API——任何兼容应用都能读取 SVG,无需向 Excalidraw 申请权限——这就把「创作」和「保管权」彻底分开。Abramov 把这个通常只用于「个人计算」的直觉,延伸去质问为什么 Instagram、Reddit 这类「社交计算」应用从未继承它:你的关注和点赞被锁在公司数据库里,而不是你能掌控的文件中。

随后他抛出全文核心的思想实验:「万物文件夹」——一个个人目录,跨所有应用的每一次社交行为(Tumblr 发帖、Instagram 关注、HN 点赞)都作为文件存在其中。关键在于这不是导出或存档,而是实时的真实数据来源:删掉一个文件就等于取消关注,创建三个帖子文件就等于跨三个社区同步发帖。应用变成了这个文件夹的响应式渲染层,而不是私有缓存的所有者。

为了把这个概念落地,他具体推演如何把一条推文编码为记录,逐层剥离字段:作者信息被移除,因为它该存在独立的个人资料文件里;回复数、转发数、点赞数被移除,因为它们源自他人的数据,而非作者本人所写。剩下的只有 text 和 createdAt——这是对用户真正创作内容的最简、最诚实的表达。这正是全文的方法论核心:区分「用户创造的」和「应用围绕用户计算出来的」。

接着他解决了任何分布式系统都会遇到的命名与版本控制问题:记录键使用混入时钟的时间戳以避免跨设备冲突;词典(一种自创的模式语言,因为 TypeScript 和 JSON Schema 都不够用)保证格式的稳定——可以新增可选字段,但字段的「是否必需」属性永远不能改变,这样才能像文件格式版本迭代一样保持前后兼容。

命名空间的解法是全文最精巧的一招:不强迫每个开发者组成委员会去统一「帖子」的定义,而是用反向域名给集合分命名空间(com.tumblr.post 对比 com.twitter.post),让产品差异化的应用无需中心协调也能共存——也没有所谓「词典警察」,因为应用始终把收到的记录当作不可信输入,在读取时校验,就像处理 POST 请求体一样。

结尾没有停留在设想,而是给出生产环境的实证:teal.fm 打卡演示展示了 678,850 次播放记录,尽管 teal.fm 这个产品和 API 本身都还不存在——任何人都能写入它的词典,任何应用都能读取。独立开发者做的 Bluesky 第三方「为你推荐」信息流成了一等公民,因为在 Atmosphere 生态里「第三方即第一方」。全文落在一句令人难忘的反转上:万能生态胜过万能应用。

04

FAQ常见问答

Isn't this just RSS or an export feature under a new name?这不就是换了个名字的 RSS 或数据导出功能吗?

No — exports are snapshots; this folder is the live source of truth. Writing to it (e.g. deleting a follow-file) actually changes app state, unlike a one-way RSS feed or a backup archive.

不是——导出是快照,而这个文件夹是实时的真实数据来源。写入它(比如删掉一个「关注」文件)会真正改变应用状态,这和单向的 RSS 订阅或备份存档完全不同。

Who stops an app from writing garbage into another app's collection?谁来阻止一个应用往另一个应用的集合里写入垃圾数据?

Nothing prevents the write, same as nothing prevents renaming cat.jpg to cat.pdf. Every reading app treats incoming records as untrusted input, validates against its lexicon, and silently drops what fails.

没有任何机制阻止写入,就像没人能阻止你把 cat.jpg 改名成 cat.pdf。每个读取方都把传入记录当不可信输入,用自己的词典校验,校验失败就静默丢弃。

How do incompatible definitions of 'post' across apps get reconciled?不同应用对「帖子」互不兼容的定义要如何调和?

They mostly aren't, by design — collections are namespaced per app via reverse-domain names (com.tumblr.post vs com.twitter.post), so divergence is treated as a feature, not a bug requiring committee consensus.

设计上大多数情况就是不调和——集合按反向域名分应用命名空间(com.tumblr.post 对比 com.twitter.post),分歧被当作特性而非需要委员会统一的缺陷。

Can a lexicon change after real records exist against it?已有真实记录依赖某个词典之后,这个词典还能修改吗?

Only non-breaking additions — new optional fields are fine, but a field's required/optional status can never flip. Breaking changes require a whole new lexicon, mirroring how file-format versions are handled.

只能做不破坏兼容性的新增——加新的可选字段没问题,但一个字段「是否必需」的属性永远不能改变。破坏性变更必须新建一个词典,就像处理文件格式版本升级一样。

What actually stops one company from re-centralizing this ecosystem?到底是什么机制阻止某家公司重新把这个生态中心化?

The piece doesn't fully answer this — it shows technical portability (open lexicons, no API gatekeeping) but relies on continued developer goodwill and adoption momentum, not an enforcement mechanism, to keep power distributed.

文章对此没有给出完整答案——它展示的是技术层面的可迁移性(开放词典、无 API 守门),但维持权力分散实际依赖开发者持续的自愿参与与生态动能,而非某种强制机制。

05

In-depth Analysis · Pros & Cons深入解读 · 优缺点

Dan Abramov revisits the filesystem's oldest promise — that what you create outlives the tool you made it with — and asks why social apps abandoned it. He walks through AT Protocol's actual design, from JSON records to lexicons to relays, to show the promise restored.

Dan Abramov 重提文件系统最古老的承诺——你创造的东西应当比创造它的工具活得更久——并追问为什么社交应用抛弃了这一点。他逐层拆解 AT Protocol 的真实设计,从 JSON 记录到词典再到中继器,展示这一承诺如何被重新兑现。

Strengths亮点 / 优点
  • Concrete worked example
    具体的推演示例
    Rather than abstractly praising decentralization, Abramov encodes one real tweet step by step into a minimal record, making the abstract 'data ownership' claim tangible and falsifiable.
    Abramov 没有空泛地赞美去中心化,而是逐字段把一条真实推文推演成最简记录,让「数据所有权」这个抽象主张变得具体、可验证。
  • Production evidence, not just theory
    生产环境实证而非纯理论
    The teal.fm and 'For You' feed examples are running systems, not thought experiments — showing an app whose API doesn't exist yet still has real scrobble data because the lexicon alone was enough.
    teal.fm 和「为你推荐」信息流的例子是正在运行的系统,而非思想实验——一个 API 尚不存在的应用照样有真实打卡数据,因为光有词典就足够了。
  • Honest about the file-format analogy's limits
    对文件格式类比的局限保持诚实
    He explicitly flags that JSON's simplicity was a reluctant compromise, not an ideal, and that a custom schema language (lexicons) was needed precisely because existing tools (TypeScript, JSON Schema, RDF) fell short.
    他坦承 JSON 的简洁是不情愿的妥协而非理想选择,并且承认正因为现有工具(TypeScript、JSON Schema、RDF)都不够用,才不得不设计一套自定义模式语言(词典)。
  • Reframes interoperability as competitive advantage
    把互操作性重构为竞争优势
    The 'third-party is first-party' framing turns what critics call fragmentation risk into a design feature — divergent apps coexisting on shared data is presented as healthier than forced consensus.
    「第三方即第一方」的框架把批评者眼中的碎片化风险,重新塑造成设计特性——分歧的应用共存于同一份数据之上,被认为比强制统一更健康。
Limits & Critiques局限 / 批评
  • No treatment of moderation or abuse
    未触及审核与滥用问题
    A system where anyone can write to shared collections raises obvious spam/abuse-at-scale questions that the piece never addresses — 'apps validate and drop bad records' doesn't cover coordinated harassment or moderation at network scale.
    任何人都能写入共享集合的系统必然带来大规模垃圾内容和滥用问题,全文对此只字未提——「应用校验并丢弃无效记录」根本无法应对协同骚扰或网络规模的内容审核。
  • Recentralization risk understated
    对重新中心化风险轻描淡写
    The essay shows technical decentralization is possible but doesn't grapple with economic incentives — hosting/relay infrastructure (like Bluesky's own PDS) could still consolidate into a de facto monopoly even with open lexicons.
    文章证明了技术上的去中心化是可行的,但没有正视经济激励问题——托管/中继基础设施(如 Bluesky 自家的 PDS)即便词典开放,仍可能事实上垄断为寡头。
  • Small, self-selected examples
    举例样本小且带自选偏差
    teal.fm and Blento are hobby projects with tiny user bases; the piece doesn't address whether this pattern holds at Instagram/TikTok scale with billions of records and adversarial actors.
    teal.fm 和 Blento 都是用户量很小的业余项目;文章没有讨论这套模式在 Instagram、TikTok 级别的十亿级记录和对抗性行为者面前是否依然成立。
  • Performance and query cost glossed over
    性能与查询成本被一笔带过
    Rebuilding a queryable database by replaying every user's repo (the 'Tap' example) is presented as neat but not analyzed for cost or latency at internet scale — a real constraint for any app trying to serve millions of users this way.
    通过回放每个用户仓库来重建可查询数据库(「Tap」示例)被描述得很轻巧,却没有分析在互联网规模下的成本或延迟——这对任何想用这种方式服务数百万用户的应用都是真实约束。
Bottom line
总评

Worth reading for anyone building or evaluating decentralized social infrastructure — Abramov makes AT Protocol's design legible through a filesystem analogy that actually clarifies rather than just gestures at 'openness.' Read it as a design walkthrough, not a risk assessment: moderation, abuse-at-scale, and infrastructure-consolidation questions are left for elsewhere.

适合任何正在构建或评估去中心化社交基础设施的人一读——Abramov 用文件系统类比让 AT Protocol 的设计变得真正清晰,而不只是空喊「开放」。但应当把它当作设计讲解而非风险评估来读:审核、大规模滥用、基础设施再中心化等问题,本文并未触及,需另寻他处。

06

Excerpt原文节选

This is a short excerpt, not the full piece — the complete essay belongs to its original author; please read it in full at the link above.

以下仅为节选,并非全文——完整文章版权归原作者所有,请点击上方链接阅读全文。

Remember files?

You write a document, hit save, and the file is on your computer. It’s yours. You can inspect it, you can send it to a friend, and you can open it with other apps.

Files come from the paradigm of personal computing .

What do files have to do with social computing?

Historically, not a lot— until recently.

But first, a shoutout to files.

Files, as originally invented, were not meant to live inside the apps.

Since files represent your creations, they should live somewhere that you control. Apps create and read your files on your behalf, but files don’t belong to the apps.

Files belong to you—the person using those apps.

Apps (and their developers) may not own your files, but they do need to be able to read and write them. To do that reliably, apps need your files to be structured. This is why app developers, as part of creating apps, may invent and evolve file formats .

[…the source continues — read the rest at the link above]

[……原文更长,完整内容请点击上方链接阅读]

Here’s my scrobble showing up:

还记得文件吗?

你写完文档,点击保存,文件就存进了你的电脑。它属于你。你可以查看它,可以发送给朋友,也可以用其他应用打开它。

文件源自 个人计算 范式。

然而,本文并非探讨个人计算。我想谈论的是 社交计算 ——诸如 Instagram、Reddit、Tumblr、GitHub 和 TikTok 这类应用。

文件与社交计算有什么关系?

历史上,情况并非如此——直到最近才有所改变。

不过首先,要特别感谢文件。

为什么文件很棒

文件最初的设计初衷,并非要让它们存活在应用程序 内部 。

既然文件代表着 你的 创作成果,它们就应该存放在 你 掌控的地方。应用程序会代表你创建和读取文件,但文件并不 属于 应用程序。

文件属于你——使用这些应用的人。

应用程序(及其开发者)可能并不拥有你的文件,但它们确实需要能够 读取和写入 这些文件。为了可靠地实现这一功能,应用程序需要你的文件具备结构化特征。正因如此,应用程序开发者在创建应用的过程中,可能会发明并演进 文件格式 。

文件格式如同语言。一个应用程序可能“支持”多种格式。单一格式则可能被众多应用程序所识别。 应用程序与格式之间存在多对多关系。文件格式使不同应用程序能够在互不了解的情况下协同工作。

请考虑以下 .svg :

SVG 是一种开放规范。这意味着不同开发者就如何读写 SVG 达成了共识。我使用 Excalidraw 创建了这个 SVG 文件,但同样可以使用 Adobe Illustrator 或 Inkscape 来完成。 您的浏览器已具备显示此 SVG 的能力。它无需调用任何 Excalidraw API,也无需向 Excalidraw 请求权限即可呈现该文件。创建 SVG 的具体应用程序并不影响显示效果。

文件格式即为 API。

当然,并非所有文件格式都是开放的或有文档记录的。

某些文件格式具有特定应用程序专属性,甚至像 .doc 这样属于专有格式。然而,尽管 .doc 格式未公开文档,这并未阻止有动力的开发者对其进行逆向工程,进而开发出更多能够读写 .doc 格式的软件:

文件范式再下一城。

[…the source continues — read the rest at the link above]

[……原文更长,完整内容请点击上方链接阅读]

万物生态系统让万事皆可成。