技术深度剖析
ActivityWatch 的架构堪称模块化、隐私优先设计的典范。该系统由多个独立组件构成,通过本地网络(通常经由 REST API)进行通信。核心组件包括:
- aw-server:中央数据存储与 API 服务器。它在本地运行(默认地址为 `localhost:5600`),并使用 SQLite 数据库存储所有时间条目。该服务器采用 Python 编写,利用 Flask 框架提供 API 端点。这种设计确保数据除非被显式导出,否则永远不会离开用户机器。
- aw-watchers:数据收集代理。主要监视器 `aw-watcher-window` 以可配置的间隔(默认每 1-2 秒)轮询活跃窗口标题和应用程序名称。它使用平台特定的 API:在 Windows 上调用 `GetForegroundWindow` 和 `GetWindowText`;在 macOS 上使用 Accessibility API;在 Linux 上则依赖 X11 或 Wayland 协议(通过 `xdotool` 或 `wlr-foreign-toplevel-management`)。每个监视器向服务器发送心跳事件,包含时间戳、应用程序名称和窗口标题。
- aw-qt:一个系统托盘应用程序,用于管理监视器和服务器,提供简单的图形界面来启动/停止追踪并查看基本统计数据。
- aw-webui:一个基于 Web 的仪表盘(由本地服务器提供),用于可视化收集到的数据。用户可以查看每日时间线、应用程序分解以及基于类别的摘要。该 UI 使用 Vue.js 构建,并通过 REST API 与服务器通信。
一项关键的技术创新是基于事件的数据模型。ActivityWatch 不存储聚合摘要,而是存储原始、细粒度的事件。每个事件包含时间戳、持续时间和数据负载(例如 `{"app": "Firefox", "title": "ActivityWatch GitHub - activitywatch/activitywatch"}`)。这允许进行灵活的事后分析。用户可以编写自定义的 Python 或 SQL 查询来获取洞察,例如特定项目所花费的时间(例如,通过过滤包含“JIRA”或“VS Code”的窗口标题)。
通过插件实现可扩展性:监视器系统基于插件。官方仓库包含适用于 Windows、macOS 和 Linux 的监视器,但社区已构建了针对特定 IDE(例如 `aw-watcher-jetbrains`)、Web 浏览器(例如追踪活跃标签页的 `aw-watcher-web`)甚至硬件设备的监视器。插件架构非常直接:任何能够向本地服务器发送 HTTP POST 请求的程序都可以充当监视器。这催生了一个丰富的第三方集成生态系统。
性能与资源占用:由于完全在本地运行,ActivityWatch 极其轻量。服务器和监视器合计通常消耗不到 50 MB 的 RAM,CPU 占用率极低(在现代硬件上低于 1%)。一个月的连续追踪数据,其 SQLite 数据库通常小于 10 MB。这与需要持续网络 I/O 且通常运行更繁重后台进程的云端追踪器形成鲜明对比。
| 指标 | ActivityWatch | RescueTime | Toggl Track |
|---|---|---|---|
| 数据存储 | 本地 SQLite | 云端服务器 | 云端服务器 |
| RAM 占用(空闲) | ~40 MB | ~120 MB | ~80 MB |
| 是否需要互联网 | 否 | 是 | 是 |
| 开源许可证 | GPL-3.0 | 专有软件 | 专有软件 |
| 插件/API 可扩展性 | 完整 REST API + Python | 有限 API | 完整 API(付费) |
| 数据导出 | 完整 SQLite + JSON | CSV(有限) | CSV(有限) |
数据要点: ActivityWatch 在隐私和资源效率方面显著优于商业替代品。其纯本地架构消除了数据泄露风险,并降低了系统开销,使其成为优先考虑控制权和性能的用户理想之选。
关键人物与案例研究
ActivityWatch 是一个社区驱动的项目,但其增长得益于几位关键人物和组织的催化。主要维护者是 Johan Bjäreholt(GitHub: `johan-bjareholt`),一位瑞典开发者,他于 2016 年启动该项目,作为替代 RescueTime 的个人工具。他打造一个完全开放、尊重隐私的追踪器的愿景引起了开发者社区的共鸣,吸引了 GitHub 上超过 100 名贡献者。
案例研究:自由职业开发者计费
一个值得注意的用例来自独立软件开发者,他们使用 ActivityWatch 自动记录可计费工时。例如,开发者可以配置一个监视器来追踪在 `Visual Studio Code` 和 `Terminal` 中花费的时间,然后使用自定义 Python 脚本按项目名称(例如“client-x-app”)过滤事件并生成发票。这消除了手动记录时间的摩擦,这是许多自由职业者的痛点。开发者完全掌控数据,确保没有机密客户信息被发送到第三方服务器。
案例研究:数字习惯的学术研究
哥本哈根大学的研究人员已使用 ActivityWatch 来研究数字工作模式。由于该