摘要

Webmention 是一种简单的方式,当你在你的网站上提到某个 URL 时,可以通知该 URL。从接收方的角度来看,它是一种请求当其他网站提及它时收到通知的方式。

作者说明

本节为非规范性内容。

本规范由IndieWeb 社区贡献给 W3C。关于 Webmention 的更多历史和演变,可以在 IndieWeb wiki 上查阅。

本文件状态

本节描述了本文件在发布时的状态。其他文件可能会取代本文件。当前 W3C 发布的规范列表和本技术报告的最新修订版可在 W3C 技术报告索引 https://www.w3.org/TR/ 查阅。

本文件由 社交网络工作组 作为推荐标准发布。如果你希望对本文件提出意见,请发送至 public-socialweb@w3.org订阅存档)。欢迎所有意见。

请参阅工作组的 实现报告

本文件已由 W3C 成员、软件开发者及其它 W3C 组织和相关方评审,并作为 W3C 推荐获得主任认可。该文件为稳定文档,可以作为参考资料或被其他文档引用。W3C 的角色是提升规范关注度,促进它的广泛部署,从而增强 Web 的功能与互操作性。

本文件由一支遵循 2004年2月5日 W3C 专利政策 运作的团队制作。W3C 维护了一份与小组成果相关的专利披露公开列表;该页面还包括披露专利的说明。任何人如果实际知晓某项专利且认为其包含 必要权利要求 ,则必须根据 《W3C 专利政策》第6节 披露相关信息。

W3C 预计本推荐规范中的功能不会受 Fetch 变动影响。

本文件依据 2015年9月1日 W3C 流程文件 管理。

1. 简介

Webmention 是一种用于通知另一个 URL 被某个 URL 链接所引用的机制。例如,Alice 在她的博客上写了一篇有趣的文章,Bob 随后在他自己的网站上写了一篇回应,并链接回 Alice 的原始帖子。Bob 的发布系统发送一个 Webmention 给 Alice,通知 Alice 她的文章得到了回应,Alice 的系统可将该回应显示为原始文章下的评论。

发送 Webmention 并不局限于博客文章,也可以用于其它类型的内容和回复。例如,回复可以是某个事件的 RSVP、对他人文章的“点赞”、对他人文章的“收藏”等等。Webmention 支持在不同网站之间进行此类互动,实现分布式的社交网络。

1.1 社交网络工作组

本节为非规范性内容。

Webmention 是社交网络工作组开发的多个相关规范之一。对替代方案或补充协议感兴趣的实现者应首先阅读概览文档 [social-web-protocols]。

1.2 背景

本节为非规范性内容。

Webmention 规范最初是 [Pingback] 规范的简化版本。Pingback 需要用 XML-RPC 方式发送源 URL 和目标 URL,而 Webmention 将之简化为表单编码,这样可以更容易地在 HTML 表单中使用,也便于利用现有工具处理表单编码数据,同时避免了 XML-RPC 可能带来的系统代码泄露问题。

Webmention 随后进一步规范了发送和验证请求的细节,并扩展支持当源文档被更新或删除时发送通知。更多信息可参阅 IndieWeb wiki 上的 Webmention 常见问题

1.3 概览

本节为非规范性内容。

典型的 Webmention 流程如下:

  1. Alice 在她的网站发布了一些有趣的内容(该站点支持接收 Webmention)。
  2. Bob 看到该内容后,在自己的网站上发表评论,并链接回 Alice 的原始文章。
  3. 通过 Webmention,Bob 的发布系统自动通知 Alice 的服务器有一篇 Bob 的文章链接了她的帖子。
  4. Alice 的发布系统验证 Bob 的文章确实提及了她的文章,然后将在自己站点上显示该消息。

1.4 协议摘要

本节为非规范性内容。

