用 vibe coding 做了一个本地优先的 X/Twitter 书签管理插件,聊聊过程

9 月 28 日
 mundane

起因其实很朴素:我自己的 X/Twitter 书签和点赞越攒越多,书签有一万多条,点赞有三万多条(以前把点赞当书签用)。

但真正想找某条内容时,原生列表基本只能一直往下翻。记得作者还好,不记得作者、只记得正文里某个词,几乎就只能放弃。

另一个让我有点不踏实的地方是,这些“收藏”实际上仍然完全依赖平台:账号状态、帖子删除、产品界面调整,都会影响之后还能不能找到。于是我想做一个很个人化的工具:把已经收藏过的内容沉淀到本地,能搜索、整理,也能自己备份。

最后做成了 Twitter Mark ,一个基于 WXT + React + TypeScript + Dexie 的浏览器扩展。

书签截图: 点赞截图:

它现在主要做几件事:

实现中最麻烦的其实不是 UI ,而是“如何保证同步不会把已有数据搞坏”。x.com 的网页 GraphQL 并不是稳定的公开 API ,Query ID 、返回结构和限流都有可能变。所以我给自己定了几个硬约束:解析异常不能当成空列表,远端某次没返回的数据不能自动从本地删除;每一页数据写入后才推进 cursor ;中断、限流或浏览器退出后要能从 checkpoint 继续。

关于 vibe coding

这个项目大部分代码是用 vibe coding 的方式完成的,但实际过程并不是一句“帮我做个插件”然后等结果。

我先把产品边界写清楚,尤其是“本地优先、只读、已有数据优先”这几个不能破坏的原则;再把系统拆成 X 网页请求、同步引擎、存储层、任务调度和资料库 UI 几块。每次只让模型处理一个范围比较小、可以验证的改动,然后马上跑类型检查和测试,再用真实账号做小批量验证。

模型在搭页面、补类型、写重复性代码上确实很快,但在分页状态、失败恢复和数据一致性上,还是很容易给出“看起来能跑”的实现。比较有效的做法是先写清楚不变量,再让它根据这些约束补测试,而不是只看 happy path 。比如:cursor 什么时候可以提交、重复同步是否幂等、解析失败会不会误删本地数据、切换账号时任务会不会串数据,这些都需要人主动盯着。

我目前最大的体会是:vibe coding 很适合把一个人脑子里的小工具快速做出来,但前提是人要负责定义问题、控制范围和验收。模型可以加速实现,却不会自动替你做出正确的产品取舍。

项目现在已经能日常使用,但同步依赖 X 的网页接口,未来接口变化时仍可能需要跟着维护。我也还在继续打磨搜索、同步稳定性和跨浏览器体验。

如果你也有大量 X 书签/点赞,想听听大家平时是怎么整理的,以及对“本地资料库”这种做法最在意什么。

项目主页: https://twittermark.com

Chrome 商店: https://chromewebstore.google.com/detail/twitter-mark/phoiffgkjjfnjfljnjgmpobmanghlaga

2646 次点击
所在节点    分享创造
59 条回复
mundane
9 月 29 日
@makry #15 已发送
mundane
9 月 29 日
@kamal 目前还没有,会考虑的。
mundane
9 月 29 日
@CyberZCS #10 取消功能我回头会做的
aurorajamesgirl
9 月 29 日
“解析失败不能当空列表”和写入成功后才推进 cursor ,这两个约束很关键。还可以给 JSON 导出做一次“导出后重新导入空库”的验证流程,确保本地数据真正能恢复,而不只是导出了文件。
mxlg2030
9 月 29 日
很实用。求个激活码。邮箱 mxlg2003@gmail.com
leqoqo
9 月 29 日
求一个激活码,之前使用的油猴脚本,导出的 json 文件,不太方便搜索和查看,有界面和搜索功能太赞了,bGVxb3FvQG1zbi5jb20=
wuhan027
9 月 29 日
@mundane #20 感谢大佬,激活码已兑换。有个功能取舍的问题想请教一下,你在正文里提到 “于是我想做一个很个人化的工具:把已经收藏过的内容沉淀到本地,能搜索、整理,也能自己备份”。就想您在上一句说的,目前太依赖平台了,如果原贴被删了,即使用您的插件非常快速地搜索到,也仍然看不了。那么可否增加一个批量下载的功能,把收藏或点赞过的文章、视频、图片,下载到本地电脑上,真正实现 “把已经收藏过的内容沉淀到本地”
mundane
9 月 29 日
@mxlg2030 已发送
mundane
9 月 29 日
@leqoqo 已发送
mundane
9 月 29 日
@wuhan027 #27 谢谢建议,我后续会考虑如何解决这个问题
mglv
9 月 29 日
很不错,看着很简洁,麻烦给我激活码吧,感谢。bHhtMTMxNDUxNDVAZ21haWwuY29t
CyberZCS
9 月 29 日
@mundane 感谢赠送激活码,期待越来越好!
MrgHOST
9 月 29 日
dGFsb3NzbWFydEBnbWFpbC5jb20= 非常不错 正好需要
Seamain
9 月 29 日
我推特的书签非常多,虽然在内部也做了文件夹分类但是找起来还是很麻烦,这个插件正好解决了我这个问题,以后会长期使用,希望获得一个激活码,邮箱 cXVhbm1pbmp1bjM3QGdtYWlsLmNvbQ==
mxlg2030
9 月 29 日
已 5 星好评
Varvel
9 月 29 日
ZHVzdGlueGxrMzI4cm9iaW5zb25Ab3V0bG9vay5jb20=
求一个激活码,刷 x 太多了,找内容能翻看好久,加上多账号分类也不行
devour
9 月 29 日
NDY5ODkzMjMxQHFxLmNvbQ== 求个邀请码.谢谢.
error
9 月 29 日
求个码,已试用,收藏了挺多的。之前都是用 cubox ,不太方便。eGluY2h5QDE2My5jb20=
mundane
9 月 30 日
@mglv 已发送
mundane
9 月 30 日
@MrgHOST 已发送

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1245353

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX