最近把一个自己做了一段时间的桌面端工具 TimeLens 整理上线了,想从工程实现角度做一次复盘。
项目地址: github.com/gitxuzhefen…
Release 下载: github.com/gitxuzhefen…
TimeLens 是一个本地优先的 AI 时间感知工具。它运行在 macOS 和 Windows 上,后台自动记录你在每个应用和窗口上花了多少时间,配合智能截图、OCR 和 AI 分析,把碎片化的桌面行为整理成时间线、日报和周报。
一句话说:我不想再手动打卡,也不想把自己的屏幕和时间数据传到云端,所以做了这个工具。
为什么做这个
我试过一些时间管理工具,但一直有几个不满意的点:
- 很多工具需要手动开始和结束,长期用下来成本很高。
- 云端时间追踪工具对隐私不够友好,尤其是窗口标题和截图这类数据。
- 单纯统计应用时长不够,真正有价值的是复盘“今天发生了什么”。
- 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…
想听反馈
这次发布主要想收集几类反馈:
- macOS / Windows 安装流程有没有阻塞。
- README 是否能让人快速理解项目价值。
- 时间线和日报是否真的对复盘有帮助。
- 工作链路图这个方向是否有意义。
- 如果你对本地优先桌面应用感兴趣,也欢迎看代码或提 Issue。
如果这个项目对你有用,也欢迎点个 star。最近的目标是 5 月底前冲到 100 stars,用这个目标倒逼我把发布、文档、反馈和迭代流程都跑起来。