乐于分享
好东西不私藏

两周做了 4 个 App,然后我决定停下来

两周做了 4 个 App,然后我决定停下来

人最难的对手,往往是自己。

我在最初只是想做一个两三步就能完成的小工具,够用就好。可一旦动手,欲望便悄然生长。起初不过是想让它能粘贴图片、能说句话;接着便想留下历史的痕迹,于是保存、清除、搜索,一项项功能自然地生长出来。再后来,连外观也成了心事:换一换皮肤,调一调边框,甚至觉得应当添些流光溢彩。

Vibe Coding 的妙处,也恰是它的危险之处。反馈太过强烈,几乎停不下来。你以为自己在创造,实则已被自己蔓延的欲望卷着往前走。每一次迭代都带来新的可能,每一种可能都在召唤下一次迭代。

于是学会克制,便成了这个过程里最珍贵的部分。

这个App还能继续优化下去,但我不再继续了。不是因为做不了,是因为这一切都太上瘾了。所以差不多就行了。尽管如此,我最近两周都做了4个App了。


这次做的是什么?

日常使用电脑的时候,不知道你们有没有这种烦恼:

经常需要截屏,或者选中一段文字,再复制到 ChatGPT、豆包、DeepSeek、Claude 之类的大模型客户端里提问。

这个动作单次看起来没什么,但一天重复几十次以后,就会变得非常烦。

查资料、写文章、看文档的时候,人的注意力其实很脆弱。

你本来只是想问一句:

“这段话是什么意思?”

“帮我总结一下。”

“这张截图里有什么问题?”

“这段文字有没有更好的写法?”

结果你要先复制,切换窗口,粘贴,等待,再切回来。

每一步都很小,但合起来就是一种工作流里的摩擦。

PopClip 这类工具可以选词,但它不是对话工具。

豆包这类客户端很好用,但体积很大,而且很多内容我其实并不想上传到网络。

所以我想做一个很轻的桌面工具:

在任何地方,选中文字以后,直接和大模型对话。

于是,使用 Floatboat,通过对话的方式,我开发了 Aski,一个轻量级的 AI 助手工具。

没有上架,所以你搜不到。


Aski 怎么用?

Aski 主要有三种使用方式。

◈1. 直接双击 Ctrl

双击 Ctrl 键,会弹出一个小输入框。

你可以直接向 AI 提问。

它不会占满屏幕,只是一个随叫随到的小窗口。

你正在写文章、看网页、读资料,它都不会强行打断你。

◈2. 选中文字后双击 Ctrl

如果你先选中一段文字,再双击 Ctrl,Aski 会进入引用模式。

AI 会针对你选中的内容回答。

这个功能对我特别重要。

因为我每天大量工作都和文字有关。

读文章、改文案、查资料、写推广内容,很多时候我只是想对眼前这一小段内容提一个问题。

这种时候,工具越轻越好。

◈3. 通过 PopClip 唤起

我还让 Aski 和 PopClip 做了结合。

选中文字以后,点击 PopClip 里的 ASKI 图标,也可以直接打开聊天窗口。

这就很适合那些不想记快捷键的场景。

选中,点一下,直接问。


它现在有哪些功能?

目前 Aski 大概有这些能力:

  • 支持本地模型:可以接入 Ollama,本地大模型启动后自动检测,断网也能使用。
  • 支持 API 模型:可以配置自己的 DeepSeek、MiniMax 等模型服务。
  • 截图问答:截图后可以直接发给 AI 识别并讨论。
  • 粘贴图片:唤醒输入框后,可以直接复制粘贴图片。
  • Markdown 渲染:AI 输出支持 Markdown,代码块也能高亮。
  • 基础搜索功能:可以做简单搜索,然后让模型汇总结果。
  • 访问网页内容:可以读取网页,不只是打开浏览器。
  • 历史记录:聊天记录会保存,也可以在设置里打开历史文件夹清理。
  • 两套皮肤:孟菲斯风格和简约自然风格,可以切换。
  • PopClip 集成:选中文字后,可以通过 PopClip 直达 Aski。
  • 卡片截图:可以把 AI 生成的内容做成适合手机宽度的卡片图片。

当然,它不是一个完美产品。

搜索功能还比较基础,复杂搜索效果有限。

一些模型的速度也受服务本身影响。

本地模型的体验,有时候和模型加载、上下文长度都有关系。

但对我来说,它已经完成了最核心的价值:

当我看到一段文字、一个截图、一个问题时,可以马上把它丢给 AI。

这就够了。


我是怎么把它做出来的?

这个东西的开发方法,其实非常简单。

都是通过口喷,直接在 Floatboat 里面弄完的。

我说的“口喷”,不是完全不动脑子地乱提需求,而是把脑子里的使用感受、别扭之处、改进方向,用大白话连续说出来。

一切的开始,就是这段话:

然后 Floatboat 回复了一大段,评估这事儿并不复杂。

它还提醒我,要不要先做一个文档。

于是我点了一下,就继续往下了。

后面的过程,我就不把 Floatboat 的回复全贴出来了,不然太长。

我只把我当时的提问列出来。

我建议初学者仔细看看这部分。

像这种小工具,不像大项目,其实没有那么神秘。某种意义上,就是当一个伸手党,把自己的需求、问题、不爽和判断说清楚。


真实过程大概是这样的

一开始,我说:

按这份文档直接搭一个能跑的 Swift MVP 骨架

然后我发现,一个能跑的骨架还不够。

于是继续说:

补上历史保存和全文搜索功能

再后来,我发现 AI 输出如果不支持 Markdown,阅读体验很差。

于是又说:

给对话回复加上 Markdown 和代码高亮渲染

然后我觉得快捷键很重要。

双击 Ctrl 做成设置里可改的自定义快捷键

做到这里,我又开始考虑本地模型。

设置页打不开,另外现在能支持 ollama 吗?

后来我觉得 Ollama 不应该让我手动配置。

如果我已经启动了,它应该自己检测到。

模型服务的那个 ollama 我建议你自己检测,只要我启动了,它就自己可用,不用让我配置,你看如何?

接着又遇到 macOS 权限问题。

实际我都授权过了,但是每次都要弹出来授权这些。

快捷键也出过问题。

另外就是快捷键失去作用了,不知道为什么双击 control 没有反应。

截图也遇到过授权问题。

选了截屏以后,会出现:“Aski”想要录制此电脑的屏幕和音频。在“系统设置”“隐私与安全”设置中允许此应用程序访问。问题是也已经授权过了。

后来我决定默认模型不要再用 OpenAI,而是换成 DeepSeek。

我觉得直接用 DeepSeek 的 API,请帮我默认模型替换掉 OpenAI,ollama 必须留着。

接着补充模型名。

DeepSeek 的默认模型现在是 deepseek-v4-pro 或 deepseek-v4-flash

然后又发现输入框位置不对。

没有用,报错了。另外这个输入框的位置也不对,应该在下面才更符合预期。现在在上面太奇怪了。

多模态模型也出过问题。

这是一个多模态本地模型,但是截图似乎没有传给模型。

MiniMax 模型输出里带 thinking,我也不想要。

我用 aski 调用了 MiniMax 多模态模型,但是输出的内容有思考,这个麻烦你查询官网以后把它关掉。帮我升级 app。

中间还发生过一次我查资料后反过来纠正 AI 的情况。

我刚查了一下:对于 MiniMax-M3,thinking 参数用于控制模型是否可以输出 thinking 内容。如果省略 thinking,默认开启 thinking,响应会包含 thinking 内容。设置 thinking: {"type": "adaptive"} 可显式保持 thinking 开启。对于 MiniMax-M3,adaptive 等同于开启 thinking。设置 thinking: {"type": "disabled"} 可跳过 thinking 并直接回答。

所以,你的方法对吗?

这也是用 AI 做东西的一个真实场景。

AI 很强,但不是永远对。

你仍然要判断,要验证,要追问。


后面就进入了疯狂打磨阶段

当软件大致能用了以后,我就开始不断挑刺。

比如速度慢:

正常了,但是有个特别严重的问题,那就是速度非常慢。我怀疑我们加两层那个方法不对,因为如果第二层先奏效,那么后台就得等“思考”后,才输出结束。

比如设置页缺少系统提示词输入框:

旁边文件夹是我正在开发的 app,现在还缺少一个系统提示词的输入框,在设置里面约束模型的能力。这个不是摆设,必须填进去,然后在聊天的时候起作用。

比如本地模型体验慢:

每次发出去消息都要等好久,这个感觉是不是哪里不对,ollama 早就打开了,按理说它啥时候都可以唤醒才对。是不是这个 app 是额外加载模型了,还是怎么回事儿?多轮次聊天也十分慢,不像别人的 app,反应贼快。

比如按钮太多:

删除每段话下面的“插入”按钮,保留“复制”按钮,如果可能的话,插入可以变成截图,截的就是生成的内容,形成的卡片。

比如动效手感:

给悬浮条加唤起的淡入下落动画让手感更顺。这个容易吗?

比如搜索:

第三个斜杠唤醒搜索这个有条件做吗?

比如卡片宽度:

卡片很好用,但是太宽了,尽量建议手机尺寸。宽度要适合手机,长度可以随意。

比如网页访问:

那能添加一个访问网站的功能吗,比如我让它搜索了,但是它不打开网站。

比如打包成原生应用:

OK,弄成一个原生应用,确保 icon 正确渲染。打包一个安装包文件。写一个漂亮的产品介绍,就像我们要出售一样。

比如上下文太短:

截断了,是不是文字上下文窗口太小了?

