tokentracker-cli 0.83.5 → 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.
Files changed (86) hide show
  1. package/dashboard/dist/assets/{AchievementBadge-bb85jTC_.js → AchievementBadge-EZ_bFGXa.js} +1 -1
  2. package/dashboard/dist/assets/{AchievementsPage-CQROtjFC.js → AchievementsPage-Y0k0UVcj.js} +2 -2
  3. package/dashboard/dist/assets/{AchievementsSection-DtPA6JRC.js → AchievementsSection-gNn-Sccq.js} +1 -1
  4. package/dashboard/dist/assets/{BadgeDetailModal-ClNP9o6O.js → BadgeDetailModal-D75mcwYT.js} +1 -1
  5. package/dashboard/dist/assets/{Card-CODGNqLE.js → Card-NUfQ9HNP.js} +1 -1
  6. package/dashboard/dist/assets/{ClawdAnimated-D4gKSsF0.js → ClawdAnimated-BRbE8Q8R.js} +1 -1
  7. package/dashboard/dist/assets/{CommandPalette-BIFV44le.js → CommandPalette-DvXS8gml.js} +1 -1
  8. package/dashboard/dist/assets/{CommunityStatsModal-CRy5X2iH.js → CommunityStatsModal-pMLOCFZw.js} +1 -1
  9. package/dashboard/dist/assets/{ConfirmModal-CcmMz3l0.js → ConfirmModal-BFMzzw67.js} +1 -1
  10. package/dashboard/dist/assets/{DashboardPage-XeXAYgKI.js → DashboardPage-D6oQfa7t.js} +1 -1
  11. package/dashboard/dist/assets/{DevicePage-DojgM7c5.js → DevicePage-w-XvCjYG.js} +1 -1
  12. package/dashboard/dist/assets/{DialogClose-Do5zKE_e.js → DialogClose-3wNhXinx.js} +1 -1
  13. package/dashboard/dist/assets/DialogDescription-BIcAn3d1.js +1 -0
  14. package/dashboard/dist/assets/{DialogTitle-AfjYgW9_.js → DialogTitle-Ct8fFe0d.js} +1 -1
  15. package/dashboard/dist/assets/{FadeIn-BLIoLlDr.js → FadeIn-BlTWjEk_.js} +1 -1
  16. package/dashboard/dist/assets/{HeaderGithubStar-kIZC8t7g.js → HeaderGithubStar-DL00mO9h.js} +1 -1
  17. package/dashboard/dist/assets/{IpCheckPage-Cp5PaKZ2.js → IpCheckPage-azBefsAB.js} +1 -1
  18. package/dashboard/dist/assets/{LandingPage-DVm8soRU.js → LandingPage-AZUMZfFX.js} +2 -2
  19. package/dashboard/dist/assets/{LeaderboardAvatar-VOe0xbW6.js → LeaderboardAvatar-CIIx7oE_.js} +1 -1
  20. package/dashboard/dist/assets/{LeaderboardPage-BxqtZ5XC.js → LeaderboardPage-But3rYJH.js} +2 -2
  21. package/dashboard/dist/assets/{LeaderboardProfileModal-Jd0LadRF.js → LeaderboardProfileModal-lCl1juGH.js} +3 -3
  22. package/dashboard/dist/assets/{LeaderboardProfilePage-UjcQrVw9.js → LeaderboardProfilePage-BP1ice75.js} +1 -1
  23. package/dashboard/dist/assets/{LimitsPage-BCT373SL.js → LimitsPage-BHs9KMMV.js} +1 -1
  24. package/dashboard/dist/assets/{LocalOnlyNotice-B6OY1s7h.js → LocalOnlyNotice-BdlY8imq.js} +1 -1
  25. package/dashboard/dist/assets/{LoginCard-DSHO0tm0.js → LoginCard-BRUrEPfx.js} +1 -1
  26. package/dashboard/dist/assets/{LoginModal-BDWfRxca.js → LoginModal-OUppx8M-.js} +1 -1
  27. package/dashboard/dist/assets/{LoginPage-C6CUveep.js → LoginPage-BWBunrTf.js} +1 -1
  28. package/dashboard/dist/assets/{PetPage-Wbdo96d7.js → PetPage-DXmShiZi.js} +1 -1
  29. package/dashboard/dist/assets/{PopoverPopup-CnBdmF9h.js → PopoverPopup-CXO-dECR.js} +1 -1
  30. package/dashboard/dist/assets/{ProviderIcon-BUmOfjp8.js → ProviderIcon-llJHJlM6.js} +1 -1
  31. package/dashboard/dist/assets/{ResetPasswordPage-CoRcV6wA.js → ResetPasswordPage-0C8wqcDe.js} +1 -1
  32. package/dashboard/dist/assets/{Select-Bz_TBa69.js → Select-C6z5XFfG.js} +1 -1
  33. package/dashboard/dist/assets/{SelectItemText-De1kreqq.js → SelectItemText-CFFYsm0E.js} +1 -1
  34. package/dashboard/dist/assets/{SettingsPage-BKhfZgg5.js → SettingsPage-D5sdztJO.js} +1 -1
  35. package/dashboard/dist/assets/{SkillsPage-Dxfd-u3a.js → SkillsPage-Cgm9uSQc.js} +1 -1
  36. package/dashboard/dist/assets/{TokenGalaxy-F8A-Nd-g.js → TokenGalaxy-BHLK8HTa.js} +1 -1
  37. package/dashboard/dist/assets/TrendMonitor-CTnaAoRP.js +19 -0
  38. package/dashboard/dist/assets/{WidgetsPage-CoHxwJKq.js → WidgetsPage-CCAvcnKW.js} +1 -1
  39. package/dashboard/dist/assets/{WrappedPage-BEtvNwJo.js → WrappedPage-CA3TSAK4.js} +1 -1
  40. package/dashboard/dist/assets/{__vite-browser-external-Bvb__wvZ.js → __vite-browser-external-D6Ldq3Qx.js} +4 -4
  41. package/dashboard/dist/assets/{agent-logos-DlTPMVzM.js → agent-logos-CLPc2PPF.js} +1 -1
  42. package/dashboard/dist/assets/{arrow-up-right-CPpFgxPI.js → arrow-up-right-BpNverQC.js} +1 -1
  43. package/dashboard/dist/assets/{check-BJqIqX_n.js → check-OAwjmqjx.js} +1 -1
  44. package/dashboard/dist/assets/{copy-CJju6E4t.js → copy-xACp3XPu.js} +1 -1
  45. package/dashboard/dist/assets/{download-Bd_X_ESz.js → download-DBzAAVuE.js} +1 -1
  46. package/dashboard/dist/assets/{flame-D0gF6_lO.js → flame-CMyLuKcu.js} +1 -1
  47. package/dashboard/dist/assets/{format-tokens-Bb2duR4k.js → format-tokens-DQt23c_Z.js} +1 -1
  48. package/dashboard/dist/assets/{icons-CHX4hzd-.js → icons-tqCKNfQb.js} +1 -1
  49. package/dashboard/dist/assets/{index-DuF533lT.js → index-B9uF-lT4.js} +1 -1
  50. package/dashboard/dist/assets/{index-BQenUM0D.js → index-DXdISlgV.js} +1 -1
  51. package/dashboard/dist/assets/{index-BvyZynlf.js → index-zFHCmjHF.js} +1 -1
  52. package/dashboard/dist/assets/{info-DvFIO61W.js → info-Cf9dDVGg.js} +1 -1
  53. package/dashboard/dist/assets/{limits-providers-Dzhqid5x.js → limits-providers-DwTD2qRh.js} +1 -1
  54. package/dashboard/dist/assets/{link-2-WXEM8anD.js → link-2-DirFa6Qd.js} +1 -1
  55. package/dashboard/dist/assets/{loader-circle-CBitYCbd.js → loader-circle-BaqfyUYe.js} +1 -1
  56. package/dashboard/dist/assets/{provider-display-Ck8wx5F_.js → provider-display-Cos1eTis.js} +1 -1
  57. package/dashboard/dist/assets/{react-qsffbXoL.js → react-TQqv_aZv.js} +1 -1
  58. package/dashboard/dist/assets/{skills-api-BGjRnLBu.js → skills-api-BE5MJlc3.js} +1 -1
  59. package/dashboard/dist/assets/{terminal-BFA955Sz.js → terminal-BzeeGl5u.js} +1 -1
  60. package/dashboard/dist/assets/{trash-2-BoxFSMOq.js → trash-2-BpF9HuIx.js} +1 -1
  61. package/dashboard/dist/assets/{use-community-stats-D_aufn0k.js → use-community-stats-DYM36tGa.js} +1 -1
  62. package/dashboard/dist/assets/{use-limits-display-prefs-DWg_VJVc.js → use-limits-display-prefs-CA9x1hIh.js} +1 -1
  63. package/dashboard/dist/assets/{use-native-settings-RHW0eAGh.js → use-native-settings-DrFmUbb1.js} +1 -1
  64. package/dashboard/dist/assets/{use-ordered-list-cn5T3Bi0.js → use-ordered-list-DkxsFCa4.js} +1 -1
  65. package/dashboard/dist/assets/use-reduced-motion-BxOv0kpO.js +1 -0
  66. package/dashboard/dist/assets/{use-session-efficiency-pref-DRobup6T.js → use-session-efficiency-pref-CH3-yj76.js} +1 -1
  67. package/dashboard/dist/assets/{use-transform-BlvN9UW0.js → use-transform-Cg_abBxV.js} +1 -1
  68. package/dashboard/dist/assets/{use-usage-limits-Cp5aKXRQ.js → use-usage-limits-CIWhPB2s.js} +1 -1
  69. package/dashboard/dist/assets/{useCurrency-CRDGDglc.js → useCurrency-CaldvKOC.js} +1 -1
  70. package/dashboard/dist/assets/{useScrollLock-D0qxSW2G.js → useScrollLock-zwTkEijR.js} +1 -1
  71. package/dashboard/dist/assets/{useTokenFormat-R9Gepc9g.js → useTokenFormat-DrEbQlO7.js} +1 -1
  72. package/dashboard/dist/assets/{zap-xt3KIPjK.js → zap-DZJCXhYl.js} +1 -1
  73. package/dashboard/dist/index.html +29 -12
  74. package/dashboard/dist/ip-check.html +202 -0
  75. package/dashboard/dist/leaderboard.html +167 -0
  76. package/dashboard/dist/share.html +1 -1
  77. package/dashboard/dist/sitemap.xml +6 -6
  78. package/package.json +1 -1
  79. package/src/commands/init.js +1 -0
  80. package/src/commands/sync.js +3 -1
  81. package/src/lib/local-api.js +3 -1
  82. package/src/lib/pricing/seed-snapshot.json +1 -1
  83. package/src/lib/sqlite-reader.js +2 -0
  84. package/dashboard/dist/assets/DialogDescription-xAzuNBeK.js +0 -1
  85. package/dashboard/dist/assets/TrendMonitor-93OdRFml.js +0 -19
  86. package/dashboard/dist/assets/use-reduced-motion-Cp5udRu_.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 &amp; 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 &amp; 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 &amp; 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,7 +75,7 @@
