actualbudget/actual

Actual Budget

从成熟个人财务产品学习 local-first、同步与跨平台工程

难度
较难
适合
进阶
主要语言
TypeScript
GitHub
28.0k
许可证
MIT
快照日期
2026年8月9日

先判断要不要学

这个项目值得拆什么?

Actual Budget 是一个 local-first 个人财务工具,核心数据和业务逻辑可在本地运行,并通过同步服务在设备间传递变更。它是包含核心引擎、Web/桌面端、Electron、移动端、CRDT、同步服务和文档的成熟 monorepo。这个案例的学习价值在于拆解数据所有权与复杂工程边界,而不是让新手一天内复制完整产品。

  1. 01

    它将 local-first 从口号变成可阅读的本地数据库、同步协议、冲突处理和服务端代码。

  2. 02

    预算、账户、交易、报表与规则等完整产品域,适合学习成熟产品如何长期组织业务代码。

  3. 03

    同一核心能力服务于浏览器、Electron、移动端与 API,能观察共享逻辑与平台适配的分界。

可以学什么

不只是看代码,而是找到产品的骨架

  • 学产品结构
  • 学数据库
  • 学完整项目组织
  • 学界面
  • 学部署
01

local-first 不等于只有本地存储

对照核心数据库、CRDT 时间戳与 Merkle 结构、客户端同步和 sync-server,理解离线可用与跨设备同步是两个相关但独立的问题。

packages/loot-core/src/server/db · packages/loot-core/src/server/sync · packages/crdt/src/crdt · packages/sync-server/src/app-sync.ts
02

核心业务与平台适配

从 loot-core 的 platform imports 和多个客户端包出发,观察文件系统、SQLite、网络连接等能力如何在浏览器、Electron 和 API 环境中被替换。

packages/loot-core/package.json · packages/loot-core/src/platform · packages/desktop-client · packages/desktop-electron
03

成熟财务产品的领域分区

通过 accounts、budget、transactions、rules、reports 等目录,学习如何让复杂业务能力在服务层、查询层和 UI 中保持可定位性。

packages/loot-core/src/server/budget · packages/loot-core/src/server/transactions · packages/loot-core/src/server/rules · packages/loot-core/src/server/reports · packages/desktop-client/src/budget · packages/desktop-client/src/transactions

三段学习路径

从理解、修改到做出你的版本

0130 分钟先跑通

建立 local-first 与仓库分层的正确心智模型

  1. 阅读 README 的 Getting Started 和 Code structure
  2. 在根 package.json 列出主要客户端与服务启动命令
  3. 对照 loot-core、crdt、desktop-client 和 sync-server 的责任

完成标志:画出本地数据、核心业务、界面和同步服务的四层关系。

022 小时动手改

沿一个预算数字完成小范围走读

  1. 选择一个预算页的显示字段
  2. 从 desktop-client/src/budget 找到查询或动作调用
  3. 在 loot-core 中定位对应业务与 SQL 实现
  4. 阅读相邻测试并记录其不变量

完成标志:得到一张某个预算值从本地数据到界面的追踪笔记。

031 天做变体

用小实验理解离线变更与同步冲突

  1. 仅运行浏览器客户端与本地测试环境
  2. 为一个简化账户字段添加变更与测试
  3. 用两个独立测试实例模拟并发编辑
  4. 对照 CRDT 测试解释最终结果并补充一个冲突用例

完成标志:产出一个不触及真实财务数据的双实例同步实验和解释。

评分解释

每一分都要说清楚为什么

可复刻性12 / 25
12 / 25

官方提供多种安装与自托管方式,但从代码复刻核心产品的成本很高。

文档与代码清晰度16 / 20
16 / 20

README 和社区文档给出包边界,目录领域命名清晰;但精确走读仍需较强工程能力。

新手学习价值11 / 20
11 / 20

可建立 local-first 与成熟工程认知,但只适合有基础的学习者做小切片。

产品完整度15 / 15
15 / 15

个人财务主要领域、多端客户端、同步、导入与自托管都已具备。

vibe coding 代表性6 / 10
6 / 10

适合学习如何让 AI 在成熟仓库中小步改动,但不适合把整个产品作为快速生成目标。

活跃度5 / 5
5 / 5

仓库未归档、核对时有当日推送,并有测试、代码审查指南和社区文档。

新颖性5 / 5
5 / 5

local-first 财务、CRDT 同步与多平台核心共享组合,具有显著的学习差异化。