
Thinkst Package Proxy
Thinkst released Package Proxy, a Cloudflare Workers-based inline proxy for npm, PyPI, pip, uv, and Cargo index/metadata requests that enforces supply-chain safety checks (minimum package age, upload-mechanism regression detection, allow/block lists) without requiring any client-side software or workflow changes. The proxy returns 404 for packages failing policy and logs installs to a D1 database, and Thinkst reports it protected them from the TanStack, Bitwarden, and TeamPCP npm compromises via its 10-day age check and integrity-downgrade detection.
What it is
Package Proxy, an open-source Cloudflare Workers tool from Thinkst that intercepts package-manager index requests (npm, pip, uv, cargo) and applies inline supply-chain policy before serving packages. Motivated by the escalating pace of attacks — the post cites Socket's report of 639 compromised npm packages in one coordinated campaign, and the Axios breach — as a reaction to backdoored/typosquatted/maintainer-compromise packages.
How it works
Package managers fetch metadata from a configurable index URL (e.g. https://pypi.org/simple for pip). You repoint that URL at the proxy. The proxy sees which packages a client wants, runs its checks, and either returns 404 for packages that fail policy or fetches and serves the package if it passes. No client-side agent — the only change is the index URL. This differs from the alternative "wrapper around the package manager" approach (commercial and OSS options exist); Thinkst chose the proxy to avoid adding a new dependency everywhere.
Preconditions / Affected
- Tied to Cloudflare Workers; the design is portable in principle but the released implementation is not.
- Only the fast checks are done inline. The post explicitly rules out inline code scanning (minutes-to-hours) and domain-expiry/maintainer-email checks (emails aren't mandatory on PyPI).
Coverage — read the asymmetry
Checks are not uniform across ecosystems. What ships out of the box:
| Check | PyPI | npm | cargo | uv |
|---|---|---|---|---|
| ≥10-day package age | ✓ | ✓ | ✓ | — |
| Upload-mechanism regression | ✓ | ✓ | — | — |
| Audit-fix bypass | — | ✓ | — | — |
| Block list | ✓ | ✓ | ✓ | — |
| Allow list | ✓ | ✓ | ✓ | — |
The upload-mechanism check flags when a package was pushed directly rather than through its usual automated pipeline — a signal of maintainer-account compromise. cargo gets age + lists only; uv is listed as supported but no specific checks are enumerated for it.
What to do
- Deploy from the Thinkst GitHub repo via 1-click Cloudflare deploy, then repoint your package managers' index URLs at it.
- For a stronger posture, mirror Thinkst's internal fork: block npm packages by default and require developers to request allow-list additions.
Caveats
- The author states plainly that even with all checks applied, an attacker can still construct a path past them — the goal is to raise attacker cost, not to guarantee safety.
- The 10-day age window is a heuristic bet that someone else encounters a malicious package first; it does nothing for a threat that stays undetected past that window.
Technologies named here
Techniques named here
- Package age enforcement
- Upload method/integrity regression detection
- Domain expiration/re-registration check
- Version diffing for backdoors
- Automated code scanning
- Allow list / block list enforcement
- Typosquatting
- Maintainer account compromise
Threat actors named here
- TeamPCP
- logger-active
- utils-terminal
Related in Supply Chain


