Vuncloud 博客
← 返回机房手记专栏

2026 GitHub 免费开源工具推荐:30 个真正能解决问题的实用项目,开发、办公、自动化都能用

按问题选,不按星标 · 开发 / 办公 / 自动化各 10 个 · 先读 LICENSE约 16 分钟阅读

两位开发者坐在 MacBook 前写代码,画面对应日常开发与办公里会用到的 GitHub 开源工具

GitHub 上每周都有一份「2026 必装开源工具」。星标只能说明有人点过 Star,不能说明它替你做掉了哪一件具体的事。下面 30 个按问题来选:开发、办公、自动化各 10 个。入选只看三件事——能在你自己的机器上跑起来、许可证允许自己用、替换的是一项说得清的劳动:搜代码、看 diff、合并 PDF、记账、盯网站、把备份真正存到别处。

n8n 和不少「开源面板」很常见,但许可证不是 MIT、Apache、GPL 这一类,所以没有放进来。流程编排留给 Activepieces 的 MIT 核心和 Node-RED。镜像标签和条款会变,安装前打开该仓库的 LICENSE 和 README。这 30 个不用一次装齐。

30
按要解决的问题选,不按星标排行
10×3
开发、办公、自动化各一条能落地的线
LICENSE
先读许可证,再决定要不要进日常使用

这份清单怎么筛

三类就够用,不必再按「AI / 效率 / 极客」拆一遍。

  • 命令行:今天装在开发机上,解决搜代码、看 diff、管语言版本、调 API。
  • 桌面或本地笔记:数据先落在你的磁盘上,同步是后一步。
  • 自托管:用仓库里的 Docker Compose。管理页面绑在本机回环,再用 SSH 转到自己的浏览器。
同类只留一个

笔记、文件夹同步、流程编排、备份,各留一套。两套笔记抢同一个目录,删文件时你分不清是同步还是备份。Syncthing 会把删除也同步过去;restic 才是加密备份。

开发:十个每天会打开的仓库

这一组几乎都是命令行,许可证干净,macOS 用 Homebrew 就能装。Linux 用发行版的包或上游安装脚本,命令本身一样。

工具解决什么许可证形态
ripgrep在仓库里按内容搜索Unlicense命令行
lazygit看清暂存、分支和提交MIT终端界面
delta把 diff 读成能改的东西MIT命令行
GitHub CLIPR、Issue、Actions 留在终端MIT命令行
act在本机试跑 GitHub ActionsMIT命令行 + Docker
uvPython 版本、虚拟环境和安装MIT OR Apache-2.0命令行
RuffPython 检查和格式化MIT命令行
miseNode、Python、Go 版本跟着项目走MIT命令行
k9s在终端里看 KubernetesApache-2.0终端界面
BrunoAPI 请求集合放进 GitMIT桌面

1. ripgrep:在仓库里按内容找

BurntSushi/ripgrep · Unlicense · 命令行

系统自带的 grep 能用,大仓库里你要的是尊重 .gitignore、带上行号、速度跟得上编辑器。ripgrep 做的就是这件事。VS Code 的搜索底层经常就是它;终端里再装一份,脚本和编辑器才走同一套忽略规则。

macOS:brew install ripgrep,在仓库根执行 rg "TODO|FIXME"。一年只搜一次小项目,就不必再叠 ack 或 ag。

2. lazygit:看清这次到底改了什么

jesseduffield/lazygit · MIT · 终端界面

它不教你 Git,它把暂存区块、分支、近期提交摊在一个屏幕上。按块暂存、临时搁置、看 reflog,比来回翻 git status 快。危险键也在同一个界面里,丢提交之前先搞清 git reset 和 git revert 的差别。

brew install lazygit,仓库里运行 lazygit。把它当视图,不把它当「再也不用记命令」。

3. delta:diff 要能读

dandavison/delta · MIT · 命令行

默认的 git diff 在大改动里只剩红绿两团。delta 按语法高亮、并排或行内对比,审查自己的提交时少翻车。brew install git-delta 之后:

git config --global core.pager delta
git config --global interactive.diffFilter "delta --color-only"

已经有一套你读得惯的 diff 工具,就不必为了换色再装一个。

4. GitHub CLI:PR 不用离开终端

cli/cli · MIT · 命令行

