npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@jkup/whoiz

v0.3.2

Published

Who is actually serving this site? Enumerate a domain's endpoints and fingerprint the CDN and hosting provider behind each one.

Readme

whoiz

npm

Who is actually serving this site?

npx @jkup/whoiz mercedesamgf1.com

whoiz takes a domain, enumerates its endpoints (sitemap, robots.txt, and a polite shallow crawl), and fingerprints the CDN and the hosting provider behind every path and subdomain — then draws you a tree. Above: the main site is on Netlify, the shop is Shopify fronted by Cloudflare, and the media host is something whoiz doesn't recognise — so it says so.

Paths that are served exactly like the host are folded into one line so the differences stand out. Use --all to see every path, and --why to see the evidence behind each verdict. Add --image whoiz.png to get the card above as a PNG, ready to post — connectors and provider icons are drawn as vector shapes, so it looks the same on every machine.

Requires Node 20+. Install globally with npm i -g @jkup/whoiz to use it as plain whoiz.

Usage

whoiz <domain or URL> [options]

  --json               machine-readable output with full evidence
  --why                show the evidence behind each verdict
  --all                don't collapse identical siblings or truncate long lists
  -d, --depth <n>      crawl depth (default 2)
  -m, --max <n>        maximum URLs to fetch (default 100, or 30 with --no-crawl)
  -c, --concurrency    parallel requests (default 8)
  -t, --timeout <ms>   per-request timeout (default 8000)
  --no-crawl           only use sitemap, robots.txt and the homepage
  --no-subdomains      ignore other hosts under the same domain
  -i, --image <file>   also write the tree as a shareable PNG (or SVG if the name ends in .svg)
  --scale <n>          PNG pixel density (default 2)
  --ascii              plain ASCII tree characters
  --no-color           disable colours (also honours NO_COLOR)

How it works

Every host gets resolved (CNAME chain, A/AAAA, ASN via Team Cymru DNS, TLS issuer), and every URL gets one GET with redirects tracked. A table of declarative rules scores the evidence per provider on two layers:

  • edge — who terminates the connection: CNAME targets, published IP ranges, CDN headers like cf-ray, x-amz-cf-pop, x-served-by: cache-…
  • origin — whose app-layer headers made it through the proxy: x-vercel-id, x-nf-request-id, x-github-request-id, fly-request-id, x-render-origin-server, …

If only edge signals fire, the CDN is either serving it directly (Pages, Workers, cached) or hiding the origin; whoiz says no upstream seen rather than guessing.

Recognised: Cloudflare (+ Pages), Vercel, Netlify, CloudFront, S3, Fastly, GitHub (+ Pages), Fly.io, Render, Google Cloud, Firebase, Azure, Akamai, Heroku, Railway, DigitalOcean, Hetzner, Shopify, Squarespace, Wix, Webflow, WordPress.com, Framer, Discourse, Ghost, HubSpot, Substack, GitBook, ReadMe, Zendesk, Statuspage, Mintlify. Adding one is a couple of lines in src/fingerprint/rules.ts.

Etiquette

whoiz identifies itself with a whoiz/<version> user agent linking to this repo, obeys robots.txt, keeps request volume modest by default, backs off on the first 429, and never follows links off the domain — other subdomains are only probed at their root plus a few linked pages. It only talks to the target and to DNS; there are no third-party APIs or telemetry.

Limitations

  • Endpoint discovery is best-effort: there is no way to list a site's routes from outside. SPAs and API-only hosts will mostly show their shell.
  • A proxy that strips upstream headers makes the origin invisible. no upstream seen is an honest "don't know", not "there is nothing behind it".
  • No JavaScript rendering.

Development

npm install
npm run dev -- vercel.com      # run from source
npm test                       # vitest
npm run update-ranges          # refresh bundled CDN IP ranges
npm run build                  # dist/cli.js

MIT © Jon Kuperman