ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Actual Budget 25.12.0 发布深度解读:Crossover 财务独立报告、强制重载与移动端体验全面升级

2026/9/12 13:58:05 拓冰建站 浏览量
Actual Budget 25.12.0 发布深度解读:Crossover 财务独立报告、强制重载与移动端体验全面升级 Actual Budget 25.12.0 发布深度解读Crossover 财务独立报告、强制重载与移动端体验全面升级【免费下载链接】actualA local-first personal finance app项目地址: https://gitcode.com/GitHub_Trending/ac/actual本篇文章基于 Actual 开源仓库的官方发布说明packages/docs/blog/2025-12-03-release-25-12-0.md展开结合仓库源码深入剖析该版本的核心新增能力。你将了解到如何使用全新的实验性 Crossover 报告追踪财务独立FI进度及其底层算法原理、如何通过Force reload按钮强制更新预算客户端、如何从账户账本快速创建单次日程、移动端运行余额的实现细节以及本版本在货币支持、CSV 导入、桌面快捷键等方面的重要改进与修复。版本总览25.12.0 是 Actual 在 2025 年 12 月发布的一个功能型版本官方 Docker 标签为25.12.0。该版本包含以下核心亮点实验性功能新增Crossover 报告用于追踪通往财务独立的进度实验性功能设置中新增Force reload强制重载按钮可强制更新预算客户端支持从账户账本快速创建单次日程single instance schedule移动端账户视图恢复**运行余额running balance**显示桌面端新增CTRL/CMD Enter快捷键仅录入单笔新交易。此外该版本还涉及 5 项新功能、18 项增强、29 项缺陷修复和大量工程化维护工作。实验性新功能Crossover 报告什么是 Crossover Point交叉点Crossover交叉报告的页面内对此有明确解释见 Crossover.tsx交叉点是指你的月度投资收入基于所选账户按安全提取率计算达到或超过月度总支出的时刻。图表利用估算的回报率向未来投影直到两条曲线相交。也就是说Crossover 报告回答一个经典的财务独立问题按当前储蓄与支出水平我的被动收入何时能覆盖生活开销报告同时给出三个关键指标Years to Retire距离交叉点的年数Target Monthly Income交叉点时刻的目标月度收入即调整后的目标支出Target Life Savings目标养老金池支撑该月度收入所需的本金按目标月度收入 / 月度安全提取率计算。如何配置 Crossover 报告该报告以 Dashboard Widget 形式存在相关文件CrossoverCard.tsx、CrossoverGraph.tsx、getDashboardWidgetItems.ts。从源码 Crossover.tsx 可以看出左侧配置面板包含以下核心参数参数说明默认值 / 取值范围Expenses categories支出类别用于估算退休后生活开销的预算类别。应包含退休后仍会延续的类别如食品、水电、娱乐、医疗排除不再持续的类别如退休储蓄默认选中全部非收入类别可切换Show hidden显示隐藏类别Income accounts收入账户用于估算未来收入、支撑退休金的账户。应包含退休账户、储蓄账户排除抵押贷款账户、子女教育账户等默认选中全部账户Safe withdrawal rate安全提取率每年从收入账户提取以覆盖生活支出的比例默认0.044%输入范围 0–100%min0, max100, step0.1Expense Projection Type支出投影方式历史支出如何投影到未来hampelHampel 过滤中位数默认、median中位数、mean均值Target Income目标收入% of expenses退休目标收入占投影支出的百分比。100% 表示退休收入等于当前投影支出100% 表示计划退休后花更多100% 表示计划花更少默认1.0100%范围 0–1000%Use custom growth projections开启后自定义月度投入金额与投资回报率关闭时使用收入账户的历史表现含历史投入与增值默认关闭开启后若回报率未设自动填入6%Expected return预期年化回报用于投影收入账户增长的年度回报率范围 0–100%step0.1Expected monthly contribution预期月度投入每月向收入账户投入的金额在应用投资回报前先计入余额范围 ≥0step100报告还支持通过 Header 选择时间范围start / end / mode并将配置保存为 Dashboard widgetSave widget 按钮元数据持久化于meta字段包括safeWithdrawalRate、projectionType、expenseAdjustmentFactor、estimatedReturn、expectedContribution、timeFrame等见 onSaveWidget。时间范围默认回看 120 个月、结束于上月见defaultTimeFrameCrossover.tsx。底层算法原理Crossover 报告的计算逻辑集中在 crossover-spreadsheet.ts这是理解该报告可信度的关键历史支出聚合按所选支出类别、按月份汇总交易金额支出为负值计算时取反为正值。历史余额与 CAGR对每个收入账户取起始月月末余额作为起点逐月累加交易得到月度余额序列用首尾余额计算月度 CAGR(final/starting)^(1/n) - 1再换算为年化历史回报率展示Using calculated historical return of X%。月度安全提取收入monthlyIncome balance × (safeWithdrawalRate / 12)。支出投影根据projectionType选择投影方式Hampel 过滤中位数先计算中位数与 MAD中位绝对偏差以median ± 1.4826 × MAD × 3为边界剔除离群值后再取中位数threshold3见 calculateHampelFilteredMedian适合剔除一次性大额支出等异常月Median直接取全部历史支出的中位数Mean取全部历史支出的均值。未来投影以最后一个历史月的余额为起点逐月先加投入、再按月度回报率增值投影上限600 个月50 年以防无限循环crossover-spreadsheet.ts。交叉点检测当projectedIncome adjustedProjectedExpenses时判定交叉针对投影支出而非历史支出判定避免历史短期波动误触发见 crossover-spreadsheet.ts目标养老金池 目标月度收入 ÷ 月度安全提取率。值得说明的是图表中同时绘制投影支出实线与目标收入虚线历史段不会触发交叉判定——这是源码注释明确的设计取舍。实验性功能设置中的 Force reload 按钮使用场景当 Actual 作为 PWAWeb 端运行时浏览器 Service Worker 缓存可能导致客户端停留在旧版本代码上。25.12.0 在设置的 Advanced 区域新增Force reload app按钮用于清除缓存的旧版本、加载全新版本对应 PR #6090逻辑后续由 #6119、#6162 迭代完善。底层实现该功能的核心是一条简洁的 Redux thunkappSlice.tsexport const updateApp createAppAsyncThunk( ${sliceName}/updateApp, async (_, { dispatch }) { await global.Actual.applyAppUpdate(); dispatch(setAppState({ updateInfo: null })); }, );applyAppUpdate()由 browser-preload.js 暴露内部调用updateSW()开发模式下直接window.location.reload()避免没有 Service Worker 时 Promise 永不 resolve生产模式则走 Service Worker 生命周期完成页面替换。值得注意的是PR #6119 将更新逻辑从.reload()改为.applyAppUpdate()使强制重载与顶部Update now通知FinancesApp.tsx及更新通知组件UpdateNotification.tsx共用同一套更新管线。从账户账本快速创建单次日程以往创建日程需要进入日程管理页25.12.0 支持直接从账户账本account ledger创建单次日程并新增提示将未来交易转换为单次日程PR #6065。账户页本身已深度集成日程能力通过SchedulesProvider与getSchedulesQuery获取日程数据并在账本中预渲染待发生的日程交易previewTransactions见 Account.tsx同时支持批量将选中交易链接/取消链接到日程onBatchLinkSchedule/onBatchUnlinkScheduleAccount.tsx。该版本还修复了日程转账链接的边界问题当收款方账户先被导入时日程转账无法正确链接PR #6025以及罕见的日程页崩溃PR #6169。移动端账户视图恢复运行余额运行余额每笔交易后的账户累计余额在移动端回归。相关实现分布在 AccountPage.tsx、AccountTransactions.tsx、TransactionListWithBalances.tsx 与 TransactionListItem.tsx 中。PR #6241 专门修复了大量交易账户上运行余额显示异常的问题确保长列表场景下余额计算稳定。桌面快捷键CTRL/CMD Enter 单笔录入在桌面端编辑交易时通常 Enter 会录入当前交易并跳到下一行以继续录入25.12.0 新增CTRL/CMD Enter快捷键PR #6037实现只录入这一笔、不继续添加下一笔的快捷操作适合批量粘贴后一次性收尾的场景。同批还调整了合并交易快捷键为GPR #6200避免与金额快捷键产生混淆。货币支持与 CSV 导入增强新增货币本版本为预算模板与目标功能补齐了货币支持PR #5955并新增以下币种PR新增货币#6195马来西亚林吉特MYR#6084危地马拉格查尔GTQ、丹麦克朗DKK#6115哥伦比亚比索COP#6173印度尼西亚盾IDR#6252白俄罗斯卢布BYNCSV 导入tilde(~) 分隔符支持PR #6045CSV 解析器新增~作为列分隔符适配部分银行导出的分隔习惯页脚行裁剪PR #5879导入时支持裁剪 CSV 底部的页脚行footer lines避免被误解析为交易相关修复导入/银行同步时优先采用传入交易的清除状态PR #6082并移除了模板字符串示例中的美元符号PR #5946。其他值得关注的增强与修复自定义报告默认纳入隐藏类别与未分类交易PR #6092预算组头按钮快速添加类别PR #6110覆盖超支/超预算时可输入具体金额PR #5988GoCardless 银行同步按浏览器时区与语言环境自动预选国家PR #6054Done reconciling按钮文案优化全部对账完成时显示Lock transactions余额不平衡退出时提示Exit reconciliationPR #6220移动端新交易页支持通过 HTTP GET 参数预填输入框PR #6050移动端 payee 支持编辑功能PR #5874银行同步账户关联弹窗移动端响应式适配PR #5984PWA 图标与桌面端对齐PR #6204修复 OpenID 签发者配置无法从环境变量加载PR #6061与 token 过期时间未按配置的秒数计算PR #6130、Mac 桌面端热键失效PR #6067、iOS 26 Safari 上input typedate渲染过高PR #6145、规则页添加大量动作后崩溃PR #6175、拆分交易按钮在桌面端失效PR #6269等。维护与工程化文档仓库合并进主仓库PR #6029docs 目录自此成为 monorepo 的一部分本文所引用的发布说明即位于 packages/docs/blog大规模 TypeScript 迁移BudgetCategories、GenericInput、BudgetTable、TransactionEdit、FiltersMenu、vite 配置文件等组件均完成 TS 化PR #5961/#5976/#5997/#5998/#6091/#6121全库将Stack组件统一重构为SpaceBetweenPR #6039并修复随之而来的样式问题PR #6086useDisplayPayee改用 context 以减少 SQL 查询PR #5795vitest 升级至 v4PR #6060新增每晚签名桌面版构建工作流Nightly 与 PR 构建改为提供单独安装包、下载更快更小PR #6242/#6246依赖与安全升级js-yaml 3.14.2、node-forge 1.3.2 等PR #6174/#6260。升级说明自托管用户可直接将 Docker 镜像标签更新为25.12.0完成升级Web/PWA 端用户可通过新版设置中的Force reload按钮主动拉取最新客户端或在收到更新通知后点击Update now。Crossover 报告与强制重载功能均为实验性特性使用前建议先备份预算文件并在社区反馈渠道中持续关注其迭代发布说明中亦更新了 Crossover 报告的反馈链接PR #6148。参考文件索引发布说明原文packages/docs/blog/2025-12-03-release-25-12-0.mdCrossover 报告 UI 与配置Crossover.tsx、CrossoverCard.tsxCrossover 计算引擎crossover-spreadsheet.tsForce reload 实现appSlice.ts、browser-preload.js移动端运行余额AccountPage.tsx、TransactionListWithBalances.tsx账本内日程集成Account.tsx【免费下载链接】actualA local-first personal finance app项目地址: https://gitcode.com/GitHub_Trending/ac/actual创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考