gh 管的是 GitHub 上的事:开 PR、看 Checks、拉 Issue、看 Actions 日志。仓库历史仍然是 git。登录用 gh auth login,令牌留在系统钥匙串或 gh 自己的凭证存储里,不要写进 shell 历史或仓库。

brew install gh
gh pr create
gh run watch

5. act:推上去之前先在本机跑一遍工作流

nektos/act · MIT · 命令行 + Docker

act 用 Docker 在本机执行 GitHub Actions。改 workflow 时先 act -l 看有哪些任务,再跑你改的那一个,省掉「推十次才绿」。brew install act,Docker 要在跑。

它模拟的是常见 Linux runner,不是 GitHub 的 macOS runner。工作流要 Xcode、签名或模拟器时,act 替代不了一台真的 Mac。那种任务直接在 Mac 上跑。

6. uv:Python 环境别再叠三层工具

astral-sh/uv · MIT OR Apache-2.0 · 命令行

同一台机器上如果同时有 pip、venv、pyenv、pip-tools,新人第一天就花在「为什么这个包装进去了却 import 不到」。uv 把装 Python、建虚拟环境、加依赖收到一套命令里。

brew install uv
uv python install 3.12
uv init
uv add ruff

团队已经把 Poetry 或 PDM 写进文档和 CI,就不要再平行引入 uv,除非你准备改锁文件和说明。

7. Ruff:检查和格式化用同一个工具

astral-sh/ruff · MIT · 命令行

它覆盖很多团队原来分给 Flake8、isort、Black 的活,速度够快,适合放进保存时和 CI。ruff check . 看问题,ruff format . 改格式。不要让 Ruff format 和 Black 同时改同一个仓库,两套格式会互相覆盖。

规则放 pyproject.toml。先在默认规则上跑一周,再按误报收紧,不要第一天打开全部插件。

8. mise:版本跟着仓库走

jdx/mise · MIT · 命令行

Node 22、Python 3.12、Go 1.23 不该靠每个人的 ~/.zshrc 口头约定。mise 在项目里放 .mise.toml,进入目录就切到这个仓库要的版本,离开就恢复。它替代的是「nvm + pyenv + 一份没人维护的 asdf」这种叠层,不是替代语言本身。

brew install mise 之后按 README 把激活行写进 shell 配置。只把二进制放下、忘了 hook,版本不会跟着目录变。

9. k9s:集群出问题先看,而不是先改

derailed/k9s · Apache-2.0 · 终端界面

Pod 起不来、服务没有端点、日志刚被冲掉,这些在 kubectl 里要拼三四条命令。k9s 把命名空间、Pod、日志、端口转发放在一个键盘界面里。brew install k9s,然后 k9s。

生产集群用只读 kubeconfig。有删除和进入容器的快捷键,共享机器上不要挂 cluster-admin。

10. Bruno:API 集合放进仓库

usebruno/bruno · MIT · 桌面

Postman 集合一旦只活在某个人的账号里,环境地址和示例请求就会丢。Bruno 把请求存成文本(.bru),跟代码一起评审。brew install --cask bruno。

密钥放被 Git 忽略的环境文件,不要写进要提交的 .bru。团队已经统一用另一套 API 客户端,就不要再加一个「只有你在用」的集合。

一台显示器上是代码编辑器,另一台开着流程图软件,对应开发工具和办公文档
左边是每天要搜、要看 diff 的代码;右边是文档和流程图。后面 20 个按这个分界来选。

办公:十个能替换订阅的工具

办公这里指的是:PDF、笔记、图、表、任务、记账、文件同步、扫描件归档。能本地先跑的,就不先交一份按座位收费的订阅。自建服务的许可证若分成「核心」和「企业目录」,下面会写明。

工具解决什么许可证形态
Stirling-PDF合并、拆分、压缩 PDF核心 MIT,另有专有目录自托管
思源笔记块引用、数据在本机AGPL-3.0桌面 / 自托管
JoplinMarkdown 笔记和加密同步客户端 AGPL-3.0桌面 / 移动端
draw.io 桌面版流程图放进 GitGPL-3.0桌面
Penpot界面设计文件自己保管MPL-2.0自托管
Grist表格其实是一张数据库Apache-2.0自托管
Vikunja任务、看板、日历AGPL-3.0自托管
Actual信封式记账MIT本地优先
Syncthing文件夹在设备之间同步MPL-2.0桌面 / 服务器
Paperless-ngx扫描件 OCR 和归档GPL-3.0自托管

