从 0 到可用:一个 Tauri 桌面时间追踪工具的工程实践

66 阅读6分钟

最近把一个自己做了一段时间的桌面端工具 TimeLens 整理上线了,想从工程实现角度做一次复盘。

项目地址: github.com/gitxuzhefen…

Release 下载: github.com/gitxuzhefen…

TimeLens 是一个本地优先的 AI 时间感知工具。它运行在 macOS 和 Windows 上,后台自动记录你在每个应用和窗口上花了多少时间,配合智能截图、OCR 和 AI 分析,把碎片化的桌面行为整理成时间线、日报和周报。

一句话说:我不想再手动打卡,也不想把自己的屏幕和时间数据传到云端,所以做了这个工具。

ezgif.com-animated-gif-maker_Chinese.gif

为什么做这个

我试过一些时间管理工具,但一直有几个不满意的点:

  1. 很多工具需要手动开始和结束,长期用下来成本很高。
  2. 云端时间追踪工具对隐私不够友好,尤其是窗口标题和截图这类数据。
  3. 单纯统计应用时长不够,真正有价值的是复盘“今天发生了什么”。
  4. macOS 和 Windows 都要能用,不能只服务一个系统。

所以 TimeLens 的产品约束一开始就很明确:

  • 被动采集,不要求用户手动打点。
  • 本地优先,数据默认不离开设备。
  • 能解释上下文,不只是做应用时长排行榜。
  • 跨平台,至少覆盖 macOS 和 Windows。

技术栈

项目目前的核心技术栈:

  • 前端:React 18、TypeScript、Vite、Tailwind CSS、Zustand
  • 桌面端:Tauri 2
  • 后端:Rust、Tokio
  • 存储:SQLite
  • 平台能力:macOS Objective-C 桥接、Windows Win32 API
  • AI:BYOK 模式,用户使用自己的 API Key

选择 Tauri 的原因很直接:我希望应用足够轻,不想为了一个常驻后台的时间工具引入太重的运行时。Rust 负责本地采集、存储和聚合,React 负责可视化和交互。

核心架构

整体数据流大概是这样:

系统前台窗口变化
  -> 平台采集层
  -> 事件采集与截图管线
  -> SQLite 本地存储
  -> 会话聚合与统计分析
  -> Tauri command
  -> React 页面展示

这个结构里比较关键的是边界划分:

  • 采集层只关心“当前系统发生了什么”。
  • 存储层只关心“如何可靠写入和查询本地数据”。
  • 聚合层负责把碎片事件变成可理解的会话。
  • 前端负责时间线、日报、周报和工作链路图的呈现。

被动采集

TimeLens 会在后台检测前台窗口变化,记录应用名、窗口标题、开始时间和结束时间。这个过程不需要用户点击开始或结束。

macOS 和 Windows 的差异主要在采集层:

  • macOS 需要通过系统 API 获取前台应用和窗口信息。
  • Windows 侧需要走 Win32 API。
  • 上层统一成同一套事件模型,避免业务层到处写平台判断。

这样做的好处是,后续时间线、日报、统计分析都可以只面向统一模型,不关心具体系统。

智能截图与 OCR

单纯记录窗口标题有时候不够。比如你在浏览器里读文档、查资料、看报错,窗口标题只能还原一部分上下文。

所以 TimeLens 会在窗口切换等关键时刻做截图,并进行去重和压缩,避免磁盘占用失控。后续再对截图做 OCR,这样用户可以搜索历史屏幕内容。

一个典型场景是:你记得上午看过某个报错或某段文档,但忘了在哪个网页。用 OCR 搜索就能把相关截图找回来。

本地 SQLite

所有时间事件、会话、截图索引和分析结果都存在本地 SQLite。

这也是项目最重要的产品承诺之一:默认没有服务器,没有账号,没有云端同步。用户的窗口标题、截图、OCR 结果和时间数据都留在自己的设备上。

AI 分析也是 BYOK 模式。用户自己配置 API Key,工具基于本地数据生成日报或周报。

从事件到时间线

原始事件通常非常碎。比如写代码时,VS Code、Chrome、Terminal、文档、聊天工具会频繁切换。

如果直接把这些事件按时间列出来,用户看到的是流水账。TimeLens 会把相邻、相关、持续时间合理的事件聚合成会话,让用户看到更接近真实工作片段的时间线。

时间线不是为了展示“每一分钟发生了什么”,而是帮助用户回答:

  • 今天主要时间花在哪些工作上?
  • 哪些时段比较连续?
  • 哪些应用切换频繁?
  • 某个工作上下文能不能被找回来?

AI 日报和周报

有了本地事件、会话和统计数据后,AI 分析就不是凭空聊天,而是基于结构化上下文生成总结。

日报会关注当天的活跃时长、应用分布、主要工作片段、切换情况和复盘建议。周报则更适合看趋势,比如 7x24 热力图、专注时段、工作节奏变化。

我比较在意的一点是:AI 在这里不是替代数据,而是把数据翻译成人能读懂的复盘。

工作链路图

这是最近比较有意思的一个功能。

当系统检测到用户短时间内频繁切换应用时,它不只是提示“你切换太频繁了”,而是尝试把这些应用分成几类:

  • 主线:当前真正承担工作流的核心应用
  • 支撑:辅助主线工作的应用,比如终端、文档
  • 中断:打断工作流的应用,比如聊天或通知

然后用泳道图展示出来。这样用户看到的不是一堆切换记录,而是“我的工作被什么打断了”。

当前状态

项目现在已经支持:

  • macOS 和 Windows
  • 中文和英文 README
  • 中文和英文界面素材
  • 时间线、日报、周报
  • OCR 搜索
  • AI 分析
  • 数据导出
  • 工作链路图
  • 主题切换

GitHub: github.com/gitxuzhefen…

下载: github.com/gitxuzhefen…

想听反馈

这次发布主要想收集几类反馈:

  1. macOS / Windows 安装流程有没有阻塞。
  2. README 是否能让人快速理解项目价值。
  3. 时间线和日报是否真的对复盘有帮助。
  4. 工作链路图这个方向是否有意义。
  5. 如果你对本地优先桌面应用感兴趣,也欢迎看代码或提 Issue。

如果这个项目对你有用,也欢迎点个 star。最近的目标是 5 月底前冲到 100 stars,用这个目标倒逼我把发布、文档、反馈和迭代流程都跑起来。