Webmention 消息从源 URL 发送到目标 URL,以通知目标其被源 URL 提及。

  1. 用户 Aaron 在博客上发文。
  2. 用户 Barnaby 在自己的博客发表一篇文,链接到 Aaron 的文章。
  3. 发布后(即已拥有 URL),Barnaby 的服务器在发布流程中发现了对 Aaron 帖子的引用。
  4. Barnaby 的服务器在 Aaron 的文章上执行 Webmention 端点发现(如未找到端点,流程停止)。
  5. Barnaby 的服务器向 Aaron 文章的 Webmention 端点发送通知,请求体内容为:
    • source 设置为 Barnaby 文章的永久链接
    • target 设置为 Aaron 文章的永久链接
  6. Aaron 的服务器接收 Webmention 消息。
  7. Aaron 的服务器校验该 Webmention 内 target 是否为其博客的有效永久链接(否则终止)。
  8. Aaron 的服务器检索 Webmention 的 source,跟随重定向 [FETCH],校验该页面是否实际包含对 target 的超链接,不存在则终止。

2. 一致性

本文件中的 "必须"、"禁止"、"要求"、"应当"、"不应"、"推荐"、"不推荐"、"建议"、"可以" 以及 "可选",需按照 [RFC2119] 的定义进行解释。

2.1 一致性类别

Webmention 实现可分为发送端或接收端。本节描述这两类的符合性标准。

以下是已知的 Webmention 实现类型。

发送端

Webmention 发送端指能够发送 Webmention 信息的实现。发送端要发送 Webmention,首先必须有一个可以被接收端访问的源 URL。

Webmention 发送端的符合性标准在发送 Webmention部分描述。

如下为部分常见的 Webmention 发送端类型:

接收端

Webmention 接收端指能够为一个或多个目标 URL 接收 Webmention,并用相关的 Webmention 端点进行公告的实现。为能收到 Webmention,需有一个已声明 Webmention 端点的 URL,但该 URL 不一定属于接收端实现本身,也可能来自另一个系统或域名。

Webmention 接收端的符合性标准在接收 Webmention部分描述。

如下为部分常见的 Webmention 接收端类型:

2.2 测试套件与报告

请在 http://webmention.net/implementation-reports/ 提交你的实现报告,具体说明见页面内容。实现报告模板参考 webmention.rocks 提供的测试。

webmention.rocks 提供了许多可用于现场测试实现的测试用例,也是开发 Webmention 实现时非常实用的工具,因为该站点会在遇到错误时详细反馈响应内容。

3. Webmention 协议

本规范中的 HTML 和 HTTP 链接关系均采用 [HTML5] 定义的 link rel 注册表。

3.1 发送 Webmention

3.1.1 创建提到目标的源文档

Webmention 消息从源 URL 发送到目标 URL,通知目标其被源 URL 所提及。在 Webmention 发送前,必须存在一个“源” URL,通常是博客文章,也可以是其它类型的内容。

例如,https://waterpigs.example/post-by-barnaby 的页面 HTML 可包含如下链接到 Aaron 帖子的内容:

Example 1
<!doctype html>
<html>
  <body>
    <a href="https://aaronpk.example/post-by-aaron">This is a great post</a>
  </body>
</html>

3.1.2 发送方发现接收方 Webmention 端点

发送方必须获取目标 URL(并跟随所有重定向 [FETCH]),并检查 HTTP Link 头 [RFC5988] 是否包含 rel="webmention"。如果文档内容类型为 HTML,则发送方必须查找 rel="webmention" 的 HTML <link><a> 元素。如三种方式均出现,则优先顺序为第一个 HTTP Link,其次是文档顺序中的第一个 <link><a>。发送方必须支持所有三种方式并按上述顺序回退。

端点可以是相对 URL,此时发送方必须用 [URL] 规范把该端点补全为相对于目标 URL 的绝对路径。

端点可以含查询参数,这些参数必须保留为查询参数,禁止发送到 POST 请求体内。

发送方可以先发 HTTP HEAD 请求 [RFC7231] 检查 Link 头,再发 GET 请求。

Example 2
GET /post-by-aaron HTTP/1.1
Host: aaronpk.example
HTTP/1.1 200 OK
Link: <http://aaronpk.example/webmention-endpoint>; rel="webmention"

<html>
<head>
...
<link href="http://aaronpk.example/webmention-endpoint" rel="webmention" />
...
</head>
<body>
....
<a href="http://aaronpk.example/webmention-endpoint" rel="webmention">webmention</a>
...
</body>
</html>

发送方可以自定义 HTTP User Agent [RFC7231],在获取目标 URL 时指明此次请求为 Webmention 发现的一部分,推荐在 User Agent 字符串中包含 "Webmention" ,方便对方了解请求来源。

