Obsidian Quick Note
一个专注于「快速记录」的 Chrome 扩展。看到网页上有值得记的内容时,点一下工具栏图标,就能把片段保存为 Markdown 笔记到 Obsidian。
为什么做这个项目
我一直在用 Obsidian 管理笔记,但官方 Obsidian Web Clipper 更像是一个完整的网页剪藏工具:它会自动提取全文、高亮、模板渲染,适合做资料归档。而我的实际场景更多是:
- 看文章时突然想到一个观点,想快速记下来
- 看到一段有用的代码或引用,想保存到自己的笔记里
- 逛论坛或社交媒体时,想把某个讨论片段顺手扔进仓库
这些场景不需要完整的网页剪藏,而是需要一种快速方便的记录方式。所以决定做一个更轻量的扩展,核心目标就是:打开快、输入少、保存稳。
产品定位
Obsidian Quick Note 不是 Obsidian Web Clipper 的替代品,而是补充。
- Web Clipper:完整保存网页内容,适合资料收集
- Quick Note:快速记录想法片段,适合随手记
两者可以共存。用户可以用 Web Clipper 归档整篇文章,同时用 Quick Note 记录自己的思考和摘录。
核心功能
1. 一键保存到 Obsidian
扩展通过 obsidian://new URI 协议把 Markdown 笔记交给 Obsidian 处理。用户只需要填写仓库名和默认保存文件夹,不需要安装任何 Obsidian 插件或配置外部服务。
2. 自动提取元数据
保存时会自动从网页提取以下信息,生成 YAML Frontmatter:
title:页面标题(自动去除站点名后缀)url:来源链接author:作者(支持 meta、JSON-LD、DOM 选择器多层提取)description:页面描述site:站点名date:保存时间tags:默认标签
3. 选中文本自动带入
在网页上框选文字后打开 popup,选中的内容会自动进入编辑器。如果在同一标签页多次框选,新内容会追加到已有草稿后面,而不是覆盖,方便把多个片段组织成一条笔记。
4. 标签页级草稿隔离
每个标签页拥有独立的草稿。切换到其他标签页不会互相覆盖,刷新或关闭标签页后草稿会自动清理,避免把旧页面的内容误保存到新页面。
5. 右键菜单快捷入口
在网页任意位置、选中文本或链接上右键,都能看到 "Obsidian Quick Note" 菜单项,点击即可打开 popup。
6. 兜底下载
如果 Obsidian URI 调用失败(比如仓库名错误、Obsidian 未安装),扩展会自动把 Markdown 文件下载到本地,避免内容丢失。
7. 中英文自动切换
根据 Chrome 的界面语言自动切换中文或英文 UI。
插件使用截图
插件页面图:

插件保存位置和 Frontmatter 可以临时切换:

插件设置页面:


使用演示:
可以按快捷键呼出,快捷键可以自定义。或者在右上角把插件 pin 住,点击即可呼出。再或者鼠标右键也可以有插件的快捷操作。

开发过程中遇到的几个关键问题
问题 1:如何让 Obsidian 保存更稳定
最早考虑过用 Obsidian Local REST API 插件,通过 HTTP 直接写入文件。但测试后发现:如果 Obsidian 没有运行,请求会失败;扩展尝试唤醒 Obsidian 时,Chrome 的协议确认框又会打断 popup 的异步流程。
最终采用了和官方 Web Clipper 相同的方案:obsidian://new + 剪贴板。这个方案的优势是零配置、能唤醒 Obsidian、大内容通过剪贴板传输不受 URL 长度限制。
问题 2:选中文本在第二次打开 popup 时丢失
最初的实现是 editor.value = draft.content || selectedText || ''。第一次框选后,关闭 popup 时会把选中文本保存到 draft.content。第二次框选时,draft.content 已经不为空,新的 selectedText 被忽略。
解决方式是引入 mergeSelectedText():新选中文本追加到草稿后面,如果已经存在则去重。这样既保留了用户手动输入的内容,又能逐步累积摘录。
问题 3:草稿在不同标签页互相覆盖
早期所有标签页共用同一个 oqn:draft key。在标签页 A 写了一半,切换到标签页 B 打开 popup,看到的是 A 的内容,很容易误保存。
解决方式是把 storage 结构改为 oqn:drafts = { [tabId]: Draft },每个标签页独立读写,并在标签页关闭或刷新时自动清理。
技术栈
- Chrome Extension Manifest V3
- TypeScript
- Vite(构建)
- Vitest(测试,131 个测试全部通过)
- 自定义元数据提取逻辑(参考 Defuddle 思路,独立实现)
后续计划
- 上架后根据用户反馈持续优化
- 考虑补充英文商店翻译和 GitHub release tag