11. Stirling-PDF:PDF 别再上传到陌生网站

Stirling-Tools/Stirling-PDF · 核心 MIT,另有专有目录 · 自托管

合并、拆分、旋转、压缩,这些事不该把合同传给一个临时网页。Stirling-PDF 把常见 PDF 操作收成自己部署的页面。仓库 LICENSE 写明:proprietary、saas、engine 等目录之外的内容按 MIT;那些目录若存在,走各自的 LICENSE。官方对一部分功能另有生产使用条款。

部署前看 README 推荐的是哪一个镜像和 tag,再读那个 tag 的 LICENSE。个人在自己机器上处理文件可以先用;要给别人当服务,或要转售,先把专有目录的条款读完。中文 OCR 不要假设默认镜像已经装好语言包。

12. 思源笔记:知识库先放在自己的磁盘上

siyuan-note/siyuan · AGPL-3.0 · 桌面 / 自托管

块引用、双向链接、本地优先。笔记的正文在你这台机器的数据目录里,不在某个只能导出一半的账号里。官方同步是可选的付费服务;自己同步可以走他们文档里的 S3 方案。许可证是 AGPL-3.0,自己用、自己改可以,把它做成对公众提供的网络服务时要按 AGPL 履行义务。

内核如果开着网页,绑在 127.0.0.1。不要为了手机方便直接监听 0.0.0.0 又不做认证。

13. Joplin:剪藏和加密同步

laurent22/joplin · 客户端 AGPL-3.0 · 桌面 / 移动端

它更像笔记本而不是块编辑器:Markdown、网页剪藏、端到端加密。同步目标可以是你自己的 Joplin Server、WebDAV 或对象存储。仓库根目录声明代码默认 AGPL-3.0,packages/server 若有单独 LICENSE,部署服务器前打开看。

加密密码丢了,同步过去的笔记也解不开,把恢复方式记在密码库里,而不是记在笔记本里。已经用思源当知识库,就不要把同一批笔记再镜像进 Joplin,两套大纲会分叉。

14. draw.io 桌面版:架构图跟着仓库走

jgraph/drawio-desktop · GPL-3.0 · 桌面

流程图、网络图、时序图存成 .drawio(XML),可以进 Git,diff 虽然不漂亮,但至少不会锁在一个只能导出 PNG 的账号里。桌面仓库当前是 GPL-3.0。不需要协作光标时,桌面版就够,不必再搭一套绘图服务器。

它不是设计系统,组件样式和标注规范仍然要你们自己约定。VS Code 里也有官方扩展,适合改一张图不用离开编辑器的时候。

15. Penpot:设计文件要能自己留底

penpot/penpot · MPL-2.0 · 自托管

界面稿、组件、给前端看的标注,若全部在别人的云上,账号一停就只剩截图。Penpot 可以自己部署,文件偏向开放的 SVG / CSS 思路。许可证是 MPL-2.0。栈里有前端、后端、PostgreSQL 和 Redis,一个人画两张草图不值得为它维护这套服务。

团队真的需要「设计文件在我们自己的机器上」,再用仓库里的 Docker Compose,并钉住你读过说明的版本。否则继续用 draw.io 或本地文件。

16. Grist:Excel 已经变成数据库的时候

gristlabs/grist-core · Apache-2.0 · 自托管

一张表被十个人用微信传来传去,列里混着编号、状态和备注,这已经不是表格,是没有约束的数据库。Grist 保留表格的看法,底下是关系型列,还能写公式。核心是 Apache-2.0。

它不是 BI。要大屏和复杂权限时,先把数据模型收干净,再谈可视化。自建时备份的是数据库,不是某一次导出的 xlsx。

17. Vikunja:任务清单不必先上一套重型系统

go-vikunja/vikunja · AGPL-3.0 · 自托管

待办、清单、看板、分享给几个人,这些需求经常被做成「先部署一套完整项目管理」。Vikunja 小一些,SQLite 就能起步,人也多了再换 PostgreSQL。许可证 AGPL-3.0。

工单要和代码仓库、客服邮箱、SLA 时钟绑在一起时,它不够。那种流程留在你们已经在用的系统里,不要平行再养一份任务真相。

18. Actual:记账先问钱在哪个信封里

