Skip to content

About

Duolingo-style tracker for Claude Code & Codex rate limits — get pinged the moment a 5-hour window resets, and turn maxing out every window into streaks, XP and leagues.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

86 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ratelimit.world

https://ratelimit.world — Claude Code と Codex の 5時間枠を、リセットの瞬間から使い切るためのウェブサービス。

A Duolingo-style tracker for AI coding rate limits: it pings your phone the moment a 5-hour window resets, and turns maxing out every window into streaks, XP, leagues and daily quests.

ダッシュボード   プロフィール

シェアカード

できること

  • リセットの瞬間に通知: スマホ (PWA の Web Push) に「リセットされた」「あと5分でリセット」「10分たっても再開していない」を届ける
  • ストリークと XP: 目標の枠数を使い切った日が続くと 🔥、1日の何枠目かで増えるコンボ XP、即スタートのボーナス、フリーズ
  • デイリークエスト / リーグ / フレンド: 日替わりのお題3つ、同じプランの30人で競う週替わりのリーグ(昇格・降格)、GitHub ユーザー名でフォロー
  • キャラクター「リミ」: 即スタートで喜び、出遅れるとしょんぼりする
  • ペース表示: 今の使い方でリセットまでに使い切れるか(「22:25 に使い切り」「このペースだと 16% 余る」)
  • PC 側: ステータスライン・Mac のメニューバー (SwiftBar) にリセットまでの時間を表示する CLI
  • 日本語 / 英語

技術

Cloudflare Workers + D1 (SQLite) · Web Push (RFC 8291 / VAPID を WebCrypto で実装) · GitHub OAuth · シェアカードは SVG を resvg-wasm で PNG に · 依存なしの Node.js CLI (Claude Code の hooks と Codex の notify から呼ばれる) · フレームワークなしの HTML/CSS/JS


5時間枠は「リセット後に最初に使った時刻」から数え直されます。3:00 にリセットされても 3:30 に再開すれば、次のリセットは 8:30 になる。この出遅れは1日のあいだ積み重なっていきます。ratelimit.world はリセットの瞬間にスマホへ通知し、使い切った回数をストリーク(Duolingo 方式)で記録します。

気持ちよさの設計

  • 日をまたぐ: 目標の枠数を使い切った日が続くと 🔥ストリーク。7日ごとにフリーズ 🧊(最大2つ)がもらえて、未達の日を自動で守る。
  • 1日の中: その日の何枠目かで XP が増えるコンボ(100 → 120 → 150 → 200 → 300)。称号は自分の目標が基準(あとn枠 / 目標達成 / 目標超え / 限界突破)で、届かない上限は見せない。リセットから5分以内の再開は +50 XP。「今日のトラック」は目標+1マスだけを並べ、次のマスの XP と時刻を見せる。枠を使い切った瞬間にスマホへ「今日n枠目 +XP」を通知し、ダッシュボードを開くと増えた枠がポップして紙吹雪が出る。
  • リーグ: ツール×課金プランごと(Claude Pro / Max 5x / Max 20x / ChatGPT Plus / Pro …)に最大30人で、1週間(月曜 0:00 UTC から)の XP を競う。上位は昇格、下位は降格(ブロンズ〜ダイヤモンドの10段)。プランは CLI が ~/.claude.json の oauthAccount.organizationType / organizationRateLimitTier と、Codex のログの rate_limits.plan_type から読む。両方使う人は両方のリーグに、そのツールの枠だけで出る。
  • 週間リミット: Claude Code(quotaLimits.rateLimitType: seven_day*)や Codex(10080分枠)の週間リミットを使い切ると 🏆 +1000 XP と「週間制覇」。リセットまでの日は5時間枠を使えないので、ストリークを自動で守る(フリーズは使わない)。
  • オンボーディング (/welcome): コマンドを貼る → 連携した瞬間に過去60日の記録(使い切った枠・平均の出遅れ・取りこぼした時間)を見せる → 「ふだんの1日」を目安に目標を自分で選ぶ → 通知を ON。

出遅れの損失

  • LP: 「毎回30分出遅れると、Claude Code と Codex で年に約1,100時間(約200枠)」。1日16時間使い、リセットのたびに30分遅れた場合の試算(5時間の枠が5.5時間かかる=約9%減、2ツール分)。
  • オンボーディング: 出遅れ d 分を d/(300+d) 枠の損失として、過去60日に取りこぼした時間と、このペースで1年に取りこぼす時間を出す。CLI が送るのは到達・リセット・再開の時刻だけで、トークン数やプロンプトは送らない。

