# Mole 出 Mac 版后，用户教会了我做产品

> Mole CLI 是去年在泳池边写的几百行代码，Mac 桌面版做出来才三个月。这篇记下真正学到的几件事：AI 多出来的三类垃圾该怎么分、删之前为什么要先看一眼、怎么让它平时不来打扰你、怎么把它做到 70 岁的老爷爷也能用，以及一个人做产品时的取舍。

- 发布日期: 2026-08-16
- Author: Tw93
- HTML: https://tw93.fun/2026-08-16/mole-mac.html
- English translation: https://tw93.fun/en/2026-08-16/mole-mac.md
- 全部文章: https://tw93.fun/posts.md

---

![《Mole 出 Mac 版后，用户教会了我做产品》文章封面](https://cdn.tw93.fun/blog/pic/mole-mac-cover-calm.png)

最近我写了不少关于独立开发的思考，想着汇总一下，就把 Mole 从开源 CLI 做到 Mac 付费软件这一路聊一聊，当时是怎么想的，哪些事情做下来有用。

> Mole 的官网是 [mole.fit](https://mole.fit)，CLI 在 [GitHub](https://github.com/tw93/Mole) 开源，可以先去玩一玩。

去年国庆我在三亚的泳池边写了几百行代码，做了个 Mac 清理的命令行工具 Mole CLI 开源到 GitHub 上，本来只想给自己和同事用。结果不到一年收了 60K star，陆续发了 50 多个版本，121 位来自全球各地的开发者提交过代码，解决掉近 800 个功能建议和 Bug。

其实我一直没太意识到用的人有多少，直到有一次，因为在 README 上挂了两张用 Vercel 加速的图片，流量把账单跑超了，欠了 Vercel 80 刀。当时才反应过来，桌面端可以做了。

之前收到最多的一类邮件来自国外用户，大意都差不多：我父母也用 Mac，我妹妹也用，但他们不会开终端，能不能做一个不用敲命令就能用的版本。这件事拖了挺久，主要是觉得 CLI 本身还没到成熟的地步。等 CLI 跑了大半年，哪些能删、删到什么程度算安全，心里有底了才开始做桌面版，做到自己敢天天用了才发出去。当天晚上十点发布，那一夜通知一直在响，法国、德国各种币种都有，后来为了睡觉把邮箱通知关了。后面几个月一直在加东西，等于是一批用户先掏了钱，再陪着我把它做完。CLI 没有任何变化，照旧开源免费，也会一直更新，付费的只有桌面版。

<video width="800px" controls preload muted autoplay playsinline loop>
  <source src="https://cdn.tw93.fun/blog/pic/new-mole.mp4?v=1" type="video/mp4">
</video>

## AI 多出来的三类垃圾

桌面版做出来之后，我自己用得最多的反而是清理，因为这台 Mac 经常跑出空间不足的警告。我全天开着 Claude Code 和 Codex 写东西，后来才发现 AI 留下的文件跟以前很不一样。

主要是三块。最明显的是编译产物，以前一天手写几百行代码编译三五次，现在一个下午让 agent 跑十几轮，每轮都要编译。Rust 项目的 target、前端的 .next 和 dist、Xcode 的 DerivedData 增长极快，我自己有一次清出 86G 全是这些。其次是 AI 工具自己留下的旧版本，Claude Code、Cursor Agent 都是静默更新的，每次拉个两三百兆的新版本，旧的就存在那里不管。再就是 Ollama 和 LM Studio 拉下来的本地模型，动辄占掉几十 G。

![Mole 清理完成页显示本次释放 86.4 GB 空间](https://mole.fit/img/ch/clean.webp)

如果把这些都压成同一份「安全可删」的清单当然省事，但代价是替用户把决定做了。后来我处理这类数据主要按拿回来的代价来分，扫出来的每样东西先判定归属，再决定默认要不要勾上。

像编译产物、多数日志、HTTP 和 GPU 缓存，删掉以后重新编译一次或刷下网页就回来了，代价只是几分钟 CPU，只要相关的 App 退出了就可以默认清。但 node_modules、Pods、venv 这些包管理器缓存，看着也是依赖目录，删了却必须重新联网下。在高铁或者飞机上想跑一下项目就只能干等。这两类很容易一起当垃圾清掉，Mole CLI 早期就是这样，后来我专门把所有下载类的目录从 Mac 版的清理列表里摘了出去，得让用户自己看一眼。

![Mole 把清理候选分为可再生、重建代价高和不可替代三类](https://mole.fit/img/blog/cleaner-data-kinds.webp)

至于模型，是这里面占用最大的一类，几十 G 重下一遍非常耗时。而且通用清理工具想帮着删也删不对，Ollama 把模型拆成一堆按哈希命名的块，多个模型可能共用同一块，从文件系统上直接删掉一个看着很大的块，很可能把另一个模型也弄坏。这种引用关系只有工具自己清楚。

所以 `~/.ollama/models`、`~/.cache/huggingface` 这类路径在代码里是写死的保护名单，扫描阶段根本不会出现，只在磁盘分析那边显示占用大小，模型本身交回给 Ollama、LM Studio 自己管。

![Ollama 模型 A 与模型 B 共用部分 SHA256 数据块的关系图](https://mole.fit/img/blog/ai-model-store.webp)

还有一类东西比模型更不能动，是 AI 的会话记录。`~/.codex/sessions`、`~/.claude/projects`、`~/.grok/sessions` 里存的是你和 AI 几个月甚至一年的完整对话，里面有当时的思路、被否掉的方案、每一处为什么这么改的原因，删掉就真的没了，说起来比代码本身还珍贵。所以这几个路径在 Mole 里永远不会清，放了多久没动过都一样，同样受保护的还有 memories、plans、skills 和生成的图片。

![Mole 磁盘分析页用矩形树图展示 Library、项目和图片的空间占用](https://mole.fit/img/ch/analyze.webp)

这些保护名单不是一开始就想好的，基本都是踩出来的。最蠢的一次是 `com.apple.e5rt.e5bundlecache`，名字里带 Caches，位置也在缓存目录下，怎么看都是缓存，其实它是苹果神经引擎编译好的模型。CLI 早期真把它当缓存清了，用户那边所有用到识别功能的 App 全挂，一直到重启才好。从那以后我养成一个习惯，看到名字里带 cache 的目录，先在心里过三个问题，谁写的，重启之后谁会去读它，万一删错了怎么找回来。有一个答不上来我就不动它。

## 先看一眼再删

这类工具好不好，我不太看能清多少，主要看删之前让不让你看清楚。

Mole 清理的时候是先扫描，逐项列出来，每一项显示具体是什么、在哪、占多少，拿不准的默认不勾选，确认完再删，删的时候优先进废纸篓，后悔了还能找回来。扫描和清理全程在本机完成，文件和结果都不会上传。代价是慢，多了一步确认，赶时间的时候会嫌它啰嗦，但我还是想让它宁可漏删也不误删。

![Mole 卸载页展开 Claude 的应用本体、支持文件、日志和缓存](https://mole.fit/img/ch/uninstall.webp)

卸载走的是同一套逻辑，选中一个 App，Mole 会把它散在系统各处的东西一起翻出来，逐项标上路径和大小，上面这张图里 Claude 本体只有 781MB，`~/Library/Application Support/claude` 却有 7.67 GB，真正占空间的从来不是应用包本身。登录项和后台服务也放在同一页，不用再去系统设置里一个个找。

举个例子，macOS 系统更新下载下来的安装包，也就是 `/macOS Install Data` 那个目录，经常十几个 G，看着是完美的清理目标。但系统可能还等着用它把更新装完，删早了机器就起不来。所以它在 Mole 里是默认不勾选的审阅项，前面叠了三道门，系统里有更新等着装就整行隐藏，安装包最近 14 天里动过就隐藏，安装相关进程还在运行也隐藏，哪个信号读不出来，就当它有风险，直接不显示。

真到执行删除那一刻，root 权限的脚本还会把这几项检查重新跑一遍，不通过就非零退出，不会出现「报告说清了 12G 其实一个字节没动」这种事。

我自己判断一款清理工具好不好，有个很土的办法。装同一个厂商的两款产品，只卸掉其中一款，看它会不会把两款共用的 Application Support 父目录或者 group 容器也列进去。列进去了，说明它是按名字匹配的，不是按归属判断。归属都说不清的工具，我不太敢让它批量删东西。

![Mole 按应用归属查找容器、支持文件、缓存与系统扩展，并避开共享容器](https://mole.fit/img/blog/leftover-attribution.webp)

## 平时它不会来打扰你

该找的文件它都会去找，只是平时不会主动来打扰你。

装了之后它不会隔三差五弹个通知提醒你该清理了，也不会扫完之后跳出来说你的电脑有多危险。你想清的时候打开它，不想的时候它就跟不存在一样。

界面上也是同一个想法，扫描没结束就不进结果页，等一下就能好的事连加载提示都不给，要等一阵才出现一个正在忙的动画，完成页也提前留好空间，结果出来的时候窗口不会跳一下。这些规定都很琐碎，合起来就是它用起来稳的原因。

底下要做的事情本来就不好预测，这时候加动画帮不上忙，还是得流程本身够可靠。我不希望一个维护工具需要人一直盯着，发起任务，等它完成，再拿回屏幕就够了，不用老闪着灯提醒你来看它。

无障碍也算在里面，朗读顺序、键盘操作、焦点稳不稳，和看上去安不安静是同一件事。系统开启「减少动态效果」之后，行星会停止装饰性旋转，状态变化也减少空间移动，任何操作都不依赖用户看懂动画。

![Mole 菜单栏面板安静地浮在桌面右侧，按需展示硬件状态和维护入口](https://mole.fit/img/ch/menubar.webp)

## 让 70 岁的老爷爷也能用

以前我做东西基本只考虑身边同事和朋友用得顺不顺手。这次从 CLI 做到桌面端才发现，要让一个 70 岁的老爷爷也用得上，中间要过的事情多得多，也有意思得多。下面这些都是从这三个月的用户邮件里翻出来的，我最大的收获几乎都在这里。

有位快 70 岁的英国用户，说他犯了一个老年时刻，把 Mole 又买了一遍，「第二笔钱就当做送你，谢谢这个出色的工具，帮我省下了比 CleanMyMac 多得多的英镑」。我建议他退款或者把多出来的授权送人，他去问了一圈，第二天回我「我邻居没人用 Mac，我 Bluesky 上的关注者也没有，这一轮算我请你」。收到这样的信，我会觉得必须把产品做得更好，才对得起这份信任。

一位美国用户纠正了我一个关于地区习惯的错误想法。我一直以为美国人看温度就得用华氏，所以美区默认给了华氏，他说：「美国人在所有技术相关的场景都用摄氏度，只有天气和体温例外。我装上 Mole 看到 110，吓了一跳。Apple 给美国人看的规格也是摄氏度，fastfetch、neofetch 在美式系统上默认也是摄氏度。建议保留华氏切换，但所有地区默认摄氏度。」后来就改成了默认摄氏可切华氏。他还追了一封聊定价，说我给的那个数字读起来不像刻意定的价，像是从别的货币换算过来的，又补了一句「我说外来不是指反华，而是人们希望感觉到作者理解他们」。说实话那个价格就是我拍脑袋定的，做产品之前从没认真想过定价这件事，被一个素不相识的用户当面点出来，挺不好意思的，原来一个价格数字也会影响用户的决策。

一位视力轻度障碍的用户说：「看起来是个很不错的 App，可惜我用不了，它似乎把深色模式写死了。我系统设成浅色，也只用浅色模式的 App。」Mole 只做深色其实是个刻意的决定，菜单栏面板像 HUD 一样浮在壁纸上，深色玻璃眩光更少，也不用多一个主题开关。但这个理由对他不成立，我一直觉得自己在无障碍上做得挺认真，却完全没想到浅色模式本身也是一种无障碍需求。这封信收到有一阵了，Mole 到现在还是只有深色，浅色一直排在列表上没做完。一个说自己在意无障碍的产品，把一位明确说了用不了的用户晾到现在，这件事我一直有点过意不去。

还有一位德国大学的讲师来申请教育授权，说这「不仅是对我个人的支持，也是一种有意义的教育层面的支持」。原来还有国外的老师在课堂环境里用我的产品，这是我没预料到的用法。一位匈牙利的医生则给了最真实的差评，「说实话，这个价格对一个免费应用也能做到的事情来说有点高了」。这条我一点都不觉得刺耳，不同国家购买力差别很大，他不是在抱怨，是在帮我定位问题。

Mole 里我自己最喜欢的几个功能，起源其实都不是我想到的。AirPods 快没电时会收到一条提醒，是做电池健康那阵子加的，我一直没遇到这个场景，直到某天下午真的收到了，很贴心又不打扰。屏幕常亮做了三种不同的行为，也是用户提醒之后才补的，周末突然出门，AI Coding 那边可以继续跑，帮我省下不少异步的时间。状态里能看到 iPhone 的电量，这一块之前不太好实现，后来也找到了办法。这些都是用户告诉我要加的，加完之后我自己受益最多。

## 其实我一直手工回邮件

答疑、退款、重置激活码这些事加起来不到用户量的 1%，花半小时写个脚本就能全自动，但我没写。只有自己一封封处理过，才能感觉到用户到底要什么、为什么退款、哪里让他不舒服，而那经常不是他第一句话问的东西。我给自动化定的门槛是三件事都成立，问题反复出现，答案已经稳定，例外也都摸清楚了，在那之前我宁愿一封封回。目前这样还有效，我没花钱做营销，增长基本来自口碑，退款率低于 0.8%。买的人里有不少是先用了很久 CLI 的老用户。

发布之前我也没有搭工单系统、客服平台和知识库。工程师喜欢先把这套支撑系统搭起来，因为那是熟悉的工作，AI 又把它压缩到半天，更容易让人过早动手，可是搭起来只要半天，维护却是长期的事，而且暂时根本用不到。等哪天收件箱开始丢请求、看不清响应时间，或者同一个问题得到了不同回答，那才是真正需要新系统的时候。AI 能把开发压缩到几天，但和人打交道不能省，不然做产品也没什么意思。自己一封封回信，慢慢也就有了信任。

## 这几件事，我觉得做下来很有用

写代码其实只是一小部分，更多时间都在弄清楚别人到底痛在哪里、怎么不用看说明书就会用、怎么让需要的人看到。一个人把这些环节全跑下来，感觉和写代码完全不一样。

对一个清理工具来说，不删什么比删什么重要得多，前面的保护名单就是这么来的。很多功能本身挺好，但只要不在这条主线上，我就坚决不加，不然功能一堆砌，自己也不好维护。

脑子里要清楚接下来的路线，知道哪些需求不该接。软件不用看说明书就能顺手用，才算及格。有不少朋友提过很酷的建议，只要会让软件变吵或者变复杂，我都婉拒了。一百个用 Mac 的人里有一位觉得它有用，就足够了。

现在一个功能进路线图之前要过三道门：用户没点进这个功能就不能有常驻的定时器、监听器和采样开销，不能为一点小便利去扩大特权助手或者新增系统权限，有合理默认值的时候不能加设置项。这不是所有软件的通用原则，是 Mole 给自己定的规矩，常驻的工作、特权和配置每多一样，用户就得多信任你一点。

![许多功能想法穿过三道筛选门，最终只有少数走向安静稳定的产品](/images/blog/mole-product-gates.svg)

我基本没攒过大招，尽量做到每周都发一版，这样用户的问题能及时解决，也能跟人有来有回地聊。每次发布、更新、宣发其实都是一次很好的沟通机会，也让之前没看到消息的人知道你在做什么。

现在用 AI 写代码，省下的时间更应该花在想清楚问题上。比如把真正的问题聊透、把界面文案改得谁都能看懂。Token 怎么花都不心疼，但要花在用户真正能感受到的地方。

Mole 从第一天就是全球化的，英文内容也发得比中文多。这段时间的感受是世界很大，用户很广，而且他们从一开始就愿意信任你。你顺手帮过的人，后来很可能就成了你的用户，因为彼此有过真实的来往。我也没花钱做过推广，X 上的消息一开始传播很快，但热度过去得也快，反而有些东西发到 YouTube 之后衰减非常慢，只要东西够好，有人推荐，能在上面活很久。

数据我花了不少时间看，销量、访问量、用户评论、退款原因和 GitHub 上的 issue 放在一起，能看到很多自己平时完全没想到的盲区，也知道大家逛到哪一步就不买了。

最后一条是心态。如果一门心思只想快速涨粉或卖货，人很容易动作变形。把平时真实的摸索、踩坑和更新过程发出来，大家看得到你是一个实在做事的人，自然会产生信任。现在网上浮躁的东西太多，愿意长期认真做东西、不忽悠人，反而最能走得远。

## 为什么是五颗行星

Mole 桌面版目前是清理、卸载、优化、磁盘分析、硬件状态五块，界面上每一块对应一颗行星，清理是地球，卸载是火星，优化是水星，分析是木星，状态是太阳。这和我小时候喜欢看各种行星运行有关系，加上十年前学会前端之后第一个特别想学的就是 WebGL，正好凑到了一起。行星的贴图我换了不下 10 次，从 NASA 官网下了很多才挑定，转的方向、转速、完成之后的飞行效果也都照着真实的天体来。

<video width="800px" controls preload="none" muted autoplay playsinline loop poster="https://mole.fit/img/journey-poster.jpg">
  <source src="https://cdn.tw93.fun/mole/journey.mp4" type="video/mp4">
</video>

这部分完全可以不做，做个菜单栏点一下清一下的小工具也能用。但 AI 产生的赛博垃圾已经够多了，与其拿 Token 再堆一个能跑就行的界面，我还是想做个舒服一点的东西出来，不浪费我的 Token，也不污染你的时间线。

我做事情喜欢水到渠成，不喜欢急躁地赶进度，这三个月下来更是这么觉得。踏踏实实做出一个自己用着舒服、别人也愿意买单的东西，就很开心了。

CLI 在 [GitHub](https://github.com/tw93/Mole) 上开源免费，Mac 桌面版在官网 [mole.fit](https://mole.fit)。

第一次做付费产品，肯定有很多没考虑周全的地方，欢迎大家随时提建议。回头看，上面那些让我最受启发的改动，几乎都来自用户的一封邮件或一个 issue。多听大家的吐槽，对我帮助真的很大。
