Claude Code と Codex の残り使用量をメニューバーに常駐表示する Mac アプリを自作した

Claude Code と Codex の残り使用量をメニューバーに常駐表示する Mac アプリを自作した

Claude Code と Codex には、どちらも「5時間ごとの枠」と「1週間の枠」の使用量の制限があります。使い切ると、リセットまで待つことになります。

これまでは、Chrome で Claude と Codex の使用量のページを2つのタブで開きっぱなしにして、残りを逐一気にしていました。ただ、ウィンドウをたくさん開いていると、使用量のタブがあるウィンドウがどこにあるのか探すことがありました。常に見えるところに置いておきたいと思っていたので、メニューバーに出す Mac アプリを Claude Code と一緒に作りました。

この記事でわかること

  • Claude Code と Codex の使用量を、メニューバー・ポップオーバー・デスクトップのウィジェットに出す構成
  • ウィジェットに値を渡す仕組みと、モノクロの表示でも危険度がわかる工夫
  • あとから足した通知・スリープ防止・CPU とメモリの表示と、しばらく使ってから直したこと
目次

完成したもの

メニューバーには、次のものが並びます。

  • C(Claude Code)と X(Codex)の二重のリング。外側が週間の枠、内側が5時間の枠
  • その右に CPU とメモリの使用率(上に CPU、下に MEM の2行)
  • 左端のカップは、スリープ防止を使っているときだけ出ます
メニューバーに並んだアプリの表示。左からスリープ防止のカップのアイコン、C と X の緑の二重リング、CPU 26% と MEM 78% の2行の数字
メニューバーに並んだアプリの表示。左からスリープ防止のカップのアイコン、C と X の緑の二重リング、CPU 26% と MEM 78% の2行の数字

クリックすると、2×2 のリング(行が Claude Code と Codex、列が5時間と週間)と、リセットまでの残り時間が出ます。下のほうで、表示する項目の ON/OFF、通知、スリープ防止、「使用率」と「残量」のどちらで出すかを切り替えられます。

アプリのポップオーバー。Claude Code と Codex の5時間と週間のリングに残量(90%・96%・94%・99%)とリセットまでの時間、Fable の行、CPU とメモリのリング、下にスリープ防止・通知・表示の切り替え
アプリのポップオーバー。Claude Code と Codex の5時間と週間のリングに残量(90%・96%・94%・99%)とリセットまでの時間、Fable の行、CPU とメモリのリング、下にスリープ防止・通知・表示の切り替え

この画像は「残量」の表示にしているので、数字は残りの割合です。リングの色は使用率で変わります。

使用率 色
70% 未満 緑(余裕あり)
70〜90% 黄
90% 以上 赤

デスクトップのウィジェット(小:2×2 のリング、中:リングと使用率とリセットまでの時間)も作りました。最初はメニューバーだけのつもりでしたが、途中で「これ、macのデスクトップにはることもできる?」と聞いたら作れるとのことだったので、足しています。

デスクトップに置いた中サイズのウィジェット。Claude Code・Codex の5時間と週間の使用率とリセットまでの時間、CPU とメモリの使用率が3行に並ぶ
デスクトップに置いた中サイズのウィジェット。Claude Code・Codex の5時間と週間の使用率とリセットまでの時間、CPU とメモリの使用率が3行に並ぶ

どこから使用量を取っているか

対象 取得元 更新の間隔
Claude Code Claude Code のログイン情報を使い、/usage と同じ値を取る 5分
Codex Codex CLI が Mac に書き出すセッションのログ 60秒
CPU・メモリ macOS の API(アクティビティモニタと同じ数え方) 3秒

取り方には、いくつか割り切りがあります。

  • Claude Code のログイン状態には触らない:ログイン情報は読むだけで、更新はしません。Claude Code の側のログインを壊さないためです。期限が切れたら、Claude Code を一度起動すれば戻ります
  • Codex はこの Mac で CLI を使った分だけ:ログから読むので、ほかの端末や Web での使用は入りません。そのため、ポップオーバーには「◯◯時点」とデータの時刻を出しています。リセットの時刻を過ぎた枠は 0% として出します
  • どちらも公開された仕様ではない:非公開の API とログの形式を使っているので、仕様が変わると取れなくなるかもしれません
  • Claude のログインを使う点:Claude のログイン(OAuth)は、公式には Claude Code など Anthropic のアプリで使う前提とされています(Claude Code のドキュメント)。このアプリは、自分の Mac で自分の使用量を読むためだけに作ったもので、配布はしていません。同じものを作るなら、その時点の規約を確かめてからが安全です

取得に失敗したときは間隔を延ばしてやり直し、サーバーから「待って」と返ってきたら、その指示に従います。5分おきに取るだけでも、相手に負担をかけない作りにしておきたかったからですね。

設計:取得と表示を分ける

色の判定や残り時間の計算は画面とは別にまとめていて、メニューバー・ポップオーバー・ウィジェットのどこに出しても同じになるようにしています。

ウィジェットは自分でデータを取りません。 ウィジェットは macOS のサンドボックスの中で動くので、ファイルや通信を自由には扱えません。そこで、メニューバーのアプリが取った値を共有のファイルに書き出し、ウィジェットはそれを読むだけにしました。

  • 値が変わったら、アプリからウィジェットに読み直しを頼む
  • それ以外は、ウィジェットが15分ごとに読み直す

アプリを終了するとウィジェットの値は止まりますが、そのぶん仕組みは単純です。

モノクロの表示でも危険度がわかるようにしました。 デスクトップのウィジェットは、ほかのウィンドウが前面にあると、macOS がモノクロで表示します。作っている途中で、色が付かないことに気づきました。色だけで危険度を伝えていると、ここで情報が消えてしまいます。

そこで、リングの太さ(注意はやや太く、危険は太く)と、90% 以上での ⚠︎ マークでも示すようにしました。いつも色付きで見たいときは、システム設定の「デスクトップと Dock」→「ウィジェットのスタイル」を「フルカラー」にします。

あとから足した機能

リングが出るところまでできたあと、Claude Code に「あと他に表示すると良い機能、値はある?」と聞きました。上限に届く時刻の予測、通知、週間の枠の内訳などの案が出てきたので、その中から通知を選んでいます。スリープ防止、CPU とメモリ、Fable の使用量は、自分から頼みました。

80% と 95% で通知します。 それぞれの枠が80% と 95% を超えたときに、macOS の通知を出します。超えていた枠がリセットされたときにも通知します。

通知がうるさくならないように、判定にはいくつか工夫を入れています。

  • 同じ枠では、超えた中で一番高いしきい値を1回だけ通知する
  • リセットの通知は、その枠で 80% 以上の通知を出していたときだけ
  • 通知済みの状態を保存して、アプリを起動し直しても同じ通知をくり返さない
  • API が返すリセット時刻のわずかな揺れ(60秒以内)を、新しい枠と取り違えない

最後の点は地味ですが、大事でした。API が返すリセット時刻は秒より細かい値まで含むので、同じ枠でも値が少しずれることがあります。そのまま比べると、「リセット時刻が変わった=新しい枠」と判定してしまいます。

CPU とメモリも並べました。 AI のツールを動かしていると、Mac 自体の負荷も気になります。そこで、CPU とメモリの使用率もメニューバーに並べました。

メモリの色は、使用率ではなく macOS の「メモリプレッシャー」(通常・注意・危険)で決めています。macOS はメモリを積極的にキャッシュに使うので、使用率が高くても、実際には余裕があることが多いからです。上のスクリーンショットでも MEM は 78% ですが、色は付いていません(余裕があるときは普通の文字の色です)。アクティビティモニタのメモリプレッシャーのグラフと同じ基準にしました。

スリープ防止も付けました。 長い処理を走らせて席を離れるときのためのものです。ターミナルで caffeinate コマンドを使えば同じことはできますが、そのためにターミナルの枠を1つ使うのもどうかなと思っていたので、メニューバーから切り替えられるようにしました。3つから選べます。

  • オフ
  • 本体のみ(画面は消える)
  • 画面も

使っている間は、メニューバーにカップのアイコンが出ます。なお、ノートの蓋を閉じたときのスリープは防げません。

Fable の使用量も出します。 Claude Code で Fable が使えるときは、Claude Code の行に Fable のトークンの使用量(5時間の枠と週間の枠)も出すようにしました。こちらは API ではなく、この Mac の Claude Code のログから、Fable のモデルの使用量を数えています。そのため、claude.ai やほかの端末で使った分は入りません。トークン数は、キャッシュの読み込みを含めた合計です。上のポップオーバーの画像の「Fable」の行がそれで、最近は使っていないので 0 になっています。

とはいえ、Opus 5.5 がかなり使えて安いので、Fable 5.1 はもう使わないかもしれません。

しばらく使って直したこと

しばらく使っていると、困ったことが出てきたので、Claude Code に直してもらいました。

スリープ防止の設定が、起動し直すとオフに戻っていました。 最初は「起動したときはいつもオフ」という作りだったためです。設定を保存して、起動時に戻すようにしました。あわせて、スリープ防止をかけるのに失敗したときは保存しないようにしています。一時的な失敗で、保存していた設定までオフに戻らないようにするためです。

メニューバーから開いたときの表示が、だんだん遅くなっていました。 原因は、ポップオーバーの中身の画面が、閉じている間も残り続けていたことでした。3秒ごとに値が変わるたびに、見えていない画面のレイアウトが計算され直し、そのための管理データがたまっていきます。調べたときには、メモリが 496MB まで増えていました。

直し方は単純で、中身は開くたびに作り、閉じたら捨てるようにしました。閉じている間に画面の計算に使っていた時間は、5秒あたり約0.6秒からほぼゼロになりました。直したあとは、しばらく動かし続けても、メモリは増えませんでした。

Codex の使用量が、Web の画面とずれていました。 アプリは「更新日時が一番新しいログのファイルに、最新の値がある」と決めつけていました。ところが、何日も続けている Codex のスレッドがあると、そのログは更新され続けるのに、中の制限値は古いままのことがあります。ログの中の記録の時刻を見て、一番新しい値を選ぶように直しました。

3つとも、作ったときには気づけなかったことでした。常駐するアプリは、何日も動かしてみて初めてわかることがあるなと思います。

作ってみて

  • Chrome の使用量のタブは閉じました:Chrome で確かめる手間が減りました。いつでも見られるので、残りを覗きに行く回数も減っています
  • 一晩で形になりました:完成のイメージの画像を1枚渡して頼み、あとはリングの色やアイコン、デスクトップのウィジェットなどを、動いているものを見ながら頼んでいきました
  • 注意点:非公開の API とログの形式に頼っているので、Claude Code や Codex の更新で動かなくなるかもしれません

まとめ

  • Claude Code と Codex の5時間の枠と週間の枠を、メニューバーにいつも出しておけるようにした
  • 通知は「1回だけ」「リセット時刻の揺れを無視する」など、うるさくならない判定にした
  • 常駐するアプリは、何日か動かしてから出てくる問題があるので気をつける必要がある

使用量のページをタブで開きっぱなしにしている人は、メニューバーやウィジェットに出しておくだけでも、かなり楽になると思うので是非作ってみてください。

あわせて読みたい

Claude Code と Codex の残り使用量をメニューバーに常駐表示する Mac アプリを自作した

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

エンジニア。Claude Code / Codex / MCP / BigQuery / 自動化 / ガジェット / 3Dプリンター / スマートホーム。楽して生きたい。ゲーム / イヤホン / キーボード / プログラミング / AI

目次