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

stackspy

v0.1.0

Published

StackSpy --------------------- BETA STATUS -- NOT ALL MODULES WORK

Readme

StackSpy

BETA STATUS -- NOT ALL MODULES WORK

This plugin identifies what technologies comprise a web app's stack.

##Use StackSpy can be required like any other node module, and it returns an object like the example in the design section.

StackSpy can also be used as a command line tool by passing in a url:

  node stackspy.js http://example.com

Design

The main file takes in a url and returns an object of results. Should a non fatal error occur, the object will contain an error flag set to true.

For sanity: All technology names are lowercased regardless of official spelling. The ending 'js' in JavaScript technologies are dropped.

If you don't agree with this convention, we can have an empathetic feedback session where we discuss the merits of this approach, and then change nothing.

ex:

  { client: [
    { name: 'jquery', 
      found: true, 
      version: null, 
      src: 'example.com'
    },
    { name: 'backbone',
      found: true,
      version: null,
      src: 'example.com',
    }],
    server: [
    { name: 'node',
      { certainty: 0.7,
        version: X.X.XX,
        misc: {
          middleware: express,
        }
      }
    }]    
  }  

Client

The client-side technologies are identified by parsing content returned from from HTTP requests.

A request (or series of requests) are made and each request gets passed off to modules which determine if particular technologies are present client side.

Each module should expect a response object straight from an HTTP request made by the request node module.

Each module should return an object that contains the technology tested for, if that technology was found, and if so, the source url and version for that technology.

eg:

  { name: 'backbone',
    found: false,
  } 

  /** OR */
  { name: 'react',
    found: true,
    version: X.X.XX,
    source: cdnjs.com/foo/bar/react.min.js,
  }

###Server The server-side technologies are teased out by piecing together various clues, using the url of the website to interrogate the server.

Each module recieves the url against which it should work.

Each module should return an object with the technology it was checking against, the certainty it found that technology on a 0-1 scale, versioning information, and plugin/middleware information dependent on the technology.

eg:

  { name: 'rails',
    certainty: 0.1,
    version: null
  }

  /** OR */
  
  { name: 'node',
    certainty: 0.7,
    version: X.X.XX,
    misc: {
      middleware: express,
    }
  }

###Certainty The working definition of certainty is (number of clues hitting positive) / (total number of clues run for that tech).

This definition will advance as the project does.