actualbudget/actual · MIT · 本地优先

信封预算法:每一笔收入先分到房租、税、服务器、杂项。Actual 把账放在本地,可选自己的同步服务。许可证 MIT。银行自动导入取决于地区和连接器,国内银行卡不要假设能自动拉流水。

它是个人或小团队的账,不是报税软件,也不是公司总账。凭证和发票归档交给 Paperless,不要把 PDF 发票只存在预算软件的附件里当唯一副本。

19. Syncthing:文件夹同步,不经过别人的云

syncthing/syncthing · MPL-2.0 · 桌面 / 服务器

两台电脑、一台手机之间同步某个目录,不需要把文件先上传到网盘。设备用 ID 互相同意,流量点对点。许可证 MPL-2.0。

删除也会同步。一台机器上误删,其他设备跟着删。所以它不是备份。重要目录同步之外,再用 restic 做加密副本,并且保留历史版本。

20. Paperless-ngx:扫描件要能搜到字

paperless-ngx/paperless-ngx · GPL-3.0 · 自托管

合同、收据、快递单扔进一个目录,它做 OCR、打标签、按通信方归档。许可证 GPL-3.0。中文需要 Tesseract 的语言包(例如 chi_sim),默认镜像不一定带。

原件占磁盘,OCR 吃 CPU。不要把它和正在编 iOS 的机器抢同一台 16GB 内存。管理界面不要裸露在公网;原件目录和数据库一起备份。

自动化:十个把重复劳动收掉的项目

这里的自动化是:一条流程、一次通知、一次备份、一次依赖更新。能用一个脚本加 cron 说清的,就不要先上编排平台。

工具解决什么许可证形态
Activepieces把 SaaS 和 webhook 串成流程核心 MIT,ee 目录另计自托管
Node-RED事件和接口的胶水Apache-2.0自托管
Windmill脚本变成定时任务和内部页面社区版以 AGPL 为主自托管
ntfy用 HTTP 发到手机的通知Apache-2.0(服务端)自托管
Uptime Kuma网站和端口还在不在MIT自托管
changedetection.io网页改了就通知Apache-2.0自托管
Renovate依赖升级变成 PRAGPL-3.0GitHub App / 自托管
restic加密备份,并能恢复BSD-2-Clause命令行
Vaultwarden密码库自己放AGPL-3.0自托管
IT-Tools编码、哈希、JWT、cron 表达式GPL-3.0浏览器 / 自托管

21. Activepieces:要可视化流程时,先看清哪一部分是 MIT

activepieces/activepieces · 核心 MIT,ee 目录另计 · 自托管

表单进来、写到表、再发一封邮件,这种流程用脚本也能写,但交接时图画着更清楚。Activepieces 的 LICENSE 写明:packages/ee/ 之外的内容是 MIT;企业目录走单独的企业许可证,生产环境使用那些功能前要符合他们的订阅条款。

n8n 的 Sustainable Use License 允许自己跑,但限制你把它做成给别人用的托管服务,所以没有放进这 30 个。你要是已经自己部署了 n8n,而且不对外提供,不必为了这份清单迁移。新搭流程、又希望核心代码是 MIT,用 Activepieces 的社区部分,企业功能没签约就别开。

22. Node-RED:一条消息从 webhook 走到下一个系统

node-red/node-red · Apache-2.0 · 自托管

它适合事件:收到 webhook、转一下 JSON、发到另一个接口或消息队列。Apache-2.0。流程导出进 Git。令牌放它的凭据存储,不要写进你提交的流程 JSON。

大批量数据和复杂重试,不该堆在一张越来越大的画布上。那种任务用 Windmill 或你们现有的作业系统。

23. Windmill:脚本已经一抽屉时,给它一张内部页面

windmill-labs/windmill · 社区版以 AGPL 为主 · 自托管

仓库 LICENSE 写明:默认 AGPL,另有 Apache-2.0 文件,企业功能走专有许可。适合把一支 Python 或 TypeScript 脚本变成「同事能填个表再跑」的内部工具,并加上调度。

只有一个 cron 和一支脚本时,不必上它。要上,先分清你用的是社区功能还是企业功能,再决定能不能接受 AGPL。

24. ntfy:通知不要只存在日志里

binwiederhier/ntfy · 服务端 Apache-2.0 · 自托管

备份失败、证书快过期、构建红了,这些如果只写在服务器日志里,等于没有通知。ntfy 用一条 HTTP 请求推到手机或桌面。服务端是 Apache-2.0。公共的 ntfy.sh 上,主题名会被猜到;自己部署,加上访问令牌。

curl -d "backup failed" -H "Authorization: Bearer TOKEN" https://ntfy.example/ops

把令牌换成你自己的,域名换成你自己的。不要把示例里的主题名用到生产。

25. Uptime Kuma:先知道它挂了

louislam/uptime-kuma · MIT · 自托管

HTTP、TCP、Ping、证书到期,一个状态页就够小团队用。MIT。它不是指标系统,CPU 和延迟直方图交给 Prometheus 一类的工具,不要在 Kuma 里堆。

公开状态页会把内部主机名暴露出去。对内的检查留在内网或 SSH 后面,对外只放你打算让用户看到的项。告警接到你自己的 ntfy。

26. changedetection.io:页面变了,而不是你每天去刷新

dgtlmoon/changedetection.io · Apache-2.0 · 自托管

价格、文档段落、招聘页、版本发布说明,设一个选择器,变了再通知。Apache-2.0。要执行 JavaScript 的页面会用浏览器,CPU 比抓静态 HTML 高,间隔拉长。

遵守对方网站的条款和 robots。不要用它去打登录后的页面或明确禁止抓取的内容。通知仍然走 ntfy,不要再装一套聊天机器人只为了这一件事。

27. Renovate:依赖升级变成可以拒绝的 PR

renovatebot/renovate · AGPL-3.0 · GitHub App / 自托管

锁文件过期通常不是因为没人知道,是因为没人愿意在一个巨大 diff 里找破坏性变更。Renovate 按包拆 PR,配置放仓库里的 renovate.json。许可证 AGPL-3.0。公开仓库常用托管的 GitHub App;私有仓库不想装第三方 App,再自建。

第一周不要打开 major 的自动合并。Dependabot 是 GitHub 的产品,不在这份自托管名单里;你要是已经用得顺,不必替换。

28. restic:备份的定义是你演练过恢复

restic/restic · BSD-2-Clause · 命令行

加密、去重、可以放到本地磁盘、SFTP 或对象存储。BSD-2-Clause。Syncthing 同步的是当前状态,restic 留的是历史快照。

restic init --repo /path/to/repo
restic -r /path/to/repo backup "$HOME/Documents"
restic -r /path/to/repo snapshots
restic -r /path/to/repo restore latest --target /tmp/restore-test

密码用 RESTIC_PASSWORD_FILE 指向一个不进 Git 的文件。每个季度至少恢复一次,确认快照不是空的。

29. Vaultwarden:密码库的服务端自己放

dani-garcia/vaultwarden · AGPL-3.0 · 自托管

它实现的是与 Bitwarden 客户端兼容的服务端 API,比官方服务端轻,许可证 AGPL-3.0。这是社区实现,不是 Bitwarden 公司的官方服务器。客户端仍然用官方 Bitwarden 应用。

必须走 HTTPS。管理令牌不进仓库。备份的是数据目录,同时把加密口令放在另一处——只备份数据、口令只记在脑子里,机器坏了就等于没有密码库。不要把它暴露在没有认证的公网端口上。

30. IT-Tools:杂活留在浏览器里

CorentinTh/it-tools · GPL-3.0 · 浏览器 / 自托管

Base64、哈希、JWT 解码、cron 表达式说明、正则,这些每周都要做一次,不值得为每个再找一个来路不明的网页。IT-Tools 可以本地打开,也可以自己部署。GPL-3.0。很多工具在浏览器里计算。

即便如此,也不要把生产环境的令牌贴进一台给整个公司用、你又没审计过的实例。自己本机开一份就够。

第一周实际装什么

30 个是菜单,不是安装脚本。第一周只留下面这些,用满七天再加。

你在做的事先装先不装
每天写代码mise、uv、Ruff、ripgrep、lazygit、delta、ghact(没有 Actions 可改时)、k9s(没有集群时)
笔记和文件思源或 Joplin 二选一,加上 Syncthing第二套笔记、Penpot
钱和合同Actual,PDF 用你读过许可证的 Stirling 镜像Paperless(磁盘和 OCR 没准备好时)
机器要自己管ntfy、Uptime Kuma、restic,并做一次恢复Activepieces、Windmill(还没有第二条流程时)
开发机上的第一组命令
brew install ripgrep lazygit git-delta gh uv ruff mise
git config --global core.pager delta
git config --global interactive.diffFilter "delta --color-only"
uv python install 3.12