言語

日本語と英語に対応。文言はすべて worker/src/i18n.js にあり、ページ下部の切り替え(cookie)→ ユーザーに保存した言語 → ブラウザの言語設定の順で決まる。スマホ通知は保存した言語で送る。CLI は RATELIMIT_WORLD_LANG → サイトで選んだ言語 → LANG / OS の設定で決まる。

構成

[PC]  Claude Code / Codex
        │ hooks (UserPromptSubmit / Stop / StopFailure=rate_limit)と Codex の notify
        ▼
      cli/ratelimit-world.mjs ── ローカルログから「到達・リセット・再開の時刻」だけを送る
        │
        ▼
[Cloudflare Worker + D1]  worker/
        ├ 記録・ストリーク・フリーズ・XP・リーグ
        ├ 毎分の Cron: リセット通知 / 10分出遅れ通知 / ピンチ通知
        └ Web Push (VAPID) → スマホ (PWA)
ディレクトリ 中身
cli/ 依存なしの Node CLI。setup / sync / status / scan / uninstall
worker/src/logic.js 集計(0時区切り・ストリーク・フリーズ・出遅れ・XP)と通知の文面
worker/src/webpush.js WebCrypto だけで書いた Web Push(RFC 8291 / 8292)
worker/src/index.js API・GitHub ログイン・CLI のデバイスログイン・Cron
worker/src/pages.js サーバーで組み立てる HTML(LP・ダッシュボード・設定・プロフィール・シェアカード)
worker/public/ CSS・クライアント JS・Service Worker・manifest・アイコン

読み取っているログ

  • Claude Code ~/.claude/projects/**/*.jsonl:error: "rate_limit" の合成メッセージ。新しい版の quotaLimits.resetsAt(rateLimitType: "five_hour")を優先し、なければ本文の resets 5:20pm (Australia/Melbourne) を読む。週次リミットは数えない。
  • Codex ~/.codex/sessions/**/*.jsonl:token_count の rate_limits.primary(window_minutes: 300)。used_percent >= 100 を到達として数える。使用率(%)は表示しない(使っていないときは古い数字になるため)。
  • 再開時刻は、リセット後の最初のプロンプト(Claude)または task_started(Codex)。

ローカルで動かす

cd worker
npm install
npm run db:local                  # D1 (ローカル) にテーブルを作る
{ echo DEV_LOGIN=1; npm run -s vapid; } > .dev.vars
npm run dev                       # http://localhost:8787 (GitHub なしで /login から名前だけでログイン)
npm test                          # 集計ロジックと Web Push の暗号化のテスト

CLI をローカルのサーバーにつなぐ: node cli/ratelimit-world.mjs setup --server http://localhost:8787 (実行すると ~/.claude/settings.json と ~/.codex/config.toml に hooks / notify を登録します。元のファイルは *.ratelimit-world.bak に保存されます)

本番にデプロイする (Cloudflare)

  1. npx wrangler login
  2. npx wrangler d1 create ratelimit-world → 表示された database_id を wrangler.toml に書く
  3. npm run db:remote
  4. GitHub の OAuth App を作る(Settings → Developer settings → OAuth Apps)
    • Homepage URL: https://ratelimit.world
    • Authorization callback URL: https://ratelimit.world/auth/github/callback
  5. シークレットを入れる
    npm run -s vapid   # 出力された 2つの値を使う
    npx wrangler secret put GITHUB_CLIENT_ID
    npx wrangler secret put GITHUB_CLIENT_SECRET
    npx wrangler secret put VAPID_PUBLIC_KEY
    npx wrangler secret put VAPID_PRIVATE_KEY
  6. npm run deploy
  7. ドメイン ratelimit.world を Cloudflare に追加し、Worker の Custom Domain に設定する

既知の制限

  • iPhone で通知を受け取るには、Safari で「ホーム画面に追加」した PWA から通知を ON にする必要があります。
  • Codex の notify はターンが終わったときにしか呼ばれません。Codex だけでリミットに当たって手を止めた場合、送信は次のターン(または Claude Code の次のターン)まで遅れます。
  • 回数は各自の PC から送られるので、改ざんは防げません。リーグは「楽しむためのもの」という前提です。
  • Windows は未対応(install.sh は macOS / Linux 用)。

About

Duolingo-style tracker for Claude Code & Codex rate limits — get pinged the moment a 5-hour window resets, and turn maxing out every window into streaks, XP and leagues.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages