product update阅读约 12 分钟

Clip 把网页变成一条摘要已经写好的笔记。从今天起,它对每一个 Telli.sh 账号开放

Clip 不只是把网页存起来,而是把它变成一条带 AI 写好的标题和一句话摘要的 Telli.sh 笔记。它上线时被藏在管理员开关后面,于是两个分析计数器一次都没有跳过。现在这道闸门拆掉了:免费账号每天有 30 次保存和 10 次 AI 摘要;浏览器扩展 1.18 版新增了右键的 Save to Telli.sh,用一枚除了保存剪藏之外什么都做不了的令牌完成认证。

K
Ken Jo
#clip#web-clipper#browser-extension#product-update#api-tokens#privacy

有一类 bug 是任何测试套件都抓不到的:功能好好地跑着,可谁也够不着它。

Clip 几周前就已经完工。弹窗通过 POST /v1/clip 保存,用页面公开的 meta 标签填好链接卡片,生成一句话 AI 摘要,让笔记缓存失效,并且早就分得清「已保存,但你的摘要配额用完了」和「这次失败了」。这些全都在正常工作。而在 PostHog 里,它上报的两个事件——clip_openedclip_created——从未触发过。不是很少,是零。

原因是前端的三行代码。侧边栏按钮和弹窗都被 user.is_master 挡住,按钮上还挂着一枚琥珀色的 Admin preview 徽章。后端根本没有按 is_master 设限,它执行的是按套餐计算的每日配额,而那才是限制该待的地方。这个功能不是没人用,是没人能用到。

从 2026 年 9 月 5 日的提交 64852ac 起,条件只剩下一句「是否已登录」。这是一篇产品公告,所以它按设计就是以产品为中心的:Clip 做什么,会花掉你多少额度,浏览器扩展会发送什么,以及它刻意从不读取什么。

TL;DR

  • Clip 对每一个已登录账号开放。 侧边栏按钮已于 2026 年 9 月 5 日摘掉管理员徽章。
  • 限制是每日配额,不是一道闸门。 免费账号每个 UTC 日有 30 次保存和 10 次 AI 摘要;plus、pro、pro+ 在此基础上往上走。确切数字见下表。
  • 摘要配额用完,不会让你丢掉剪藏。 链接和它的元数据照常保存,跳过的只有摘要那一步,而且应用会明说。
  • 浏览器扩展可以保存你当前打开的页面。 「Save to Telli.sh」出现在任意 http(s) 页面的右键菜单里,你选中的内容会一并带走。1.18 版在本文发出时正在 Chrome 应用商店审核中,还装不了。
  • 扩展用一枚只能保存剪藏的令牌来认证。 它读不了你的笔记,改不了你的账号,碰不到账单,也签不出另一枚令牌。密钥只显示一次,而且你随时可以吊销。
  • 扩展读取的,是页面本来就展示给你看的东西。 标题、canonical 链接、公开的 og:/twitter: meta,以及你选中的文字。不包括正文。没有你的点击,什么都不会离开浏览器;没有保存令牌,那个菜单项什么也不做。

给一个 URL,Clip 到底做了什么

从侧边栏打开 Clip,粘贴一个 URL,弹窗会调用 POST /v1/clip/metadata。这个端点抓取页面的 HTML,只读取其中公开的 meta 标签:og:titleog:descriptionog:imageog:site_namearticle:authorarticle:published_time,以及 <link rel="canonical">。标题、描述、站点和图片会带着内容返回。若抓取失败,弹窗会告诉你,并且仍然让你把链接存下来,站点名的位置由主机名顶上。

然后你保存,Clip 就变成一条笔记。不是附件,也不是躺在另一个列表里的书签,而是一条 note_type="clip" 的笔记,和其他所有笔记一起待在全部笔记里,用同一套机制搜索、归档、分享和导出。源 URL 和整张链接卡片都保留在笔记的上下文中,出处不会被摘要盖掉。

只要有可供概括的内容——一段描述、你选中的文字、你粘贴的备注——通用摘要就会运行,并把一句话摘要写到笔记上。那就是你在列表里标题下方看到的那一行。

Telli.sh 全部笔记列表中的三条网页剪藏:没有摘要行的 Hacker News,以及各自下方带一句话摘要的 Fetch API Overview and Practical Considerations 和作为 AI 驱动开发平台的 GitHub

2026 年 9 月 5 日保存到一个生产账号的三条剪藏,和普通笔记并排待在全部笔记里。两条文章剪藏带着 AI 写的标题和一句话摘要。Hacker News 首页不发布 description meta,当时也没有选中文字,于是没有任何可概括的东西,它保留了自己的标题,也没有摘要行。当 Clip 手上没有素材时,它宁可什么都不说,也不会编一句出来。

