tokentracker-cli 0.83.4 → 0.83.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dashboard/dist/assets/{AchievementBadge-Cj42BYfJ.js → AchievementBadge-EZ_bFGXa.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage-B41jhL7x.js → AchievementsPage-Y0k0UVcj.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-Lp1iynwg.js → AchievementsSection-gNn-Sccq.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal-DuaMzaGW.js → BadgeDetailModal-D75mcwYT.js} +1 -1
- package/dashboard/dist/assets/Card-NUfQ9HNP.js +1 -0
- package/dashboard/dist/assets/{ClawdAnimated-C-Hry4YB.js → ClawdAnimated-BRbE8Q8R.js} +1 -1
- package/dashboard/dist/assets/{CommandPalette-CTJBaWpw.js → CommandPalette-DvXS8gml.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-qSclg4Bj.js → CommunityStatsModal-pMLOCFZw.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-Dh3VzEaA.js → ConfirmModal-BFMzzw67.js} +1 -1
- package/dashboard/dist/assets/DashboardPage-D6oQfa7t.js +1 -0
- package/dashboard/dist/assets/{DevicePage-BrH5YYqa.js → DevicePage-w-XvCjYG.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-CH61tv1C.js → DialogClose-3wNhXinx.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-BIcAn3d1.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-D945fBHg.js → DialogTitle-Ct8fFe0d.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-PByY-20e.js → FadeIn-BlTWjEk_.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-JqnF9WrS.js → HeaderGithubStar-DL00mO9h.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-BL8s0rdr.js → IpCheckPage-azBefsAB.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-Dq0YMelT.js → LandingPage-AZUMZfFX.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardAvatar-BV85AG35.js → LeaderboardAvatar-CIIx7oE_.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardPage-CW9nMYRr.js → LeaderboardPage-But3rYJH.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardProfileModal-DF5nu051.js → LeaderboardProfileModal-lCl1juGH.js} +3 -3
- package/dashboard/dist/assets/{LeaderboardProfilePage-Cid2lIXh.js → LeaderboardProfilePage-BP1ice75.js} +1 -1
- package/dashboard/dist/assets/{LimitsPage-D_SjLBQb.js → LimitsPage-BHs9KMMV.js} +1 -1
- package/dashboard/dist/assets/{LocalOnlyNotice-BgjVuk6t.js → LocalOnlyNotice-BdlY8imq.js} +1 -1
- package/dashboard/dist/assets/{LoginCard-DcOOJ7F4.js → LoginCard-BRUrEPfx.js} +1 -1
- package/dashboard/dist/assets/{LoginModal-BmbXCQpU.js → LoginModal-OUppx8M-.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-BReX-hIM.js → LoginPage-BWBunrTf.js} +1 -1
- package/dashboard/dist/assets/{PetPage-cKhD5kRw.js → PetPage-DXmShiZi.js} +1 -1
- package/dashboard/dist/assets/{PopoverPopup-BL8WWGQD.js → PopoverPopup-CXO-dECR.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-Dv8LjXBc.js → ProviderIcon-llJHJlM6.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-BggDvUTE.js → ResetPasswordPage-0C8wqcDe.js} +1 -1
- package/dashboard/dist/assets/{Select-DFLOEvtQ.js → Select-C6z5XFfG.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-l_IytZ1x.js → SelectItemText-CFFYsm0E.js} +1 -1
- package/dashboard/dist/assets/SettingsPage-D5sdztJO.js +1 -0
- package/dashboard/dist/assets/{SkillsPage-DJeX_hFu.js → SkillsPage-Cgm9uSQc.js} +1 -1
- package/dashboard/dist/assets/{TokenGalaxy-CvtOZNXz.js → TokenGalaxy-BHLK8HTa.js} +1 -1
- package/dashboard/dist/assets/TrendMonitor-CTnaAoRP.js +19 -0
- package/dashboard/dist/assets/{WidgetsPage-Dj37UajB.js → WidgetsPage-CCAvcnKW.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-BbRezT_v.js → WrappedPage-CA3TSAK4.js} +1 -1
- package/dashboard/dist/assets/__vite-browser-external-ByIYTB6l.css +1 -0
- package/dashboard/dist/assets/__vite-browser-external-D6Ldq3Qx.js +1351 -0
- package/dashboard/dist/assets/{agent-logos-C2WjBjZi.js → agent-logos-CLPc2PPF.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-_bkVN_-t.js → arrow-up-right-BpNverQC.js} +1 -1
- package/dashboard/dist/assets/{check-QQtC-jGr.js → check-OAwjmqjx.js} +1 -1
- package/dashboard/dist/assets/{copy-tnrXJIlX.js → copy-xACp3XPu.js} +1 -1
- package/dashboard/dist/assets/{download-DJgEaI-n.js → download-DBzAAVuE.js} +1 -1
- package/dashboard/dist/assets/{flame-D7el_0f3.js → flame-CMyLuKcu.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-CmFsnNFY.js → format-tokens-DQt23c_Z.js} +1 -1
- package/dashboard/dist/assets/{icons-D__mI241.js → icons-tqCKNfQb.js} +1 -1
- package/dashboard/dist/assets/{index-CKS8Swvi.js → index-B9uF-lT4.js} +1 -1
- package/dashboard/dist/assets/{index-DG0NZ_W7.js → index-DXdISlgV.js} +1 -1
- package/dashboard/dist/assets/{index-1pzviHs-.js → index-zFHCmjHF.js} +1 -1
- package/dashboard/dist/assets/{info-7xyGxNal.js → info-Cf9dDVGg.js} +1 -1
- package/dashboard/dist/assets/{limits-providers-D8LfR6Om.js → limits-providers-DwTD2qRh.js} +1 -1
- package/dashboard/dist/assets/{link-2-DRYdgDC2.js → link-2-DirFa6Qd.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-CX24zxqF.js → loader-circle-BaqfyUYe.js} +1 -1
- package/dashboard/dist/assets/{provider-display-DPIFKw3O.js → provider-display-Cos1eTis.js} +1 -1
- package/dashboard/dist/assets/{react-D9H9IC9r.js → react-TQqv_aZv.js} +1 -1
- package/dashboard/dist/assets/{skills-api-BVQc9owa.js → skills-api-BE5MJlc3.js} +1 -1
- package/dashboard/dist/assets/{terminal-4058d4_A.js → terminal-BzeeGl5u.js} +1 -1
- package/dashboard/dist/assets/{trash-2-D3cJG7LG.js → trash-2-BpF9HuIx.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-MKJhkjxa.js → use-community-stats-DYM36tGa.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-FXO2f5fy.js → use-limits-display-prefs-CA9x1hIh.js} +1 -1
- package/dashboard/dist/assets/use-native-settings-DrFmUbb1.js +1 -0
- package/dashboard/dist/assets/{use-ordered-list-D1Ts8ut3.js → use-ordered-list-DkxsFCa4.js} +1 -1
- package/dashboard/dist/assets/use-reduced-motion-BxOv0kpO.js +1 -0
- package/dashboard/dist/assets/{use-session-efficiency-pref-CtzlSied.js → use-session-efficiency-pref-CH3-yj76.js} +1 -1
- package/dashboard/dist/assets/{use-transform-CO582voD.js → use-transform-Cg_abBxV.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-Ca15KPkK.js → use-usage-limits-CIWhPB2s.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-CKFbWGkT.js → useCurrency-CaldvKOC.js} +1 -1
- package/dashboard/dist/assets/{useScrollLock-DNdxd1UW.js → useScrollLock-zwTkEijR.js} +1 -1
- package/dashboard/dist/assets/{useTokenFormat-DTK4cojM.js → useTokenFormat-DrEbQlO7.js} +1 -1
- package/dashboard/dist/assets/{zap-DDCrktFO.js → zap-DZJCXhYl.js} +1 -1
- package/dashboard/dist/index.html +30 -13
- package/dashboard/dist/ip-check.html +202 -0
- package/dashboard/dist/leaderboard.html +167 -0
- package/dashboard/dist/share.html +2 -2
- package/dashboard/dist/sitemap.xml +6 -6
- package/package.json +1 -1
- package/src/commands/init.js +1 -0
- package/src/commands/sync.js +3 -1
- package/src/lib/local-api.js +23 -5
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/sqlite-reader.js +2 -0
- package/dashboard/dist/assets/Card-CBJAS2Mp.js +0 -1
- package/dashboard/dist/assets/DashboardPage-BYnPMlX8.js +0 -1
- package/dashboard/dist/assets/DialogDescription-DqSqTcXg.js +0 -1
- package/dashboard/dist/assets/SettingsPage-DD6EiVg7.js +0 -1
- package/dashboard/dist/assets/TrendMonitor-CbFaoSZx.js +0 -19
- package/dashboard/dist/assets/__vite-browser-external-BRzJpYc1.js +0 -1350
- package/dashboard/dist/assets/__vite-browser-external-C44tPAD-.css +0 -1
- package/dashboard/dist/assets/use-native-settings-BeED1BpH.js +0 -1
- package/dashboard/dist/assets/use-reduced-motion-8J-IDPSQ.js +0 -1
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Claude IP Check — Exit IP Reputation, Geo & Risk Score</title>
|
|
7
|
+
<meta name="description" content="Free Claude IP check: see the exit IP used to reach Claude Code plus reputation, geo and cleanliness/risk (纯净度/风险) signals that can trigger sign-in blocks or rate limits." />
|
|
8
|
+
<meta property="og:site_name" content="Token Tracker" />
|
|
9
|
+
<meta property="og:title" content="Claude IP Check — Exit IP Reputation, Geo & Risk Score" />
|
|
10
|
+
<meta property="og:description" content="Free Claude IP check: see the exit IP used to reach Claude Code plus reputation, geo and cleanliness/risk (纯净度/风险) signals that can trigger sign-in blocks or rate limits." />
|
|
11
|
+
<meta property="og:image" content="https://www.tokentracker.cc/dashboard-dark.png" />
|
|
12
|
+
<meta property="og:type" content="website" />
|
|
13
|
+
<meta property="og:url" content="https://www.tokentracker.cc/ip-check" />
|
|
14
|
+
<meta name="twitter:card" content="summary_large_image" />
|
|
15
|
+
<meta name="twitter:title" content="Claude IP Check — Exit IP Reputation, Geo & Risk Score" />
|
|
16
|
+
<meta name="twitter:description" content="Free Claude IP check: see the exit IP used to reach Claude Code plus reputation, geo and cleanliness/risk (纯净度/风险) signals that can trigger sign-in blocks or rate limits." />
|
|
17
|
+
<meta name="twitter:image" content="https://www.tokentracker.cc/dashboard-dark.png" />
|
|
18
|
+
<link rel="canonical" href="https://www.tokentracker.cc/ip-check" />
|
|
19
|
+
<link rel="icon" href="/icon.svg" type="image/svg+xml" />
|
|
20
|
+
<link rel="icon" href="/favicon.ico" sizes="any" />
|
|
21
|
+
<link rel="icon" href="/favicon-32.png" sizes="32x32" type="image/png" />
|
|
22
|
+
<link rel="icon" href="/favicon-16.png" sizes="16x16" type="image/png" />
|
|
23
|
+
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180" />
|
|
24
|
+
<meta name="theme-color" content="#fafafa" media="(prefers-color-scheme: light)" />
|
|
25
|
+
<meta name="theme-color" content="#000000" media="(prefers-color-scheme: dark)" />
|
|
26
|
+
<script>
|
|
27
|
+
// ES2022 built-in polyfills for WebKit < 15.4 (macOS 12.0 Monterey ships Safari 15.0).
|
|
28
|
+
// Base UI uses Object.hasOwn and TrendMonitor uses Array.prototype.at — both land in
|
|
29
|
+
// Safari 15.4; esbuild down-levels syntax but never polyfills built-ins, so without this
|
|
30
|
+
// the dashboard crashes with "Object.hasOwn is not a function". Run before the bundle.
|
|
31
|
+
(function () {
|
|
32
|
+
try {
|
|
33
|
+
if (typeof Object.hasOwn !== "function") {
|
|
34
|
+
Object.defineProperty(Object, "hasOwn", {
|
|
35
|
+
value: function (o, k) { return Object.prototype.hasOwnProperty.call(o, k); },
|
|
36
|
+
configurable: true, writable: true,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function at(n) {
|
|
40
|
+
n = Math.trunc(n) || 0;
|
|
41
|
+
if (n < 0) n += this.length;
|
|
42
|
+
return n < 0 || n >= this.length ? undefined : this[n];
|
|
43
|
+
}
|
|
44
|
+
if (typeof Array.prototype.at !== "function") {
|
|
45
|
+
Object.defineProperty(Array.prototype, "at", { value: at, configurable: true, writable: true });
|
|
46
|
+
}
|
|
47
|
+
if (typeof String.prototype.at !== "function") {
|
|
48
|
+
Object.defineProperty(String.prototype, "at", { value: at, configurable: true, writable: true });
|
|
49
|
+
}
|
|
50
|
+
} catch (e) {}
|
|
51
|
+
})();
|
|
52
|
+
document.documentElement.classList.add("js");
|
|
53
|
+
// TokenTrackerBar WKWebView: mark before first paint so inline CSS below can clear html/body (NSVisualEffectView shows through).
|
|
54
|
+
(function () {
|
|
55
|
+
try {
|
|
56
|
+
if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.nativeBridge) {
|
|
57
|
+
document.documentElement.classList.add("native-app");
|
|
58
|
+
}
|
|
59
|
+
} catch (e) {}
|
|
60
|
+
})();
|
|
61
|
+
// Sync theme before first paint to prevent dark→light flash (FOUC)
|
|
62
|
+
(function(){
|
|
63
|
+
var t;
|
|
64
|
+
try { t = localStorage.getItem("tokentracker-theme"); } catch(e) {}
|
|
65
|
+
var dark = t === "dark" || (t !== "light" && matchMedia("(prefers-color-scheme:dark)").matches);
|
|
66
|
+
if (dark) document.documentElement.classList.add("dark");
|
|
67
|
+
})();
|
|
68
|
+
</script>
|
|
69
|
+
<style>
|
|
70
|
+
/* Prevent dark flash: set background before CSS loads */
|
|
71
|
+
html { background: #fafafa; }
|
|
72
|
+
html.dark { background: #0a0a0a; }
|
|
73
|
+
/* Native app: must override the two lines above — otherwise WKWebView stays opaque over NSVisualEffectView */
|
|
74
|
+
html.native-app,
|
|
75
|
+
html.native-app.dark {
|
|
76
|
+
background: transparent !important;
|
|
77
|
+
}
|
|
78
|
+
html.native-app body {
|
|
79
|
+
background: transparent !important;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.js .aeo-seed-content {
|
|
83
|
+
display: none;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.aeo-seed-content {
|
|
87
|
+
margin: 0;
|
|
88
|
+
padding: 1.5rem;
|
|
89
|
+
font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
90
|
+
line-height: 1.55;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.aeo-seed-content h1,
|
|
94
|
+
.aeo-seed-content h2,
|
|
95
|
+
.aeo-seed-content h3 {
|
|
96
|
+
margin: 0.75rem 0;
|
|
97
|
+
}
|
|
98
|
+
</style>
|
|
99
|
+
<script type="application/ld+json">
|
|
100
|
+
{
|
|
101
|
+
"@context": "https://schema.org",
|
|
102
|
+
"@graph": [
|
|
103
|
+
{
|
|
104
|
+
"@type": "Organization",
|
|
105
|
+
"@id": "https://www.tokentracker.cc/#organization",
|
|
106
|
+
"name": "Token Tracker",
|
|
107
|
+
"url": "https://www.tokentracker.cc/"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"@type": "WebPage",
|
|
111
|
+
"@id": "https://www.tokentracker.cc/ip-check#webpage",
|
|
112
|
+
"url": "https://www.tokentracker.cc/ip-check",
|
|
113
|
+
"name": "Claude IP Check — Exit IP Reputation, Geo & Risk Score",
|
|
114
|
+
"isPartOf": {
|
|
115
|
+
"@id": "https://www.tokentracker.cc/#website"
|
|
116
|
+
},
|
|
117
|
+
"description": "Check the exit IP used to reach Claude Code, with reputation, geolocation and cleanliness/risk (纯净度/风险) signals."
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"@type": "BreadcrumbList",
|
|
121
|
+
"itemListElement": [
|
|
122
|
+
{
|
|
123
|
+
"@type": "ListItem",
|
|
124
|
+
"position": 1,
|
|
125
|
+
"name": "Home",
|
|
126
|
+
"item": "https://www.tokentracker.cc/"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"@type": "ListItem",
|
|
130
|
+
"position": 2,
|
|
131
|
+
"name": "Claude IP Check",
|
|
132
|
+
"item": "https://www.tokentracker.cc/ip-check"
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"@type": "FAQPage",
|
|
138
|
+
"mainEntity": [
|
|
139
|
+
{
|
|
140
|
+
"@type": "Question",
|
|
141
|
+
"name": "What is a Claude IP check?",
|
|
142
|
+
"acceptedAnswer": {
|
|
143
|
+
"@type": "Answer",
|
|
144
|
+
"text": "A Claude IP check shows the public exit IP that your network uses to reach Claude Code and Claude.ai, along with its reputation, geolocation and cleanliness/risk score, so you can tell whether the IP is likely to trigger sign-in blocks, verification, or rate limits."
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"@type": "Question",
|
|
149
|
+
"name": "Why does my Claude exit IP reputation matter?",
|
|
150
|
+
"acceptedAnswer": {
|
|
151
|
+
"@type": "Answer",
|
|
152
|
+
"text": "Anthropic and its anti-abuse providers score the reputation of the exit IP. Shared, datacenter, VPN, or previously abused IPs (low 纯净度 / high 风险) are more likely to face extra verification, throttling, or blocked logins, even on a paid plan."
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"@type": "Question",
|
|
157
|
+
"name": "How do I check the exit IP used for Claude Code?",
|
|
158
|
+
"acceptedAnswer": {
|
|
159
|
+
"@type": "Answer",
|
|
160
|
+
"text": "Open the Token Tracker IP check page. It detects your current public exit IP and shows its geolocation, network type, and reputation/risk signals so you can decide whether to switch networks before using Claude Code."
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
]
|
|
164
|
+
}
|
|
165
|
+
]
|
|
166
|
+
}
|
|
167
|
+
</script>
|
|
168
|
+
<script type="module" crossorigin src="/assets/__vite-browser-external-D6Ldq3Qx.js"></script>
|
|
169
|
+
<link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-ByIYTB6l.css">
|
|
170
|
+
</head>
|
|
171
|
+
<body>
|
|
172
|
+
<main class="aeo-seed-content" aria-label="Claude IP Check AI-readable summary">
|
|
173
|
+
<h1>Claude IP Check: exit IP reputation, geolocation and cleanliness/risk score</h1>
|
|
174
|
+
<p>
|
|
175
|
+
This free Claude IP check detects the public exit IP your network uses to reach Claude Code and
|
|
176
|
+
Claude.ai, then reports its reputation, geolocation, network type, and a cleanliness/risk score.
|
|
177
|
+
A low-reputation, datacenter, VPN, or previously abused exit IP is more likely to trigger extra
|
|
178
|
+
sign-in verification, rate limiting, or blocked logins — even on a paid Claude plan.
|
|
179
|
+
</p>
|
|
180
|
+
<h2>Claude IP 纯净度与风险检测</h2>
|
|
181
|
+
<p>
|
|
182
|
+
本页用于检测你访问 Claude Code / Claude.ai 时使用的出口 IP:展示该 IP 的归属地、网络类型、
|
|
183
|
+
信誉度与"纯净度 / 风险"评分。共享 IP、机房 IP、VPN 或历史被滥用的 IP 通常纯净度低、风险高,
|
|
184
|
+
更容易触发 Claude 的登录验证、限速甚至封禁。检测后可据此决定是否更换网络再使用 Claude Code。
|
|
185
|
+
</p>
|
|
186
|
+
<h2>What this Claude IP check reports</h2>
|
|
187
|
+
<ul>
|
|
188
|
+
<li>Your current public exit IP address (the IP Anthropic actually sees).</li>
|
|
189
|
+
<li>Geolocation and network type (residential, datacenter, mobile, VPN/proxy).</li>
|
|
190
|
+
<li>IP reputation and a cleanliness/risk score (纯净度 / 风险).</li>
|
|
191
|
+
<li>Whether the IP is likely to trigger Claude sign-in verification or rate limits.</li>
|
|
192
|
+
</ul>
|
|
193
|
+
<h2>Part of Token Tracker</h2>
|
|
194
|
+
<p>
|
|
195
|
+
Token Tracker is a free, open-source, local-first dashboard that monitors AI token usage and cost
|
|
196
|
+
across 27 AI coding tools including Claude Code. Install with <code>npx tokentracker-cli</code>.
|
|
197
|
+
</p>
|
|
198
|
+
</main>
|
|
199
|
+
|
|
200
|
+
<div id="root"></div>
|
|
201
|
+
</body>
|
|
202
|
+
</html>
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>AI Coding Token Usage Leaderboard — Claude, Codex, Cursor</title>
|
|
7
|
+
<meta name="description" content="Public Token Tracker leaderboard ranking AI coding token usage across Claude Code, Codex, Cursor, Gemini and 27 tools. Opt-in, privacy-first — token counts only, never prompts." />
|
|
8
|
+
<meta property="og:site_name" content="Token Tracker" />
|
|
9
|
+
<meta property="og:title" content="AI Coding Token Usage Leaderboard — Claude, Codex, Cursor" />
|
|
10
|
+
<meta property="og:description" content="Public Token Tracker leaderboard ranking AI coding token usage across Claude Code, Codex, Cursor, Gemini and 27 tools. Opt-in, privacy-first — token counts only, never prompts." />
|
|
11
|
+
<meta property="og:image" content="https://www.tokentracker.cc/dashboard-dark.png" />
|
|
12
|
+
<meta property="og:type" content="website" />
|
|
13
|
+
<meta property="og:url" content="https://www.tokentracker.cc/leaderboard" />
|
|
14
|
+
<meta name="twitter:card" content="summary_large_image" />
|
|
15
|
+
<meta name="twitter:title" content="AI Coding Token Usage Leaderboard — Claude, Codex, Cursor" />
|
|
16
|
+
<meta name="twitter:description" content="Public Token Tracker leaderboard ranking AI coding token usage across Claude Code, Codex, Cursor, Gemini and 27 tools. Opt-in, privacy-first — token counts only, never prompts." />
|
|
17
|
+
<meta name="twitter:image" content="https://www.tokentracker.cc/dashboard-dark.png" />
|
|
18
|
+
<link rel="canonical" href="https://www.tokentracker.cc/leaderboard" />
|
|
19
|
+
<link rel="icon" href="/icon.svg" type="image/svg+xml" />
|
|
20
|
+
<link rel="icon" href="/favicon.ico" sizes="any" />
|
|
21
|
+
<link rel="icon" href="/favicon-32.png" sizes="32x32" type="image/png" />
|
|
22
|
+
<link rel="icon" href="/favicon-16.png" sizes="16x16" type="image/png" />
|
|
23
|
+
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180" />
|
|
24
|
+
<meta name="theme-color" content="#fafafa" media="(prefers-color-scheme: light)" />
|
|
25
|
+
<meta name="theme-color" content="#000000" media="(prefers-color-scheme: dark)" />
|
|
26
|
+
<script>
|
|
27
|
+
// ES2022 built-in polyfills for WebKit < 15.4 (macOS 12.0 Monterey ships Safari 15.0).
|
|
28
|
+
// Base UI uses Object.hasOwn and TrendMonitor uses Array.prototype.at — both land in
|
|
29
|
+
// Safari 15.4; esbuild down-levels syntax but never polyfills built-ins, so without this
|
|
30
|
+
// the dashboard crashes with "Object.hasOwn is not a function". Run before the bundle.
|
|
31
|
+
(function () {
|
|
32
|
+
try {
|
|
33
|
+
if (typeof Object.hasOwn !== "function") {
|
|
34
|
+
Object.defineProperty(Object, "hasOwn", {
|
|
35
|
+
value: function (o, k) { return Object.prototype.hasOwnProperty.call(o, k); },
|
|
36
|
+
configurable: true, writable: true,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function at(n) {
|
|
40
|
+
n = Math.trunc(n) || 0;
|
|
41
|
+
if (n < 0) n += this.length;
|
|
42
|
+
return n < 0 || n >= this.length ? undefined : this[n];
|
|
43
|
+
}
|
|
44
|
+
if (typeof Array.prototype.at !== "function") {
|
|
45
|
+
Object.defineProperty(Array.prototype, "at", { value: at, configurable: true, writable: true });
|
|
46
|
+
}
|
|
47
|
+
if (typeof String.prototype.at !== "function") {
|
|
48
|
+
Object.defineProperty(String.prototype, "at", { value: at, configurable: true, writable: true });
|
|
49
|
+
}
|
|
50
|
+
} catch (e) {}
|
|
51
|
+
})();
|
|
52
|
+
document.documentElement.classList.add("js");
|
|
53
|
+
// TokenTrackerBar WKWebView: mark before first paint so inline CSS below can clear html/body (NSVisualEffectView shows through).
|
|
54
|
+
(function () {
|
|
55
|
+
try {
|
|
56
|
+
if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.nativeBridge) {
|
|
57
|
+
document.documentElement.classList.add("native-app");
|
|
58
|
+
}
|
|
59
|
+
} catch (e) {}
|
|
60
|
+
})();
|
|
61
|
+
// Sync theme before first paint to prevent dark→light flash (FOUC)
|
|
62
|
+
(function(){
|
|
63
|
+
var t;
|
|
64
|
+
try { t = localStorage.getItem("tokentracker-theme"); } catch(e) {}
|
|
65
|
+
var dark = t === "dark" || (t !== "light" && matchMedia("(prefers-color-scheme:dark)").matches);
|
|
66
|
+
if (dark) document.documentElement.classList.add("dark");
|
|
67
|
+
})();
|
|
68
|
+
</script>
|
|
69
|
+
<style>
|
|
70
|
+
/* Prevent dark flash: set background before CSS loads */
|
|
71
|
+
html { background: #fafafa; }
|
|
72
|
+
html.dark { background: #0a0a0a; }
|
|
73
|
+
/* Native app: must override the two lines above — otherwise WKWebView stays opaque over NSVisualEffectView */
|
|
74
|
+
html.native-app,
|
|
75
|
+
html.native-app.dark {
|
|
76
|
+
background: transparent !important;
|
|
77
|
+
}
|
|
78
|
+
html.native-app body {
|
|
79
|
+
background: transparent !important;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.js .aeo-seed-content {
|
|
83
|
+
display: none;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.aeo-seed-content {
|
|
87
|
+
margin: 0;
|
|
88
|
+
padding: 1.5rem;
|
|
89
|
+
font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
90
|
+
line-height: 1.55;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.aeo-seed-content h1,
|
|
94
|
+
.aeo-seed-content h2,
|
|
95
|
+
.aeo-seed-content h3 {
|
|
96
|
+
margin: 0.75rem 0;
|
|
97
|
+
}
|
|
98
|
+
</style>
|
|
99
|
+
<script type="application/ld+json">
|
|
100
|
+
{
|
|
101
|
+
"@context": "https://schema.org",
|
|
102
|
+
"@graph": [
|
|
103
|
+
{
|
|
104
|
+
"@type": "Organization",
|
|
105
|
+
"@id": "https://www.tokentracker.cc/#organization",
|
|
106
|
+
"name": "Token Tracker",
|
|
107
|
+
"url": "https://www.tokentracker.cc/"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"@type": "WebPage",
|
|
111
|
+
"@id": "https://www.tokentracker.cc/leaderboard#webpage",
|
|
112
|
+
"url": "https://www.tokentracker.cc/leaderboard",
|
|
113
|
+
"name": "AI Coding Token Usage Leaderboard",
|
|
114
|
+
"isPartOf": {
|
|
115
|
+
"@id": "https://www.tokentracker.cc/#website"
|
|
116
|
+
},
|
|
117
|
+
"description": "Public leaderboard ranking opt-in AI coding token usage across Claude Code, Codex, Cursor, Gemini and 27 tools."
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"@type": "BreadcrumbList",
|
|
121
|
+
"itemListElement": [
|
|
122
|
+
{
|
|
123
|
+
"@type": "ListItem",
|
|
124
|
+
"position": 1,
|
|
125
|
+
"name": "Home",
|
|
126
|
+
"item": "https://www.tokentracker.cc/"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"@type": "ListItem",
|
|
130
|
+
"position": 2,
|
|
131
|
+
"name": "Leaderboard",
|
|
132
|
+
"item": "https://www.tokentracker.cc/leaderboard"
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
}
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
</script>
|
|
139
|
+
<script type="module" crossorigin src="/assets/__vite-browser-external-D6Ldq3Qx.js"></script>
|
|
140
|
+
<link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-ByIYTB6l.css">
|
|
141
|
+
</head>
|
|
142
|
+
<body>
|
|
143
|
+
<main class="aeo-seed-content" aria-label="AI Coding Token Usage Leaderboard AI-readable summary">
|
|
144
|
+
<h1>AI coding token usage leaderboard</h1>
|
|
145
|
+
<p>
|
|
146
|
+
The Token Tracker leaderboard ranks opt-in AI coding token usage across Claude Code, OpenAI Codex,
|
|
147
|
+
Cursor, Gemini CLI and 27 supported tools. It is privacy-first: entries are opt-in and expose token
|
|
148
|
+
counts only — never prompts or conversation content. See how your AI coding token consumption
|
|
149
|
+
compares with other developers by model, tool, and time window.
|
|
150
|
+
</p>
|
|
151
|
+
<h2>How the leaderboard works</h2>
|
|
152
|
+
<ul>
|
|
153
|
+
<li>Opt-in only — you choose whether to appear, using a public display name.</li>
|
|
154
|
+
<li>Token counts only — never prompts, code, or conversation content.</li>
|
|
155
|
+
<li>Ranks usage across Claude Code, Codex, Cursor, Gemini and 27 AI coding tools.</li>
|
|
156
|
+
<li>Powered by optional Token Tracker cloud sync; local-first by default.</li>
|
|
157
|
+
</ul>
|
|
158
|
+
<h2>Part of Token Tracker</h2>
|
|
159
|
+
<p>
|
|
160
|
+
Token Tracker is a free, open-source, local-first dashboard that monitors AI token usage and cost
|
|
161
|
+
across 27 AI coding tools. Install with <code>npx tokentracker-cli</code>.
|
|
162
|
+
</p>
|
|
163
|
+
</main>
|
|
164
|
+
|
|
165
|
+
<div id="root"></div>
|
|
166
|
+
</body>
|
|
167
|
+
</html>
|
|
@@ -75,8 +75,8 @@
|
|
|
75
75
|
"description": "Shareable Token Tracker dashboard snapshot."
|
|
76
76
|
}
|
|
77
77
|
</script>
|
|
78
|
-
<script type="module" crossorigin src="/assets/__vite-browser-external-
|
|
79
|
-
<link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-
|
|
78
|
+
<script type="module" crossorigin src="/assets/__vite-browser-external-D6Ldq3Qx.js"></script>
|
|
79
|
+
<link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-ByIYTB6l.css">
|
|
80
80
|
</head>
|
|
81
81
|
<body>
|
|
82
82
|
<main class="aeo-seed-content" aria-label="Token Tracker share page summary">
|
|
@@ -2,25 +2,25 @@
|
|
|
2
2
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
3
3
|
<url>
|
|
4
4
|
<loc>https://www.tokentracker.cc/</loc>
|
|
5
|
-
<lastmod>2026-
|
|
5
|
+
<lastmod>2026-07-22</lastmod>
|
|
6
6
|
<changefreq>weekly</changefreq>
|
|
7
7
|
<priority>1.0</priority>
|
|
8
8
|
</url>
|
|
9
9
|
<url>
|
|
10
10
|
<loc>https://www.tokentracker.cc/leaderboard</loc>
|
|
11
|
-
<lastmod>2026-
|
|
11
|
+
<lastmod>2026-07-22</lastmod>
|
|
12
12
|
<changefreq>daily</changefreq>
|
|
13
13
|
<priority>0.9</priority>
|
|
14
14
|
</url>
|
|
15
15
|
<url>
|
|
16
16
|
<loc>https://www.tokentracker.cc/ip-check</loc>
|
|
17
|
-
<lastmod>2026-
|
|
18
|
-
<changefreq>
|
|
19
|
-
<priority>0.
|
|
17
|
+
<lastmod>2026-07-22</lastmod>
|
|
18
|
+
<changefreq>weekly</changefreq>
|
|
19
|
+
<priority>0.7</priority>
|
|
20
20
|
</url>
|
|
21
21
|
<url>
|
|
22
22
|
<loc>https://www.tokentracker.cc/share</loc>
|
|
23
|
-
<lastmod>2026-
|
|
23
|
+
<lastmod>2026-07-22</lastmod>
|
|
24
24
|
<changefreq>weekly</changefreq>
|
|
25
25
|
<priority>0.4</priority>
|
|
26
26
|
</url>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tokentracker-cli",
|
|
3
|
-
"version": "0.83.
|
|
3
|
+
"version": "0.83.6",
|
|
4
4
|
"description": "Local-first AI coding token usage and cost tracker for 27 tools, with a dashboard, desktop pet, widgets, achievements, and native macOS/Windows apps.",
|
|
5
5
|
"main": "src/cli.js",
|
|
6
6
|
"bin": {
|
package/src/commands/init.js
CHANGED
package/src/commands/sync.js
CHANGED
|
@@ -436,7 +436,9 @@ async function cmdSync(argv, context = {}) {
|
|
|
436
436
|
: null;
|
|
437
437
|
|
|
438
438
|
const autoSourceScope = resolveAutoSourceScope(opts);
|
|
439
|
-
|
|
439
|
+
// --background controls local scan breadth; --drain only controls upload
|
|
440
|
+
// depth and lock priority. Plain `sync --drain` remains a full source scan.
|
|
441
|
+
const isBackgroundLightweightSync = opts.auto && opts.background;
|
|
440
442
|
const isBackgroundAllLocalSync = isBackgroundLightweightSync && opts.allLocalSources;
|
|
441
443
|
const isFullSourceScan = !autoSourceScope && !isBackgroundLightweightSync;
|
|
442
444
|
const sourceAllowed = (...sources) => {
|
package/src/lib/local-api.js
CHANGED
|
@@ -15,6 +15,19 @@ const { getOrCreateMachineId, computeStableMachineId } = require("./machine-id")
|
|
|
15
15
|
|
|
16
16
|
const SYNC_TIMEOUT_MS = 120_000;
|
|
17
17
|
const TRACKER_BIN = path.resolve(__dirname, "../../bin/tracker.js");
|
|
18
|
+
const MAX_DEVICE_NAME_LENGTH = 128;
|
|
19
|
+
|
|
20
|
+
function getSystemDeviceName() {
|
|
21
|
+
try {
|
|
22
|
+
const hostname = os.hostname()
|
|
23
|
+
.replace(/[\u0000-\u001f\u007f]/g, "")
|
|
24
|
+
.trim()
|
|
25
|
+
.slice(0, MAX_DEVICE_NAME_LENGTH);
|
|
26
|
+
return hostname || null;
|
|
27
|
+
} catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
18
31
|
|
|
19
32
|
// Avatar proxy (see /api/avatar-proxy below). In-memory LRU; survives the
|
|
20
33
|
// CLI server lifetime, which is good enough — the dashboard reloads cheaply.
|
|
@@ -1356,7 +1369,7 @@ function createLocalApiHandler({ queuePath }) {
|
|
|
1356
1369
|
// 必须和 dashboard/src/lib/cloud-sync.ts 使用同一个设备身份。
|
|
1357
1370
|
// 旧云端设备按 (platform, device_name) 认领;如果这里发明
|
|
1358
1371
|
// local-sync 身份,会多出一个 active device,账户视图会把历史求和两次。
|
|
1359
|
-
device_name: `Token Tracker (dashboard) #${machineId.slice(0, 8)}`,
|
|
1372
|
+
device_name: getSystemDeviceName() || `Token Tracker (dashboard) #${machineId.slice(0, 8)}`,
|
|
1360
1373
|
platform: dashboardPlatform,
|
|
1361
1374
|
machine_id: machineId,
|
|
1362
1375
|
}),
|
|
@@ -1906,7 +1919,9 @@ function createLocalApiHandler({ queuePath }) {
|
|
|
1906
1919
|
}
|
|
1907
1920
|
const extraEnv = {};
|
|
1908
1921
|
const drain = body.drain === true;
|
|
1909
|
-
|
|
1922
|
+
// Native Sync Now combines an incremental background scan with a full
|
|
1923
|
+
// cloud drain. A plain {drain:true} request remains an exhaustive sync.
|
|
1924
|
+
const auto = body.auto === true;
|
|
1910
1925
|
const background =
|
|
1911
1926
|
auto && (body.background === true || body.lightweight === true);
|
|
1912
1927
|
// The local server is the trust boundary for cloud-sync preferences.
|
|
@@ -2577,7 +2592,10 @@ function createLocalApiHandler({ queuePath }) {
|
|
|
2577
2592
|
// device_name keys on the MACHINE, not the browser — see
|
|
2578
2593
|
// getOrCreateMachineId above and dashboard/src/lib/cloud-sync.ts.
|
|
2579
2594
|
if (p === "/functions/tokentracker-machine-id") {
|
|
2580
|
-
json(res, {
|
|
2595
|
+
json(res, {
|
|
2596
|
+
machineId: getOrCreateMachineId(qp),
|
|
2597
|
+
deviceName: getSystemDeviceName(),
|
|
2598
|
+
});
|
|
2581
2599
|
return true;
|
|
2582
2600
|
}
|
|
2583
2601
|
|
|
@@ -2891,10 +2909,10 @@ module.exports = {
|
|
|
2891
2909
|
// queue, wrapped aggregator) reports the same numbers for the same data.
|
|
2892
2910
|
normalizeQueueRow,
|
|
2893
2911
|
// Machine-stable identity (config.json machineId) — shared with
|
|
2894
|
-
// `tracker device-login
|
|
2895
|
-
// to the machine, not the hostname.
|
|
2912
|
+
// `tracker device-login`; the hostname is only a human-readable label.
|
|
2896
2913
|
getOrCreateMachineId,
|
|
2897
2914
|
computeStableMachineId,
|
|
2915
|
+
getSystemDeviceName,
|
|
2898
2916
|
// Local achievement compute — exported for test/local-achievements.test.js.
|
|
2899
2917
|
computeLocalAchievements,
|
|
2900
2918
|
LOCAL_BADGE_THRESHOLDS,
|