@ipv9/tokentracker-cli 0.39.42 → 0.39.44
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/README.md +20 -12
- package/dashboard/dist/assets/{Card-B8Y_I2mQ.js → Card-C_H8B1rI.js} +1 -1
- package/dashboard/dist/assets/DashboardPage-DOa3N76u.js +60 -0
- package/dashboard/dist/assets/{FadeIn-ChNG3KP0.js → FadeIn-BE8I9B4-.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-Ca1uwFdQ.js → IpCheckPage-DQ9gR343.js} +1 -1
- package/dashboard/dist/assets/LimitsPage-Balfhw3-.js +2 -0
- package/dashboard/dist/assets/LocalOnlyNotice-hxi161Wl.js +1 -0
- package/dashboard/dist/assets/{PopoverPopup-BGzAyIYN.js → PopoverPopup-B4zbh-jA.js} +1 -1
- package/dashboard/dist/assets/{Select-DEntlQun.js → Select-DLYT4NCO.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-Bn_0YJTr.js → SelectItemText-DUyZrDnS.js} +1 -1
- package/dashboard/dist/assets/{SettingsPage-CGmzeeBt.js → SettingsPage-BySJoulk.js} +1 -1
- package/dashboard/dist/assets/{SkillsPage-vY8xnrco.js → SkillsPage-DpiMLTPo.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-BM16UPSy.js → WidgetsPage-C6je8upG.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-dK7Mh5mP.js → WrappedPage-ByarX-vY.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-UZisIdFP.js → arrow-up-right-C-WAJGZ8.js} +1 -1
- package/dashboard/dist/assets/{download-C-J68Mev.js → download-BhOg_qb4.js} +1 -1
- package/dashboard/dist/assets/{format-DIhJkiH4.js → format-Co2okzG-.js} +1 -1
- package/dashboard/dist/assets/limitDisplay-CPMQA7lm.js +1 -0
- package/dashboard/dist/assets/{main-B7TdYIfs.js → main-q9UoIq7C.js} +15 -3
- package/dashboard/dist/assets/main-t7dbBL4x.css +1 -0
- package/dashboard/dist/assets/{mock-data-DjoQefEM.js → mock-data-0XiGBeUV.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-g_zmpVGY.js → use-limits-display-prefs-DmEIJPtg.js} +1 -1
- package/dashboard/dist/assets/{use-native-settings-DrNnC_U7.js → use-native-settings-QLM3Sd2C.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-xmDhKr0q.js → useCurrency-Dtize6Tx.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/package.json +7 -3
- package/src/commands/doctor.js +2 -0
- package/src/commands/init.js +1 -1
- package/src/commands/sync.js +67 -0
- package/src/lib/doctor.js +72 -0
- package/src/lib/local-api.js +306 -93
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/queue-compact.js +220 -0
- package/src/lib/rollout.js +76 -12
- package/src/lib/skills-manager.js +2 -2
- package/src/lib/usage-limits.js +69 -12
- package/dashboard/dist/assets/DashboardPage-BDJHJCf-.js +0 -60
- package/dashboard/dist/assets/LimitsPage-CyDE5D02.js +0 -2
- package/dashboard/dist/assets/LocalOnlyNotice-yBRg7mqR.js +0 -1
- package/dashboard/dist/assets/limitDisplay-HQrH6Bc9.js +0 -1
- package/dashboard/dist/assets/main-ZrWkoMlr.css +0 -1
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@ Auto-collect token usage from **20+ AI coding tools**, aggregate it locally, and
|
|
|
29
29
|
You can — that is the honest alternative, and for a single tool it is enough. TokenTracker earns its place once you use more than one:
|
|
30
30
|
|
|
31
31
|
- **One number instead of six tabs.** Claude, Codex, Cursor, Gemini and Copilot each bill in their own dashboard, on their own reset schedule, in their own units. Nobody adds them up for you.
|
|
32
|
-
- **Subscriptions hide the number entirely.** A flat monthly plan shows you a quota bar, not what your usage would have cost. TokenTracker prices every token against public model rates,
|
|
32
|
+
- **Subscriptions hide the number entirely.** A flat monthly plan shows you a quota bar, not what your usage would have cost. TokenTracker prices every token against public model rates, and you can enter what you pay to see the two side by side. The figure is list-price-equivalent for the window on screen, not a bill you would have paid — and when some usage cannot be priced it says so rather than quietly reporting a smaller number.
|
|
33
33
|
- **Per-project and per-model, not just per-account.** Billing pages answer "what do I owe this month". This answers "which repo, which model, and which hour" — the resolution you need to actually change something.
|
|
34
34
|
- **Quota chips before you hit the wall.** Live plan-limit usage sits on each provider's card, so a 5-hour window running out is something you see rather than something you discover.
|
|
35
35
|
|
|
@@ -80,7 +80,7 @@ Both bundle their own Node runtime, so there is nothing else to install. They sh
|
|
|
80
80
|
|
|
81
81
|
- 🔒 **Your usage data never leaves your machine.** Token counts and timestamps only — never prompts, responses, or file contents. No account, no telemetry, no analytics, no phone-home. TokenTracker does make a few outbound calls *on your behalf* (model prices, your own plan quotas); every one is named in [Privacy](#-privacy) below, and none of them carry your usage.
|
|
82
82
|
- 📊 **One calm web dashboard.** Your whole picture in the browser at a local URL, no login — light or dark, auto-refreshing while the tab is open. [What's on it ↓](#-the-dashboard)
|
|
83
|
-
- 📈 **Quota at a glance, on every card.** Live plan-quota usage (
|
|
83
|
+
- 📈 **Quota at a glance, on every card.** Live plan-quota usage (e.g. 5h + weekly) as color-coded chips right on each provider's card — see how close you are to your limits without leaving the overview. Where the provider reports countable units you get the actual number rather than a percentage to convert in your head: GitHub Copilot reads `158/300` premium requests. Full windows + reset countdowns on the Limits page. Covers Claude, Codex, Cursor, Gemini, Kimi, Z.AI, Kiro, Copilot, and Antigravity.
|
|
84
84
|
- 💰 **Cost you can trust — and a price tag when it can't.** 2,200+ models priced from [LiteLLM](https://github.com/BerriAI/litellm) (refreshed daily) with a bundled offline snapshot, so USD totals are right even without a network. A model too new to have a price is badged **pricing missing** rather than quietly counted as $0, and prices refresh in the background instead of waiting for a restart. Cross-provider records are de-duplicated to match each provider's own billing.
|
|
85
85
|
- 🔌 **20+ tools, zero config.** Claude Code, Codex, Cursor, Gemini, Copilot, Antigravity, OpenCode, Kiro, Zed, Goose, and more — auto-detected, hooks auto-install on first run. Zero to dashboard in ~30 seconds.
|
|
86
86
|
- 🧩 **Skills tab.** Syncs 250+ public skills across your tools.
|
|
@@ -96,7 +96,7 @@ Both bundle their own Node runtime, so there is nothing else to install. They sh
|
|
|
96
96
|
**On one screen:**
|
|
97
97
|
- **Total tokens + cost** for the selected window (24h / day / 7d / 30d / total / custom), with a browser-timezone "Updated" stamp.
|
|
98
98
|
- **Usage Trend** — token volume over time, right beside the total.
|
|
99
|
-
- **Provider breakdown** — every tool's share and top models, with each provider's live quota chips (
|
|
99
|
+
- **Provider breakdown** — every tool's share and top models, with each provider's live quota chips (e.g. 5h + weekly — a count like `158/300` where the provider reports one, otherwise a percentage) on its card and a click-to-expand per-model drill-down.
|
|
100
100
|
- **Context breakdown** — where Claude's and Codex's tokens actually go (input / output / cache / reasoning), shown side by side.
|
|
101
101
|
- **Activity heatmap** — daily usage at a glance.
|
|
102
102
|
- **Project & daily tables** — per-project totals and a day-by-day breakdown with cost and $/MTok.
|
|
@@ -144,16 +144,24 @@ No account, no upload of your usage, and no server to sign in to.
|
|
|
144
144
|
| **Auditable in one command** | You don't have to take our word for it — the store is an append-only text file you can open yourself: `cat ~/.tokentracker/tracker/queue.jsonl`. It's numbers and timestamps. |
|
|
145
145
|
| **No telemetry** | No analytics, no crash reporting, no phone-home, no account. |
|
|
146
146
|
|
|
147
|
-
**Outbound calls
|
|
147
|
+
**Outbound calls.** TokenTracker is local-first, not network-free. It reaches these hosts and no others. None of them carry your usage data — but some do reveal that *you* are asking, so they are listed with who makes the call.
|
|
148
148
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
|
152
|
-
|
|
153
|
-
|
|
|
154
|
-
|
|
|
155
|
-
|
|
|
156
|
-
| `
|
|
149
|
+
This table is checked in CI against [`outbound-hosts.json`](outbound-hosts.json): a host the code can reach but the file does not declare fails the build, and so does a declared host missing from this table. It is not maintained by memory.
|
|
150
|
+
|
|
151
|
+
| When | Host | From | Why |
|
|
152
|
+
|---|---|---|---|
|
|
153
|
+
| Pricing refresh (daily) | `raw.githubusercontent.com` | server | The public [LiteLLM](https://github.com/BerriAI/litellm) price list. Anonymous — no credentials, nothing sent. Works offline from a bundled snapshot. |
|
|
154
|
+
| Quota chips + Limits page | `api.anthropic.com`, `chatgpt.com`, `api.openai.com`, `cursor.com`, `www.cursor.com`, `cloudcode-pa.googleapis.com`, `api.kimi.com`, `api.z.ai`, `api.github.com` | server | Asks *your* provider about *your* plan limits, using credentials already on your machine. Only for providers you actually use. |
|
|
155
|
+
| Token refresh | `auth.openai.com`, `oauth2.googleapis.com`, `auth.kimi.com` | server | Renews those same provider credentials when they expire. |
|
|
156
|
+
| Skills tab — search | `skills.sh` | server | Searches the public skills directory. Sends the terms you typed. Only when you open that tab. |
|
|
157
|
+
| Skills tab — install | `api.github.com`, `raw.githubusercontent.com` | server | Reads a public repository's file tree and downloads the skill's files. Carries the repository owner, name, branch and path — no usage data. |
|
|
158
|
+
| Currency conversion | `open.er-api.com` | **browser** | Public USD exchange rates. Anonymous. Only when you pick a non-USD currency. |
|
|
159
|
+
| Star count in the header | `api.github.com` | **browser** | The star count for this project's own repository — a fixed public URL that says nothing about you. |
|
|
160
|
+
| IP check page | `ip.net.coffee`, `d.ip.net.coffee`, `1.1.1.1`, `claude.ai`, `www.anthropic.com` | server + **browser** | Only if you open that page, whose entire purpose is showing you your own IP, your DNS resolver, and whether Anthropic is reachable. The `d.` subdomain is a per-run DNS probe: your browser resolves a unique name so the page can see which resolver answered. |
|
|
161
|
+
| IP check page — VPN leak test | `stun.l.google.com` (Google), `stun.cloudflare.com` | **browser** | WebRTC STUN binding requests, which is how the page detects whether a VPN leaks your real address — and which necessarily discloses that address to the STUN server. **This is the one place the dashboard talks to Google.** Only if you open that page. |
|
|
162
|
+
| `npx` startup | `registry.npmjs.org` | server | How `npx` works — it downloads the package. A global install avoids it. |
|
|
163
|
+
|
|
164
|
+
**What is deliberately absent:** the Projects panel does not fetch repository avatars or star counts. Doing so would have put the name of a repository you have checked out — a private one included — into a URL sent to GitHub from your browser. It did, until [#100](https://github.com/pitimon/TokenTracker/issues/100). Project rows now render a local icon.
|
|
157
165
|
|
|
158
166
|
---
|
|
159
167
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as r}from"./main-
|
|
1
|
+
import{j as r}from"./main-q9UoIq7C.js";function t({children:i,title:a,subtitle:o,className:s="",bodyClassName:d=""}){return r.jsxs("div",{className:`rounded-xl border border-oai-gray-200 dark:border-oai-gray-800 bg-white dark:bg-oai-gray-900 transition-colors duration-200 ${s}`,children:[(a||o)&&r.jsxs("div",{className:"px-5 py-4 border-b border-oai-gray-200 dark:border-oai-gray-800 transition-colors duration-200",children:[a&&r.jsx("h3",{className:"text-sm font-medium text-oai-gray-500 dark:text-oai-gray-300 uppercase tracking-wide transition-colors duration-200",children:a}),o&&r.jsx("p",{className:"text-sm text-oai-gray-500 dark:text-oai-gray-300 mt-1 transition-colors duration-200",children:o})]}),r.jsx("div",{className:`p-5 ${d}`,children:i})]})}export{t as C};
|