os-alt · annual report · 2026
State of Self-Host 2026
A build-time audit of every open-source alternative we list — what's still maintained, what's quietly aging, and where the self-host story has gaps.
Findings at a glance
- 17 of 168 (10%) self-hostable alternatives we track haven't shipped a commit in over 90 days. 10 of those (incl. 6 archived) are over a year cold.
- 8 repos with ≥1,000 stars haven't shipped in 180+ days — popular projects are not the same as maintained projects.
- 0 of 99 SaaS categories we cover have no mature self-host option (zero alive alts, or the best alive alt is under 500 stars).
Data: live GitHub fetch at build time across 227 unique repos listed as alternatives to 100 paid SaaS. Build date: 2026-05-11. Methodology: below.
1 · The freshness distribution
The single number worth quoting: 10% of self-hostable alternatives are stale or dead.
- alive ≤ 90d — 151 (90% of 168)
- stale 91–365d — 7 (4%)
- dead >365d or archived — 10 (6%, incl. 6 archived)
- unknown — 59 (could not parse last commit)
The healthy cohort is healthier than the headline number suggests: the median commit age across the 151 alive repos is 2 days. Half of all alive alternatives have committed inside the last quarter; the other half are within the alive band but moving more slowly.
Most-starred alive alternatives in the directory:
| # | OSS | Stars | Last commit |
|---|---|---|---|
| 1 | n8n n8n-io/n8n | 187.4k | 1d ago |
| 2 | Ollama ollama/ollama | 171.2k | 2d ago |
| 3 | Excalidraw excalidraw/excalidraw | 122.9k | 4d ago |
| 4 | Immich immich-app/immich | 100.3k | 1d ago |
| 5 | Hugo + Decap CMS gohugoio/hugo | 88.0k | today |
| 6 | Uptime Kuma louislam/uptime-kuma | 86.5k | today |
| 7 | Hoppscotch hoppscotch/hoppscotch | 79.1k | 9d ago |
| 8 | code-server coder/code-server | 77.5k | 2d ago |
| 9 | Grafana stack (Mimir + Loki + Tempo) grafana/grafana | 73.7k | today |
| 10 | Apache Superset apache/superset | 72.8k | 1d ago |
Full sortable view: /freshness/. Recent diffs: /insights/.
2 · Big and quiet
8 repos with ≥ 1,000 stars have no commit on the default branch in 180+ days.
These are the projects most likely to mislead a self-host shopper. Star count signals past traction, not current maintenance — a directory that doesn't disclose this is silently routing people toward unmaintained software. Below is the full list as the audit caught it; the /insights/ page tracks this cohort across builds.
| OSS | Stars | Last commit | Cold for |
|---|---|---|---|
| Maybe Finance maybe-finance/maybe | 54.1k | Jul 24, 2025 | 10mo ago |
| Focalboard mattermost/focalboard | 26.1k | Jun 11, 2025 | 11mo ago |
| BioDrop EddieHubCommunity/BioDrop | 5.71k | Jul 1, 2024 | 23mo ago |
| HTTPie Desktop httpie/desktop | 3.94k | Mar 19, 2025 | 14mo ago |
| Trilium Notes TriliumNext/Notes | 2.92k | Jun 24, 2025 | 11mo ago |
| OhMyForm ohmyform/ohmyform | 2.89k | Oct 31, 2024 | 19mo ago |
| Cuttlefish mlandauer/cuttlefish | 1.62k | Jun 27, 2024 | 23mo ago |
| Oncall (LinkedIn) linkedin/oncall | 1.25k | Aug 20, 2025 | 9mo ago |
3 · Where the OSS bench is thin
0 of 99 categories have no mature open-source self-host option in our directory.
"Mature" here is intentionally generous: ≥1 alive alt with at least 500 GitHub stars. Falling below that bar means the alt-side is either dead, stale, or so small that picking it is a bet on a single maintainer. Where the bench is thin, the SaaS isn't competing with self-host — it's competing with nothing.
A second concentration risk: 17 categories have ≥2 listed alternatives but only one is alive. If that single repo ever stops shipping, the open-source story for the whole category collapses to "the bench is thin" overnight.
4 · The savings math
Self-hosting the entire 100-SaaS corpus on one shared VPS: ~$ 30/mo vs paying ~$ 3,710/mo at SaaS list price.
That's ~$44,166/year in theoretical savings if a single buyer subscribed to entry-tier of every SaaS we cover and replaced them all with the listed primary OSS pick. No buyer does that, of course — the right reading is per-pick, which is what /calc/ computes.
The methodology is the same as /calc/: shared VPS sized to the heaviest pick (most tools fit on $5/mo; a few want $10–$20+), one paid seat per SaaS at its lowest-tier monthly price. The honest number per individual buyer is much smaller — most picks save tens of dollars a month, not thousands. The why bother case is durability and lock-in, not arithmetic.
5 · Methodology & caveats
- Sample. 227 unique GitHub repos listed as alternatives across 100 paid SaaS pages on os-alt. Curated by hand; not exhaustive of the open-source ecosystem. Full list with health flags.
- "Stale" and "dead" definitions. Last commit on the default branch > 90 days = stale. > 365 days OR repo archived = dead. These thresholds are coarse on purpose — many maintained projects in long-tail categories ship infrequently. A 91-day-quiet repo is not necessarily abandoned; it shows up in the stale bucket regardless.
- "Mature self-host option" definition. ≥1 listed alt that is alive AND has ≥500 GitHub stars. Stars are a noisy popularity signal; the cutoff is editorial, not statistical.
- Build-time, not point-in-time. All numbers refresh on every deploy — this page is regenerated against live GitHub state, so figures here will drift week-to-week. Re-run builds and the report re-runs. Snapshot-vs-live diffs live at /insights/.
- Selection bias. The corpus is biased toward better-known SaaS with at least one well-known OSS alternative — by construction. The "thin categories" count would be larger if we widened to every SaaS without a directory entry. Honest reading: within a curated set that already has open-source picks, this many categories still have no mature option.
- SaaS pricing. Lowest paid-tier monthly price per SaaS (free tiers count as $0). One seat. Ignores volume discounts and annual commits.
Cite this report as: os-alt, "State of Self-Host 2026", retrieved 2026-05-11, https://code-rho-dun.vercel.app/state-of-self-host-2026/. Press kit with PDF, quote-card PNGs, raw CSV. Frozen citable snapshot (CSV + JSON): /data/. Live source: /api/health.json. Re-derive any number from /api/insights.json + /api/saas/.