CodexNotify 是一个面向 Windows、macOS 和 Linux 的轻量通知助手。它监听 Codex 的 Stop、PermissionRequest,并通过 PreToolUse 捕获 request_user_input,在任务结束、等待输入或请求权限时发送 Bark 通知。
- 桌面端使用 Tauri 2 + React + TypeScript,提供设置、历史、诊断和 Hook 管理界面。
- Hook、网络请求、AES 加密、SQLite 队列和敏感信息脱敏均由 Rust 完成。
- Linux 无桌面环境提供独立静态 CLI,不依赖 GTK、WebKitGTK、GIO 或显示服务器。
- 桌面程序关闭后,独立 Hook 仍能继续入队并尝试发送通知。
- Bark Key 与 AES 密钥不会写入 JSON、SQLite 或日志。
每个版本只创建一个 GitHub Release 页面,并在同一页面提供四个正式产物:
| 使用环境 | 下载文件 | 架构 | 使用方式 |
|---|---|---|---|
| Windows 10/11 | CodexNotify-Windows-x64.exe |
x86_64 | 免安装,双击运行 |
| macOS | CodexNotify-macOS-Universal.dmg |
Intel + Apple Silicon | 打开 DMG,将应用拖入 Applications |
| Linux 桌面 | CodexNotify-Linux-Desktop-x86_64.AppImage |
x86_64 | 添加执行权限后直接运行 |
| Linux 服务器/CLI | codex-notify-Linux-CLI-x86_64 |
x86_64 | 单文件静态 CLI、Hook 与重试守护程序 |
前往 Releases 下载最新版。
Windows 与 macOS 版本目前没有商业代码签名。系统首次启动时可能要求额外确认;请只从本仓库 Release 页面下载。
Windows 直接运行下载的 .exe。macOS 打开 .dmg 后将 CodexNotify 拖入 Applications。Linux Desktop 执行:
chmod +x CodexNotify-Linux-Desktop-x86_64.AppImage
./CodexNotify-Linux-Desktop-x86_64.AppImageLinux 桌面版需要可用的 WebKitGTK 桌面环境;没有桌面的服务器请使用 Linux CLI 版本。
Windows 请先把 EXE 保存到 Downloads、Apps 等稳定目录,再双击运行;不要从 Edge 的下载浮窗直接“打开”。浏览器的 MicrosoftEdgeDownloads 临时目录不能用于便携数据,应用会拒绝这种位置。
首次启动会先要求选择非密钥数据的保存位置:
| 模式 | 说明 |
|---|---|
| 系统默认 | 推荐。使用当前系统的标准用户级配置、数据和日志目录 |
| 与程序同目录 | 在可执行文件旁创建 CodexNotifyData/config、data、logs,适合便携使用 |
| 自定义文件夹 | 将全部设置、历史、队列、日志和 Hook 程序保存到指定目录 |
选择自定义或便携位置时,系统配置目录会保留一个很小的 storage.json 位置索引,供独立 Hook 在桌面程序退出后找到数据。该文件不包含 Bark Key、AES 密钥或通知正文。
重新下载应用时,只有索引指向的 settings.json 仍然存在且有效才会自动复用。旧目录已被删除或设置不完整时,应用不会重建旧目录,而是重新显示位置选择页;操作系统凭据库中的密钥仍会保留。
在首次设置向导中确认自动识别的来源设备名,填写 Bark 服务器与 Device Key,然后发送测试通知。标题固定为“设备名 · 项目名”,Hook 直接提供会话名时才显示副标题。除声音、分组、级别、图标、图片和跳转 URL 外,还支持 Markdown、音量、角标、重复铃声、复制、历史保留、点击动作、稳定 ID、远端更新/删除,以及 AES-128/256-CBC 加密。
桌面版密钥保存在操作系统凭据库中:
- Windows:Credential Manager
- macOS:Keychain
- Linux Desktop:Secret Service,例如 GNOME Keyring 或 KWallet
Linux 没有可用 Secret Service 时,应用会明确提示凭据库不可用,不会降级为明文保存。
- 打开 CodexNotify 的“系统”页面。
- 点击“安装 / 修复”。
- 回到 Codex,输入
/hooks。 - 分别选择
PreToolUse、PermissionRequest和Stop,按T完成信任。 - 回到 CodexNotify,点击“检查信任”。
CodexNotify 不会代替用户写入信任状态。Hook 配置发生变化后,Codex 可能要求重新审核。
Windows Hook 使用 PowerShell 调用语法生成 commandWindows,可正确处理包含空格的路径。旧版本写入的 \\?\ 自定义路径会在读取时自动简化;点击一次“安装 / 修复”即可更新 Hook 命令。
“系统 → 应用卸载 → 彻底卸载”会移除 CodexNotify 自己的 Hook、Bark/AES 系统凭据、自启动项、设置、SQLite 历史与队列、日志、独立 Hook 和当前应用文件。第三方 Hook 会保留,~/.codex 中也会留下卸载前的 hooks.json 安全备份。
CLI 产物是完全静态的 x86_64 Linux 可执行文件,不要求桌面组件。安装只需要一个环境变量:CODEX_NOTIFY_BARK_KEY。
mkdir -p ~/.local/bin
curl -fL https://github.com/Xiiiing/CodexNotify/releases/latest/download/codex-notify-Linux-CLI-x86_64 \
-o ~/.local/bin/codex-notify
chmod +x ~/.local/bin/codex-notify
export CODEX_NOTIFY_BARK_KEY='你的 Bark Device Key'
export PATH="$HOME/.local/bin:$PATH"
codex-notify init
codex-notify test
codex-notify hook install
codex-notify hook status然后在 Codex 中输入 /hooks,信任 PreToolUse、PermissionRequest 和 Stop。每次从同一终端启动 Codex 即可;为了永久生效,将上面两个 export 加入 ~/.bashrc 或 ~/.zshrc。无需配置数据路径,也无需常驻 daemon;后续 Hook 事件会顺带处理失败重试。
AES 加密、自定义数据目录和常驻重试服务均为可选高级能力,普通 Linux CLI 部署不需要它们。
常用命令:
codex-notify status
codex-notify config show
codex-notify config set bark-server https://api.day.app
codex-notify events list 20
codex-notify events retry all
codex-notify events clear
codex-notify daemon
codex-notify daemon --once
codex-notify hook uninstalldaemon 会持续处理到期重试队列,适合交给 systemd、Supervisor 或其他进程管理器;daemon --once 只处理当前到期任务并退出。即使不运行 daemon,后续 Hook 触发时也会顺带发送少量到期事件。
| 内容 | 保存位置 |
|---|---|
| 普通设置 | config/settings.json |
| 通知历史、去重与重试队列 | data/events.sqlite3 |
| 独立 Hook 与健康状态 | data 目录 |
| 运行日志 | logs 目录 |
| Bark Device Key | 系统凭据库;CLI 也可从环境变量读取 |
| Bark AES 密钥 | 系统凭据库;CLI 也可从环境变量读取 |
可在“系统 → 数据保存位置 → 更换位置”中迁移数据。迁移流程会:
- 复制并校验设置、SQLite 历史与队列、日志和 Hook;
- 验证成功后切换共享位置索引;
- 自动修复已安装 Hook 的绝对路径;
- 删除原位置中的
config、data和logs内容; - 重启应用。
目标目录必须为空。凭据库中的密钥不属于这些目录,因此不会被迁移或删除。Hook 路径改变后可能需要在 Codex 中重新信任。
高级用户可使用 CODEX_NOTIFY_DATA_DIR 强制指定全部非密钥数据的根目录。该环境变量优先级最高,启用期间不能通过桌面界面更换位置。
Codex
└─ JSON/stdin → 独立 Rust Hook
├─ 事件分类、过滤与脱敏
├─ SQLite 去重、可靠队列与重试
├─ 系统凭据库 / 环境变量
└─ Bark HTTP(S) + 可选 AES
桌面程序
└─ React 界面 → Tauri Rust 后端
├─ 托盘、单实例与自启动
├─ Hook 安装、修复、卸载与诊断
└─ 后台到期队列处理
Hook 始终以成功协议响应 Codex;通知失败只会写入日志和可靠队列,不会阻断 Codex。PermissionRequest 仅发送通知,不会自动允许或拒绝操作。
- 自动识别且可编辑的设备名,以及固定的“设备名 · 项目名”通知标题
Stop、普通输入请求和权限审批提醒,可选 Hook 会话名副标题- Bark Markdown、图片、音量、角标、铃声、复制、历史、点击动作、远端更新与删除
- AES-128/256-CBC 加密推送
- 全部项目、包含规则、排除规则和项目别名
- 中文/英文界面、系统主题、浅色和深色主题
- 安静时段、正文裁剪与敏感信息脱敏
- SQLite 唯一去重、离线队列、指数退避、失败重试和历史清理
- Hook 安装、修复、卸载、信任检查与环境诊断
- 托盘驻留、单实例、登录自启动和低频后台工作
需要当前稳定版 Rust、Node.js 22+、npm,以及对应平台的 Tauri 2 系统依赖。Ubuntu/Debian 桌面构建依赖:
sudo apt-get install libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf pkg-config运行桌面开发版:
cd apps/desktop
npm ci
npm run tauri:dev运行测试:
cargo fmt --all -- --check
cargo test -p codex-notify-core -p codex-notify-hook -p codex-notify-cli
cd apps/desktop
npm test
npm run build仓库是一个 Cargo Workspace:
crates/codex-notify-core:共享设置、事件、Bark、加密、SQLite、凭据库和 Hook 配置逻辑apps/hook:桌面版嵌入的独立 Hookapps/cli:Linux 无桌面 CLI、Hook 与 daemonapps/desktop/src-tauri:Tauri 后端apps/desktop/src:React + TypeScript 前端
推送 v* 标签后,GitHub Actions 会在一个 Release 中生成并核对四个平台产物。Windows 与 macOS 正式代码签名、安装包和自动更新暂未提供。
本项目采用 MIT License。