BeeCount
beecount-website.pages.devSelf-hostedPrivacy-first cross-platform personal expense tracker (Android/iOS/Web) with offline-first design. Multi-cloud sync options — self-hosted BeeCount Cloud, iCloud, Supabase, WebDAV or S3 — keep data under user control.
- Homepage:beecount-website.pages.dev
- GitHub:github.com/TNT-Likely/BeeCount
- iOS App:apps.apple.com/app/id6754611670
- Android App:play.google.com/.../com.tntlikely.beecount
- Web info:web-check.xyz/check/beecount-website.pages.dev
BeeCount Source Code
Author
Description
Local-first bookkeeping for iOS/Android/Web · Self-hosted cloud + iCloud/WebDAV/S3 sync · AI capture · MCP | 本地优先的跨端记账 · 自建云 + iCloud/WebDAV/S3 同步 · AI 记账 · MCP
Homepage
https://count.beejz.comRepository
- LicenseOther
- Created06 Sept 25
- Primary languageDart
- Size124,414 KB
- Stars2,416
- Forks324
- Watchers2,416
Top Contributors
@TNT-Likely (622)
@pan071 (4)
@e74yp8 (4)
@tedzhouhk (3)
@LeibNici (2)
@pullfrog[bot] (2)
@Kratosmax (2)
@stoneReg (1)
@moduvoice (1)
@wait-more (1)
Recent Commits
TNT-Likely(13 Sept 26)
docs(repo): 统一提交与 PR 标题规范 (#493)
TNT-Likely(13 Sept 26)
AI助手体验升级 合并交易汇总、AgentCore、本地记忆与流式体验优化。
TNT-Likely(06 Sept 26)
feat: AI助手体验升级 (#480) * feat: 增加 AgentCore 回合编排 * fix: 限制 AgentCore 工具回合 * feat: 增加 Agent JSON 工具协议校验 * feat: 增加本地 Agent 记忆与审计存储 * feat: 增加本地 Agent 模型适配与 P0 权限策略 * feat: 增加 Agent 本地查询和记账工具 * feat: 接入 AgentCore 对话编排 * test: 更新 Agent 迁移后的 schema 版本断言 * feat: 接入原生 Agent 工具调用回合 * fix: 防止 Agent 降级路径重复记账 * feat: 补充 Agent 提示韩语本地化 * feat: 支持 Agent 原生流式执行展示 * refactor: 移除 Agent JSON 降级路径 * fix: 修复 Agent 查询状态与可观测性 * 修复 Agent 拒绝调用导致的重复回合 * 修复 Agent 流式工具解析与回复渲染 * 忽略 Android Kotlin 构建缓存 * feat: 完善 Agent 执行结果日志 * feat: 支持异步 Agent 工具策略 * feat: 添加 Agent 本机工具权限仓库 * feat: 添加 Agent 工具授权门禁 * fix: 防止 Agent 授权响应串用 * feat: 接入 Agent 对话授权事件 * fix: 修复 Agent 取消与授权持久化边界 * fix: 隔离 Agent 权限写失败后的污染缓存 * feat: 添加 Agent 权限设置与授权交互 * fix: 修复 Agent 连续对话上下文 * feat: 美化 Agent 权限设置页 * feat: 添加统一 Agent 品牌组件 * feat: 优化首页 Agent 入口 * feat: 优化 Agent 对话沉浸式执行体验 * feat: 收敛首页 AI 入口 * refactor: 移除 agentcore 业务硬编码 * refactor: 下沉 Agent 权限与记忆契约 * refactor: 下沉原生 Agent 协议与模型 * docs: 完善 agentcore 接入说明与边界测试 * fix: 清理 Agent 模型异常运行状态 * chore: 忽略本地设计原型 * 完善 Agent 工具 schema 与 agentcore 文档 * 修复记忆授权与 AI 页面交互问题 * 修复 Agent 最终响应切换闪烁 * 调整首页 AI 入口图标尺寸 * 修复 AI 对话状态与滚动体验 * 优化 AI 对话入口与快捷指令 * 优化 AI 对话交互并扩展只读工具 * 修复 AI 对话定位与页面一致性 * feat: 完善 AI 助手本地运行控制 * fix: 更新项目 Star 兜底数值 * fix: 收紧 AI 助手运行边界 * feat: 优化 AI 对话空状态 * feat: 优化 AI 助手空会话引导 * fix: 补全 AI 工具本地账本上下文 * feat: 补全 AI 记账成功卡片详情 * fix: 保留 AI 账单卡片详情并补齐文案 * chore: 清理 AI 助手冗余入口与韩语文案
TNT-Likely(31 Aug 26)
docs: remove Star History section (#470)
TNT-Likely(31 Aug 26)
feat: 标签详情页支持按月/年/全部时间维度筛选统计 (#461) (#463) - getTagStats / watchTransactionsByTag 增加可选 [start, end) 半开区间过滤, 共享账本 synthetic tag 分支同步支持 - 标签详情页 header 底部新增 月/年/全部 胶囊切换 + 周期选择器(轮盘), 周期口径与洞察页一致(periodForLabel/yearRangeFor,支持自定义每月起始日); 默认「全部」保持旧行为,统计卡片与交易列表共用同一范围 - watchTransactionsByTag 改用 drift join 全字段映射,修复旧手写映射漏掉 currencyCode/nativeAmount/categorySyncIdOverride 导致外币交易显示错误的隐患 - 页面统计/交易 provider 改 autoDispose,切换周期后旧范围的 watch 订阅及时释放
Hongkuan Zhou(17 Aug 26)
fix: 创建标签后自动选中新标签 (#455) TagSelector 早已会读取 TagEditPage 的路由返回值并自动选中,但 TagEditPage 保存成功后始终执行无返回值的 pop(),这段自动选中逻辑从未生效。 保存后重新读取已落库的 Tag 并通过路由返回;读不到时返回 null 正常关页面, 不使用强制解包。TagSelector 在异步返回后补 mounted 检查。 从 #436 拆分而来,保持一个 PR 只处理一个问题。
Hongkuan Zhou(17 Aug 26)
fix: 共享账本 Editor 不可在标签选择器新建标签 (#436) 标签是 user-scoped,共享账本 Editor 新建的标签只进自己的个人标签库, Owner 与其他成员均不可见,表现为「提示创建成功但标签消失」。 按 issue #435 方案1 处理 App 侧入口:共享账本非 Owner 角色隐藏「新建标签」 入口,并在同一位置显示「共享账本标签由所有者管理」;确认时过滤掉升级前 残留、当前 picker 不可见的个人标签 ID(Owner mirror 的 synthetic 负 ID 保留)。 Fixes #435
TNT-Likely(17 Aug 26)
fix(android): targetSdk 提到 36 并移除 Android 侧 Google Play 结算库 (#447) Google Play 两条策略要求(截止 2026-11-01): 1. targetSdk >= 36:硬编码 36。flutter.targetSdkVersion 在锁定的 Flutter 3.27.3 里是 35,永远追不上要求。 2. 结算库 >= 8.0.0:走「移除」而非「升级」。官方插件升到 billing 8 的 版本要求 Flutter >= 3.38,而 Android 端从来没有内购功能,billing 7.1.1 是 in_app_purchase 联合插件带进 AAB 的死代码。改为只依赖 iOS 专属的 in_app_purchase_storekit,AAB 里彻底不含结算库。 将来若在 Android 上做内购(如付费皮肤),需改回联合插件并升级 Flutter。
TNT-Likely(17 Aug 26)
feat: 周期账单支持选择货币 (#444) (#446) * feat: 周期账单支持选择货币 (#444) 周期账单此前完全没有币种概念:编辑页的账户候选被硬过滤成「账本本位币」, 外币账户根本选不到;也没有记账页那样的手选币种入口(L12),生成的交易 永远落本位币。 - DB v32:`recurring_transactions.currency_code`(可空,NULL = 账本本位币, 不回填 → 存量模板行为一字不差) - 编辑页:新增币种字段(复用 showCurrencyPickerSheet);币种优先联动 —— 改币种即按新币种过滤账户候选并清空已选账户;账户过滤同时修掉「读 currentLedgerId 而非所选账本」的老问题 - 生成器:有账户以账户币种为准(账户内不混币),无账户用模板币种; nativeAmount 不锁在模板上,每次生成按当日有效汇率折算 —— 周期账单的 语义是「每月 10 美元」,不是「每月固定 72 元」 - 列表页:外币模板金额前带币种符号 - 配置导出/导入:currency_code 往返 跨币种转账仍不支持(多币种设计 §4.4):转账两端按同一有效币种过滤, 天然同币种。周期账单不参与云同步,服务端零改动。 * fix: 周期账单列表标 ISO 码而非币种符号 真机走查发现:JPY 和 CNY 的 getCurrencySymbol 都是「¥」,只换符号的话 5000 日元和 5000 元长得一模一样,等于没标 —— 改成金额左侧标 ISO 码。
TNT-Likely(17 Aug 26)
fix: 共享账本 Editor 的标签「最近使用」不再等于「全部标签」(#443) (#445) Editor 视角下「最近使用」区块与「全部标签」内容完全一致,失去意义。 根因两层: 1. recentTagsForCurrentLedgerProvider 把 getRecentlyUsedTags 的 10 条子集 喂给 filterTagsForLedger,而后者在 Editor 分支是「丢弃入参、返回全量 mirror」语义(其余调用方传的都是全量,所以只有这一处受影响),子集被 静默放大成全量。 2. 即便不放大也取不到数:getRecentlyUsedTags 查的是 tags ⨝ transaction_tags 主表关联,而 Editor 记账的 tag 关联落在 transaction_tag_overrides (按 tag_sync_id),主表一条都没有。 修法:provider 两条分支各自取数,不再共用 filterTagsForLedger。新增 recentSharedTagsForLedger —— 从 transaction_tag_overrides join 当前账本的 transactions,按 MAX(happened_at) 取最近 N 个 tag_sync_id,再用 shared_ledger_tags 映射成 synthetic Tag。映射复用 _sharedTagAsMain,保证 id 口径与「全部标签」一致(picker 选中态按 tag.id 比,口径不一致会错位)。 mirror 未到齐时跳过查不到的 syncId,全查不到返回空 —— tag_selector 已有 recentTags.isEmpty → SizedBox.shrink(),区块自然隐藏。 单人账本 / Owner 分支保持原样(仍是跨账本的全局「最近使用」,标签本身是 user-scoped,这一项不在本次范围)。filterTagsForLedger 补文档警示不能传 子集。顺带删掉 tag_providers.dart 里失效的 sync_providers 导入(该库并未 导出 currentLedgerIdProvider,analyzer 一直在报)。 测试:provider 层锁死「recent ≠ all」(修复前红:返回全量 4 个),DB 层锁死 取数来源、排序去重、limit、跨账本隔离、mirror 缺失兜底。
TNT-Likely(15 Aug 26)
fix: 快速记账中号小组件改 2×4 网格,消除大片空白 (#448) 364×169 的中号卡此前只画一行 5 格(4 分类 + 记一笔),格子按自然高度居中, 下方空出近一半高度(用户反馈"空白很多不好看")。改为 2×4 网格铺满卡片, 顺带把快捷入口从 4 个提到 7 个。 - 取数:本周期用过的支出分类不足 limit 时,用账本其余可用支出分类按 sortOrder 补齐(total 记 0)。月初刚翻篇 / 新账本这类"本周期一笔还没记" 的场景,不补的话网格会空出一排灰占位格,而这恰恰是最需要有格子可点的 时候。批次 limit 4 → 7。 - 顺带修 emoji 分类图标撑爆格子:裸 Text 的占位高度是「字号 × 字体行高 倍数」(真实中文字体约 1.4),比同字号 Icon 高近 10px。flutter_test 默认 的 Ahem 字体行高恰好 1.0,单测复现不出,只有真机/预览加载真实字体渲染 时才炸(RenderFlex 溢出 6.5px)。锁死成与 Icon 同高的 SizedBox + height:1.0,并补结构断言测试防回归。 - 重新生成中英选择器预览图(Android drawable-nodpi/-en-nodpi + iOS Previews)。 原生壳无需改动:渲染尺寸仍是 364×169,点击态本来就是整块深链、不分区。
TNT-Likely(13 Aug 26)
feat: 一周年纪念皮肤(一岁星座 / 周年蛋糕)+ 修复云同步主题色闪烁 (#442) * feat: 一周年纪念皮肤(一岁星座 / 周年蛋糕)+ 修复云同步主题色闪烁 两款周年皮肤,纪念 2025.9.10 首版发布一周年,选择页置顶带「1st」角标: - **一岁星座**:BeeCount 首个动态皮肤。十颗星连成数字「1」,一只发光 小蜜蜂拖着彗尾绕它巡航,外加银河带 / 星云 / 月牙 / 流星 / 星尘。 跟随用户主题色。 - **周年蛋糕**:插着数字「1」蜡烛的蛋糕,烛火摇曳、糖粒升起。 自带奶油金配色。 配套: - HeaderSkin 加 isAnimated / boundPrimary / badge 三个元数据,皮肤选择页 按「动态 / 静态」分组 - **自带配色的皮肤会绑定 App 主题色**,换回普通皮肤时恢复用户原先手选的 颜色 —— 否则会出现「头部奶油金、按钮蜜黄」的割裂 - 动态皮肤共用基座 skin_common.dart:坐标换算、动画骨架、渐变底、径向光 同时修掉开启 BeeCount Cloud 后主题色闪烁(一岁星座上最明显,因为它是 唯一不绑定配色的皮肤,绑定色皮肤的结算恒等于绑定色所以看不出来): 1. **echo 环(一直闪)**:主题色 listener 无差别推 server,而下行 apply 又写同一个 provider,下行写入触发上行推送。两端各有一次在途 push 时 交替到达互相触发。加 runApplyingFromServer 抑制下行回推。 2. **推送在途窗口(闪一下)**:本地改色后 push 还在路上,这期间一次 syncMyProfile 拉到 server 上还没被覆盖的旧色就跳过去了。窗口必须在 listener 的**同步段**开 —— 中间隔着 prefs 写入和小组件重绘两段 await。 3. **失效皮肤 id**:皮肤下架后本地那个 id 没人清、会一直推给 server, server 又推回来。启动时降级为纯色并推上去,下行忽略认不出的 id。 * perf: 动态皮肤降功耗——非当前 tab 停 Ticker + 皮肤动效开关;铭文避开我的页头像 **发烫的主因是同时在跑 5 份。** app.dart 用 IndexedStack,它靠 Offstage 藏起非当前页,而 Offstage 不停 Ticker —— 明细/洞察/记账/资产/我的五个页面的 header 皮肤全部满帧重绘,不管你在看哪个。ProMotion 机型上就是 5×120fps。 非当前页包一层 TickerMode(enabled: false),controller 被 mute,切回来自动恢复。 再给一个用户侧出口:外观设置加「皮肤动效」开关,关掉后动态皮肤停在各自的 静态帧(那一帧是按构图最完整的时刻挑的,静态版本身也好看)。 开关不给皮肤加参数,而是翻译成子树的 disableAnimations —— 复用动态皮肤本来 就有的「系统减弱动态效果 → 停静态帧」分支,皮肤代码一行没改,以后新增的 动态皮肤自动支持。用 || 而非覆盖:系统的无障碍设置优先级高于 App 偏好。 状态并入 appearance 同步包(skin_animation),server 侧 appearance 是自由 dict,零改动。 另外修铭文在「我的」页被头像挡住:那页 header 约 270pt(首页 172pt)且正中 是大头像,照首页的横向位置排必然被盖。按高度分档,高 header 走左上。 实测:关掉开关后间隔两秒的两张截图逐字节相同,动画是真停住而非降频。 * feat: 皮肤选择页按系列分组;悬浮 tab 的星座避开头像 分组:HeaderSkin 加 group 字段,分「周年纪念 / 渐变 / 场景 / 图案 / 几何艺术」五组,与 web 端 HeaderSkinMeta.group 对齐。「全部 / 动态 / 静态」筛选保留(动/静不只是分类,还是功耗筛选),每个筛选下按组分节, **空组不出标题** —— 比如「动态」下只显示周年那一组。「纯色」不属于 任何系列,单独打头。将来加秋日系列只需加一个枚举值。 同时加 deprecated 标记:标了的皮肤选择页不再展示,但 headerSkinById 仍能查到。这是「想撤掉不好看的」和「不能坑老用户」之间的折中 —— 直接从 kHeaderSkins 删掉的话,正在用那款皮肤的人下次打开会发现 header 变回纯色,那是回收已发布的功能。当前一款都没标。 另修悬浮 tab 的迷你「1」星座被头像挡住:它原来画在 w*.93,而最后一项 「我的」显示的是用户头像 —— 一张不透明圆图占 87%~93.5%,星座直接被 盖掉。挪到 w*.80,即「资产」和「我的」之间的缝(73%~87% 是空的)。 * fix: 皮肤卡片高度对不齐;自带配色的皮肤预览要用自己的颜色 **卡片高度**:「自带配色」原来是名字下面多排的一行字,而 GridView 的 childAspectRatio 是固定的 —— 多一行文字就把上面的预览区挤矮,带标记的 卡片(周年蛋糕)比不带的(一岁星座)短一截。改成预览区右下角的 tag, 跟左下的「动」标记对称,所有卡片就齐了。 **预览配色**:预览原来一律拿当前主题色渲染。但自带配色的皮肤选中后 applyHeaderSkin 会把主题色切成 boundPrimary —— 卡片上标着「自带配色」、 画出来却是当前主题色、选中后又变一次,自相矛盾。改成优先用皮肤自己的 boundPrimary(没有才回落到当前主题色),预览即所见即所得。 实测:主题色切晴空蓝后,一岁星座/极光/山峦跟着变蓝,周年蛋糕保持奶油金。 这条对秋日六款影响更大(五款都有绑定色),提前修掉。 * feat: 一岁星座绑定蜜金;银河带浓度按底色亮度自适应 **绑定蜜金,不再跟随主题色。** 暗色下原本是两套色系同框:月牙 / 流星 / 四芒星走固定 #F8C91C(_warm),而星座 / 银河 / 星尘 / 双蜜蜂 / tab 装饰 跟主题色走。主题色一换成紫、绿,画面就成了「金色月牙 + 金色流星划过 紫色银河」—— 不是单纯的显假,是两套色系在打架。 星空的星光只有暖白 / 金才成立(星云那段「hue 偏移必须 ±14° 以内,否则 黑底泛脏绿 / 脏红」的注释,就是一直在跟这件事搏斗);纪念款用品牌色也 更贴题 —— 这是蜜蜂的第一年。BeeTheme.honeyGold 恰好等于 _warm 的字面量, 绑定后整幅收敛成一套金色系,**painter 内部一行没改**。 皮肤尚未发布,现在绑是零成本;发版后再绑就是「升级后主题色被强切」的 破坏性变更 —— 这是唯一便宜的时机。 **银河带浓度改为按底色相对亮度反推**(同一轮发现的另一个问题): 亮色分支原来写死 alpha .26,那是在中等亮度主题色上调的值。换到蜜蜂黄 (luminance .58)就废了 —— 截图沿银河法线采样,亮度单调下降,压根分离不出 带状特征,银河被底色自身的纵向渐变淹没。而蜜蜂黄正是默认主题色。 现按 target / (1 - luminance) 反推(target 由晴空蓝那组能用的值标定), 夹在 .24~.52。暗色分支的 .11 一字未动。 顺带清掉秋日剥离时遗留的 3 个 warning(_paintTwinkles 死代码 + 两处 staticFrame),全项目 warning 254 → 251,未引入新增。 ⚠️ 秋日分支 rebase 后须补:_paintTwinkles 已从 skin_common.dart 移除, 但桂月中秋 / 雁阵南飞在用,需搬回 autumn_common.dart。 * feat: 新功能红点 —— 发新版后引导用户自己发现新功能 现在新功能全靠用户去读更新日志,实际上没人读。这版加红点:升级后在通往 新功能的**路径每一级**点红点,用户走到功能本身时整条链熄灭。 **为什么不做更新弹窗。** 记账是高频且目的极强的动作 —— 用户打开 App 是 为了记一笔早餐,弹窗打断的是所有人,收益只在少数人身上;而且它对「修复 日历 firstDay」这种条目也照发一遍,不发又要额外维护一张判断表。最要紧的 是 CN 96 条 4.77 分那份评价资产扛不起「一更新就弹东西」的风险。红点是 零打扰的:不想探索的人只是多看到一个小圆点,想探索的人被直接引到位置 —— 后者比弹窗说「新增周年皮肤」有用得多,那句话看完还得自己找。 ## 机制 每条功能声明首发版本 + 入口路径。启动时比对上次启动版本与当前版本, 落在 (上次, 当前] 区间的进入未读;anchors 里每一级都亮,叶子被访问时 整条链熄灭。 四条钉死的规则(都有测试守着): 1. **首次安装绝不亮。** 新用户眼里所有功能都是新的,全亮等于全噪音。 2. **只有叶子消费。** 点开「个性化设置」不算看到了皮肤,红点得继续往下 指;这条搞反的话红点会在把人指到位之前就熄灭,整个机制失效。 3. **提前登记的未来版本不泄露。** 开发期常见:功能已合并、版本号写的是 下一版。区间上界卡住 currentVersion。 4. **跨版本升级不漏**,且未读集合累加 —— 升两版都没点进去,不会被后一次 启动冲掉。 **不进云同步**:红点回答的是「这台设备前的人看没看过」,在 iPad 上看过 不代表手机前的这个人也看过。只存 prefs。 ## 接入 AppListTile 加 dotAnchor 参数,接一个入口一行。放在组件内部而不是让调用方 自己包 FeatureDot —— 默认图标那个 36×36 圆形容器的样式在那个文件里, 让每个调用点复刻必然走样。 本版登记两条,都指向周年皮肤那条线。version 写 3.8.0,**发布版本号若不是 3.8.0 需要同步改**,否则红点不会在正确的版本亮起。 本地开发时 pubspec 的 0.0.1 是占位(CI 用 CI_VERSION 覆写),拿它比对会让 红点永不亮、没法自测,所以回退成清单里的最大版本。 测试 21 项;模拟器伪造 3.7.0 → 3.8.0 升级,四级传播与熄灭逐步验证通过。 * fix: 红点在开发机上永远看不到 —— debug 退化成「没点过就亮」 上一版的自测出口是坏的。以为把本地版本回退成清单最大版本就能自测, 实际上两条规则把窗口锁死了:首次启动走「首次安装不亮」、同时把 lastVersion 写成当前版本,之后每次启动都是「同版本无区间」。也就是 开发机上区间**永远为空**,红点一次都不会亮 —— 我自己验证时是手改 plist 绕过去的,等于没修。 现在 debug build 只放宽**入场**条件:清单里的功能一律视为待办。退场 仍走同一套 seen 标记,所以「红点怎么亮、怎么随访问逐级熄灭」在开发机 上完整可复现,唯独不复现「升级那一刻才开窗」—— 那一半由纯函数测试 覆盖(不吃 kDebugMode)。 配套把 seen 拆成独立的持久化 key:它是「看过」这个永久事实,不能跟着 未读集合被版本区间重算翻回来。debug 下每次启动都会把清单全量放回 待办,没有 seen 兜着就会「点完下次又亮」。 实测:卸载重装(全新安装、未碰 prefs),红点直接出现在「我的」tab。 * chore: 红点清单的首发版本改为 3.7.1 下个发布版本是 3.7.1(changelog 目录最新为 3.7.0),不是原先写的 3.8.0。 写错的话红点不会在正确的版本亮起 —— 写大了要等到更后面的版本才亮。 * refactor: 红点改为只看「点没点过」,不再跟版本号绑定 原来靠「首发版本 + 升级区间」开窗,换掉了。那套有两个真实缺陷: - **版本号填错是静默失败** —— 红点不亮、没有任何报错,只能人肉复查。 实测第一版就填错过(写成 3.8.0,实际下个版本是 3.7.1)。 - 开发机上区间恒为空、自测不了,只能给 debug 开特例;而特例本身又意味着 开发看到的行为和线上不一致。 「点没点过」既没有这些坑,语义也更贴事实:红点回答的本来就是「这个入口我 探过了吗」,跟它是哪个版本进来的没有内在关系。version 字段、版本比较、 升级区间、kDebugMode 特例全部删除,持久化只剩一个 seen 集合。 **首次安装的区分**是这套方案唯一需要处理的地方,靠 welcome_shown: - 全新安装(还没走过引导)→ 清单整体预标记已读 → 一个红点都不亮; - 从没有红点功能的旧版升上来(已走过引导)→ 什么都不预置 → 清单全亮。 这个信号比版本号可靠 —— 它是事实状态,不是需要人工填写的元数据。 代价是清单不再自动过期:一个从很老版本升上来的用户会一次性看到清单里 所有条目。所以维护纪律从「填对版本号」变成「过气就从清单删掉」,用 测试钉住(清单长度 ≤5)。删除是安全的,已读记录留在 prefs 里不影响任何事。 顺带把「为什么是红点而不是 NEW 角标」写进文档:多级传播要求载体能在 22px 的 tab 图标上生存,NEW 做不到;外加零文案(省四语 i18n)、固定红不吃主题色 (NEW 用主题色会重演银河在蜜蜂黄上看不清那个坑)、多条命中时不吵。并明确 两层分工 —— 路径引导用红点,内容标识用 badge(`1st`/`NEW`),别混用。 实测同一台设备同一 build,唯一变量 welcome_shown:全新安装走完引导后 「我的」tab 干净;删掉 seen 保留 welcome_shown 再启动,红点出现。
TNT-Likely(12 Aug 26)
feat(ai): 智能记账支持多币种(#437) (#441) * feat(ai): 智能记账支持多币种(#437) AI / 语音 / 图片 / 自动记账提取出的交易可以带币种,不再一律记成账本主币种。 底层管道 v3.6.0 已经全通,本次补的是 AI 侧「拿不到也传不出」币种这一层。 - currency_aliases: 口语/符号/英文名 → ISO 4217。符号表与英文名表从 151 币种表自动派生;**歧义不猜** —— `$`/`¥`/卢比/比索在没有上下文能唯一确定 时返回 null 回落本位币(45 美元记成 45 元比不识别贵得多) - BillInfo: 加 currency 字段,fromJson 兼容 currency/currency_code/ currencyCode 三种键名,非法值按缺失处理不抛 - PromptBuilder: 默认模板加字段 10 + 外币示例 + {{CURRENCIES}};账户清单 只在币种 ≠ 主币种时标注(单币种用户 prompt 逐字不变) - AiExtractionContext: 账户候选不再按本位币过滤(否则 AI 永远看不见外币 账户),改为带币种全量给出;隐藏账户仍排除(#240) - BillCreationService: 账户池按这笔的币种筛;落库传 currencyCode, nativeAmount 交给 repo 折算;外币时本位币默认账户不适用 - EnsureRate 注入式回调:外币落库前按需拉汇率,后台自动记账同样覆盖 - 缺汇率不阻断(A5):落 1:1 + 结果里带 unconvertedCurrencies,对话/语音/ 图片三条有 UI 的通道提示「已按 1:1 暂记」,靠统计页 L11 横幅补折算 - prompt 编辑页(A7):检测模板缺 {{CURRENCIES}} 时给提示条 + 「插入币种 段落」一键补丁 —— 不覆盖用户模板,保留其定制 顺带修掉 main 上一直失败的 bill_creation_service_test「AI 账户名完全相等」 (它靠创建两个同名账户来构造币种过滤场景,账户名唯一后不再成立)。 设计与决策见 .docs/multi-currency-ai/(A1-A10)。 * fix(ai): 币种识别对「美元」失效 —— prompt 加币种对照表,裸 $ 认作 USD 实测「花了 xx 日元」能识别、「xx 美元」不行,三个原因叠加: 1. 6 个示例里只有 1 个外币示例、恰好是 JPY —— 模型对「日元」有样例可套, 对其它币种只能靠字段说明那一行,few-shot 偏置明显 2. 字段说明把 `$45` 当输入例子写在紧邻 currency 字段的位置,模型容易把 `$` 当成**字段值**回来 3. 别名表把裸 `$` 当歧义符号丢弃 —— 于是「AI 认出美元」+「回了 $」= 整个 失效。「日元」不受影响,因为它极少写成符号 改动: - prompt 币种对照表**从别名表运行时生成**(zhAliasesForCode):prompt 与解析器 共用同一份数据,AI 照着填就一定解析得出;覆盖 kCommonCurrencyCodes 常用 币种 ∪ 账本自己在用的币种(KES 这类长尾也带上)。对照表只给一个规范名, 繁体/口语变体留给解析,不进 prompt - 示例补 USD / EUR 两条外币,含「星巴克 $6.5」→ USD(符号 → 代码) - 字段说明改成明令「不要填货币符号,也不要填中文名」+ 符号对应表 - 默认模板与「插入币种段落」补丁共用 _currencyFieldSpec 常量,加测试锁防漂移 - 裸 `$` → USD 作为有依据的默认:要区分 AUD/CAD/SGD/HKD/NZD 时书写惯例都是 A$/C$/S$/HK$/NZ$;`¥` 仍不猜(CNY/JPY 都写裸 ¥,差 ~20 倍) - 别名表补 `欧`/`歐` → EUR 新增测试含一条「对照表里每个中文名都能被解析器认回来」的联动锁。 * fix(ai): 自审两处缺陷 —— AI 可造跨币种转账、外币逐笔重复拉汇率 1. 跨币种转账守卫缺失(正确性) 放开账户池按币种筛之后,AI 不给币种时池是全币种开放的,于是 「从建行(CNY)转 800 到 Chase(USD)」会被当合法转账落库 —— 而手动路径 transfer_form 有明确守卫挡这个(01 §4.4)。改成转入账户按转出账户的 币种筛:匹配不到就不挂转入账户(与 AI 本来没说转入账户时同形),不造 币种错乱的转账。 2. 汇率预拉没先查本地(性能) 设计写的是「币种 ≠ 本位币**且本地无有效汇率**才拉」,漏实现了后半句: force:true 绕过 24h 节流,于是每笔外币账单各打一次网络请求(一张图 10 笔 JPY = 10 次),后台自动记账同样受害。补 _hasLocalRate 前置检查, 同一批里后续账单也能命中第一笔刚落库的汇率。 新增 6 个用例:跨币种转账不成立 / 同币种(含外币间)照常 / 本地已有自动 汇率或手动 override 时不再拉 + 折算值正确。 * fix(ai): 币种解析失败不再静默 —— 补一条 warning 便于排查 AI 给了币种但解析不出来时是静默降级成账本本位币的(A5 不阻断),用户只会 看到「1200 日元被记成 1200 元」,没日志根本判断不出是模型没填还是填了个 不认的写法 —— 「美元失效」当初就卡在这:模型回的是 `"$"`,被歧义保护丢掉。 日志打在 JsonResponseParser(它本来就持有 logger),bill_info 保持零依赖。 * refactor(ai): 提示词缺失检测从「只查币种」改为占位符登记表驱动 原实现硬编码 `!contains('{{CURRENCIES}}')`,只管币种一个洞。实际模板共 8 个 占位符,而编辑页的变量说明只列了 6 个 —— 一个自定义模板如果缺 {{ACCOUNTS}} (比如是账户功能上线前存的),AI 就永远匹配不到账户,而我们一句提示都没有。 改成登记表驱动: - PromptPlaceholder 登记 token + warnIfMissing + 可选的可追加片段 - 检测 = 默认模板占位符集合 − 用户模板里有的,自动覆盖以后新增的占位符 - 编辑页的变量说明也从登记表生成,顺带补上一直漏列的 {{BILL_GUARD}} 刻意不做成「与默认模板不一致」提示:自定义模板天然就不一致,那样会变成一条 永远消不掉的黄条,用户只会学会无视。只报**能力性**占位符缺失 (warnIfMissing=false 给 {{INPUT_SOURCE}}/{{CURRENT_DATE}} 这类纯观感的), 这样提示始终可操作、补完即消失。 一键补丁按占位符逐个登记:{{CURRENCIES}} 追加到末尾安全;{{BILL_GUARD}} 必须 在最前、{{OCR_TEXT}} 位置有语义,这类只提示不代劳,免得写坏模板。 新增 6 个用例,其中「登记表与默认模板双向一致」是防漏登记的锁。 * fix(ai): 跨币种转账守卫补上漏掉的另一半分支 上一轮只堵了「转出账户匹配上了」的情况:转入账户池按转出账户币种筛。但 「转出账户没匹配上 + AI 没给币种」时 fromCurrency 是 null,池又全币种开放了 —— 于是这笔按 ledgerBase(CNY)落库,却挂了个 USD 转入账户。账户余额读的是 原币 amount,800 会当成 800 美元加到 USD 账户上,余额直接错。 池的币种改成 fromCurrency ?? requestedCurrency ?? ledgerBase,永不为 null。
Hongkuan Zhou(12 Aug 26)
fix: 云服务配置页在唯一 provider 实例上登录,修复 2FA 后同步丢失登录态 (#434) 配置页原先先 invalidate 配置、再用临时 auth 实例登录,导致共享 provider 在 prefs 尚无 session 时重建并卡在未登录;2FA 场景下静默恢复被 requires_2fa 挡住而无法自愈,SyncEngine 随后报 CloudSyncUser not authenticated。 改为在 beecountCloudProviderInstance(SyncEngine 使用的同一实例)上完成登录。 Fixes #433
TNT-Likely(12 Aug 26)
feat: 日历视图支持点标题快捷跳转年月,并修复 firstDay 硬编码 2020 日历页原先只有左右箭头,导入多年历史账单的用户回看早年数据要一个月一个月点 (issue 场景:2026-08 → 2020-09 约 71 次)。 - 头部标题改为「20xx年xx月 ▾」可点入口,弹出 showWheelDatePicker(mode: ym), 与首页、统计页复用同一个年月滚轮:零新增组件、零新增 arb key,标题格式沿用 DateFormat.yMMMM(locale),四语显示与改造前逐字一致 - firstDay 从硬编码 DateTime(2020,1,1) 放宽到 2000-01-01。原先导入 2020 年前 账单的用户根本翻不到那些月份;且这是年月跳转的前置必要项 —— focusedDay 越界 会踩 table_calendar_base.dart:77 的 assert。选择器 min/max 与日历 firstDay/lastDay 绑同一份,结构上消灭越界 - 跳月后清空选中日,与滑动切月的 _onPageChanged 同语义;程序化跳转不回调 onPageChanged,故两个 provider 手动同步 - 顺带清理该页存量调试代码与死代码(-192 行,无行为变更):15 处 print、 死方法 _buildMonthTransactionsList、死 provider monthTransactionsProvider, 以及 getDailyTotalsByMonth 里两条纯粹为了喂 print 而存在的调试查询 (日历每渲染一个月原本跑 3 条 SQL,现在只剩聚合那一条) 涉及文件 analyze issues 28 → 9,剩余 9 条属基线已有类别。已在 iOS 18.6 模拟器 实测:跳 2020-09 / 2017-09 均正常且格子有数、当日列表正确、暗黑模式配色正常。 Closes #429
sunxiao(07 Aug 26)
docs: 相关仓库移除 BeeShot(项目已删除)
TNT-Likely(26 Jul 26)
docs: 商业授权公示与贡献者许可条款(CLA)落地 (#420)
TNT-Likely(26 Jul 26)
feat: 关于页更新日志入口、家当推广移除 TestFlight 及文案优化 (#419) * feat: 蜜蜂家当引流弹窗移除 TestFlight 入口(已正式上架 App Store) * feat: 关于页底部新增「更新日志」入口(内嵌打开官网文档) * style: 关于页开发者故事入口改用书本图标(原问号图标语义误导) * fix: 「我的」页「当前余额」改称「账本结余」,避免误读为资产金额
TNT-Likely(26 Jul 26)
docs: 更新支持者名单 (#418)
TNT-Likely(26 Jul 26)
feat: 桌面小组件扩展——6 类内容×12 规格,图片渲染统一架构 (#406) 收支速览/净资产/快速记账/预算进度/最近交易/综合仪表盘,小中大多尺寸;双语选择器预览图、深链点击直达、暗黑跟随系统、i18n 全链路;home_widget 0.9.2;修复商店包类名匹配/启动预热死代码/渲染钩子竞态。
TNT-Likely(18 Jul 26)
feat: 账户隐藏功能(账户不再使用可隐藏,避免删除丢历史) (#404) * feat: accounts 加 hidden 列(schema v31) 补齐 schema 变更连带的手写 Account(...) 构造(共享账本 synthetic 账户 映射),否则 Drift 生成的必填字段会导致编译失败。 * feat: repo updateAccount/setAccountHidden + 选择器 helper 排除隐藏 updateAccount 加 hidden 参(null=不改);setAccountHidden 便捷法内部走 updateAccount 复用其同步追踪。filterAccountsForLedger(记账/转账选择器 共用)排除 hidden 账户。 * feat: 账户同步 push/apply 接 hidden(apply 缺键保留) serializeAccount 无条件带上 hidden;_applyAccountChange 照账单标记的 containsKey 范式处理:缺键保留本地值,insert 缺键落默认 false,显式值 (含 false)覆盖。账户 apply 其它字段是无条件覆盖,hidden 必须走这条 保护,否则远端只改名字的 partial 更新会把本地已隐藏抹掉。 * test: 同步 schemaVersion 硬编码测试到 v31 Task 1 把 schemaVersion 从 30 升到 31,该测试字面断言 30 需要跟着改, 否则全量回归会误报。 * feat: 记账/转账/周期/默认账户选择器排除隐藏(编辑态钉住当前账户) - 周期记账选择器(recurring_transaction_edit_page)inline 过滤加 !hidden - 首页快速记账默认账户解析(transaction_editor_page)命中隐藏账户按无默认处理 - AccountSelector 加 pinnedAccountId(E1):编辑历史交易时钉住已隐藏的原账户 并打「已隐藏」灰标,其余隐藏账户仍不出现;amount_editor_sheet 接入 * feat: 账户管理页在用/已隐藏分区 + 隐藏/恢复入口 + i18n - accounts_page:资产/负债分组及未知类型兜底只渲染在用账户;新增 「已隐藏」分区(默认折叠,分区头「已隐藏(N)· 合计 ¥x」,口径复用 convertAmountsToBase 与在用分组小计对齐,两者相加与净资产卡对账); 隐藏卡复用 _AccountCard 弱化(灰度 + 已隐藏灰标)+ 恢复按钮;默认收/支 账户选择器排除隐藏账户 - account_edit_page:删除按钮同区新增「隐藏账户/恢复账户」入口;隐藏前 查活跃周期账单数提示(E2),隐藏后若是默认收/支账户则清空该设置(E3) - 补充 getActiveRecurringCountByAccount repo 方法(接口 + local + 委托), 供上面的隐藏确认框使用 - i18n:app_en/app_zh/app_zh_TW 补齐账户隐藏文案,跑 flutter gen-l10n (韩语按惯例暂不翻译,兜底英文) * feat: 周期生成跳过隐藏账户 + 统计反向断言 + 回归收尾 - generatePendingTransactions:关联账户(转账含转出/转入两端)任一被隐藏, 本次扫描跳过该周期账单且不推进 lastGeneratedDate,账户恢复后按现有 「补生成」机制自动追上遗漏周期(E2) - account_hidden_test 补充:getNetWorthBreakdown / getAssetCompositionByType 隐藏账户前后数值不变(D1 反向断言);getActiveRecurringCountByAccount 统计正确性(转出/转入任一端命中、排除已禁用模板) - recurring_transaction_service_test 补充:隐藏 accountId/toAccountId 均 跳过生成、恢复后补上遗漏一笔 * feat: 转账表单编辑态钉住已隐藏账户(E1) 编辑历史转账时,若转出/转入账户当前已被隐藏(因而被 filterAccountsForLedger 排除),补回候选并打「已隐藏」灰标,让用户能原样保存;其余隐藏账户仍不出 现。新建转账场景不钉住。跟 AccountSelector.pinnedAccountId 同一范式。 * feat: AI 自动记账账户匹配排除隐藏账户(与手动记账/Web 一致)
Qinian(14 Jul 26)
feat(历史备注): 备注历史建议支持范围/排序/数量个性化 记账填备注时的历史建议支持配置:显示范围(全部/当前分类)、排序(使用频率/最近)、数量(1-100);走 appearance 通道同步 + 纳入配置导入导出;repo 层 getNoteHistory 聚合查询,枚举收拢至 lib/models/note_history.dart。
Qinian(13 Jul 26)
feat(搜索): 支持分类筛选交易记录 (#399) 1、筛选弹窗接入可搜索的全部分类选择器 2、搜索结果按分类ID及二级分类范围过滤 3、补齐分类筛选多语言文案 Co-authored-by: ChangAn <[email protected]>
TNT-Likely(12 Jul 26)
feat: 账本支持多币种(v30)——交易记原币+折本位币快照,统计自动折算 (#397) * feat: 账本支持多币种(v30):交易记原币+折本位币快照,统计自动折算 - 交易表加 currency_code/native_amount(schema v30,迁移回填 currency_code=账户币种、native_amount=amount,单币种账本零变化) - 记账录入:账户币种≠本位币自动出汇率行+折算预览(无开关);无账户交易可手选币种(L12);编辑外币交易按隐含汇率回显;汇率缺失阻断保存 - 账本维度统计折本位币:repo 13 处+UI/Service 15 处切 nativeAmount??amount;账户余额/资产页仍原币(回归锁) - Repository 带折算兜底(AI/周期记账落外币账户先查汇率);金额变更联动折算(与云端对称) - 补折算横幅(检测存量未折算外币交易,确认后按当前汇率重算)+改本位币全量重算,重算逐笔记 change(L13) - 同步:payload 带两字段;apply 快照保护(旧客户端改备注不丢折算,改金额退化 1:1 可捞回) - CSV 导入补两列;i18n 三语;统计页折算脚注 * fix: 记账选外币时自动拉取汇率,修复「汇率获取失败」 记账页是汇率的新消费场景:用户可能从没进过资产页/汇率页(exchange_rates 表为空), 且手选币种不在 usedCurrencies(账户币种∪主币种)里,常规 refresh 永远不会拉它。 - refreshExchangeRates 加 extraQuotes 参数,把记账页所选币种并入拉取集合 - 金额弹窗检测「外币且本地无汇率」→ 自动拉一次(同币种只试一次,拉取中显示 1 XXX = … 占位;失败回落「汇率获取失败」由用户手填,L8 阻断兜底不变) * feat: 多币种记账体验优化(测试反馈 1/2/6) - 交易列表外币显示其币种符号(US$/JP¥ 等),本位币维持纯数字(反馈1) - 币种标移到金额旁,点开即选;汇率行常态纯展示,仅获取失败时可点手填(反馈2) - 币种优先联动(反馈6):切币种 → 账户重置不选 + 账户列表按新币种过滤刷新; 修复 AccountSelector 只显示本位币账户的旧过滤(外币账户原本选不到) * fix: 账本编辑改本位币被静默吞掉 + 字段改名「账本本位币」(反馈7) - 确认弹窗误用可能已随入口弹层销毁的参数 context,mounted=false 时静默 return 连基础保存都被吞 → 改用 State 的 context/mounted - 账本编辑里「币种」label 改为「账本本位币」,与资产页用户级「主币种」区分 * style: 编辑弹窗币种标移到金额左侧,折算预览金额下方,去掉汇率行(反馈9) 汇率仍自动拉取/隐含汇率内部计算,只是不再展示数字;获取失败时折算行 变为错误提示,点击可手填(L8 兜底保留) * fix: 币种标固定在金额表达式最左侧,折算预览回归金额模块区域(反馈11) 运算模式下币种标原本夹在「10 + 20」中间;折算预览原本渲染在备注框之后 (视觉落在账户选择上方)——移入金额区 Column 内、金额/等号行正下方 * feat: 交易列表外币金额下方显示 ≈ 折算小字(反馈13) * feat: CSV 导出/导入支持币种列(反馈10)+ 列表折算移到标签右侧(反馈15) - 导出:金额后新增「币种」列(currencyCode??账户币种??本位币,自包含可回导) - 导入:表头自动识别 币种/貨幣/currency;字段映射 UI 加币种项;CSV 币种列 优先于账户币种/本位币兜底,按有效汇率折算(ISO 格式校验防脏值) - 列表 ≈折算小字与标签同行(标签右侧),无标签时独占该行 * style: 列表有折算小字时标签最多展示 1 个,无折算保持 2 个(反馈16) * fix: 改主币种后旧币种交易折算不生效(反馈17)+ 文案改「主币种」 - 根因:改本位币瞬间本地没有「以新主币种为 base」的汇率组,全量重算因缺 汇率整体跳过(绝不 1:1 硬折的红线行为)→ 旧交易折算值保持=原值,显示端 判定为未折算 → 重算前先 force 拉新主币种汇率;L11 横幅补折算同样处理 - 「账本本位币」文案三语改「主币种」(资产页用户级主币种语境不同,值 几乎恒相同,不引入混淆;设计文档保留「本位币」作技术术语) * fix: 转账金额弹窗隐藏币种标(转账币种恒=账户币种,选了会被忽略,纯误导) * fix: 审查修复(App):重算脏值/换账户联动/跨账本移动/synthetic 币种/统计口径 - 改主币种全量重算:缺汇率不再保留旧本位币折算值(native≠amount 使 L11 永远检测不到的永久静默错值)→ 退化 =amount 可被横幅捞回 - 补折算/改主币种前的汇率拉取带上账本实际涉及的外币(extraQuotes),无对应 账户的币种(CSV 导入/手选)此前永远补不上 - updateTransaction 换账户时按新账户币种重新解析折算(此前只联动金额, 转账换账户对后币种残留旧值) - updateTransactionLedger 跨账本移动后按新账本主币种重算折算快照 - 金额弹窗解析共享账本 synthetic 账户(负 id)币种(新 repo 方法 getAccountCurrencyByAnyId),成员选 Owner 外币账户不再被静默按本位币 - getCategorySummary 平均值改折算口径(原 AVG 原币与 SUM 折算混用,平均可 大于总额);getTagStats/getCategorySummary 补 exclude_from_stats 过滤 - 重算包进单事务(万笔账本 2 万次 commit → 1);addTransaction 兜底在两字段 显式传入时零查询直通;删除 2 个 dead i18n key * fix: 改主币种后统计立即刷新(反馈19) 刷新信号(stats/budget/ledgerList)原排在 await 云同步之后——重算产生的 几百条 change push 可能耗时数十秒甚至失败,期间首页/账本页统计一直显示 旧数据。信号提前到本地重算完成后立即发;同步移到最后并 catch(失败不 影响本地展示,下次同步兜底) * fix: 账本余额/日历/年度报告的折算口径漏网(反馈:改主币种余额不更新) 系统排查 lib/data/repositories 全目录(上次 grep 路径漏扫)+ 年度报告: - getLedgerStats 账本余额裸加 t.amount(多币种账本 CNY+JPY 直接相加,改 主币种不随折算更新)→ 折 nativeAmount??amount。这是「我的页面/账本页 余额不更新」的根因,双页面同源一处修复 - getDailyTotalsByMonth(日历日收支)裸加 amount → 折算 + 补 exclude 过滤 (与首页/分析页口径统一) - 年度报告「最大单笔支出/收入」按 amount 原币比较(多币种下 5000 JPY 会 误判为比 300 CNY 大)→ 按折算值比较 - 确认 account_repository 全部账户维度(正确)、allAccountsTotalStats 无 消费者(dead code) * fix: 分类详情金额排序分支的日小计/排序折算口径(穷尽审计) 穷尽核对 210 处 .amount 引用后仅剩这一处活跃 bug: - category_detail 金额排序分支日小计裸加 amount(时间排序分支/顶部汇总 都已折算)→ 同页两套口径,多币种下金额排序下小计偏大 → 折 nativeAmount - 金额排序 ORDER BY 改按 coalesce(native,amount)(多币种下 5000 JPY 不再 因原币面值大而排在 300 CNY 前,与年报 largest 比较同口径) - getAllAccountsTotalStats(死代码,无消费者)加口径警示注释:跨账本总收支 正确口径是 rate 折主币种非 nativeAmount,勿来日误用 * fix: 分类详情/日历/搜索/标签详情列表补传币种+折算给 TransactionListItem TransactionListItem 早已支持币种符号+≈折算小字,但这 4 个页面(共 6 处调用) 只传了 amount、漏传 currencyCode/nativeAmount(默认 null → 组件判定非外币 → 不显示)。补齐后与首页/明细列表一致。 全局审计所有 6 处 TransactionListItem 调用点现均传币种;account_detail (账户维度,用账户币种展示原币,正确)、recurring(周期模板无折算概念)、 category_rank_row(分类汇总已折本位币)按语境正确,非漏传。 * feat: 币种选择弹窗加国旗+汇率;记账币种标国旗胶囊样式(反馈) - 引入 country_flags 包(SVG,两端渲染;emoji 国旗安卓不显示故弃用) - countryCodeForCurrency:币种→国家码(前2位派生 + 欧元/区域法郎/贵金属等 无国旗货币返 null 兜底占位) - 币种选择弹窗:每行加国旗 leading + 汇率 subtitle(rateBase 传入时拉一次 全量 base→quote 汇率展示 1 该币种≈x 主币种;override 优先,缺失省略) - 记账弹窗币种标:纯文字 → 浅底胶囊 + 小国旗 + code + 下拉箭头,更醒目; _pickCurrency 传 rateBase=账本主币种,选币种时看得到汇率 - 多币种记账开关:评估后不做(与 L7 无开关决策冲突,且外币账户 footgun) * fix: 新台币(TWD)国旗改用中国国旗(中国大陆市场合规) * feat: 币种选择弹窗常用货币置顶(CNY/USD/EUR/JPY/HKD 等 11 种) kCommonCurrencyCodes 按顺序置顶,其余按地区原顺序;搜索时常用匹配项同样 优先。中国用户 + 出境/外贸高频币种排前面,不用滚到地区分组里找。 * feat: 欧元显示欧盟旗;币种名全部走 arb(151 三语);补 TOP/常用置顶 - 欧元:country_flags 有 eu.si 资源但 fromCountryCode 不认 EU → 引 jovial_svg 照包内方式直接渲染欧盟旗;抽共享 currencyFlag(弹窗+记账币种标统一,区域 货币符号占位) - 币种名改为全部走 arb(反馈):151 币种补齐 zh/zh_TW/en 三语(简体译名+简转繁+ 英文兜底),删临时内置简体 map 与 locale-aware 逻辑,回到 arb 驱动;缺翻译由 en template 兜底英文 - 补 TOP(汤加潘加)中文名 * style: 记账币种标国旗圆角对齐 4
TNT-Likely(11 Jul 26)
style: 关于页/配置页 list 分割线统一缩进避开 icon (#396) about_page(3 处)+ config_import_export_page(2 处)的裸 Divider 换成 BeeTokens.cardDivider(context),与其它设置页一致:左缩进 48 对齐 AppListTile 内容、避开 leading icon,暗黑不显示。
TNT-Likely(11 Jul 26)
feat: 关于页重设计、6 款皮肤、云同步状态修复、明细/设置暗黑视觉优化 (#395) * feat(关于页): 重设计为社媒图标按钮布局,新增真实 logo 与 Telegram 群入口 * fix: beecount-cloud 同步完成后刷新「我的」页同步状态 本地新增/修改交易触发的 auto sync push 成功后,SyncEngine.getStatus 的 _statusCache 未失效(手动上传/下载路径都会 remove,唯独 sync() 遗漏),「我的」页一直命中旧缓存显示「本地有更新」,必须手动去详情页下拉刷新才更新。 修复:sync() 完成后清本账本 _statusCache(clearStatusCache);并新增 PushCompleted 事件在 push>0 时 emit,listener 收到后 bump syncStatusRefresh 触发 syncStatusProvider 重读。补 e2e 回归测试(禁用清缓存即复现 localNewer)。 * feat(皮肤): 新增 6 款 Header 皮肤(丝带/气泡/星系/低多边形/棱镜/水磨石) 代码绘制、跟随主题色、亮暗两套,沿用现有皮肤 part 模式;三语言(简/繁/英)i18n,韩语兜底英文;含 smoke test。 * style: 明细列表暗黑模式颜色协调,并迁移 tokens 到 withValues - 每日汇总 header 去掉 surface 深灰底,与交易行一样透明,亮暗都显示同一列表背景 - 暗黑 day 之间补 1px 白 8% 分隔线(原暗黑无线,靠 header 深灰块分隔,header 透明后需显式补上) - tokens.dart 全部 withOpacity → withValues,消除 29 处 deprecated 告警 * style: 设置项分割线缩进避开 icon,暗黑分割线策略调整 - 设置项分割线(cardDivider)默认缩进 48 对齐 AppListTile 内容、避开左侧 icon;卡外全宽线(mine 顶部)传 indent 0 - 暗黑模式:设置项去掉分割线(纯黑极简,靠间距+主题色边框),明细列表 day 线拆出独立 token(listDayDivider)亮暗都保留
sunxiao(11 Jul 26)
docs: 修正语言支持描述为「官方三语+社区韩语」,移除虚列的未实现语言
moduvoice(11 Jul 26)
feat(i18n): add Korean (ko) translation (#388) * feat(i18n): add Korean (ko) translation Add a complete Korean (ko) localization: lib/l10n/app_ko.arb covering all 2159 keys from the English template (en) with full key parity and placeholder preservation, plus registration of the new locale in MaterialApp.supportedLocales, the language settings page, the appearance settings summary, and the onboarding language picker, following the same pattern already used for zh / zh_TW. 한국어(ko) 번역을 추가합니다. * chore: regenerate l10n files for Korean locale (flutter gen-l10n) Ran `flutter gen-l10n` (Flutter 3.27.3) against the existing app_ko.arb to add ko to supportedLocales/lookupAppLocalizations and generate app_localizations_ko.dart, per maintainer request on PR #388. Co-Authored-By: Claude Sonnet 5 <[email protected]> --------- Co-authored-by: Claude Sonnet 5 <[email protected]>
sunxiao(08 Jul 26)
style(搜索): 移除 #383 残留的多余 import(database_providers 已由 providers.dart 提供)
Qinian(08 Jul 26)
feat(搜索): 搜索结果页新增收支汇总展示 (#383) * feat(搜索): 搜索结果页新增收支汇总展示 1、search_page.dart结果统计行新增支出/收入金额汇总,按搜索结果实时计算 2、新增_buildSummaryChip辅助方法,复用BeeTokens收支颜色体系 3、ARB及l10n文件新增searchSummaryIncome/searchSummaryExpense多语言文案(简体/繁体/英文) * fix(搜索-汇总统计): 修复搜索结果汇总行大额金额溢出及换行问题 1、_buildSummaryChip金额改用formatBalance紧凑格式(万/k/M),杜绝超长数字 2、chip包Flexible+Text加softWrap:false/ellipsis,防止RenderFlex黄黑条和换行 3、从currentLedgerProvider获取currencyCode传给formatBalance * refactor(搜索页-汇总统计): 优化汇总金额显示稳健性及代码规范 1、汇总chip改为Expanded+Flexible(loose)布局,正常金额取自然宽度展示,极端金额截断省略不再触发RenderFlex溢出 2、新增_totalExpense/_totalIncome缓存字段,在_searchResults更新时计算一次,消除build()中重复全量遍历 3、收入fold统一补充.abs(),与支出写法对称 4、汇总chip的fontSize及间距SizedBox改用.scaled(context,ref),遵循项目字体缩放规范 * fix(搜索页-汇总统计): 修复隐藏金额对汇总行不生效及中英文单位错误 1、_buildSummaryChip改用AmountText替代手写formatBalance,隐藏金额开启时汇总行金额自动打码为****,与列表项行为一致 2、AmountText按languageProvider自动切换万/k/M单位,修复原hardcode中文环境导致英文界面仍显示「万」的问题 3、移除currencyCode参数及build()中的currencyCode变量,币种由AmountText内部自动读取,消除冗余依赖 --------- Co-authored-by: ChangAn <[email protected]>
BeeCount Website
Website
蜜蜂记账 - 简洁安全的个人记账工具 | 蜜蜂记账
蜜蜂记账是一款开源免费的个人记账应用,支持 iOS 和 Android。简洁易用,数据安全,支持多种云同步方式。
Redirects
Does not redirect
Security Checks
3 security checks failed (62 passed)
- Uncommon Clickable URL
- Domain is Blacklisted
- Risky Category Detected
Server Details
- IP Address172.66.47.91
- LocationSan Francisco,California,United States of America,NA
- ISPCloudFlare Inc.
- ASNAS13335
Categories
Some proxies may block this service, as it falls into the following categories
- Free Hosting
Associated Countries
US
Safety Score
Website marked as very dangerous
0%
Blacklist Check
beecount-website.pages.dev was found on 1 blacklists
- ThreatLog
- AntiSocial Blacklist
- Artists Against 419
- Badbitcoin
- Bambenek Consulting
- CERT Polska
- CoinBlockerLists
- CRDF
- CryptoScamDB
- EtherAddressLookup
- EtherScamDB
- Fake Website Buster
- MetaMask EthPhishing
- NABP Not Recommended Sites
- OpenPhish
- PetScams
- PhishFeed
- PhishFort
- Phishing.Database
- PhishStats
- PhishTank
- Phishunt
- RPiList Not Serious
- Scam.Directory
- SecureReload Phishing List
- Spam404
- StopGunScams
- Suspicious Hosting IP
- ThreatFox
- TweetFeed
- URLhaus
- ViriBack C2 Tracker
Website Preview
BeeCount iOS App
App Info
BeeCount - Simple Ledger
BeeCount is a fully free, open-source personal ledger app that puts privacy protection and data sovereignty first. Open and Transparent - 100% open-source code, trusted by 2000 + users on GitHub - All code is publicly auditable, community-supervised - Business Source License — completely free for personal use - Active developer community with continuous updates Self-Hosted and Multi-Device Sync - Full control of your data — the defining feature of BeeCount - Sync via BeeCountCloud, Supabase, S3, WebDAV, iCloud, and more - A great fit for users with Synology, UGREEN, Nextcloud, and other NAS - Your data sovereignty is yours alone; developers cannot access anything AI Smart Bookkeeping - Snap Alipay or WeChat bill screenshots and AI auto-detects amount and merchant - Categories are auto-matched by merchant name - System shortcut integration for one-tap screenshot logging - Customizable AI: built-in Zhipu GLM, plus other compatible LLM providers (Zhipu / DeepSeek / SiliconFlow / etc.) Complete Ledger Features - Transactions with amount, category, date, note, and attachments - Multiple ledgers — separate personal, work, and investment - Multiple accounts — cash, debit card, credit card - Two-level categories and a tag system for flexible labeling - Image attachments per transaction - Recurring entries for rent, salary, and other fixed flows - Budget management to keep monthly spending in check Data Insights - Monthly and yearly reports with category rankings at a glance - Income and expense trend analysis to stay on top of your finances - Beautiful annual recap posters, one-tap shareable Data Safety - Offline-first — works without a network connection - CSV and TSV import and export, compatible with major apps - One-tap export of categories, tags, budgets, and other settings - Privacy mode to hide sensitive amounts Personalization - Multiple theme colors to express your style - Dark mode for comfortable nighttime use - Font scaling for accessibility - Three languages supported: Simplified Chinese, Traditional Chinese, English Why BeeCount Traditional ledger apps store your data on third-party servers, raise privacy concerns, can lose your data when services shut down, paywall premium features, and push ads. BeeCount lets you self-host with full data control, is 100% open-source and auditable, works offline, is completely free for personal use with no ads, and is community-driven with ongoing updates. More than a ledger — a lifestyle of data sovereignty. Join BeeCount and take charge of your financial data. GitHub: https://github.com/TNT-Likely/BeeCount
Rating
Version Info
- Current Version3.3.0
- Last Updated09 Jun 26
- First Released11 Nov 25
- Minimum iOS Version15.5
- Device Models Supported127
App Details
- IPA Size45.07 Mb
- PriceFree (USD)
- Age Advisory4+
- Supported Languages3
- Developer笑笑 孙
- Bundle IDcom.tntlikely.beecount
Screenshots
BeeCount Reviews
More Secure Budgeting
A local-first personal finance app
A lightweight, self-hosted personal finance app for recording daily transactions and analyzing spending patterns. Self-hosted, with all data staying on your own server. Supports 2FA and OICD.
A free and open source personal finance manager. Firefly III features a clean and clear UI, is easy to set up and use, and is backed by a strong community. Regular updates bring new features, improvements, and fixes. There's also a hass.io addon, and compatibility with Home Assistant. Ensure your server is securely configured.
A full-featured cross-platform accounting application suitable for personal and small business finance. Stable and reliable, GnuCash offers a comprehensive suite of financial management tools. Available for Windows, Mac, Linux, and Android.
Utilizes plain text files and scriptable, command-line-friendly software for bookkeeping/accounting, offering full control over data. Popular tools include Ledger, hledger, and Beancount among others, providing a flexible and vendor-independent approach to accounting.
A self-hosted, opensource, privacy-first portfolio tracking and accounting tool for crypto and more. Support for all 3 major Operating systems and docker. The tool focus is on data self-sovereignty.
About the Data: BeeCount
Change History
- Added #531
Edit BeeCount Data
You can edit BeeCount's entry in this section of awesome-privacy.yml by submitting a PR to our GitHub repo.
Note that some of the information shown above has been aggregated from external
sources, a list of these can be found data documentation.
Origin Data
Modify Data
API
You can access BeeCount's data programmatically via our API. Simply make a GET request to:
https://api.awesome-privacy.xyz/v1/services/beecountThe REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.
Share BeeCount
Help your friends compare Secure Budgeting, and pick privacy-respecting software and services.
Share BeeCount and Awesome Privacy with your network!