最后这个细节正是整个功能底下的设计规则,值得单独讲一句:AI 生成的内容永远不会取代原件。 源 URL、站点自己的元数据、你提供的任何文字都会保留;摘要是叠在上面的派生数据。就算摘要写错了或者没用,你真正保存下来的东西依然在那里。

限制是每日配额,而且它是唯一的限制

Clip 没有套餐闸门,只有额度。

套餐每天保存次数每天 AI 摘要次数
Free3010
Plus15050
Pro500150
Pro+2,000500

取自 backend/config.py 的默认值(CLIP_SCRAPE_DAILY_QUOTA_*CLIP_SUMMARY_DAILY_QUOTA_*),2026 年 9 月 5 日读取。

配额是两个而不是一个,而且它们被刻意设计成以不同方式失败。保存次数用完,保存会被拒绝——服务器返回 403,附带结构化的 clip_scrape_quota_exceeded 代码和重置日期。摘要 次数用完,剪藏照样保存,跳过的只是生成摘要这一步,应用会原原本本地告诉你:「剪藏已保存。今天的 AI 摘要配额已用完。」

这种不对称是有意为之。保存一个链接很便宜,而且那本来就是你想要的东西;贵的是概括。仅仅因为语言模型被限流,就丢掉一个你打算留下的页面,是一桩荒唐的交易,所以我们不做这笔交易。

计数器就是一个朴素的 UTC 日历日期。00:00 UTC 你的一天重置——对所有人是同一个瞬间,而不是一个需要你在脑子里推算的 24 小时滚动窗口。

「Save to Telli.sh」只差一次右键——等 1.18 通过审核

网页弹窗假定 URL 已经在你的剪贴板上。可通常的情况是,你把那个页面开着。

Telli.sh: Every Translator 1.18 新增了一个右键菜单项 Save to Telli.sh,在 http://*/*https://*/* 上同时注册了 pageselection 两种上下文——任意网页都行,不止扩展能翻译的那三十来个站点。在文章的任何地方右键,它就保存。先选中三段文字,那三段也会跟着走,最多 2,000 个字符。

反馈搭在扩展本来就有的工具栏徽章上:保存中显示 ,成功显示 ,失败显示 !,每种状态在工具栏提示里都配一句解释。失败信息之所以具体,是因为服务器的错误本身就具体。401 表示令牌被拒,你需要一枚新的。403 表示两件截然不同的事,扩展靠在响应体里找 *_quota_exceeded 代码来区分它们:是配额用完了(「明天再来」),还是这枚令牌没有剪藏权限(「这枚令牌做不了这件事」)。同一个状态码,相反的建议。

1.18 版已提交至 Chrome 应用商店,截至 2026 年 9 月 5 日仍在审核中。 你现在还装不了。通过之后它会作为自动更新到达,右键菜单也随之出现。

一枚只写的钥匙:这枚令牌能保存剪藏,别的什么都不能做

这是我们最在意的一段,因为这类集成通常就是在这里出问题的。

「把扩展连到你的账号」有一种偷懒写法:让你把会话令牌粘贴进扩展。那枚令牌打开的是一切——它能删笔记、导出你的数据、碰账单。你等于是为了一个书签按钮交出了完整的账号凭据,而它会永远躺在扩展的存储里。

所以 Clip 不用那枚令牌。Telli.sh 签发的是带作用域的 API 令牌,模型学自 Cloudflare:令牌携带的是一组策略,而不是代表你本人;每条策略由一个 effectallowdeny,冲突时 deny 胜出)、一组 resources 和一组权限组构成。今天只存在一个权限组 clip_write,它展开为 clip:writeclip:metadata 两项权限;也只存在一种资源形状 {"user": "self"} ——你自己的数据,别无其他。

我们把它叫作一枚只写的钥匙,因为它的形状就是这样:它能往你的账号里放东西,却带不走任何东西。

让这件事真正成立的安全不变量,在设计文档里只有一句话:API 令牌绝不经过会话认证路径。 会话 Cookie 和访问 JWT 通过 get_current_user_optional 解析,那条路径通向产品里的每一个端点。API 令牌只通过 require_permission(...) 这个依赖解析,而如果这个依赖所要求的权限不在令牌里,答案就是 403。一旦这层隔离被打破,带作用域的令牌就会悄悄变回一枚全账号令牌,这也正是它被写成整份设计中最重要一条规则的原因。这里还有一个有益的二阶效应:API 令牌是一串不透明字符串,所以 JWT 解码对它必然失败。万一它哪天误入了会话代码路径,它认证出来的会是「没有人」。

令牌 API 本身对令牌是关着的。创建、列出和吊销令牌都需要一个真实的已登录会话——令牌无法签出另一枚令牌。

创建一枚大约要十五秒

