Free · Open source · macOS

免费 · 源码公开 · macOS

Do you make it to the reset?

到不到得了重置?

Every other quota bar reports how much is gone. A number that large tells you nothing you can act on: 88 % with six days to run is fine, and 88 % with two hours to run is not. So this one spends its biggest number on the only question worth asking — at this pace, do you reach the reset — and it answers with a bound, not a guess.

别的额度条都在报告用掉了多少。可那个数字本身没法据以行动 —— 还剩六天的 88% 没事,还剩两小时的 88% 就是另一回事。所以这一个把最大的字号 留给唯一要紧的问题:按这个节奏,到不到得了重置 —— 而且给的是界,不是猜测。

Version 1.5.0 · 1.7 MB · signed and notarised by Apple, so it opens with no security warning. Requires macOS 13 or later on an Apple Silicon Mac. English and 简体中文, switchable in settings. Or brew install --cask kenshinice-ai/tap/pwe-ai-bar.

1.5.0 版 · 1.7 MB · 已由 Apple 签名公证,打开不会有安全提示。 需要 macOS 13 或更新版本,Apple Silicon 机型。或者 brew install --cask kenshinice-ai/tap/pwe-ai-bar

The PWE AI Bar panel: a source picker, then a countdown bar under one large number answering whether the quota lasts to the reset, then per-provider rows for Claude Code and Codex.

Seven verdicts, and it says which one

七种判决,而且它把话说出来

The large number is the answer, and the sentence beside it is the verdict. Three of the seven, drawn by the app's own renderer:

大数字是答案,旁边那句话是判决。七种里的三种,由 app 自己的渲染器绘制:

Three endurance states stacked: 2 hours to reset with at least 69% left over; 1 hour 15 minutes of runway against a reset 3 hours away, marked too close to call; and 1 hour 15 minutes of runway against a reset 1 hour 15 minutes away, marked as 40 minutes short.

Makes it — two hours to the reset and at least 69 % still in hand when it arrives. Too close to call — the interval straddles the reset, so it says so instead of picking a side. Falls short — 35 minutes of runway against a reset an hour and a quarter away, and the gap is named. The needle is where the quota runs out; the red line is the reset.

到得了 —— 距重置两小时,到点至少还剩 69%。 临界 —— 区间跨过了重置那一刻,于是它就说「说不准」,而不是替你挑一边。 到不了 —— 还能跑 35 分,重置在 1 小时 15 分之后,缺口直接写出来。 针是额度见底的位置,红线是重置。

The rate is an interval, not a number

速率是区间,不是数字

Every reading these services hand back is a whole number, and long plateaus are normal. The error is not Gaussian noise to be smoothed away — it is quantisation. So there is no regression here, no EWMA and no Kalman filter: they would all be averaging an ε that does not exist. Two bounds instead, over a span of S hours:

这些服务给回来的每一条读数都是整数,长时间的平台期是常态。误差不是可以被抹平的 高斯噪声,是量化。所以这里没有回归、没有 EWMA、也没有卡尔曼 —— 它们都在平均一个不存在的 ε。 取而代之的是两条界,跨度 S 小时:

rate.low  = max(0, Δp − 1) / S
rate.high = (Δp + 1) / S

One expression, three properties worth having. A plateau yields only an upper bound, which gives a lower bound on endurance — so the app can say "at least this long" and mean it. A single-step jump has a lower bound of zero, so one step can never announce that you are going to run out. And a burst decays on its own as S grows. The width of the interval is where the uncertainty goes; there is no confidence knob, because there does not need to be one.

一个式子,三个想要的性质。平台期只给上界,于是有续航的界 —— app 可以说「至少还能跑这么久」,并且这句话是真的。单级跳的下界必为零, 于是一步永远不能宣布你会用尽。爆发随 S 增长自行衰减。 不确定性的出口就是区间的宽度,不需要另设一个置信度参数,因为根本不需要。

What it reads

它读什么

Claude Code, from the real endpoint

Claude Code,读真实接口

The five-hour and weekly windows as actual percentages from /api/oauth/usage, plus the current session's context. Thresholds come from the server's own severity, not a number we invented.

五小时与周窗口的真实百分比,来自 /api/oauth/usage, 外加当前会话的上下文占用。阈值用服务端自己的 severity,不是我们瞎定的数字。

Codex, with no credentials at all

Codex,零凭据

Read from its own app server. Nothing is asked of you and nothing is stored.

读它自己的 app server。不问你要任何东西,也不存任何东西。

Six more, read-only

另外六家,只读

Cursor, Copilot, Devin, Grok and Antigravity, each gated on the app actually being installed and each with a timeout. See before you install — none of them has been verified against a real account.

Cursor、Copilot、Devin、Grok、Antigravity,每一家都以「装没装」为前提, 每一家都有超时。见装之前先看 —— 它们都没在真实账户上验证过。