我甚至还觉得 8000 上下文不够。

8000 是不是太少了,2026 年的 ollama 还有这个模型我感觉你 8 万还差不多。

然后又加了图片粘贴:

帮我添加一个功能,如果我唤醒 aski 以后,能不能支持复制粘贴图片,就是唤醒框以后支持这个操作。

再去检查 DeepSeek 速度问题:

检查一下为什么使用 deepseek 的模型的时候 aski 速度感觉有点慢。

最后发现关键可能不是速度,而是思考模式。

我觉得你先不要修改,重要的其实是不是关闭思考模式。

设置页的模型服务管理也出过 bug。

设置里模型服务这里还不对。添加新的服务的时候,默认不是空白的,然后如果删除预填写的内容,会把另外的 DeepSeek 也删除。也就是说添加的这些管理混乱,你检查一下。

后来我又研究了 PopClip 集成:

我做的 aski 怎么跟 popclip 结合起来?效果就是选中就弹出来 popclip 的按钮,直达 aski,可以做吗?

UI 细节也继续调整:

当我复制文字的时候,上面框起来的两个地方不优雅,是不是弄一个引用符号会更简洁?

然后我又开始关心历史记录和截图到底保存在哪里。

研究一下最新版的 aski,查一下源码,看看保存的历史记录在哪里,我想让你在设置的权限那里,添加一个能直接打开历史记录文件夹的按钮,因为我要删除里面冗余的东西,尤其是截图。另外你要告诉我一下,这个软件的截图都保存了还是没有?理论上最好不要保存。你帮我查一下。

甚至在 Typora 里发现了选中文本少一个字的问题。

查一下源码,我发现一个 bug,在 typora 里使用 aski 的时候,我发现鼠标明明选中了 5 个字,但是 aski 实际上选中的是前 4 个字。你帮我看看为啥会这样?

最后我又把 UI 整体改成了孟菲斯风格。

把 UI 整体变成孟菲斯风格,设置页外观把原来的系统跟孟菲斯变成两个可选风格。

设置页里还加了一句:

本 App 由“魔云兽”使用 Floatboat 制作。

还要求 Floatboat 变成蓝色超链接,加下划线。

最后,我让它把 README 和源码一致起来,又升级了落地页。

帮你把过时自相矛盾的 README 校正到与源码一致。

太完美了。以这个为最终版。通读源码以后,升级落地页:Aski-落地页-孟菲斯.html。

当然,还有一堆我就不继续啰嗦了。

主要过程就是这样。


AI 做 App,有极快的反馈回路

很多人以为,用 AI 做 App,就是一句话生成一个软件。

实际不是。

至少我这次的感受不是。

这个过程有着极快的反馈回路:

先说出一个粗糙需求。AI 就给我一个能跑的版本。

我马上使用,发现哪里不顺手,哪里不优雅,哪里不符合直觉。

然后我把这种“不舒服”说出来。

AI 再修改。

我再试。

它再改。

这个过程的核心,就是:描述不满意。

我不懂 Swift。

不懂 macOS 权限。

不懂本地模型调用。

不懂快捷键监听。

也不懂打包、签名、PopClip 扩展到底应该怎么做。

但我懂一件事:

这个东西用起来顺不顺。

输入框应该在上面还是下面。

选中文字以后,引用区域优不优雅。

按钮该叫“插入”还是“复制”。

卡片宽度是不是适合手机。

唤醒动画有没有手感。

截图是否应该默认保存。

历史记录入口放在哪里才合理。

这些都不是纯粹的代码问题,而是使用感问题。

你的感受、审美、经验、工作流,就是你的开发工具。

你把麻烦说出来,让 AI 帮你一点点把它变成能用的东西。

这也是我建议初学者做 AI App 的起点:

先找一个你自己每天都会遇到的小麻烦。

它足够具体。它每天重复。它不解决也能活,但解决了会很爽。


那我为什么停在这里?

因为一个个人工具和一个商业产品,边界是不一样的。

如果继续做,Aski 当然还可以加很多东西。

比如:

  • 多设备同步。
  • Prompt 模板库。
  • 更完整的知识库。
  • 更强的网页搜索。
  • 插件系统。
  • 自动更新。
  • 更漂亮的动画。
  • 更稳定的打包和分发。
  • 甚至还可以做账号体系、会员体系、云端同步。

今天加搜索,明天加截图,后天加皮肤,大后天加插件。

你会突然发现,到处都是可以被改造的东西。

这当然很迷人,但也很危险。

一旦开始就真的停不下来了。现在睡眠已经够少了:)

当你在那里熬着夜,静静观察自己是如何得陇望蜀的,这过程还蛮恐怖的。😃


最后

无论如何,我们又做了一个app,创造的快乐还是非常强烈的。回头有新想法,并且有大量的时间,再开新坑吧。