进入设置 → API 令牌。在你还没有令牌的时候,这个页面会老老实实告诉你,你即将创建的东西能做什么。

还没有任何令牌的 Telli.sh API 令牌设置页:一个只有令牌名称输入框和一个 Save clips 权限复选框的创建表单,以及写着 No tokens yet 的空状态

任何令牌都还不存在时的 /settings/tokens API 令牌页,摄于 2026 年 9 月 5 日。说明作用域的那句话就压在表单上方,而不是埋进某篇帮助文章里:「一枚令牌只能保存剪藏。它无法读取你的笔记、修改你的账号,也无法接触你的账单信息。」页面上只提供一个权限,因为一共就只存在这一个权限。

起个名字,勾上 Save clips,创建。完整的密钥只出现一次,面板本身用红字这么写着。

写着「立即复制你的令牌」的一次性令牌面板:提示这是令牌唯一一次展示的警告、一枚部分打码的 tsh_ 令牌,以及 Copy token 和 I saved it 两个按钮

一次性密钥面板。这张截图里的令牌已打码,它所属的账号也已删除。一枚令牌的形式是 tsh_<12-character prefix>_<43-character secret> ——256 位的 base64url 随机数。以明文存储的只有前缀,用作查询键;密钥以 bcrypt 哈希存储,我们和你都无法还原它。关掉这个面板,它就永远消失了。

此后列表里只显示前缀,别的没有。这足够你区分两枚令牌,对偷走截图的人则毫无用处。

令牌列表中显示一枚名为 My browser extension 的令牌,带 Active 徽章、tsh_ 前缀、Save clips 作用域、创建时间、Last used: Never used,以及一个红色的 Revoke 操作

密钥面板关闭之后的同一枚令牌:前缀、作用域、创建时间、最近使用时间,以及吊销。last_used_at 最多每小时写一次,而不是每次请求都写,所以它能大致告诉你一枚令牌最后活跃在什么时候,又不会把每一次剪藏都变成一次额外的数据库写入。吊销会写入 revoked_at ——立即、永久,而且不是硬删除,因此「曾经存在过什么」的记录会留下来。

连接扩展:五步

  1. 在 telli.sh 登录,打开 设置 → API 令牌/settings/tokens)。
  2. 输入一个你日后认得出的名字——占位文字写着「Browser extension」是有原因的——勾上 Save clips,按 Create token
  3. 趁一次性面板还开着,按 Copy token。没有第二次机会;弄丢了就吊销那枚令牌,再建一枚。
  4. 打开扩展的设置页,找到 Telli.sh Clip 区块,把令牌粘贴进 Telli.sh Clip token,按 Connect
  5. 在任意网页上右键,选 Save to Telli.sh。工具栏徽章闪一下 ,剪藏就已经在全部笔记里了。

扩展设置中的 Telli.sh Clip 区块:Clip 令牌输入框、Connect 和 Disconnect 按钮、Connected as tsh_0wjkFr24mTcX 的状态,以及一个「去哪里获取令牌」的链接

完成第 4 步之后的扩展,摄于 2026 年 9 月 5 日。状态行只显示前缀——扩展展示的,正是令牌列表展示的那部分。辅助文字把存储方式说得很直白:「它只保存在本设备上,在添加令牌之前,保存剪藏一直处于关闭状态。」没有令牌就没有剪藏;菜单项存在,但什么也不做。

扩展究竟读取了什么

隐私承诺很廉价。下面是代码的行为,只有这个版本算数。

当你点击 Save to Telli.sh 时,扩展会往页面里注入一个函数,读取八个字段:og:titletwitter:title,回退到 document.titleog:descriptiontwitter:descriptiondescription;canonical 链接;og:imagetwitter:imageog:site_nameapplication-namearticle:authorauthorarticle:published_time;以及 window.getSelection()

再读一遍这份清单,这次看它缺了什么。没有 document.body。没有正文抽取,没有 readability 处理,没有 DOM 遍历。八个字段里有七个是页面为 Google 和社交媒体预览而公开发布的元数据——本来就写给陌生人看的数据。第八个是你自己划选的文字。

代码里还成立四条性质。

没有点击,什么都不会被发送。 那个读取元数据的函数运行在右键菜单的处理器里。没有后台定时器,没有页面加载钩子,也没有「一边浏览一边收集」的模式。

没有令牌,什么都不会发生。 处理器会先检查是否存有 Telli.sh 令牌,没有就到此为止,并显示一个提示你去连接令牌的徽章。刚装好的扩展里,那个菜单项是死的。

你的会话 Cookie 借不走。 扩展持有 telli.sh 的主机权限,通常这意味着它的 fetch 调用会自动带上你已登录的 Cookie——而那枚 Cookie 会抢在令牌之前完成认证,给出完整的账号权限,而不是我们设计的仅限剪藏的作用域。所以这个请求是带着 credentials: 'omit' 发出的。场上唯一的凭据就是令牌,你挑的作用域就是实际生效的作用域。真正让这枚只写钥匙保持只写的,就是这一个选项。

