人最难的对手,往往是自己。
我在最初只是想做一个两三步就能完成的小工具,够用就好。可一旦动手,欲望便悄然生长。起初不过是想让它能粘贴图片、能说句话;接着便想留下历史的痕迹,于是保存、清除、搜索,一项项功能自然地生长出来。再后来,连外观也成了心事:换一换皮肤,调一调边框,甚至觉得应当添些流光溢彩。
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,创造的快乐还是非常强烈的。回头有新想法,并且有大量的时间,再开新坑吧。
夜雨聆风