Public delivery network for open source
Every published version, on one permanent URL.
CDNPulse serves files out of the public npm registry and out of tagged repository releases. Pin an exact version and the response never changes again — the bytes are frozen, the cache entry is immutable, and the URL keeps working long after your build machine is gone.
https://cdnpulse.org/npm/<package>@<version>/<file> https://cdnpulse.org/rel/<owner>/<repo>@<tag>/<file>
Worked examples, nothing to configure
These are literal, copyable URLs. There is no console, no key, no account and no origin to register — a request is the whole integration.
<link rel="stylesheet"
href="https://cdnpulse.org/npm/bootstrap@5.3.6/dist/css/bootstrap.min.css">
<link rel="stylesheet"
href="https://cdnpulse.org/rel/photoswipe/photoswipe@v5.4.4/dist/photoswipe.css">
// bare specifiers are rewritten to absolute CDNPulse URLs
import dayjs from "https://cdnpulse.org/npm/dayjs@1.11.13/+mod";
console.log(dayjs().format("YYYY-MM-DD"));
https://cdnpulse.org/join/npm/dayjs@1.11.13/dayjs.min.js
,npm/dayjs@1.11.13/plugin/utc.js
Line breaks above are for reading only. A real /join/ request is one line with comma-separated members.
What the edge does for you
Six behaviours that are on by default. None of them need a query parameter, and none of them change the bytes of a file you asked for by exact name.
Compiled variants
Ask for /file.min.js where the package ships only /file.js and the edge produces the minified form once, then caches it beside the original.
Source maps kept
When a package publishes .map files they are served with the same headers, so devtools resolve original sources without a second origin.
Directory listings
Drop the filename and you get a browsable index of everything that version published, with byte sizes and content types.
Range semantics
Semver ranges, dist-tags and bare major numbers all resolve. The resolution itself is cached for 12 hours so a burst does not walk the registry.
Joined responses
Concatenate several files of the same media type into one cached object with /join/ — useful on connections where a round trip costs more than a kilobyte.
Per-file counters
Every path accumulates an anonymous hit counter. Maintainers can see which version of which file the ecosystem is actually loading.
Busiest packages, last 30 days
Share is measured against all 41.6 billion requests, not against this table.
| # | Package | Requests | Share | Top version |
|---|---|---|---|---|
| 1 | bootstrap | 1.94 B | 4.66 % | 5.3.6 |
| 2 | jquery | 1.51 B | 3.63 % | 3.7.1 |
| 3 | font-awesome | 0.96 B | 2.31 % | 6.7.2 |
| 4 | swiper | 0.74 B | 1.78 % | 11.2.6 |
| 5 | chart.js | 0.61 B | 1.47 % | 4.4.9 |
Rows 6 to 20, plus the split by source and by region, are on the traffic page.
Built to be boring
Two independent DNS operators, four transit providers, anycast in 61 cities, and origins in three separate facilities. A whole provider can fall over without a visible dip — that is the entire design goal.
Read how the routing decision is made on the edge network page.
Free, and staying that way
No account, no quota, no per-seat tier, no commercial plan hiding behind the free one. Bandwidth is donated by the operators listed on the project page, and the running costs are published there every quarter.