Find the expired code your AI reads, and you pay for, every day. Try: npx contextdebt
JavaScript
0
31 commits
updated Sep 21, 2026
Context debt is the expired code your AI reads — and you pay for — every day: workarounds for bugs fixed upstream years ago, polyfills for browsers you no longer support, retry logic tuned for defaults that no longer exist. The reason died; the code stayed.
npx contextdebt
We ran it on 1,813 of the most-starred repos on GitHub — results and every claim, re-checkable: contextdebt.dev/report
Run it inside any JS/TS, WordPress/PHP, or Python repository. In seconds you get:
workaround, until we upgrade, TODO: remove when ..., TODO(v11): remove, Remove in v18., we can use X once we drop Y) — comments only, so an identifier like var kludge = 0 or a UI string never countsremove after Oct 28, 2025), a fix that landed at or below the lowest version your manifest supports (fixed in vite 5.1 under a ^6.4.0 peer floor), a release you have already shipped (TODO: Remove from core-js@4). A deadline written without a year is dated from the commit that introduced the line — or reported as unknown. Never guessed from today's date 537 files scanned (0.9s)
91,120 lines of code
10 self-admitted workarounds (1.10 per 10k LOC)
1 with EXPIRED reasons — the issue they cite was closed as fixed
EXPIRED BY THE PROJECT'S OWN FLOOR — the fix is already in the lowest version this repo supports:
packages/vitest/src/node/logger.ts:257
// workaround for https://github.com/vitejs/vite/issues/15438, it was fixed in vite 5.1
↳ vite 5.1 ≤ floor 6.4.0 (peerDependencies ^6.4.0 || ^7.0.0 || ^8.0.0 in packages/vitest/package.json)
↳ lockfile resolves vite 8.0.11
Real output, vitest at 4944cf4988. The floor and the lockfile line were read out of the repository; nothing was asked of any network to reach that one.
Runs 100% locally. Your code never leaves your machine. The only network calls are GitHub API status lookups for issue URLs your own comments reference — and the checks above that read your own dates, manifests and version make none at all. Set GITHUB_TOKEN to raise the lookup rate limit.
Options: npx contextdebt [path] [--all] [--json]
This free scanner finds candidates — code whose stated reason may have expired. It deliberately says "expired reason", never "safe to delete": that the reason died is one claim, that removing the code is safe is another, and only the first is provable from a comment and a manifest. The second needs your tests and your judgement, and stays yours.
Where it cannot prove something, it says so rather than reporting a zero: a version range it refuses to read, a package no manifest declares, a deadline whose year the history could not supply. Unknown and none are different answers.
MIT © ContextDebt
31 commits
JavaScript
92.7%
TypeScript
4.2%
Python
1.8%
Find the expired code your AI reads, and you pay for, every day. Try: npx contextdebt
JavaScript
0
31 commits
updated Sep 21, 2026
Context debt is the expired code your AI reads — and you pay for — every day: workarounds for bugs fixed upstream years ago, polyfills for browsers you no longer support, retry logic tuned for defaults that no longer exist. The reason died; the code stayed.
npx contextdebt
We ran it on 1,813 of the most-starred repos on GitHub — results and every claim, re-checkable: contextdebt.dev/report
Run it inside any JS/TS, WordPress/PHP, or Python repository. In seconds you get:
workaround, until we upgrade, TODO: remove when ..., TODO(v11): remove, Remove in v18., we can use X once we drop Y) — comments only, so an identifier like var kludge = 0 or a UI string never countsremove after Oct 28, 2025), a fix that landed at or below the lowest version your manifest supports (fixed in vite 5.1 under a ^6.4.0 peer floor), a release you have already shipped (TODO: Remove from core-js@4). A deadline written without a year is dated from the commit that introduced the line — or reported as unknown. Never guessed from today's date 537 files scanned (0.9s)
91,120 lines of code
10 self-admitted workarounds (1.10 per 10k LOC)
1 with EXPIRED reasons — the issue they cite was closed as fixed
EXPIRED BY THE PROJECT'S OWN FLOOR — the fix is already in the lowest version this repo supports:
packages/vitest/src/node/logger.ts:257
// workaround for https://github.com/vitejs/vite/issues/15438, it was fixed in vite 5.1
↳ vite 5.1 ≤ floor 6.4.0 (peerDependencies ^6.4.0 || ^7.0.0 || ^8.0.0 in packages/vitest/package.json)
↳ lockfile resolves vite 8.0.11
Real output, vitest at 4944cf4988. The floor and the lockfile line were read out of the repository; nothing was asked of any network to reach that one.
Runs 100% locally. Your code never leaves your machine. The only network calls are GitHub API status lookups for issue URLs your own comments reference — and the checks above that read your own dates, manifests and version make none at all. Set GITHUB_TOKEN to raise the lookup rate limit.
Options: npx contextdebt [path] [--all] [--json]
This free scanner finds candidates — code whose stated reason may have expired. It deliberately says "expired reason", never "safe to delete": that the reason died is one claim, that removing the code is safe is another, and only the first is provable from a comment and a manifest. The second needs your tests and your judgement, and stays yours.
Where it cannot prove something, it says so rather than reporting a zero: a version range it refuses to read, a package no manifest declares, a deadline whose year the history could not supply. Unknown and none are different answers.
MIT © ContextDebt
31 commits
JavaScript
92.7%
TypeScript
4.2%
Python
1.8%