小豆记账:截图就是记账,和上架路上的五次卡住
记账 App 最难的不是记,是坚持记。每一笔都要打开 App、选分类、输金额,三天就放弃了。小豆记账只做一件事:付款完截一张图,账就记好了。
核心做法:一个模型,不做后处理
截图交给多模态模型(豆包 doubao-seed-2-0-mini),直接出结构化的 JSON:金额、商家、日期、分类。识别这一步没有单独的 OCR,也不写任何「合并、纠正」的后处理代码。
这是刻意的。识别出错时只改 prompt,不在代码里打补丁,因为两处规则打架,比一处不准更难查。prompt 里的每一条约束都在文档里写了理由:订单详情页只出 1 条、分类只能从给定列表里选、看不到日期就不许猜。
几个后来加的规则,都来自真实数据:
- 退款:同一个模型从最近的支出里找出原交易,返回的 id 必须在候选列表里,防止模型编一笔出来。
- 查重:同金额、同类型、5 分钟内算重复。起因是统计了 14 天的识别记录,135 次成功识别里有 7 次是同一笔被截了两张图,差不多每 20 次就有 1 次。
最常用的入口不是 App,是快捷指令:轻点手机背面截屏,直接送去识别。最早的快捷指令直接调后端,根本不经过 App,所以存在 App 里的「同意把截图交给 AI」只挡得住审核员,真实用户的图照样发出去了。发现之后,同意状态改存在服务端:真正把图发给模型的是服务端,只有它能同时管住 App 和快捷指令两条路。快捷指令也改成了走 App 里的入口。
上架路上卡住的五次
1. 没有 iPad 截图,提交不了。 项目带着 iPad 支持,提交时报 SCREENSHOT_REQUIRED,缺 12.9 英寸 iPad 的截图。改成只支持 iPhone、重新出包才过去。
2. 两次因为隐私被拒(5.1.1)。 第一次:App 里没说清截图发给谁、发什么,也没先征得同意。Apple 明确说只写在隐私政策里不算数。这次改的是功能:上传前加一道同意页,没同意连相机和相册都不打开;「我的」里加了一页说明,同意随时可以撤回。第二次:隐私政策缺「第三方提供同等保护」的承诺。补上这一条,顺手出了英文版,之前只有中文。
3. 过审了,但没上架。 版本的发布方式默认是「手动发布」,1.0.2 审核通过后在后台停了好几天,没人点发布。Swipe(现在叫 Flipfile)早一周踩过同一个坑,但那条教训只写在它自己的仓库里。从那以后每个版本都设成「过审自动发布」,这条也记进了所有 App 共用的知识库。
4. 备案。 备案登记的主体名和开发者账号的名字对不上,提审前要用管理员账号在网页上确认一次「这是同一个主体」。这一步接口做不了:同一个账号下的 Flipfile 没确认就提审,接口直接返回 409,查询备案信息的接口则根本不存在。
5. 美国的审核员连不上服务器(2.1(a))。 后端最早只在阿里云。从美国的探测点访问,24 次里有 5 次超时,审核员登录时拿不到挑战码,静默失败。最后的修法是按 App Store 地区分两套后端:大陆走阿里云,其他地区走 Cloudflare,同一份服务端代码。没有拆成两个 App,因为审核指南不鼓励为了地区差异做重复的 App。
定价
免费版每月 30 次识别;Pro 年付 ¥28(7 天试用)或买断 ¥98,不做月付。按 9 月的估算,一次识别的模型成本大约 0.003 元,所以免费版只限识别次数,其他功能一样不砍:付费的理由和成本的来源是同一件事。
用 AI 写的部分
后端和第一版客户端在一个仓库里,224 次提交中 189 次是和 Claude 一起完成的,从后端、识别 prompt 到发布脚本。10 月又用一个新仓库重写了客户端,24 次提交中 21 次。发布流程本身也是 agent 跑的:打包、上传、提审、读审核状态。我做的主要是定方向、定规则,以及在每次出事后决定改什么结构。
现在
写这篇时(2026 年 10 月 22 日),在售的是 1.0.7,在 175 个国家和地区上架。重写后的客户端 1.1.0 在 10 月 21 日提审,新增的一点是:截图上传前先在手机上用系统的文字识别找出地址、电话和姓名,涂灰再发出去,金额和商家原样保留。