内容
# pi0
**一款用于 macOS 的个人智能工作台 — 记录您的活动,在设备上进行 OCR,并通过本地 MCP 服务器将其暴露给 AI 代理。**
pi0 静默地记录您如何使用 Mac — 哪个应用程序处于前台,您输入了什么,屏幕上显示什么 — 将其转换为结构化、可搜索的 _context_,并通过本地 [MCP](https://modelcontextprotocol.io) 服务器将其暴露给 AI 代理。目标是让您(和您的代理)了解并优化您如何实际花费时间和注意力。
所有内容都保留在您的机器上。截图在设备上进行 OCR,然后 **删除** — 只有提取的文本存活下来 — 整个存储库都存活在一个密码加密的 SQLite 数据库中。
> ⚠️ pi0 **仅限 macOS**,且需要 **macOS 14 (Sonoma) 或更高版本**(它使用 ScreenCaptureKit)。它需要 **输入监控** 和 **屏幕录制** 权限才能正常运行。
---
## 快速安装(预编译)
> ⚠️ 如果 pi0 已经在运行,请在替换应用程序之前 **先退出**。
在终端中复制并粘贴以下命令以获取最新的预编译应用程序:
```bash
# 下载,解压,删除任何现有的安装,并移动到 /Applications
curl -L -o pi0.zip https://releases.ruiqilei.com/pi0/pi0-darwin-arm64-latest.zip
unzip pi0.zip
rm -rf /Applications/pi0.app
mv pi0.app /Applications/
# 构建是临时签名的,因此清除隔离并在本地重新签名
sudo xattr -cr /Applications/pi0.app
sudo codesign --force --deep --sign - /Applications/pi0.app
```
然后从 `/Applications` 启动它,并在第一次运行时授予 **输入监控** 和 **屏幕录制** 权限。
> 仅限 Apple Silicon(arm64)。
## 功能
- **按键捕获** — 通过 `IOHIDManager` 记录每个应用程序输入的文本,在专用运行循环线程上。
- **定期截图** — 使用 ScreenCaptureKit 在固定间隔(默认为 8 秒)捕获每个显示屏。
- **设备 OCR** — 每个截图都通过嵌入式 PP-OCRv6 模型(仅限 CPU)运行,生成带有归一化 `[0,1]` 屏幕坐标的文本行。然后删除图像;仅保留文本。
- **加密本地存储** — 所有数据都存储在一个单独的 SQLCipher 加密 SQLite 数据库(`<dataDir>/pi0.db`)中,使用您在第一次启动时设置的密码解锁。
- **MCP 服务器** — 一个本地、基于令牌身份验证的 HTTP 服务器,允许其他 AI 代理查询您的活动,以总结您的当天,分解注意力,或重建工作上下文。
## 架构
pi0 是一个 Electron 应用程序,带有 Rust 原生插件:
```
┌─────────────────────────── Electron ───────────────────────────┐
│ │
│ 渲染器(React 19 + Arco Design) │
│ 密码门 · 权限守卫 · 设置 · 托盘面板 │
│ │ IPC(预加载) │
│ 主进程(Node / TypeScript) │
│ 设置 · 托盘图标 · MCP 服务器(可流式 HTTP) │
│ │ napi │
│ @pi0/native(Rust,napi-rs) │
│ 按键记录线程 · 截图捕获 · OCR 线程 │
│ · 加密 SQLite 存储(SQLCipher) │
└─────────────────────────────────────────────────────────────────┘
```
- **`native/`** — Rust 插件(`@pi0/native`)。负责所有繁重的、特定于平台的工作:HID 按键记录、ScreenCaptureKit 截图、OCR 管道和加密数据库。 使用 [napi-rs](https://napi.rs/) 构建。
- **`src/main/`** — Electron 主进程:设置持久性、托盘和 MCP 服务器(`src/main/mcp/`)。
- **`src/app/`、`src/renderer.tsx`、`src/panel.tsx`** — React UI:设置窗口和小型托盘浮动面板。
- **`src/shared/`** — 在主进程 ↔ 预加载 ↔ 渲染器边界之间共享的 zod 模式(用于验证 Rust 插件返回的数据)。
## MCP 服务器
MCP 服务器在 `http://127.0.0.1:<mcpPort>/mcp`(默认端口 **31415**)上运行,采用无状态的可流式 HTTP,并需要 `Authorization: Bearer <token>` 头。令牌一次性生成并存储在加密数据库中。它公开了三个工具,设计用于按顺序调用:
| 工具 | 目的 |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `apps` | 列出在时间范围内使用的应用程序,并附带活动计数。 **首先调用** 以限定分析范围。 |
| `app-guidance` | 如何读取给定应用程序的屏幕文本 — 需要关注什么,需要忽略什么(例如 Feishu/Lark → 提取最近的消息,跳过 UI 顶部导航)。 |
| `contexts` | OCR 的屏幕文本本身,分页,可选地过滤到一个应用程序。 |
设置 ▸ MCP 有 **复制令牌** 和 **为代理复制** (一个可以直接粘贴的 `mcpServers` JSON 块),以便快速连接代理。
## 隐私和安全
- 所有处理都是 **本地** 的。不会向第三方进行网络调用;截图永远不会离开设备,截图后会立即删除。
- 数据存储在 **静止时加密** (SQLCipher),使用只有您知道的密码 — **如果忘记,无法恢复**。
- MCP 服务器仅绑定到 **本地回环**,并且拒绝任何没有正确 bearer 令牌的请求。
## 要求
- macOS 14+
- [Node.js](https://nodejs.org/)(带有 npm)
- [Rust 工具链](https://rustup.rs/)(用于构建原生插件)
- 第一次原生构建会下载预构建的 MNN 静态库和 OCR 模型,因此需要网络访问。
## 入门
```bash
# 安装 JS 依赖项(这也会链接本地的 @pi0/native 包)
npm install
# 构建 Rust 原生插件
npm run build:native
# 在开发环境中运行应用程序
npm start
```
在第一次启动时,您将被要求 **创建密码**(用于加密存储库)并授予 **输入监控** 和 **屏幕录制** 权限。
### 打包
```bash
npm run make # 构建可分发的(macOS .zip via electron-forge)
npm run package # 打包应用程序而不制作安装程序
```
在 webpack 捆绑主进程之前,forge `generateAssets` 钩子会运行 `npm run build:native`,因此打包会为您构建插件。
## 脚本
| 命令 | 描述 |
| ---------------------- | -------------------------------------------- |
| `npm start` | 在开发环境中运行应用程序(electron-forge)。 |
| `npm run make` | 构建可分发的。 |
| `npm run package` | 打包应用程序。 |
| `npm run build:native` | 构建 Rust 原生插件(`native/`)。 |
| `npm run lint` | 对 `.ts` / `.tsx` 进行 ESLint 检查。 |
| `npm run format` | Prettier 写入。 |
| `npm run format:check` | Prettier 检查。 |
## 项目布局
```
native/ Rust 原生插件(@pi0/native)
src/ 按键记录 · 捕获 · OCR · 数据库 · 应用程序监视器 …
models/ 嵌入式 OCR 字符集(构建时获取的模型)
src/
index.ts Electron 主入口(窗口,托盘,捕获,停靠同步)
main/
settings.ts 设置持久性(zod 验证)
trayIcon.ts 托盘图标
mcp/ MCP 服务器,身份验证和应用程序分析指导
app/ React 视图:App,PasswordGate,PermissionGuard,
SettingsView,FloatPanel
shared/ zod 模式 + IPC 契约
preload.ts 上下文桥表面(window.pi0.*)
renderer.tsx 主窗口入口
panel.tsx 托盘浮动面板入口
arco-compat.ts Arco Design ⇄ React 19 兼容层(首先导入)
forge.config.ts electron-forge 配置(webpack,fuses,makers)
```
## 许可证
MIT © Ruiqi Lei