一句话,一张图,一笔账。

这是 CoinFlow 的核心理念,也是我做这个 App 的初衷:把记账的摩擦降到最低

GitHub: https://github.com/Dovelizi/CoinFlow


为什么再做一个记账 App

记账类 App 我用过不下五款。每次都用不过两周,原因其实只有一个:录入门槛太高。打开 App、找分类、敲金额、选日期……一笔账三十秒,谁顶得住?

更别说大部分 App 把你的数据锁在自己的服务器里,想看个长期统计还得开会员。

所以我想做的事很简单:

  1. 录入要快:截个图、说一句话就能记
  2. 数据归我:本地加密 + 云端同步到我自己的飞书多维表格
  3. 解析要准:LLM + 规则引擎双保险,最差也能识别金额和分类

CoinFlow 主页


三种记账方式

1. 截图记账:丢张支付截图进来就行

支付宝、微信、抖音、银行 App 的支付成功页,截下来直接发给 CoinFlow。它会自动识别金额、商户、时间、分类。

实现思路是三档路由:先用 iOS 自带的 Vision 本地识别,confidence 不够再走视觉 LLM,再不行就让用户手填。这样断网、API 挂了都能用。

截图识别中

截图识别完成

还做了一个挺好用的功能:Back Tap × 2 唤起。在 iOS 设置里把”敲击背面两次”绑到 CoinFlow 的 Shortcuts,然后截完图敲两下手机背面,App 就会自动接住最新截图开始识别。比手动打开 App 快多了。

2. 语音记账:一句话识别多笔

按住底部按钮说话,松手识别。重点是支持一句话多笔

“今天中午吃了 14 块的拉面,下午买咖啡 22,晚上打车 35”

LLM 会自动把它拆成 3 笔账单,然后用一个向导让你逐笔确认。中间随时能跳回去改任意一笔。

语音录音中

语音逐笔确认

ASR 用的是苹果的 SFSpeech,强制 onDevice 模式——录音完全不上传,识别也在本地。

3. 手动记账:还是要的

不是所有场景都适合截图或语音。给孩子的零花钱、私下转账,还得手输。一个 Modal 搞定,金额、分类、备注、日期。


让我自豪的功能:LLM 账单总结

这是我自己最喜欢的功能。

每周一、每月 1 号、每年 1 月 1 日打开 App,会自动生成上一周期的账单总结。不是冷冰冰的数据,而是带情绪的复盘

提示词调了好久,让 LLM 在保留数据准确性的前提下,写得像朋友吐槽。比如这周报里有这么一句:

这周的你像一位精准控分的极简主义者,三笔消费干净利落,连支出都透着一种”非必要不花钱”的倔强。

账单总结入口

账单总结浮窗

每篇总结生成后还会自动同步一份到飞书的「CoinFlow 账单总结」表,永久归档。一年后回头看自己的财务情绪轨迹,挺有意思。


数据归你:飞书多维表格作为云端

同步状态

为什么不用 iCloud / Firebase / 自建后端?

候选 我的看法
iCloud 没有结构化查询,没法直接做报表
Firebase 计费门槛 + 国内网络抽风 + 数据所有权依然在 Google
自建后端 个人 App 运营不起
飞书多维表格 ✅ 用户自带账号、免费、原生表格视图,关键是数据 100% 在用户自己手里

每次记完一笔账,App 会自动把数据上传到你飞书”我的空间”里的一张多维表格。你随时能在飞书侧自己写公式、做透视、生成图表。卸载 App 数据也还在。

技术上,所有飞书 HTTP 调用经一个 actor 串行化,token 自动刷新、错误指数退避、批量删除分页、附件素材库归档全做了。失败重试上限 5 次,超过就标记”已死”等用户手动复活。


统计:把数据看得见

本月统计概览

资金流向 Sankey

分类词云

资金流向用的是 Sankey 图,工资进来 → 支出去向一图看清。分类词云字号映射占比,点击下钻到详情。


一些细节

流水详情

设置页

  • Face ID 启动锁:冷启动要求生物认证,账单数据不让别人随手翻
  • 应用切换器隐私模糊:切到后台时整个界面被模糊,防止录屏 / 截图
  • 金额染色策略:自动 / 收入绿 / 支出红 / 全 mono 四种主题
  • 14 个预设分类 + 100+ SF Symbols 图标库:自定义分类时图标按 group 浏览
  • 流水列表三视图:List / 扑克叠 / Grid 切换

技术栈一览(给同行看的)

  • 平台:iOS 17+ / SwiftUI 100%
  • 架构:分层 + MVVM + Repository + Actor 隔离
  • 本地存储:SQLCipher 4(256-bit AES 透明加密),密钥存 Keychain
  • OCR:Vision 本地 + 视觉 LLM(OpenAI 兼容协议)
  • ASR:SFSpeechRecognizer 强制 onDevice
  • LLM Provider:ModelScope(魔搭,免费额度大)/ DeepSeek(中文最快),运行时切换
  • 依赖:只有 SQLCipher.swift 和 swift-markdown-ui 两个第三方库,HTTP 走 URLSession,状态走 Combine

几个坚持下来的工程原则:

  • 金额永远用 Decimal,全栈禁用 Double 中转
  • SQL 100% 参数化,动态列名也走白名单
  • 同步元操作不污染 updated_at:保证待同步队列的 FIFO 真实序
  • 三档可降级:OCR / ASR / LLM 主路径失败都有兜底,断网照样能用

现在的状态

首页有数据态

Phase 1(M1–M9 基础功能)+ M10(LLM 账单总结)+ M11(视觉打磨 + App 图标)已经做完,目前在真机上自用打磨。

下一步想做的:

  • 真”自动消费最新截图”(现在还要手动选)
  • 多账本、AA 账本(数据库字段已经预留)
  • 二级分类
  • 把统计页的 Charts 和 Sankey 做更深

写在最后

这是一个有点偏执的项目:

  • 依赖少到极致——能用系统 API 就不引第三方
  • 数据归用户——云端选飞书是因为它能让用户在自己的账号里完整看到所有原始数据
  • 录入门槛降到最低——三种入口、三档路由,最差也能用

如果你也对 iOS 端”重数据 + 重同步”的产品感兴趣,欢迎到 GitHub 仓库 一起讨论。完整的技术架构文档也在仓库里,6 万多字,所有时序图、状态机、字段映射都有。


完整源码:https://github.com/Dovelizi/CoinFlow
完整技术架构文档:仓库里的 CoinFlow技术架构文档.md