macOS menu bar app,实时监控 Claude Code 和 OpenAI Codex 的用量配额。
自用工具,所有凭证仅存储在本地 Keychain,零第三方依赖。
通过 claude.ai Web API 获取用量数据,不使用 OAuth /api/oauth/usage 端点(该端点有未文档化的激进限流,30-60s 轮询会触发持续 30+ 分钟的 429)。
GET https://claude.ai/api/organizations/{org_id}/usage
Cookie: sessionKey={session_key}
返回 5 小时会话 / 7 天周限 / Sonnet / Opus 各维度的 utilization(0-100%)和重置时间。
认证方式: 使用浏览器登录 claude.ai 后的 sessionKey cookie(约一个月过期)。支持从浏览器自动导入或手动粘贴。
轮询间隔: 默认 3 分钟,可在设置中调整(1/3/5/15 min)。
读取本地 ~/.codex/sessions/YYYY/MM/DD/*.jsonl 文件,解析最后一条包含 rate_limits 的 JSON 行,提取 used_percent 和 resets_at(Unix 时间戳)。
当前 Codex CLI 会同时写入整体 Codex 限额和模型级限额。barbar 会优先选择 limit_id = "codex" 的整体限额,避免把某个模型的额度误当成总用量;如果只找到模型级限额,则退回显示最新可用记录。解析兼容当前顶层 rate_limits 和旧版 payload.rate_limits 两种结构。
零配置——只要用过 Codex 就有数据。通过文件系统事件监听(DispatchSource)自动更新,不轮询。
读取策略:从文件尾部分块向前回溯(64KB/chunk),避免全量加载大文件。
账号信息来自 ~/.codex/auth.json 和 ~/.codex/version.json。界面只显示登录方式、脱敏后的 account id、认证刷新时间和 CLI 版本检查结果,不展示 access token、refresh token、id token 或 API key。
# 开发
swift build && swift run UsagePulse
# 打包成 .app
bash scripts/build-app.sh
open build/barbar.app打包脚本会从项目根目录的 image.png 自动生成 AppIcon.icns,写入 build/barbar.app/Contents/Resources/,并在 Info.plist 中配置 app 图标。
要求:macOS 15+,Swift 6 / Xcode 16+
方式一:Safari 自动导入(推荐)
- 打开系统设置 → 隐私与安全性 → 完全磁盘访问权限
- 点
+,添加barbar.app(如果通过swift run运行则添加终端 app) - 重新启动 barbar
- 点击 menu bar 图标 → ⚙️ → Import → Safari
为什么需要完全磁盘访问权限?
Safari 的 cookie 存储在
~/Library/Cookies/Cookies.binarycookies,这个文件受 macOS TCC(Transparency, Consent, and Control)保护。普通 app 无法读取,必须授予完全磁盘访问权限。barbar 只读取 claude.ai 相关的 cookie(sessionKey和lastActiveOrg),不会访问其他站点的 cookie。读取后 cookie 值存储在 app 自己的 Keychain 条目中(
com.yy.barbar),原始 cookie 数据不会保留在内存中。
方式二:Chromium 浏览器自动导入
支持 Chrome / Arc / Brave / Edge。点击 Import → 选择浏览器即可。
原理:复制浏览器 Cookies SQLite 数据库到临时目录(权限 0600)→ 从 macOS Keychain 读取浏览器加密密钥 → AES 解密 → 提取目标 cookie → 删除临时文件。
方式三:手动粘贴
- 用浏览器打开 claude.ai → 开发者工具 → Application → Cookies
- 复制
sessionKey(以sk-ant-sid01-开头)和lastActiveOrg(UUID) - 粘贴到 barbar 设置页的手动输入框
无需配置。barbar 自动检测 ~/.codex/sessions/ 目录。如果没用过 Codex,会显示"Codex not detected"。
Menu bar 图标: 两条竖状像素条,左 = Claude 5h 会话用量,右 = Codex 5h 会话用量。颜色:绿色 < 70%,橙色 70-90%,红色 > 90%,灰色 = 无数据。
弹出面板:
- 每个 provider 一张卡片,显示各维度的进度条
- 每条进度条标注重置的绝对时间和剩余时间(如
Resets at 03/24 15:30 (2h 34m)) - Claude 显示脱敏后的组织 ID,Codex 显示登录方式和脱敏后的 account id
- 每个 provider 单独显示更新时间;Footer 显示最近一次检查时间和下次刷新倒计时
- ⚙️ 打开设置,↻ 手动刷新
通知: 任意维度超过 80% 时推送一次通知(每个窗口期不重复)。
- 凭证仅存储在 macOS Keychain,设置
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly - Keychain 写入采用 update-first 策略,无 delete-add 窗口期;旧条目自动迁移访问策略
- API 请求使用
URLSession.ephemeral,不写入磁盘缓存 - Chromium 临时 DB 目录权限 0700,文件权限 0600,同时复制 WAL/SHM 保证一致性
- Safari cookie 解析后立即释放原始数据引用
- 错误信息脱敏,不向 UI 暴露内部数据库路径等细节
- Codex 账号信息只读取低风险元数据;token 字段不会进入 UI
- Claude 手动刷新带并发保护和短间隔保护,避免连续点击造成重复请求
- Settings 页面关闭时自动清空手动输入缓存
- 构建脚本设置
umask 077,生成的 app 和 icon 中间产物默认只有当前用户可读写
Sources/
├── App/ # @main, MenuBarExtra, AppDelegate
├── Models/ # Claude API + Codex JSONL 数据模型
├── Services/ # ClaudeService, CodexService, KeychainHelper,
│ # ChromeCookieImporter, SafariCookieImporter
├── ViewModels/ # UsageViewModel(@Observable,合并两个 provider)
└── Views/ # MenuBarView, ProviderCardView, UsageBarView, SettingsView
Personal use. No warranty.