3.1.3 发送方通知接收方

发送方必须向 Webmention 端点发送 x-www-form-urlencoded [HTML5] 表单数据,包含 sourcetarget 两个参数。其中 source 为包含链接的发送方页面 URL,target 为被链接的目标页面 URL。

如 Webmention 端点 URL 自身含有查询参数,则这些参数必须保留,并禁止随 POST 请求体发送。

Webmention 端点将校验并处理请求,并返回 HTTP 状态码 [RFC7231]。通常返回 202 Accepted201 Created,表示请求已入队,异步处理,防止 DoS 攻击。如果响应码为 201,Location 头会指明可用于查询请求状态的 URL。

任何 2xx 响应码必须视为请求成功。

Example 3
POST /webmention-endpoint HTTP/1.1
Host: aaronpk.example
Content-Type: application/x-www-form-urlencoded

source=https://waterpigs.example/post-by-barnaby&
target=https://aaronpk.example/post-by-aaron


HTTP/1.1 202 Accepted

3.1.4 已更新文章的 Webmention 发送

若源 URL 已被修改,发送方推荐重新发送所有已发 Webmention(包括对已移除的链接也重新发送),并对新增链接也推荐发送 Webmention。

这样,Webmention 接收方可更新对源文档的显示,或通知收件人其被提及内容已变动。

当文章更新时重发 Webmention,发送方必须为每个目标 URL 重新发现 Webmention 端点,以防对方已更新端点。

如果源页面上显示了对目标的回复(如作为评论显示),则发送方也应视为源页面变动并推荐重新发送所有已发 Webmention。

3.1.5 已删除文章的 Webmention 发送

若源 URL 被删除,发送方推荐为该 URL 返回 HTTP 410 Gone 状态码,并推荐以“墓碑”方式显示(即所有属性内容清空、或主内容如名称/正文字段改为“Deleted”)。随后,发送方推荐重新发送所有曾为该文档发出的 Webmention。

如此 Webmention 接收端支持删除,则可自动移除已显示过的 Webmention;不支持删除的仍能通过内容变动适当回退。

3.2 接收 Webmention

接收到带 sourcetarget 参数的 POST 请求时,接收方推荐校验参数(见下文请求校验),然后推荐将请求异步队列处理,以防止 DoS 攻击。根据处理方式,请求响应有三种可能结果:

接收方若为请求分配了状态页,可供发送方查询,则必须返回 HTTP 201 Created 状态,并在 Location 头中附上该状态 URL。响应体可以带内容。

Example 4
HTTP/1.1 201 Created
Location: http://aaronpk.example/webmention/DEhB9Jme

如果接收方异步处理请求但未返回状态 URL,则必须返回 HTTP 202 Accepted,响应体可以含文本,推荐为人类可读内容。

Example 5
HTTP/1.1 202 Accepted

若接收方选择同步处理并同步校验(不推荐),则请求成功时必须返回 200 OK 状态。

3.2.1 请求校验

接收方必须检查 sourcetarget 是否为有效 URL [URL],并且协议方案为接收方支持的类型(通常为 http 或 https)。

sourcetarget 相同,接收方必须拒绝请求。

接收方推荐校验 target 是否为自身可接收 Webmention 的有效资源。此校验推荐同步执行,以便在深入验证前快速拒绝无效请求。“有效资源”含义由实现决定,比如某些可接收多域 Webmention,某些仅限本域。

注意 target URL 可带片段标识符,若接收方限制可接收的 URL,应在校验时忽略片段部分。

3.2.2 Webmention 验证

Webmention 验证推荐异步处理,以防止 DoS 攻击。

如果接收方准备对 Webmention 进一步处理(如将其显示为评论、增加“点赞”计数、通知作者等),其必须对 source 执行 HTTP GET(跟随重定向,建议限制重定向次数),确认页面是否实际包含对 target 的引用。接收方推荐带 Accept 头声明可接受内容类型。

接收方推荐按媒体类型规则判断 source 是否提及 target。例如在 [HTML5] 文档中查找 <a href="*"><img href="*"><video src="*"> 等链接。JSON ([RFC7159]) 文档则查找属性值全等于 target 的项。纯文本情况下查找字符串匹配。其它类型由实现自定。只有 source 文档内容和 target URL 完全一致时,才视为有效 Webmention。