在没有页面访问权限的地方,它发送得更少,而不是更多。 注入脚本需要主机访问权限,而扩展只对清单里声明的站点持有它。在其他任何地方,注入直接失败,剪藏退回到只带一个 URL;随后由服务器用页面的公开 meta 标签把卡片填好。失败的形态是「数据更少」,绝不会是「去申请更宽的权限」。

而服务器抓取一个 URL 时,它是像访客那样抓,不是像爬虫那样抓。它拒绝 localhost、任何 .local 主机,以及任何解析到私有、回环、链路本地、组播、保留或未指定 IP 地址的主机名——是解析后再校验,而不是只做模式匹配,所以一个指向 10.0.0.1 的公网 DNS 名同样会被拒。它最多跟随 3 次重定向,最多读取 256 KB 的 HTML。它不登录,不携带你的 Cookie,也不尝试任何一个未登录访客取不到的东西。付费墙后的页面和私有页面依旧付费、依旧私有——那种情况下,请改为保存你自己选中的文字。

最后补一条关于度量的说明,既然本文是从一个分析故事开的头。扩展生成的剪藏根本不经过网页应用,前端因此看不见它们;这类剪藏改由服务器上报 clip_created。这个事件携带来源应用、来源类型、是否包含了选中内容、是否生成了摘要,以及套餐。它不携带 URL、不携带标题、不携带选中的文字——只知道产生了多少条剪藏、走的是哪条路径,永远不知道里面写了什么。

结语:只装得下你说过的话的笔记应用,只是半份记忆

Telli.sh 起初是为口头工作准备的地方——录一场会议,用它实际被说出口的语言转写,翻译它,概括它,把四层内容放进同一条笔记。这覆盖的是你说过的部分。

它没有覆盖你读过的部分,而你所知道的绝大多数东西来自阅读。那个开了三天没关的标签页。一个月后你还会再需要的那页文档。那条真正给出答案的评论串。它们住在一份你永远不会去搜索的浏览器历史里,和一条你从 2019 年起就不再打开的书签栏里。

Clip 就是另外那半份的到来:同一条笔记、同一套搜索、同样的文件夹、同样的导出——只不过是用右键而不是麦克风抵达的。方向是一个单一的个人数据库,让你的话语和你的来源并排坐着,而这是第一个朝向网页的收集入口。

闸门没有了。计数器终于有地方可去了。


试试看: 登录,在侧边栏打开 Clip,粘贴一个你一直想留下来的网址。免费账号每天有 30 次保存和 10 次 AI 摘要。等扩展 1.18 通过 Chrome 应用商店审核,同一件事就会变成你在正读的任意页面上的一次右键。

打开 Telli.sh,保存你的第一条剪藏

来源

  • Telli.sh 代码仓库,提交 64852ac,2026 年 9 月 5 日——「feat(clip): open Clip to every signed-in user」,它移除了 is_master 闸门和 Admin preview 徽章,并记录了 clip_createdclip_opened 在 PostHog 中从未触发过。
  • Telli.sh 代码仓库,backend/config.py——CLIP_SCRAPE_DAILY_QUOTA_*CLIP_SUMMARY_DAILY_QUOTA_* 的默认值,2026 年 9 月 5 日读取。
  • Telli.sh 代码仓库,docs/SUPERAPP_BASELINE.md——Clip 的基线与安全规则:不绕过登录或付费墙,不做批量抓取,摘要仅限用户提供的文字与公开元数据,以及 AI 生成的内容永不取代原件这条规则。
  • Telli.sh 代码仓库,docs/design/API_TOKEN_RBAC_DESIGN.md——带作用域令牌的设计:策略结构、tsh_<prefix>_<secret> 格式、bcrypt 存储,以及 API 令牌绝不经由会话认证路径解析这一不变量。
  • Telli.sh 代码仓库,extension/extension/background.js——readClipMetadataFromPagecollectClipMetadatasaveClip,2026 年 9 月 5 日:八个元数据字段、仅由点击触发、没有令牌时的提前返回,以及 credentials: 'omit'
  • Chrome 应用商店上的 Telli.sh: Every Translator——1.18 版提交到的商店页面;截至 2026 年 9 月 5 日仍在审核中。
  • Telli.sh: Every Translator 产品页 — 支持的站点、显示方式、服务商与隐私承诺,集中在一页。
  • 扩展的弹窗一直在回答错误的问题。1.16 改为画出你正在看的这个页面,2026 年 9 月 4 日——上一次扩展发布,Clip 令牌输入框就落在那次的设置页上。

返回博客