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.
Maintainers
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 Meetstackscore build starter --out stack
cd stack && docker compose up -dYou 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.jsonNow 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 / TruebillWhy 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. buildrefuses to overwrite a non-empty output directory: a regenerated.envhas new secrets and would lock you out of a running deployment.--forceif you mean it..envis written0600and the generated.gitignoreexcludes 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 dependenciesMIT. Fork it, rename it, ship it.
