原生 macOS 应用 · 免费且开源 · 已签名并公证

文档,是拿来比对 阅读的。

PullMark 把你本地的 Markdown 渲染成读者将会看到的样子——并把以文档为主的 GitHub 拉取请求显示为渲染后的差异,只高亮真正改动的那几个词。评论、提建议、 提交审查,全程不必再对着一堵 +/ 的文字墙眯眼睛。

Homebrew
$ brew tap jedijashwa/tap
$ brew trust jedijashwa/tap
$ brew install --cask pullmark
直接下载
下载 PullMark

最新的 DMG——打开它,拖进 Applications(收尾的事交给 PullMark)。 全部版本发布 →

无论走哪条路,PullMark 都会自己检查更新,一键装好。

macOS 13+ · Developer ID 签名,经 Apple 公证 · 也可以从源码构建

PullMark 把一份项目文档渲染成排好版的页面,并开启了 blame 边栏:作者头像列在左侧页边,每一段由同一次提交最后改动的连续区块对应一个头像
一份项目文档,排好了版——历史留在页边:每段连续区块一个头像,每个头像都是通往那次提交的门。

你的智能体

你的智能体在写计划。
把它当同事的稿子来审。

智能体会产出大量 Markdown:实现计划、规格说明、调研报告——都是些在任何人动手之前、 需要你先下判断的长文档。可眼下能用来传达这份判断的几种方式,没有一种称职。在编辑器里读 原始源码,读者会看到的样子就被藏了起来;把片段贴进聊天窗口,反馈便与它所指的位置断了联系; 而为了拿到 PR 的评论框,把一份还在改的草稿提交上去,纯属仪式——并不是每份文档都该走一遍 拉取请求。

页边批注把反馈放进文档本身。渲染着读这份草稿,在不对劲 的地方点一下,留下一条署名的批注,锚在那个区块上。批注是不会出现在渲染页面上的普通 HTML 注释——所以一句“把计划里的批注都处理掉”就是全部交接:智能体会在你留下批注的确切 位置逐条读到它们。不用提交,不用粘贴,不用开拉取请求。然后看着修订落地——“比较” 把智能体的改动逐词高亮,随它保存实时更新。

PullMark 渲染一份由智能体撰写、标题为 Wind Gust Alerts 的设计规格,三条页边批注以审查者的署名卡片呈现——一条文件级批注要求重写一版干净的第二稿,一条质疑规格里的采样率假设,还有一条对某个功能喊了 YAGNI——侧边栏则显示这份规格位于某个 git 仓库 main 分支下的 docs/superpowers/specs 文件夹中
智能体的一份规格,就地审查完毕:三条署名批注锚在它们所质疑的区块上,以普通 HTML 注释的形式存在文件里——智能体逐条处理,处理完就删掉。

整个闭环——连同要交给智能体的那段指令——都在智能体 页面上走了一遍。页边批注目前是 beta,且默认开启;文档讲清了它的机制。

为什么

文字不是代码。
别再照着代码的样子审它。

那一幕你熟悉:README 的差异里立着四十行绿墙,而真正改动的那一句,就埋在墙里的某处。 设计文档、决策记录、运行手册、智能体定义——每周流过你审查队列的东西,越来越多是文字; 而文字的源码差异,恰恰藏起了你来这一趟要判断的东西。

PullMark 把改动按读者将会遇见它的样子摆给你看:渲染出来,只高亮改动的词。 表格还是表格,图表还是图表,改了一个词就只有一个词被点亮。对任意区块评论,评论都会落在 GitHub 期待的那几行上——批准、请求更改,或者留下作者一键就能应用的建议。

“工作间隔壁的那间阅览室。”
注意

PullMark 有意不做完整的审查客户端。它只显示 PR 里的 Markdown 文件—— 改动中的代码部分,你惯用的审查工具依然是对的地方。

审查

整场文档审查,都在渲染好的页面上完成。

内联并排两种版式之间切换,落到原始的 源码差异,或者预览最终的结果——全都在工具栏上; 工具栏还带你从一个文件走到下一个、再走回 PR,全程不必碰侧边栏。YAML front matter 渲染成 一张安静的元数据表,而不是一堵加粗的文字墙——所以配置密集的文档也能干净地 比对。全新的文档读起来仍然是一份文档——一条说明写着它整篇都是新的,而不是把每个区块都染成 绿色。已有的审查会话出现在它们所讨论的区块下方。悬停任意区块,点开气泡,就能评论整个区块, 或者只评论你挑中的那几行。写完之后,直接在总览页上 批准请求更改评论——带不带行内评论都行——也可以留下文件级评论或纯粹的会话 评论。总览页显示这个 PR 的处境:已批准还是已请求更改、每位审查者的裁定、 CI 检查(可一路点进任意一项检查的日志),以及作为可读时间线呈现的完整会话。打开的 PR 每分钟检查一次;分支往前走了,一键刷新,你的草稿安然无恙。

