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 秒执行一次:

  1. 上下文捕获 — 读取当前前台应用(bundle ID + 名称);若为受支持浏览器,触发 AppleScript 获取当前标签页 URL
  2. 规则引擎 — 按优先级顺序解析分类:空闲 → 域名规则 → 用户应用规则 → 内置默认值 → 中性
  3. 聚合 — 获胜分类在 SQLite 当前分钟桶中累积
  4. 账本更新 — 当日净值、收入和支出实时重新计算;菜单栏图标和标签立即刷新

截图

菜单栏弹出窗口——实时净收益、当前上下文及一键为任意应用或域名创建规则
设置界面——配置工作/娱乐费率、空闲阈值,按类别管理所有应用和域名规则

技术概览

   
语言 Swift 6
UI SwiftUI, MenuBarExtra(macOS 13+ API)
存储 SQLite(本地,~/Library/Application Support/
分类 基于规则引擎:空闲 → 域名 → 应用 → 默认 → 中性
浏览器集成 AppleScript URL 获取(7 款浏览器)
采样 15 秒上下文轮询 → 分钟级聚合
平台 macOS 14+
构建 Xcode / xcodebuild,Swift Package Manager