至此,接收方可以将 source 页内容连同其它采集到的数据发布到目标页或其它页面,例如将 source 内容作为评论显示,或在“点赞者”列表显示作者头像等。

二次发布 source 页内容时应注意不要无意间扩大其可见性。例如,若源文档仅向部分用户可见,在转载时应确保不向公众开放。源文档可通过认证或仅允许局域网访问来受限,如果接收方也在同一网络或有权限也需遵守此规则。

3.2.3 错误响应

若 Webmention 请求因发送方自身原因失败,必须返回 400 Bad Request 状态,可可以在响应体内提供错误描述。

同步校验 source 前可返回这些发送方相关错误:

  • 指定 target URL 未找到。
  • 指定 target URL 不接受 Webmention。
  • source URL 语法非法或协议不支持(如 mailto:)。

获取 source 内容后可能出现的错误:

  • source URL 未找到。
  • source URL 未包含对 target 的链接。

如因接收方服务器问题 Webmention 失败,推荐返回 500 Internal Server Error,并可以在响应体内附错误描述。

3.2.4 更新已存在的 Webmention

如果接收方之前收到过相同 sourcetarget 的 Webmention,

  • 若两步校验都成功,推荐更新当前 Webmention 的 source 数据。
    • 若实现支持 Webmention 更新(即“Webmention 更新实现”),则必须支持以 source 主体对象属性为单位的数据更新(如页面的 [h-entry] 属性)。
      • Webmention 更新实现可以支持对子属性(如嵌套 h-entry 评论)的数据更新。建议实现时参考 [Salmention] 扩展。
  • 如在第2步(GET source)返回 410 Gone,或为 200 OK 但未找到 target,则推荐删除已有 Webmention 或标记为删除。
  • Webmention 处理推荐幂等:即多次收到相同 sourcetarget 的 Webmention、内容不变时只算一次回复。

4. 安全性注意事项

4.1 防止滥用

4.2 限制 GET 请求

Webmention 协议依赖发送端发起 GET(或 HEAD)请求来发现接收端的 Endpoint,然后接收端又会对发送端的网页发起 GET 请求用于校验链接。这意味着发送端可以导致接收端对任意 URL 发起 GET 请求,存在潜在 DoS 风险。

接收端可以在校验链接时首先发 HTTP HEAD 请求,初步检查内容类型、长度或相关 Header,再决定是否进行完整 GET 请求。

接收端推荐限制HTTP重定向次数,例如最多跟踪20次,以防因发送端连续重定向导致陷入循环。

接收端推荐限制抓取未经验证 source URL 时的数据量和时长。例如 source URL 超过5秒无响应可视为失败,同样可只抓取页面的前1MB内容,一般合理的 HTML 或 JSON 页面不会超过此大小。

4.3 避免发送 Webmention 到本地地址

在发送方发现接收方 Webmention endpoint 时,几乎没有理由将 endpoint 设置为 localhost 或其它 loopback 地址。如果发送方有监听本地服务且未设鉴权,恶意 Webmention 接收端可能构造一个 endpoint 导致发送方对自身本地接口发起任意 POST 请求。

在发现步骤中,如果 endpoint 是 localhost 或回环IP(127.0.0.0/8),发送方不应向其发送 Webmention。

4.4 跨站请求伪造

本规范未对包含额外 Header 或参数(如认证 Header、会话 Cookie)的 Webmention 请求做特殊处理。但如 Webmention endpoint 接受含额外 Header 的请求,应推荐防范 CSRF 攻击。其中一种方式是在 endpoint 的查询参数里加入 CSRF token,使得 Webmention 发送方在发现 endpoint 时一并得到该 token。

例如,目标 URL 可声明一个带 CSRF token 的 Webmention endpoint:

Example 6
GET /post-by-aaron HTTP/1.1
Host: aaronpk.example
HTTP/1.1 200 OK
Link: <http://aaronpk.example/webmention?csrf=Q0NTVhYjI0NTVkNDA3M>; rel="webmention"

Webmention endpoint 处理请求时,可先校验 CSRF token 再继续处理其它逻辑。

4.5 限制对受保护资源的访问

