Mole 出 Mac 版后,用户教会了我做产品
Categories: Share

最近我写了不少关于独立开发的思考,想着汇总一下,就把 Mole 从开源 CLI 做到 Mac 付费软件这一路聊一聊,当时是怎么想的,哪些事情做下来有用。
去年国庆我在三亚的泳池边写了几百行代码,做了个 Mac 清理的命令行工具 Mole CLI 开源到 GitHub 上,本来只想给自己和同事用。结果不到一年收了 60K star,陆续发了 50 多个版本,121 位来自全球各地的开发者提交过代码,解决掉近 800 个功能建议和 Bug。
其实我一直没太意识到用的人有多少,直到有一次,因为在 README 上挂了两张用 Vercel 加速的图片,流量把账单跑超了,欠了 Vercel 80 刀。当时才反应过来,桌面端可以做了。
之前收到最多的一类邮件来自国外用户,大意都差不多:我父母也用 Mac,我妹妹也用,但他们不会开终端,能不能做一个不用敲命令就能用的版本。这件事拖了挺久,主要是觉得 CLI 本身还没到成熟的地步。等 CLI 跑了大半年,哪些能删、删到什么程度算安全,心里有底了才开始做桌面版,做到自己敢天天用了才发出去。当天晚上十点发布,那一夜通知一直在响,法国、德国各种币种都有,后来为了睡觉把邮箱通知关了。后面几个月一直在加东西,等于是一批用户先掏了钱,再陪着我把它做完。CLI 没有任何变化,照旧开源免费,也会一直更新,付费的只有桌面版。
AI 多出来的三类垃圾
桌面版做出来之后,我自己用得最多的反而是清理,因为这台 Mac 经常跑出空间不足的警告。我全天开着 Claude Code 和 Codex 写东西,后来才发现 AI 留下的文件跟以前很不一样。
主要是三块。最明显的是编译产物,以前一天手写几百行代码编译三五次,现在一个下午让 agent 跑十几轮,每轮都要编译。Rust 项目的 target、前端的 .next 和 dist、Xcode 的 DerivedData 增长极快,我自己有一次清出 86G 全是这些。其次是 AI 工具自己留下的旧版本,Claude Code、Cursor Agent 都是静默更新的,每次拉个两三百兆的新版本,旧的就存在那里不管。再就是 Ollama 和 LM Studio 拉下来的本地模型,动辄占掉几十 G。

如果把这些都压成同一份「安全可删」的清单当然省事,但代价是替用户把决定做了。后来我处理这类数据主要按拿回来的代价来分,扫出来的每样东西先判定归属,再决定默认要不要勾上。
像编译产物、多数日志、HTTP 和 GPU 缓存,删掉以后重新编译一次或刷下网页就回来了,代价只是几分钟 CPU,只要相关的 App 退出了就可以默认清。但 node_modules、Pods、venv 这些包管理器缓存,看着也是依赖目录,删了却必须重新联网下。在高铁或者飞机上想跑一下项目就只能干等。这两类很容易一起当垃圾清掉,Mole CLI 早期就是这样,后来我专门把所有下载类的目录从 Mac 版的清理列表里摘了出去,得让用户自己看一眼。

至于模型,是这里面占用最大的一类,几十 G 重下一遍非常耗时。而且通用清理工具想帮着删也删不对,Ollama 把模型拆成一堆按哈希命名的块,多个模型可能共用同一块,从文件系统上直接删掉一个看着很大的块,很可能把另一个模型也弄坏。这种引用关系只有工具自己清楚。
所以 ~/.ollama/models、~/.cache/huggingface 这类路径在代码里是写死的保护名单,扫描阶段根本不会出现,只在磁盘分析那边显示占用大小,模型本身交回给 Ollama、LM Studio 自己管。

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

这些保护名单不是一开始就想好的,基本都是踩出来的。最蠢的一次是 com.apple.e5rt.e5bundlecache,名字里带 Caches,位置也在缓存目录下,怎么看都是缓存,其实它是苹果神经引擎编译好的模型。CLI 早期真把它当缓存清了,用户那边所有用到识别功能的 App 全挂,一直到重启才好。从那以后我养成一个习惯,看到名字里带 cache 的目录,先在心里过三个问题,谁写的,重启之后谁会去读它,万一删错了怎么找回来。有一个答不上来我就不动它。
先看一眼再删
这类工具好不好,我不太看能清多少,主要看删之前让不让你看清楚。
Mole 清理的时候是先扫描,逐项列出来,每一项显示具体是什么、在哪、占多少,拿不准的默认不勾选,确认完再删,删的时候优先进废纸篓,后悔了还能找回来。扫描和清理全程在本机完成,文件和结果都不会上传。代价是慢,多了一步确认,赶时间的时候会嫌它啰嗦,但我还是想让它宁可漏删也不误删。