mise 的 shell 激活行以它当前 README 为准。gh 用 gh auth login,不要把令牌写进仓库。

自托管时别踩的坑

  1. 管理页面绑 127.0.0.1,用 SSH 本地转发到你的笔记本。Uptime Kuma、Vaultwarden、思源、Paperless、Activepieces 都一样。
  2. 企业目录不是顺手克隆就能用。 Activepieces 的 packages/ee、Stirling 的专有目录、Windmill 的企业功能、AFFiNE 这类「前端 MIT、服务端另有企业条款」的项目,生产环境先读那一份 LICENSE。这篇用思源而不是把 AFFiNE 的自建后端算成免费方案,就是这个原因。
  3. AGPL 自己用通常没问题,把它做成对公众提供的网络服务,要履行相应的源代码义务。不确定就读许可证,而不是读营销页上的「open source」。
  4. 同步不是备份。 Syncthing 传删除;restic 留快照。密码库的口令和数据目录分开存放。
  5. 钉版本。 Compose 里写你读过说明的 tag,不写浮动的 latest。升级前看该版本的迁移说明。
  6. 密钥不进 Git。 Bruno 的环境文件、Node-RED 的令牌、restic 的密码文件、ntfy 的 Bearer,都放在被忽略的路径。

放在 Cloud Mac 上时

命令行这一组用 Homebrew 装在 Mac 上即可,不占用多少内存。Docker 里的 OCR、设计协作和流程编排会吃内存和磁盘。16GB 的机器如果同时还在跑 Xcode 和模拟器,不要把 Paperless 的中文 OCR 或 Penpot 的整套数据库放在同一台上面。PDF 和扫描件更适合放在磁盘更大、不跟编译抢 CPU 的机器上。

act 用的是 Linux 容器,替代不了需要 Xcode 的 GitHub Actions。iOS 构建、签名和模拟器留在 Mac 上跑;workflow 里只是 lint 或跑 Linux 测试时,再用 act 在本地预演。

管理界面继续绑回环地址。你从自己的电脑执行 SSH 转发,例如把远端的端口转到本机浏览器,而不是把 Vaultwarden 或 Kuma 的端口映射到公网 IP。restic 的仓库放到对象存储或另一台磁盘,Mac 本身不要成为唯一的副本。笔记和 .mise.toml、Ruff 配置进 Git;密码和 API 令牌不进。

FAQ

星标高就值得装吗? 不值得当成理由。星标说明传播广,不说明许可证适合你,也不说明它解决的是你的问题。先写下一件你这周要省掉的劳动,再从上面的表里挑。

为什么没有 n8n? 它使用 Sustainable Use License,不是 MIT / Apache / GPL。自己部署、不把它做成对外托管服务时,很多人在用,不必为了这份清单迁移。这份名单要的是许可证边界更清楚的替代:Activepieces 的 MIT 核心,或 Apache-2.0 的 Node-RED。

30 个都要装吗? 不要。第一周只装「第一周实际装什么」那张表里和你有关的几行。同类笔记、同步、编排、备份各留一个。

AGPL 和 MIT 自己用有什么差别? 在自己的机器上使用、修改,两者都可以。差别主要在分发和网络服务:AGPL 对通过网络提供服务有源代码义务,MIT 基本只要求保留版权声明。企业目录和专有附加条款要单独读,不能用「仓库首页写了 MIT」概括整个仓库。

自托管密码库安全吗? Vaultwarden 让数据在你的磁盘上,同时把 HTTPS、更新、备份和口令保管交给你。官方 Bitwarden 托管是另一种取舍。无论哪边,口令和数据备份都要分开,并演练过恢复。

能全部放在一台云 Mac 上吗? 命令行工具可以。OCR、Penpot、多套数据库不适合和 Xcode 挤在 16GB 内存里。管理页面用 SSH 转发,restic 的副本不要只放在这台 Mac 上。

机房手记 · 开源

命令行用 Homebrew,管理页走 SSH 隧道

ripgrep · restic · Cloud Mac

查看 Cloud Mac 套餐
限时优惠 点击查看套餐