攻击者可以声明一个指向任意 URL 的 Webmention endpoint。所以如果你在防火墙内服务器或有权限访问内部资源的环境中安装 Webmention 发送端软件,需要注意,攻击者可能导致服务器对内网服务器发POST请求。推荐采取措施防止访问受保护资源,可以:

4.6 安全与隐私评估

下列问题基于自我评估问卷:安全与隐私([security-privacy-questionnaire]),简要总结本规范涉及的安全与隐私注意事项。

本规范是否涉及个人身份信息?
Webmention 唯一可能涉及个人信息的是源 URL 和目标 URL。
本规范是否涉及高价值数据?
否,本规范不涉及认证或其它凭据。
本规范是否为 origin 引入了可跨会话持久化的新状态?
本规范是否在 web 上暴露了持久性跨域状态?
Webmention 接收端可能会创建一个临时资源,存储有关 Webmention 请求的信息。
本规范是否向某 origin 暴露了其当前不可访问的其它数据?
本规范是否允许新的脚本执行/加载机制?
本规范是否允许 origin 访问用户位置信息?
本规范是否允许 origin 访问用户设备上的传感器?
本规范是否允许 origin 访问用户本地计算环境相关信息?
本规范是否允许 origin 访问其它设备?
本规范是否允许 origin 对用户代理原生 UI 有一定控制?
本规范是否向 web 暴露临时标识符?
本规范是否区分一方/三方场景行为?
本规范在用户代理隐私模式下应如何工作?
Webmention 不维护任何状态,隐身模式下无特殊考虑。
本规范是否将数据写入用户本地设备?
本规范是否允许降低默认安全属性?

5. 其它注意事项

5.1 从非 HTML 内容发送 Webmention

如果你的源文档不是 HTML(如 PDF),或因受限无法直接用 HTTP GET 请求获取原文(如需付费墙或点击协议),你需建立一个 HTML “落地页”,其中列出所有目标链接。创建好 HTML 落地页后即可用其 URL 作为 Webmention 的 source。这能让接收端有个可抓取 URL 校验对目标的链接,同时避免将完整源文档公开。

制作 HTML 落地页还能提升你的内容被外部引用的频率,为受限内容(如论文)提供一个适合引用的页面。论文类内容建议 HTML 页直接展示参考文献列表,以便用作 Webmention 的 target URL。

5.2 为大数据集发送 Webmention

如果你的源文档规模非常大(如包含上千条记录的大表HTML页,或超大JSON文件),不建议直接用其作为 source 发送 Webmention。这样可能导致接收端下载整个数据集,消耗大量带宽,或者接收端只下载一部分内容而引发校验失败。如果接收端对外转发你的 source 链接,其他访客也可能意外下载完整大数据集。

如网页分页显示数据集是最佳实践,发送 Webmention 时,大数据应仅从较小数据页发起;HTML 可直接用分页后的页面作 source,JSON 则推荐为每页单独设一个较小的 json 文档并用其做 source。

5.3 发现时遵守缓存头

执行 Webmention 发现 时,发送端推荐遵守目标 URL 返回的 HTTP 缓存头 [RFC7234],避免高于Header指定频率地抓取同一目标 URL。

6. IANA 相关事项

IANA 已根据 [RFC5988] 第6.2.1节,登记了如下链接关系类型:

关系名称:
webmention
描述:
用于标识支持 Webmention 协议的目标 URI,使发表内容时可通过该端点通知目标资源被提及。
参考:
W3C Webmention 规范 (http://www.w3.org/TR/webmention/)
备注:
这是一种类似 Refback、Trackback、Pingback 的“Linkback”机制,但其协议不同,因此应以独立的 link relation 方式声明可发现性。

A. 表单编码属性的 URI

如你实现中希望将 sourcetarget 参数视为 URI,可在参数前添加 http://www.w3.org/ns/webmention# 前缀。

B. 扩展

本节为非规范性内容。

下列 Webmention 扩展规范已在互联网上有2个及以上互操作实现,特此列出:

B.1 Vouch(担保)

[Vouch] 协议是 Webmention 的一个反垃圾邮件扩展。

B.2 Salmention

[Salmention] 协议是 Webmention 的一个扩展,用于上游分发评论与其它交互行为。

B.3 Private Webmention

[Private-Webmention] 协议是支持受权限控制的文章发送和验证 Webmention 的扩展。

C. 资源

本节为非规范性内容。

C.1 文章

本节为非规范性内容。

你可以在 IndieWeb wiki 上查阅 Webmention 相关文章

C.2 实现

本节为非规范性内容。

你可以在 webmention.net 查阅 Webmention 实现列表

D. 致谢

编辑特别感谢 Sandeep Shetty 对 Webmention 规范原始草案的贡献。

此外,编辑还要感谢 IndieWeb 社区和其他实现者的支持、鼓励和热情,包括但不限于:Amy Guy、Benjamin Roberts、Ben Werdmüller、Dave Wilkinson、Rob Sanderson 和 Tantek Çelik。

E. 变更日志

本节为非规范性内容。

E.1 2016年11月1日 PR 到 REC 的变动

F. 参考文献

F.1 规范性引用

[FETCH]
Anne van Kesteren. WHATWG. Fetch 标准。实时规范。URL: https://fetch.spec.whatwg.org/
[HTML5]
Ian Hickson;Robin Berjon;Steve Faulkner;Travis Leithead;Erika Doyle Navara;Theresa O'Connor; Silvia Pfeiffer。W3C。HTML5。2014年10月28日。W3C 推荐。URL: https://www.w3.org/TR/html5/
[RFC2119]
S. Bradner。IETF。在 RFC 中用作需求级别指示的关键词。1997年3月。最佳当前实践。URL: https://tools.ietf.org/html/rfc2119
[RFC5988]
M. Nottingham。IETF。Web 链接。2010年10月。建议标准。URL: https://tools.ietf.org/html/rfc5988
[RFC7231]
R. Fielding(编辑);J. Reschke(编辑)。IETF。超文本传输协议(HTTP/1.1):语义与内容。2014年6月。建议标准。URL: https://tools.ietf.org/html/rfc7231
[URL]

注:URL 可在不同上下文中以多种方式使用。为生成严格的 URL,建议参考 [RFC3986] 和 [RFC3987]。URL 规范定义了 URL 一词、相关算法以及用于构造、解析和解析(resolve)URL 的 API。开发者建议关注 https://url.spec.whatwg.org/ 追踪最新进展。

需要注意的是,Web 浏览器与 HTML 外的软件栈在处理 URL 时方式不尽相同。虽然不会采纳破坏现有 Web 内容的 URL 处理变更,但部分 URL 行为因此为实现自定义(如 file: 解析或不符 RFC3986/3987 的语法操作)。

Anne van Kesteren. WHATWG。URL 标准。持续更新规范。URL: https://url.spec.whatwg.org/

F.2 补充性引用

[CSRF]
OWASP。跨站请求伪造。实时文档。URL: https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)
[Pingback]
Stuart Langridge;Ian Hickson。hixie.ch。Pingback 1.0。稳定规范。URL: http://www.hixie.ch/specs/pingback/pingback
[Private-Webmention]
Aaron Parecki。IndieWeb。Private Webmention。实时规范。URL: https://indieweb.org/Private-Webmention
[RFC7159]
T. Bray(编辑)。IETF。JavaScript 对象表示法(JSON)数据交换格式。2014年3月。建议标准。URL: https://tools.ietf.org/html/rfc7159
[RFC7234]
R. Fielding(编辑);M. Nottingham(编辑);J. Reschke(编辑)。IETF。超文本传输协议(HTTP/1.1):缓存。2014年6月。建议标准。URL: https://tools.ietf.org/html/rfc7234
[Salmention]
Ben Roberts;Tantek Çelik。IndieWeb。Salmention。实时规范。URL: https://indieweb.org/Salmention
[Vouch]
Aaron Parecki;Tantek Çelik。IndieWeb。Vouch。实时规范。URL: https://indieweb.org/Vouch
[XSS]
OWASP。跨站脚本攻击。实时文档。URL: https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)
[h-entry]
Tantek Çelik。microformats.org。h-entry。实时规范。URL: http://microformats.org/wiki/h-entry
[security-privacy-questionnaire]
Mike West。W3C。自我评估问卷:安全与隐私。2015年12月10日。W3C 注记。URL: https://www.w3.org/TR/security-privacy-questionnaire/
[social-web-protocols]
Amy Guy。W3C。社交网络协议。2016年11月2日。W3C 工作草案。URL: https://www.w3.org/TR/social-web-protocols/