AeternaLabsHQ/pullmd

Self-hosted URL- and file-to-Markdown service for humans and AI agents - web pages, documents, images, audio, YouTube. PWA + REST + MCP + Claude Code skill, Reddit-aware, refreshable share links.

PullMD – 自托管 URL 转 Markdown 服务

功能简介

PullMD 是一款自托管 Web 服务,可将任何公开 URL(或上传的文件)转换为干净的 Markdown。它支持:

  • 普通网页(使用 Cloudflare Markdown、Mozilla Readability、Trafilatura 或 headless Chromium 作为回退)
  • Reddit 和 Hacker News 的帖子及完整评论树
  • 文档,如 PDF、Word、PowerPoint、Excel、EPUB
  • 图片和音频(通过兼容 OpenAI 的视觉或语音模型进行字幕生成/转写)
  • YouTube 视频(标题、描述和转录文本) 结果以 Markdown 形式返回,并附带 YAML front-matter 块,其中包含元数据(源 URL、抓取日期、作者等)。可以使用 32 字符的短共享 ID 检索缓存版本,该版本每小时自动刷新。

适用人群

  • 需要节省 token 的纯文本表示形式的 AI 代理
  • 构建 RAG 流水线、希望本地获取和规范化内容的 开发者
  • 希望拥有个人“稍后阅读”服务、去除广告和样板内容的 高级用户
  • 需要私有、可控的公共摘要服务替代方案的 团队

快速开始

  1. 安装 Docker Compose。
  2. 运行 README 中提供的一行命令:
    mkdir pullmd && cd pullmd
    curl -O https://raw.githubusercontent.com/AeternaLabsHQ/pullmd/main/docker-compose.yml
    docker compose up -d
    
  3. 在浏览器中打开 http://localhost:3000。无需 .env 文件;默认监听端口 3000。
  4. (可选)添加 .env 以自定义身份验证、OCR 密钥或代理设置。

关键技术细节

  • 架构 – 主 PullMD 容器协调三个可选的 side-car 服务:
    • trafilatura – 从静态 HTML 中提取正文内容。
    • playwright – 用于 JavaScript 密集型页面的 headless Chromium/Firefox/WebKit 渲染器。
    • markitdown – 将上传的文档、图片、音频和 YouTube 视频转换为 Markdown。 这些 side-car 默认启动,但如果只需要普通网页提取,可以省略。
  • 输出格式(v3) – 默认情况下,Markdown 正文仅包含标题和内容。所有其他信息(URL、抓取日期、Reddit 统计、OCR/模型使用情况等)都存储在 YAML front-matter 中,以减少下游 LLM 调用的 token 数。可以通过 PULLMD_SOURCE_HEADER=true 重新启用旧版内联标头。
  • 安全 – 内置 SSRF 保护阻止对私有网络目标的请求。速率限制、身份验证模式(disabled、single-admin、multi-user)以及可选的注册控制均可通过环境变量配置。
  • 可扩展性 – 用户可以添加自定义 站点规则(JSON-LD 到 front-matter、自定义选择器),并通过 PULLMD_FRONTMATTER_FIELDS 控制输出的 front-matter 字段。
  • 性能 – 缓存将结果存储在 SQLite 文件(/data/cache.db)中。缓存保留时间、大小限制以及检测过短提取的“覆盖率保护”均可调整。

何时考虑替代方案

  • 如果只需要快速的一次性转换,Mercury 或浏览器扩展等公共服务可能更快。
  • 对于大规模、高吞吐量的爬取,您可能更喜欢专用的爬虫框架(例如 Scrapy)与单独的 Markdown 渲染器结合使用。
  • 如果需要深度语义摘要而非原始 Markdown,您需要在 PullMD 的输出之上使用 LLM。

以上信息全部直接取自仓库的 README,未添加外部假设。

相关

  • 项目
  • 项目
  • 项目
  • 项目
  • 项目