做了个 Safari 扩展:一键把网页转成干净的 Markdown - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
morphinewan
V2EX    分享创造

做了个 Safari 扩展:一键把网页转成干净的 Markdown

  •  
  •   morphinewan
    morphinewan 2025 年 8 月 13 日 2869 次点击
    这是一个创建于 156 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    作为一个经常需要整理技术文档和研究资料的开发者,我发现自己总是在做这样的事情:

    • 看到好的技术博客、API 文档想保存,但网页版广告满天飞
    • 复制粘贴到笔记软件,格式乱七八糟
    • 手动整理 Markdown 格式,费时费力
    • 最关键的需求:想把这些技术文档整理成知识库,喂给 AI Model ( Claude 、ChatGPT 等),提升写代码时的效率

    现在 AI 编程助手越来越重要,但它们的知识有时效性限制。比如最新的框架文档、内部技术规范、项目最佳实践等,都需要我们手动整理后提供给 AI 。

    但是这个过程太痛苦了:网页复制粘贴格式乱,手动整理 Markdown 耗时,想批量处理更是麻烦。

    试过各种方案,要么功能不够用,要么界面太复杂,要么不支持 macOS 原生体验。索性自己撸了一个。

    项目介绍

    DownMark - Safari 浏览器扩展,专门解决网页内容到 Markdown 的转换问题。

    核心功能

    • 智能内容提取:基于算法识别网页主体内容,自动过滤广告、导航栏、侧边栏等干扰元素
    • 标准 Markdown 输出:保持文章结构,支持标题、列表、链接等格式转换
    • 原生 macOS 体验:深度集成 Safari ,一键操作,原生文件保存对话框
    • 零配置使用:安装即用,无需复杂设置

    技术实现

    • 基于 Safari Web Extension API (Manifest V3)
    • 内容脚本负责页面分析和提取
    • 背景脚本处理扩展逻辑
    • macOS 原生应用提供文件输出

    使用场景

    特别适合这些场景的 V 友:

    • AI 编程助手重度用户:需要把最新技术文档、API 参考喂给 Claude/ChatGPT ,提升代码质量
    • 技术博客收集党:看到好的实践文章想整理成知识库
    • 框架文档整理:Vue3/React/Swift 等官方文档本地化管理
    • 团队知识沉淀:把分散的技术分享统一整理成 Markdown ,方便 AI 索引
    • 研究资料管理:论文、技术报告等学术资料收集
    • 离线开发环境:网络不稳定时的本地文档库

    举个实际例子:我现在做 SwiftUI 项目时,会把 Apple 的 HIG 文档、最新的 API 变更、社区最佳实践都用 DownMark 转成 Markdown ,然后上传到 Claude Projects ,这样 AI 就能基于最新最准确的信息帮我写代码了。

    为什么做这个

    现在 AI 编程助手这么火,但用过的都知道一个痛点:AI 的知识是有时效性的

    最新的框架更新、内部技术规范、项目特定的最佳实践,这些 AI 都不知道。想要 AI 帮你写出高质量的代码,就得手动喂给它这些上下文信息。

    但市面上的工具大多存在这些问题:

    1. 内容提取不够精准,把广告、评论都抓进来,污染知识库
    2. Markdown 格式转换质量差,AI 读起来费劲
    3. 批量处理能力弱,一个个复制粘贴效率太低
    4. 不支持 macOS 原生体验,工作流程割裂

    DownMark 专注解决这几个痛点,让技术文档到 AI 知识库的转换变成"一键搞定"。

    技术细节

    内容提取算法

    • 基于 DOM 结构分析,识别文章主体区域
    • 语义化标签优先级判断
    • 广告和导航元素特征识别
    • 内容密度计算,过滤低质量区块

    格式转换

    • HTML 到 Markdown 的标准化转换
    • 特殊字符和编码问题处理
    • 保持原文档的层次结构
    • 链接和图片引用的正确处理

    当前状态

    • 已完成核心功能开发
    • 通过 App Store 审核,正式上架
    • 定价:$4.99 (一次性购买)
    • 支持 macOS 14.0+

    官网链接

    一些思考

    做独立开发这两年,越来越觉得好的工具应该是"隐形"的 - 让开发者专注于代码本身,而不是纠结于工具的使用。

    现在 AI 编程时代,知识库的质量直接影响代码质量。我们需要的不只是一个格式转换工具,而是一个高效的"知识到代码"的桥梁。DownMark 就是朝着这个方向努力的。

    有了干净的 Markdown 技术文档,配合 Claude Projects 或者 ChatGPT 的 Knowledge ,写代码的效率真的能提升不少。特别是做新技术栈的项目时,这种差别更明显。

    欢迎体验

    如果你也有类似的内容收集需求,欢迎试用反馈。作为独立开发者,特别珍惜来自技术社区的意见和建议。

    有任何问题或想法,欢迎在楼下讨论

    第 1 条附言    2025 年 9 月 17 日
    8 条回复    2025-09-17 08:11:11 +08:00
    Kakarrot
        1
    Kakarrot  
       2025 年 8 月 13 日
    我用的 Weblnk 免费的...甚至能翻译
    morphinewan
        2
    morphinewan  
    OP
       2025 年 8 月 13 日
    @Kakarrot 多一个选择么,萝卜青菜各有所爱
    FansMaker
        3
    FansMaker  
       2025 年 8 月 14 日 via iPhone
    有同样的需求,所以我搞了个 Chrome 插件: https://www.y3pm.com/tools/reader/
    wangyahao2018
        4
    wangyahao2018  
       2025 年 8 月 14 日
    看到有价格,直接劝退我
    morphinewan
        5
    morphinewan  
    OP
       2025 年 8 月 14 日
    @wangyahao2018 很遗憾,等待下次有缘
    morphinewan
        6
    morphinewan  
    OP
       2025 年 8 月 14 日
    @FansMaker 上 chrome 商店要花多少钱?
    FansMaker
        7
    FansMaker  
       2025 年 8 月 18 日
    @morphinewan 忘记了,不是很多,一次性的。
    morphinewan
        8
    morphinewan  
    OP
       2025 年 9 月 17 日
    @FansMaker 我刚刚审批通过了,貌似没花钱,就是花的时间长了点,审批了个把月。传说中的$5 怎么都没收。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2805 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 13:55 PVG 21:55 LAX 05:55 JFK 08:55
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86