





















我做了一个不会偷看你账单的记账 App
你有没有遇到过这样的困扰?
作为一个程序员,我对这些问题深感不安。于是,我决定自己动手,做一个真正把数据所有权还给用户的记账应用。
这就是**蜜蜂记账(BeeCount)**的由来。
我调研了市面上主流的记账软件,发现它们普遍存在以下问题:
1. 隐私问题
大多数记账 App 会将你的数据上传到他们的服务器。表面上是为了"云同步",但你的消费习惯、收入水平、资产状况等敏感信息,都被完整地存储在第三方服务器上。
更糟糕的是,很多 App 的隐私政策中明确写着"可能会将数据用于商业分析"或"与合作伙伴共享"。你的财务隐私,实际上已经不再属于你。
2. 广告和推销
免费的记账 App 需要盈利,最常见的方式就是广告和金融产品推销:
有些 App 甚至会根据你的消费数据,"精准推送"贷款广告。这不仅影响使用体验,更让人担心数据被滥用。
3. 功能锁定
很多记账 App 采用"免费增值"模式,核心功能需要付费订阅:
一旦停止订阅,功能立刻降级,甚至无法导出历史数据。
4. 数据不可控
当你把数据托管给第三方服务时,你就失去了对数据的完全控制:
基于这些问题,我列出了理想记账软件的特征:
✅ 数据主权:数据完全由用户掌控,可以选择存储位置 ✅ 隐私保护:开发者无法访问用户数据 ✅ 完全免费:所有功能免费使用,无广告 ✅ 开源透明:代码公开,可审计 ✅ 功能完整:不阉割核心功能 ✅ 自由迁移:支持标准格式导入导出
市面上没有同时满足这些条件的产品,所以我决定自己做一个。
跨平台是必须的。我希望这个 App 能同时支持 iOS 和 Android,而不是分别开发两个版本。
在对比了 React Native、Flutter、Kotlin Multiplatform 后,我选择了 Flutter:
本地存储使用 SQLite(通过 Drift ORM):
云同步是可选的,而且是自建云服务:
我支持了两种方案:
方案 1:Supabase(推荐新手)
Supabase 是开源的 Firebase 替代品,提供:
关键是,用户可以使用自己的 Supabase 项目,数据存储在用户自己的 Supabase 实例中,而不是我的服务器。
Supabase 提供免费套餐,对于个人记账完全够用。
方案 2:WebDAV(推荐 NAS 用户)
WebDAV 是一个开放的文件共享协议,支持:
用户可以将数据同步到自己的 NAS 或私有云,数据完全本地化。
这两种方案的共同点是:数据存储在用户自己控制的服务器或云平台上,我作为开发者无法访问。
Flutter 的状态管理方案很多,我选择了 Riverpod:
为了让用户能够自由迁移数据,我实现了完整的 CSV 导入导出功能。
特别是导入功能,我做了很多优化:
很多人有多个账本的需求:
蜜蜂记账支持创建多个账本,每个账本独立记录,互不干扰。
在底部导航栏有一个专门的"账本"标签,可以快速切换账本。
内置了常用的收入和支出分类,同时支持:
特别地,我实现了分类迁移功能:当你想删除一个分类时,可以选择将该分类下的所有记录迁移到另一个分类,避免数据丢失。
实现了多维度的数据分析:
图表使用 fl_chart 库实现,支持交互和动画。
支持全文搜索,可以按:
搜索结果按时间倒序排列。
内置了多种主题颜色,用户可以根据喜好选择。
主题系统基于 Material Design 3,自动适配亮色和暗色模式。
为了让更多人使用,我实现了完整的国际化(i18n)支持。
目前支持 9 种语言:
国际化不仅包括 UI 文本翻译,还包括:
如果你想贡献新的语言翻译,欢迎提交 Pull Request!
云同步是最复杂的部分,我采用了以下设计:
每条记录都有以下元数据:
id:唯一标识符(UUID)createdAt:创建时间updatedAt:最后修改时间deletedAt:删除时间(软删除)采用时间戳为基础的增量同步:
updatedAt 晚于上次同步时间的记录上传到云端updatedAt 晚于本地记录的数据下载到本地updatedAt 较新的为准为了支持多设备同步,删除操作不会真正删除数据,而是:
deletedAt 字段这样可以避免"在 A 设备删除,同步后又从 B 设备恢复"的问题。
真正的物理删除由用户手动触发("清理已删除数据"功能)。
Supabase 提供了完整的后端能力:
WebDAV 相对简单:
如果用户需要更高的安全性,可以:
App 只请求必要的权限:
不需要:
代码完全开源在 GitHub 上,任何人都可以审计:
CSV 格式看似简单,实际上有很多坑:
支付宝和微信导出的 CSV 格式也各不相同:
支付宝:
交易时间、商品说明、收/支、金额微信:
交易时间、交易类型、收/支、金额为了支持这些格式,我实现了:
Flutter 的自绘引擎保证了基本的 UI 一致性,但仍有一些平台差异需要处理:
最终我使用了 SafeArea 和条件编译来处理这些差异。
随着功能迭代,数据库 schema 需要升级。我使用 Drift 的 migration 功能:
@DriftDatabase
(...)
class
AppDatabase
extends
_
$
AppDatabase
{
@override
int
get
schemaVersion =>
3
;
@override
MigrationStrategy
get
migration => MigrationStrategy(
onUpgrade: (m, from, to)
async
{
if
(from ==
1
) {
await
m.addColumn(transactions, transactions.cloudId);
}
if
(from <=
2
) {
await
m.addColumn(transactions, transactions.deletedAt);
}
},
);
}
每次升级都要确保旧版本用户的数据能够平滑迁移。
Android 可以直接分发 APK,但 iOS 必须通过 App Store 或 TestFlight。
这需要:
为了让社区用户能用上 iOS 版本,我在 V2EX 发起了筹款,目标 $99(Apple 开发者账号年费)。
令人感动的是,不到一天时间,目标就达成了(实际筹集 ¥732)。感谢所有支持者!
iOS 版本预计 5-7 天后通过 TestFlight 发布。
我选择了 MIT 协议,这是最宽松的开源协议之一:
唯一的要求是保留原始的版权声明。
项目在 GitHub 上开源:https://github.com/TNT-Likely/BeeCount
目前已有 140+ Stars,欢迎:
做蜜蜂记账的初衷很简单:我想要一个不会偷看我账单的记账软件。
在这个数据即金钱的时代,隐私变得越来越珍贵。大多数免费软件都在用你的数据变现,而我希望做一个例外。
蜜蜂记账的核心理念是:
如果你也在寻找这样一款记账软件,不妨试试蜜蜂记账。
如果你是开发者,欢迎阅读源码,参与贡献。
让我们一起,把数据所有权还给用户。
一名关注隐私和开源的独立开发者,相信技术应该服务于人,而不是控制人。
如果你喜欢这个项目,欢迎在 GitHub 给个 Star ⭐️
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。