卸载走的是同一套逻辑,选中一个 App,Mole 会把它散在系统各处的东西一起翻出来,逐项标上路径和大小,上面这张图里 Claude 本体只有 781MB,~/Library/Application Support/claude 却有 7.67 GB,真正占空间的从来不是应用包本身。登录项和后台服务也放在同一页,不用再去系统设置里一个个找。
举个例子,macOS 系统更新下载下来的安装包,也就是 /macOS Install Data 那个目录,经常十几个 G,看着是完美的清理目标。但系统可能还等着用它把更新装完,删早了机器就起不来。所以它在 Mole 里是默认不勾选的审阅项,前面叠了三道门,系统里有更新等着装就整行隐藏,安装包最近 14 天里动过就隐藏,安装相关进程还在运行也隐藏,哪个信号读不出来,就当它有风险,直接不显示。
真到执行删除那一刻,root 权限的脚本还会把这几项检查重新跑一遍,不通过就非零退出,不会出现「报告说清了 12G 其实一个字节没动」这种事。
我自己判断一款清理工具好不好,有个很土的办法。装同一个厂商的两款产品,只卸掉其中一款,看它会不会把两款共用的 Application Support 父目录或者 group 容器也列进去。列进去了,说明它是按名字匹配的,不是按归属判断。归属都说不清的工具,我不太敢让它批量删东西。

平时它不会来打扰你
该找的文件它都会去找,只是平时不会主动来打扰你。
装了之后它不会隔三差五弹个通知提醒你该清理了,也不会扫完之后跳出来说你的电脑有多危险。你想清的时候打开它,不想的时候它就跟不存在一样。
界面上也是同一个想法,扫描没结束就不进结果页,等一下就能好的事连加载提示都不给,要等一阵才出现一个正在忙的动画,完成页也提前留好空间,结果出来的时候窗口不会跳一下。这些规定都很琐碎,合起来就是它用起来稳的原因。
底下要做的事情本来就不好预测,这时候加动画帮不上忙,还是得流程本身够可靠。我不希望一个维护工具需要人一直盯着,发起任务,等它完成,再拿回屏幕就够了,不用老闪着灯提醒你来看它。
无障碍也算在里面,朗读顺序、键盘操作、焦点稳不稳,和看上去安不安静是同一件事。系统开启「减少动态效果」之后,行星会停止装饰性旋转,状态变化也减少空间移动,任何操作都不依赖用户看懂动画。

让 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 给自己定的规矩,常驻的工作、特权和配置每多一样,用户就得多信任你一点。
我基本没攒过大招,尽量做到每周都发一版,这样用户的问题能及时解决,也能跟人有来有回地聊。每次发布、更新、宣发其实都是一次很好的沟通机会,也让之前没看到消息的人知道你在做什么。
现在用 AI 写代码,省下的时间更应该花在想清楚问题上。比如把真正的问题聊透、把界面文案改得谁都能看懂。Token 怎么花都不心疼,但要花在用户真正能感受到的地方。
Mole 从第一天就是全球化的,英文内容也发得比中文多。这段时间的感受是世界很大,用户很广,而且他们从一开始就愿意信任你。你顺手帮过的人,后来很可能就成了你的用户,因为彼此有过真实的来往。我也没花钱做过推广,X 上的消息一开始传播很快,但热度过去得也快,反而有些东西发到 YouTube 之后衰减非常慢,只要东西够好,有人推荐,能在上面活很久。
数据我花了不少时间看,销量、访问量、用户评论、退款原因和 GitHub 上的 issue 放在一起,能看到很多自己平时完全没想到的盲区,也知道大家逛到哪一步就不买了。
最后一条是心态。如果一门心思只想快速涨粉或卖货,人很容易动作变形。把平时真实的摸索、踩坑和更新过程发出来,大家看得到你是一个实在做事的人,自然会产生信任。现在网上浮躁的东西太多,愿意长期认真做东西、不忽悠人,反而最能走得远。
为什么是五颗行星
Mole 桌面版目前是清理、卸载、优化、磁盘分析、硬件状态五块,界面上每一块对应一颗行星,清理是地球,卸载是火星,优化是水星,分析是木星,状态是太阳。这和我小时候喜欢看各种行星运行有关系,加上十年前学会前端之后第一个特别想学的就是 WebGL,正好凑到了一起。行星的贴图我换了不下 10 次,从 NASA 官网下了很多才挑定,转的方向、转速、完成之后的飞行效果也都照着真实的天体来。
这部分完全可以不做,做个菜单栏点一下清一下的小工具也能用。但 AI 产生的赛博垃圾已经够多了,与其拿 Token 再堆一个能跑就行的界面,我还是想做个舒服一点的东西出来,不浪费我的 Token,也不污染你的时间线。
我做事情喜欢水到渠成,不喜欢急躁地赶进度,这三个月下来更是这么觉得。踏踏实实做出一个自己用着舒服、别人也愿意买单的东西,就很开心了。
CLI 在 GitHub 上开源免费,Mac 桌面版在官网 mole.fit。
第一次做付费产品,肯定有很多没考虑周全的地方,欢迎大家随时提建议。回头看,上面那些让我最受启发的改动,几乎都来自用户的一封邮件或一个 issue。多听大家的吐槽,对我帮助真的很大。