Skip to content
CDNPulse

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.

The shape of a CDNPulse URL
https://cdnpulse.org/npm/<package>@<version>/<file>
https://cdnpulse.org/rel/<owner>/<repo>@<tag>/<file>
41.6 Brequests / 30 days
1.78 PBegress / 30 days
96edge locations
99.987 %rolling uptime

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.

A stylesheet from an npm package
<link rel="stylesheet"
      href="https://cdnpulse.org/npm/bootstrap@5.3.6/dist/css/bootstrap.min.css">
A bundle from a repository release tag
<link rel="stylesheet"
      href="https://cdnpulse.org/rel/photoswipe/photoswipe@v5.4.4/dist/photoswipe.css">
A module graph, resolved for the browser
// 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"));
Two files, one response
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.

#PackageRequestsShareTop version
1bootstrap1.94 B4.66 %5.3.6
2jquery1.51 B3.63 %3.7.1
3font-awesome0.96 B2.31 %6.7.2
4swiper0.74 B1.78 %11.2.6
5chart.js0.61 B1.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.