PullMark 正在审查一个文档拉取请求:渲染出来的差异中,改动过的段落带着词级高亮,新增的 Mermaid 流程图渲染在绿色的新增区块底色上,侧边栏在该文件上显示评论数,工具栏的审查控件写着“完成审查”,并标着三条待提交的评论
一个文档 PR 作为渲染差异:唯一改动的那句话带着词级高亮,新来的流程图以 的样子落在新增区块的底色上——而不是八十行绿色的 Mermaid 源码。
开始审查

默认动作:把草稿评论先攒在本地。再一起提交——“评论”、“批准”或“请求更改”——也可以存成待完成的审查,回 github.com 上收尾。

添加单条评论

立刻发出一条审查评论,锚在该区块上——也可以在编辑框里选行,把范围收窄到你挑中的 那几行。

添加建议

铅笔把区块的 Markdown 源码在编辑器里打开——你的改动会作为一条 ```suggestion 发出去,作者一键即可应用。

PullMark 的拉取请求总览:PR 标题旁挂着“开启”标签,一枚“已请求更改”胶囊,一枚“检查已通过”胶囊,审查者头像佩戴着裁定徽章,一枚 docs-guild 团队标签,渲染好的 PR 描述,以及会话时间线——其中第一条审查评论里的表格是渲染过的
会话本身就是一份文档:审查评论里的表格渲染成表格,每位审查者的头像都佩戴着 自己的裁定。

阅读

给你硬盘里那些 Markdown,一个像样的阅读器。

你的笔记、你的 README、你们团队的 docs 文件夹——打开一个文件,或者整个 目录,按它本该有的样子读。文件在磁盘上一变,页面立刻重新渲染;相对路径的图片与链接自动 解析;只要 GitHub 渲染得出来,PullMark 就渲染得出来:

粗体斜体删除线行内代码高亮、H2O、mc2e + 1 = 0带悬停预览的链接、脚注[1]任务列表——还有表格、Mermaid 图表、 语法高亮的代码、> [!NOTE] 提示框、离线的 KaTeX 数学公式、 [toc],以及折叠成一张整洁元数据表的 YAML front matter。

PullMark 渲染一个 docs 仓库里的本地 Markdown 文件:侧边栏的“打开的文件”区列出三份留驻的文档和一条斜体的预览条目;“位置”区把该文件夹显示为子文件夹与 Markdown 文件的树,佩戴着 git 分支标签和 GitHub 仓库标记;一个打开的拉取请求,其改动文件排成带状态图标和评论计数徽章的树;渲染出的文档里可见标题、列表、一个链接和一个 Tip 提示框;标题栏显示文件所在的文件夹和 git 分支,角落里是一枚字数统计药丸
文件夹以活的树进来,每个位置都佩戴着自己的 git 分支,浏览时文件以预览 出现——“打开的文件”里那条斜体条目,下一次点击就把它替换掉。拉取请求就挨着 你的本地文件,标题栏知道你身在何处。
  • 历史留在页边——一条安静的 blame 边栏:每段连续区块一个头像;悬停 可见作者、日期和提交;点击可看完整的行历史。
  • 永远是最新的——在任何编辑器里保存,页面早已重新渲染完毕。
  • 与历史比对——一键把工作中的文件与最近的任意一次提交或任意分支 比较,像 PR 差异一样渲染出来;文件继续变,差异就继续跟; pullmark --diff 在终端里做同一件事——回答“智能体刚刚把我的文档改成 什么样了”最快的方式。
  • 浏览而不至于把自己埋了——在文件夹或仓库里单击,每个文件都以 预览出现:“打开的文件”里一条斜体条目,下次点击就被替换。双击(或者直接开始 编辑)就把它留下。
  • 大纲侧边栏——一张导航器式的标题地图,一个开关的距离。
  • 什么都找得到——⌘F 在页面上逐个走过匹配项; ⇧⌘F 一次搜遍侧边栏里的所有文件。
  • 会重排的缩放——⌘+⌘−(或者双指捏合) 把文字、图片和阅读栏一起缩放,跨启动记住;导航也跟着一起长。
  • 点开细看——图片、Mermaid 图表和块级公式在可平移缩放的专注浮层中 打开,复杂图表不再被困在栏宽里——而且存储或共享的正是你正在细看的东西 (图表是真正的 SVG)。
  • 带它去任何地方——导出为 PDF,或一个完全自包含的 HTML 文件; ⌘C 粘进 Docs 和 Slack 是富文本,⌥⌘C 还你 Markdown。
  • 三套阅读主题——Editorial、GitHub 和 Terminal,在设置里带实时 预览——也可以丢进你自己的 CSS。浅色与深色会把一切重新配色,Mermaid 也不例外; 行宽归你:Standard、Wide 或 Full Width。
  • GitHub 链接在应用内打开——点击一个指向 Markdown 文件的 github.com 链接,PullMark 就渲染它,并始终显示一条 repo @ branch 的来源栏;-点击则把它交给浏览器。
  • 快速打开——⌘K 模糊匹配,跳到任意标题、 文件或 PR——也可以粘贴一个 PR 链接、仓库链接或文件路径,直接打开。
  • 搬了家就是搬了家——原样挪了位置的段落只渲染一次,佩戴一枚安静的 紫色标签,而不是红加绿的噪音。
  • 接着上次继续——你的文件、PR 和阅读位置在启动时一并恢复。

以上只是要点。剩下的都在文档里——每个功能、每项 设置、每个图标、完整的键位表,还有 pullmark 命令。

默认是读。编辑就在原地。

按下 ⌘E,页面本身就成了编辑器:光标所在的区块就地显出它的 Markdown 源码——同样的字体,同样的位置,什么都不跳——你立刻就能打字。用方向键在区块间 穿行,用 Backspace 合并,用一个空行拆开;离开某个区块就把它保存,走的是和别处一样有防护、 有版本记录的那条路。阅读依然是默认;模式的边界,就是保存这个动作。

处于编辑模式的渲染文档:其中一个段落就地显出 Markdown 源码,四周仍是渲染好的内容
编辑模式:当前区块显示源码,其余一切保持渲染。

GitHub 也是文档住的地方。就当住处来读它。

点击一个指向 Markdown 文件的 github.com 链接,PullMark 会抓取 它、在应用内渲染出来——第一次点击会问你想要哪种行为,而 -点击永远执行另一种。 页面上方的来源栏写明你正在读哪个仓库的哪个分支,并钉在它解析到的那次提交上;相对链接照旧 按仓库解析,整棵 Markdown 树在侧边栏里一点即达,私有仓库用的就是你的 PR 已经在用的 GitHub 登录——抓取到的东西从不落盘。分支是每个仓库上的一枚标签:就地切换、把另一个分支作为独立的 侧边栏条目打开,或者跳进本地工作树。而如果这个仓库已经克隆在你的 Mac 上、正停在那个分支, 链接打开的就是你的本地文件。

PullMark 渲染一个从 GitHub 仓库抓取的 Markdown 文件:内容上方的来源栏写着仓库名、一枚分支标签、文件路径和钉住的提交,并带一个“在 GitHub 上打开”链接;侧边栏的“位置”区以书本图标显示该仓库及其 Markdown 文件树
直接从 GitHub 读一份文档:来源栏始终说明你身在何处——仓库、分支、钉住的 提交——分支标签不必离开页面就能切换或打开分支。
PullMark 的设置窗口停在“外观”标签页:三张实时主题预览卡片——GitHub、Editorial 和 Terminal——各自用真实的渲染管线渲染同一份示例文档,其中 Editorial 处于选中状态,下方是打开自定义 Themes 文件夹的按钮
设置 → 外观:三张实时主题预览,由真实的 渲染管线渲染——点一张卡片就切换。

原生

一个真正像 Mac 应用的 Mac 应用。

Quick Look(快速查看)

在 Finder 里对任意 Markdown 文件按空格,还没打开任何应用,就已经用你的阅读主题 看到了它渲染后的样子。

一个真正的命令行

pullmark README.mdpullmark ~/wt docs/plan.md——文件、 文件夹和工作树都在正在运行的应用里打开,永远落在最前面的窗口。 pullmark --help 写着说明,文档也写着。

.md 的默认应用

在设置里点一下,Finder 里的双击从此处处意味着渲染——万一某次升级弄丢了 这条绑定,PullMark 会自己发现,并把它请回来。

你现成的凭据

不用另外登录。PullMark 直接用 gh auth token 或你的 git 凭据助手—— 私有仓库和组织仓库开箱即用。

硬盘上什么都不留

抓取到的 PR 内容只活在临时会话和有限的内存缓存里——来自 GitHub 的东西一律不写入 持久化存储。

开源,MIT

Swift 写成,零第三方包依赖,外加一份不挡你路的许可证去读源码

给你的文档一间阅览室。

免费,开源,已签名并公证。 一次下载的距离。

Homebrew
$ brew tap jedijashwa/tap
$ brew trust jedijashwa/tap
$ brew install --cask pullmark
直接下载
下载 PullMark

最新的 DMG——打开它,拖进 Applications(收尾的事交给 PullMark)。 全部版本发布 →

无论走哪条路,PullMark 都会自己检查更新,一键装好。

或者从源码构建