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

stackscore

v0.1.0

Published

One compose file that replaces a few hundred dollars a year of subscriptions — and the honest number for what running it costs you.

Readme


There are plenty of lists of self-hosted software. This one runs, and it tells you the number.

$ npx stackscore

  stackscore  31 apps · replaces 71 paid services

  starter                  $1,512/yr  6 apps · 4.0 GB
  The six that pay for themselves in a month. Runs on a Raspberry Pi 5.
  Vaultwarden, Nextcloud, Immich, Vikunja, n8n, FreshRSS

  media                   $739.20/yr  6 apps · 4.6 GB
  Photos, music, books and film, from a library you already own.
  Immich, Jellyfin, Navidrome, Audiobookshelf, Calibre-Web, Immich machine learning

  business                 $3,728/yr  8 apps · 5.1 GB
  Email marketing, invoicing, support and scheduling.
  Cal.com, Listmonk, Invoice Ninja, Chatwoot, Formbricks, Documenso, n8n, Jitsi Meet
stackscore build starter --out stack
cd stack && docker compose up -d

You get four files, all of them meant to be read before they are run:

| File | What it is | |---|---| | docker-compose.yml | your apps plus the databases they need, commented, images pinned | | Caddyfile | TLS and one subdomain per app, certificates handled automatically | | .env | secrets generated locally with crypto.randomBytes, written mode 600 | | README.md | what each app is, where to reach it, and how to back it up |

Nothing but Caddy publishes a port. Every app sits on the compose network behind the proxy, so a stack of twenty services still exposes exactly 80 and 443.

Build the stack that replaces your subscriptions

stackscore reads the output of unsubscribed, which finds recurring charges in a bank statement:

unsubscribed statement.csv --json > report.json
stackscore build --from report.json

Now the selection is not a curated guess — it is exactly the software that replaces what you are actually paying for, priced with your amounts:

  $786.96 a year in subscriptions replaced
  8 containers · 4.8 GB idle · priced from your statement

  What it replaces
             $144.00/yr  Calendly                    your amount
             $143.88/yr  Dropbox                     your amount
             $120.00/yr  ChatGPT Plus                your amount · only 50% of $240.00 is really displaced
              $57.60/yr  Netflix                     your amount · only 30% of $191.88 is really displaced

  What it costs to run
             $288.00/yr  8 GB VPS  (needs ~5.3 GB with OS overhead)
             $498.96/yr  net, before your own time

  Not covered by anything here
  Adobe Creative Cloud, NordVPN, Rocket Money / Truebill

Why the number is smaller than you expected

Because most of these tools do not tell you the truth, and a number you cannot defend in a comment thread is worth nothing.

Partial replacements are discounted. Mealie replaces HelloFresh's meal planning; it does not replace the groceries. Navidrome replaces Spotify's player, not its catalogue. Each of those carries a credit in data/apps.json — Mealie gets 30% of HelloFresh, Navidrome gets 40% of Spotify — and the output says so on the line.

Nothing is double-counted. Nextcloud and Immich both cover iCloud. It is counted once, at whichever app replaces more of it.

Hosting is subtracted, not omitted. Every app declares an honest idle RAM figure, those are summed, and the savings figure is never printed without the VPS it needs sitting next to it. The starter stack saves $1,512 a year and costs $288 a year to run. The net is $1,224 — before your own time, which is the cost this number genuinely cannot show you.

In --from mode, only what you pay for counts. An app that could replace Evernote earns nothing if you have never had an Evernote subscription.

The stacks

| Stack | Replaces | Apps | Idle RAM | |---|---|---|---| | starter | Dropbox, 1Password, Google Photos, Todoist, Zapier, Feedly | 6 | 4.0 GB | | productivity | Notion, Trello, Airtable, Pocket, Grammarly | 7 | 4.0 GB | | media | Plex Pass, Spotify, Audible, Kindle Unlimited | 6 | 4.6 GB | | developer | GitHub Team, Sentry, Mixpanel, ChatGPT Plus | 4 | 2.0 GB | | home | Ring, Nest Aware, Keepa, HelloFresh | 4 | 2.3 GB | | business | Calendly, Mailchimp, FreshBooks, Intercom, DocuSign, Zoom | 8 | 5.1 GB |

Combine them (stackscore build starter media) or add one app at a time (--app gitea).

Things it will tell you that you would rather it did not

Every app that has a trap declares it, and the warning ends up in the generated compose file and README:

  • Vaultwarden — losing this database loses every password you own. Back it up somewhere else and test a restore before you cancel anything.
  • Outline — requires an OAuth provider to log in at all. Plan that before you deploy it.
  • Frigate — object detection on CPU will eat a whole core per camera.
  • Jitsi — a real deployment needs four containers and a lot of open UDP. If you only need occasional calls, meet.jit.si is free and already running.
  • Listmonk — sends nothing on its own. You still need SMTP.

A stack that omits these is not simpler, it is just quieter about the parts that will wake you up.

Safety rails

  • Images are pinned, never :latest. CI fails if one floats.
  • build refuses to overwrite a non-empty output directory: a regenerated .env has new secrets and would lock you out of a running deployment. --force if you mean it.
  • .env is written 0600 and the generated .gitignore excludes it.
  • The generated README ends with a backup command, and the instruction to test a restore before cancelling anything.

Contributing

An app is one JSON object in data/apps.json — no code:

{
  "id": "miniflux",
  "name": "Miniflux",
  "category": "Reading",
  "stacks": ["starter"],
  "replaces": ["feedly"],
  "ram": 64,
  "port": 8080,
  "needs": ["postgres"],
  "compose": { "image": "miniflux/miniflux:2.2.3", "environment": { "...": "..." } }
}

CI checks that every replaces id exists in the catalog, that every credit is a fraction with an explanation attached, that no image floats on :latest, that every ${VAR} in a compose block gets a value in .env, and that no two apps claim the same subdomain.

npm test    # 38 tests, no dependencies

MIT. Fork it, rename it, ship it.