What it cost, at list price

按目录价折算花了多少

A trophy page converts the work you actually did into what the same tokens would have cost at the published API rates, with the price table's source and date shipped alongside it.

战绩页把你实际做的事,按官方公布的 API 单价折算成等效成本 —— 价格表连同它的来源和核对日期一起打包在应用里。

It comes and finds you

它会来找你

The dashboard is the part a dozen other tools already do. This is the part that is actually worth installing something for: three hooks, merged into your existing Claude Code settings rather than written over them, with the original backed up byte for byte first.

看板那部分市面上已经有十几个实现。真正值得为之装一个东西的是这部分: 三个钩子,以合并方式写进你已有的 Claude Code 配置而不是覆盖它, 并且动手之前先逐字节备份原文件。

The menu bar readout at its real size: the wing mark, then 42% / 13% for Claude with a countdown to its reset, and Codex marked as exhausted.

The menu bar at the size it really is — the wing, both Claude windows, Codex's state and the countdown to the next reset. The panel spells everything out; the menu bar is the one place where space is scarce enough to earn a silhouette. It never animates.

菜单栏,就是它真实的大小 —— 翼、Claude 的两个窗口、Codex 的状态, 以及到下一次重置的倒计时。面板里不用缩写;菜单栏是唯一一处空间紧张到值得用剪影的地方。 它不做动画。

It does not ask for your password

它不会问你要密码

If you are logged into Claude Code, the app reuses that login. You never re-enter an account, and this app never sees a password.

It does not need your permission either. macOS checks keychain access per record and per program, and Claude Code creates its login record with the security tool, so the record admits that tool. This app reads the record through the same tool, with the same command Claude Code uses — so nothing asks, and signing in to Claude Code again changes nothing.

It only reads. It never renews the login and never writes to the record. Up to 1.4.0 it did both: it asked once for keychain access and again after every sign-in, and on one machine a renewal it could not write back logged the command-line tool out. When the login has expired now, the panel says so and offers Open Claude Code; using Claude Code once renews it, and the numbers come back on their own.

Nothing here asks you to open a terminal. Signing in is a button that opens one and does it for you; a Mac without Claude Code on it gets a button to the download page rather than a command that answers command not found. Until 1.1.5 every dead end ended in something to type.

Until 1.0.9 this page said no dialog ever appeared, on the grounds that the app read the record through /usr/bin/security. It raised a prompt on every poll instead — and at the time the app was also writing that record itself. 1.0.10 to 1.4.0 stopped using the tool and asked you for keychain access; 1.5.0 stopped writing, and went back to it.

已经登录 Claude Code 的话,应用直接复用那个登录。不用重新输账号, 本应用也从不接触你的密码。

也不需要你授权。macOS 的钥匙串授权是按「条目 × 程序」给的,而 Claude Code 用 security 工具创建自己的登录记录,所以这条记录认这个工具。本应用通过同一个工具、 用 Claude Code 自己用的那条命令去读 —— 于是什么都不会问,重新登录 Claude Code 之后也一样。

它只读。从不续期这个登录,也从不写这条记录。1.4.0 及更早的版本两件都做: 要你授权一次钥匙串、每次重新登录后再授权一次,而且在一台机器上,一次写不回去的续期把命令行工具登出了。 现在登录过期时,面板会说明原因,并给一个 打开 Claude Code 按钮;用 Claude Code 一下, 登录就会续期,额度随后自动恢复。

这里不会让你去开终端。登录是一个按钮 —— 它替你打开终端并跑完; 没装 Claude Code 的 Mac 得到的是一个通往下载页的按钮,而不是一条会回你 command not found 的命令。1.1.5 之前,每一个死胡同的尽头都是一句要你敲的东西。

1.0.9 之前,这个页面写的是「永远不弹框」,理由是应用通过 /usr/bin/security 读记录。结果它每轮轮询都弹框 —— 而那时应用自己也在写这条记录。 1.0.10 到 1.4.0 不再用这个工具,改为请你授权钥匙串;1.5.0 不再写,又回到了它。

The token goes to api.anthropic.com and nowhere else. There is no telemetry, no crash reporting and no account of any kind.

令牌只发往 api.anthropic.com,不去别处。没有统计、没有崩溃上报, 也不需要任何账号。

Before you install

装之前先看

Four things that are true of version 1.5.0 and are better said here than discovered later.

1.5.0 版的四件事,写在这里比让你自己发现要好。

Free, and the source is public

免费,而且源码公开

No licence, no account, no paid tier. Around 10,200 lines of Swift with no third-party dependencies, 185 tests, and a handover document that explains why the awkward parts are the way they are.

不要授权、不要账号、没有付费档。约 10,200 行 Swift,零第三方依赖,185 个测试, 外加一份把「为什么这里写得这么别扭」讲清楚的交接说明。

Download for macOS 下载 macOS 版 GitHub