博客

给 Reddit 做一个桌面应用

常用网站 · · 约 7 分钟

Reddit 的帮助中心只说 iPhone 去 App Store、Android 去 Google Play 下载官方应用,这些应用文章都没有提到电脑上的应用,所以在电脑上 Reddit 就是网站。Pake 可以把 reddit.com 包成一个独立窗口,有自己的启动入口,窗口大小自己定,指向其他网站的链接交给浏览器打开。它和浏览器里是同一个网页,所以登录和通知要先测一遍再依赖。

Reddit 官方提供什么

Reddit 帮助中心的 Where can I download the official Reddit mobile app? 说官方应用到设备对应的商店获取,iOS 是 App Store,Android 是 Google Play。另一篇最低系统版本也只写了这两个平台,设备系统太旧的话建议改用手机网页版。截至 2026 年 11 月,这两篇都没有列出 Mac、Windows 或 Linux 应用。

Pake 窗口补的就是这个空缺,它不会添加网站没有的功能,只存在于手机应用里的东西依然留在手机上。

哪个 Pake 适合你的系统

Pake CLI 免费开源,Mac、Windows、Linux 都能构建,需要 Node.js 20.9 或更新、Rust 1.85 或更新,Linux 上还要 WebKitGTK 开发包,其余见快速开始和 CLI 常见问题。Linux 上它能出 .deb、.rpm 和 .AppImage,--targets zst 出 Arch 包,所以桌面版不支持的发行版也能用它。

Pake 桌面版不需要这些工具,支持 macOS 14 或更新、Windows 10 2004 版本或更新(x64 和 ARM64),Linux 上只支持 Arch 系的发行版,比如 x86_64 的 Omarchy,Ubuntu 和 Fedora 用 CLI,系统要求见安装页,表单说明见创建应用。

用 CLI 构建

npm install -g pake-cli
pake https://www.reddit.com --name Reddit --width 1100 --height 800 --hide-on-close --show-system-tray

--name 是应用名,--width 和 --height 是窗口起始大小,默认 1200 × 780。--hide-on-close 让关闭按钮隐藏窗口而不是退出,--show-system-tray 加托盘图标,方便把窗口叫回来。第一次构建要编译依赖,是最慢的一次,之后会快一些。Mac 上默认出 DMG,加 --install 会直接装进 /Applications。

用桌面版构建

打开 Pake,在创建页粘贴 https://www.reddit.com,看一下自动填好的名称和图标。在窗口外观里设默认尺寸,想让它常驻后台就在运行偏好里打开常驻后台,然后点创建应用,几秒就好,点打开启动。没有授权时每个新应用会用掉一个免费名额,见安装页。

指向其他网站的链接

Reddit 里大半是链接,打开位置由链接规则决定。Pake 对主机名和应用地址相同、或同属一个根域名的链接留在应用里,所以 reddit.com 的各个子域名都不会跳走,其他链接用默认浏览器打开,所以帖子里指向新闻站、代码仓库或视频的链接会跳到浏览器,作为阅读器这通常正是想要的。

有两个设置可以改。--safe-domain 接一串用逗号分开的域名,列出的域名和它们的子域名留在应用里,只匹配主机名,不匹配路径和查询参数。这个列表会替换默认规则,所以要保留 reddit.com,再加上另一个主机名:

pake https://www.reddit.com --name Reddit --safe-domain reddit.com,redd.it

--internal-url-regex 用你写的正则做同样的事,两个都设时以正则为准,桌面版把它放在高级里,叫内部链接正则。--force-internal-navigation 会让所有链接都留在应用里,对阅读器来说正好相反,保持关闭。构建后点一个外站链接和一个别的子版块链接,确认各自去了该去的地方。redd.it 是 Reddit 的短链和图片域名,如果还有别的主机名上的 Reddit 链接跑去了浏览器,就看一下浏览器地址栏里的主机名,加进这个列表。

登录

Reddit 自己的用户名密码登录在 Pake 窗口里和普通网页一样能用。Google 和 Apple 的登录按钮不同,Google 不允许在内嵌浏览器里登录,报错是 disallowed_useragent,没有任何 Pake 设置能改变这一点,三种看起来相似的失败怎么区分,见 Google 登录指南。

Pake 在 Mac 和 Linux 上让登录页留在当前窗口,Windows 上打开新窗口的选项开着时会用弹窗,这个选项在桌面版叫新窗口在应用内打开,CLI 里是 --new-window,Sign in with Apple 是例外,保持原生弹窗路径。如果你用 Google 登录 Reddit,在应用里登一次就行,页面拒绝的话用浏览器,或者尽量给 Reddit 账号设一个密码。

Pake 不加参数时不会进入隐私模式,退出再打开一次,确认不用重新登录,如果又要登录,检查构建时是不是带了 --incognito(桌面版叫无痕浏览)。

通知

Reddit 的通知文章说,在 reddit.com 上打开 Settings,点 Notifications 标签,逐类开关。这页没有说网站会不会发系统提醒,而 Pake 应用只转发页面发出的请求。页面通过标准的 Notification API 请求,Pake 回答权限已授予,再把每条提醒交给系统。

所以要自己测一下,打开一类通知,用另一个账号或设备回复一条,看应用在后台时有没有横幅出现。通知指南讲了发送路径、系统专注模式,以及各系统上点击提醒会发生什么。提醒只在应用运行时才能到达,这就是要用常驻后台或 --hide-on-close 的原因。

用 CSS 整理页面

Pake 能把样式表注入应用打开的每个页面,CLI 里是 --inject ./reddit.css,桌面版在高级里的注入 CSS,细节见注入 CSS 和 JS。一个最简单的文件长这样:

body {
  font-size: 17px;
}

Reddit 的文字会不会跟着变,要看它自己的样式表怎么设字号,Reddit 改版也不会提前通知。想只改页面的某一块,用 --debug 构建,它会打开开发者工具,检查那个元素,把它的选择器复制进文件。改版后选择器不再命中,规则什么都不会做,改一行重新构建就行。

窗口大小和置顶

默认 1200 × 780 适合带侧栏的信息流。窗口收窄一些,可以放在编辑器旁边当陪读窗口,布局会像浏览器里一样跟着宽度变,收窄到信息流读着还舒服就行,大小和标题栏的选项见自定义窗口。

想让它一直在最前面,用 --always-on-top,桌面版是窗口外观里的始终置顶,哪些系统上有效见置顶指南。Linux 各个合成器行为不同,最好在自己的系统上测一下。

构建后检查什么

Pake 窗口跑的是系统 WebView,Mac 上是 WKWebView,Windows 上是 WebView2,Linux 上是 WebKitGTK,所以 Reddit 的表现就是这个引擎里的表现。构建后查四件事:信息流滚动是否顺畅,视频帖能不能播放,发帖表单里能不能上传图片,外站链接是不是在浏览器里打开。如果只在 Linux 上出问题,CLI 常见问题建议窗口空白时用 PAKE_LINUX_WEBKIT_SAFE_MODE=1,点击没反应时用 =0。

如果 Reddit 完全不接受这个窗口,就只能退回浏览器标签页或手机应用,Pake 改变不了网站的决定。

更新

网站自己会在每次加载时更新,它外面那层 Pake 运行时不会,更新 pake-cli 后用同样的网址和名字再跑一遍同一条命令,桌面版则是编辑应用再保存。

常见问题

Reddit 有官方桌面应用吗?

没有,Reddit 帮助中心只列了 iOS 和 Android,上面的页面构建前再看一眼有没有变化。

Pake 桌面版能在 Ubuntu 上用吗?

不能,Linux 上它只支持 Arch 系的发行版,比如 x86_64 的 Omarchy,其他发行版用 CLI。

两个账号能各开一个窗口吗?

能,用不同的名字构建两个应用,做法见同一网站用两个账号。