75
75
  "description": "Shareable Token Tracker dashboard snapshot."
76
76
  }
77
77
  </script>
78
- <script type="module" crossorigin src="/assets/__vite-browser-external-Bvb__wvZ.js"></script>
78
+ <script type="module" crossorigin src="/assets/__vite-browser-external-D6Ldq3Qx.js"></script>
79
79
  <link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-ByIYTB6l.css">
80
80
  </head>
81
81
  <body>
@@ -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-05-07</lastmod>
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-05-07</lastmod>
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-05-07</lastmod>
18
- <changefreq>monthly</changefreq>
19
- <priority>0.5</priority>
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-05-07</lastmod>
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.5",
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": {
@@ -1225,6 +1225,7 @@ function spawnDetached(argv) {
1225
1225
  try {
1226
1226
  const child = cp.spawn(argv[0], argv.slice(1), {
1227
1227
  detached: true,
1228
+ windowsHide: true,
1228
1229
  stdio: 'ignore',
1229
1230
  env: process.env
1230
1231
  });
@@ -436,7 +436,9 @@ async function cmdSync(argv, context = {}) {
436
436
  : null;
437
437
 
438
438
  const autoSourceScope = resolveAutoSourceScope(opts);
439
- const isBackgroundLightweightSync = opts.auto && opts.background && !opts.drain;
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) => {
@@ -1919,7 +1919,9 @@ function createLocalApiHandler({ queuePath }) {
1919
1919
  }
1920
1920
  const extraEnv = {};
1921
1921
  const drain = body.drain === true;
1922
- const auto = body.auto === true && !drain;
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;
1923
1925
  const background =
1924
1926
  auto && (body.background === true || body.lightweight === true);
1925
1927
  // The local server is the trust boundary for cloud-sync preferences.