macOS 日常记录器
一款原生 macOS 菜单栏应用,将活跃屏幕使用时间转换为实时每日账本——工作分钟计入收入,娱乐分钟计入支出,空闲或中性时间忽略不计。基于 Swift 6 和 SwiftUI 的 MenuBarExtra API 构建,应用在后台静默运行,每 15 秒采样一次上下文,并以分钟级记录聚合后存入本地 SQLite 数据库。无云端、无订阅、无追踪——只是菜单栏中一个实时数字,在你花费注意力的当下让其可见。
私有仓库,暂未开源。如有兴趣体验,欢迎联系。
亮点
- 构建优先级分层规则引擎:空闲检测 → 域名规则 → 用户应用规则 → 内置默认值 → 中性兜底;通过 AppleScript 跨 7 款浏览器(Safari、Chrome、Arc、Brave、Edge、Chromium、Safari TP)获取当前标签页 URL
- 设计子域名感知的域名匹配——
mail.google.com优先于google.com;为已有主机添加规则时覆盖而非重复,保持规则集一致性 - 实现带 Schema 迁移的 SQLite 持久化——分钟记录存储 bundle ID、应用名称、分类、决策来源、金额(分)和活跃/空闲标志;Schema 版本控制透明处理升级
- 实时菜单栏汇总:净收益(绿色 ▲ / 黄色 = / 红色 ▼ / 暂停图标)、收入与支出明细、一键为当前应用或域名创建规则——无需打开独立窗口
- 完整的 15 秒采样循环,含键盘/鼠标空闲检测;将采样聚合到分钟桶,使每日账本不受短暂焦点切换影响
- 自我使用验证:作为个人生产力工具每日使用,持续完善默认规则和边界情况处理
工作原理
核心循环每 15 秒执行一次:
- 上下文捕获 — 读取当前前台应用(bundle ID + 名称);若为受支持浏览器,触发 AppleScript 获取当前标签页 URL
- 规则引擎 — 按优先级顺序解析分类:空闲 → 域名规则 → 用户应用规则 → 内置默认值 → 中性
- 聚合 — 获胜分类在 SQLite 当前分钟桶中累积
- 账本更新 — 当日净值、收入和支出实时重新计算;菜单栏图标和标签立即刷新
截图
菜单栏弹出窗口——实时净收益、当前上下文及一键为任意应用或域名创建规则
设置界面——配置工作/娱乐费率、空闲阈值,按类别管理所有应用和域名规则
技术概览
| 语言 | Swift 6 |
| UI | SwiftUI, MenuBarExtra(macOS 13+ API) |
| 存储 | SQLite(本地,~/Library/Application Support/) |
| 分类 | 基于规则引擎:空闲 → 域名 → 应用 → 默认 → 中性 |
| 浏览器集成 | AppleScript URL 获取(7 款浏览器) |
| 采样 | 15 秒上下文轮询 → 分钟级聚合 |
| 平台 | macOS 14+ |
| 构建 | Xcode / xcodebuild,Swift Package Manager |