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

sssssssssss

v1.0.5

Published

the static site generator so poorly named you'll never trust it!

Downloads

100

Readme

code name: sssssssssss

tests codecov

because i am not sure what to call this yet other than yet another static site generator.

example output can be seen here

usage

the cli tool accepts the path to an options.json file, in this format:

{
  "baseFolder": "./example" // Where your posts/templates/static files are located
  "baseUrl": "/", //subdomain if required
  "outputPath": "./docs", //Where to put the generated html files
  "pageTemplate": "page.ejs", //The name of your page template, this is used for every markdown file in your "basePath"
  "baseTemplate": "base.ejs", // The base template that will be used by both index+page views
  "metadata": { //The metadata object is provided to each rendered view
    "blogTitle": "Test Blog"
  }
}

You can run it using sssssssssss my-options-file.json

Pages

Each page stored in your basePath will be generated into it's own html file. Each entry allows for a header in this format:

---
title: Some blog post
date: 2022-01-01
---

You can provide any additional values in the header and they will be available for use within the template.

Markdown Assets

If you require the use of additional assets in your markdown files, you can include them using the @asset For example: @asset(script, "public/js/script.js") This file maps to your /static folder. This will be converted to the proper html tag at compile time, and ensure your baseUrl has been included.

Index Page

The index is a special template that recieves an array of pages found in the basePath directory. This can be used to list links to each blog post.

The page structure is:

{
  title: 'the blog title in a url friendly format'
  date: '2022-01-01'
  ...headers, // any additional headers provided
  content: 'html string of template content',
  slug: 'the-blog-title-in-a-url-friendly-format',
  path: '/qualified/path/to/the-blog-title-in-a-url-friendly-format.html'
}

example

When you clone this repo, you can use the directories provided to generate an example using: node debug.js example-options.json. This will create an output directory where you can see the outputted files.

arch

sssssssssss is broken down into three main components:

ContentExtractor

responsible for parsing all of the page files within the /posts directory. It renders the markdown, as well as applies the transformation to @asset tags. The return value from the extractor is an array of pages in the following structure:

{
  title: '',
  date: '',
  //...another other header metadata
  content: 'html content of markdown page',
  slug: '<date>-slugified-version-of-title',
  path: 'url html path to file'
}

TemplateRenderer

responsible for converting each of the processed pages through the ejs compiler. This is a two step process. First the page is rendered to the /templates/page.ejs, then the /templates/base.ejs. Each of these templates receive the page object from the ContentExtractor in their view.

The TemplateRenderer is also called to render the index page. This page uses the /templates/index.ejs and recieves all of the pages, as well as the full options metadata in it's view.

ContentWriter

responsible for taking the rendered pages and outputting them to the options.outputPath. It will write all index, and pages. As well as copy over any static files it finds in the /statics directory.