The implicit open-source contract and why it breaks
Open source rests on a functional promise: the code is readable, modifiable, redistributable. This promise is contractual — it is written into the licence. What is not written is the continuity of free features, the stability of scope, or the longevity of maintainers.
The breakages observed in 2025–2026 are not all the same in nature. Some are deliberate commercial decisions (Planka, Grist, Portainer): an existing feature migrates to a paid tier. Others are architectural drift (Netdata): advanced features progressively require the vendor's cloud. Others are governance risks (Jellyfin): lead maintainers leave, and no one knows if the project will survive.
For an agency, these three scenarios have very different consequences — but all are detectable in advance, with the right indicators.
Five recent documented cases
Scroll the table
| App | Version | Event | Agency impact | Date |
|---|---|---|---|---|
| Planka | v2.2.0 | SSO/OIDC removed from the community edition, moved to paid Pro tier | SSO accounts deactivated without automatic migration on update | August 2026 |
| Grist | v1.7.18 | OIDC/SAML removed from grist-core, reserved for the Enterprise edition | Any existing IdP integration stops working after update | 2026 |
| Netdata | Agent ≥ 2.x | Alerts Configuration Manager and AI alerts restricted to Business cloud plan | Local monitoring stays functional, but centralised management requires Netdata Cloud | 2025–2026 |
| Portainer | 3.0 | CE frozen at 2.45 LTS, all R&D moves into Portainer Business 3.x | No Portainer CE 3.x; 3.x access only via a proprietary tier capped at 3 nodes | September 2026 |
| Jellyfin | 12.0 | 3 founders leave the project in July 2026 (burnout + disagreements) | Governance risk absorbed: version 12.0 shipped on 7 September 2026 despite departures | July–September 2026 |
Signal 1 — Legal governance: who controls the project?
The first question is not technical, it is legal: who controls the repository, the trademark, and strategic decisions?
A single-shareholder LLC means one individual decision can change the model overnight. Planka is operated by a commercial entity that can, at any time, redefine what belongs to "Community" and what belongs to "Pro".
A non-profit foundation (Software Freedom Conservancy, Apache Software Foundation, Linux Foundation) or a contributor cooperative (Codeberg model) creates institutional friction before any change of direction. By-laws require a vote, transparency, a delay. This is not an absolute guarantee, but it is a verifiable brake.
How to verify. The GOVERNANCE.md or MAINTAINERS.md file at the root of the repository. The GitHub organisation's About page. The trademark register (USPTO, EUIPO). If the project is under a Fiscal Sponsor (Open Collective Foundation, NumFocus), the sponsor entity's page. Jellyfin, for example, is hosted under the Software Freedom Conservancy — which contributed to the project surviving the departure of its founders.
Signal 2 — Contribution velocity: is the project alive?
An open-source project that has received no commits in 18 months is not "stable" — it is in undeclared end-of-life. Contribution velocity measures the project's capacity to absorb security bugs, keep up with dependencies, and integrate fixes.
Indicators to measure. The GitHub Pulse over 30 days: number of commits, open and closed pull requests, active contributors. Release cadence: a healthy project publishes regular versions, even minor ones. Average response time on critical issues (labels bug, security). The closed/open ratio on issues older than 90 days.
Via the GitHub API, the following command gives the raw pulse: curl "https://api.github.com/repos/<owner>/<repo>/stats/commit_activity" returns 52 weeks of commits. A project whose 12-week average is below 2 commits per week deserves close attention.
What this does not tell you. A very active project may be so because it is accumulating technical debt or producing frequent breaking changes. Velocity is a necessary signal, not a sufficient one.
Signal 3 — Funding structure: where does the money come from?
The funding model of an open-source project foreshadows its commercial trajectory. This is not a moral judgement — a project needs resources to last — but a risk indicator.
VC-backed: an investor expects a return. Monetisation pressure increases over time. Features that were free become conversion levers. Grist Labs received funding before restricting SSO to its Enterprise edition.
Bootstrapped with commercial revenue: the business model is known from the start (support, managed hosting, pro features). The risk is more predictable. Planka always had a Pro version, but the boundary shifted without warning.
Donations or grants only: the project is vulnerable to revenue fluctuations. But commercial decisions remain rare. Jellyfin operates primarily on this model.
How to verify. The project's Open Collective page (amounts received, expenses, sponsors). The FUNDING.yml file in the GitHub repository. Crunchbase for funding rounds. GitHub issues or discussions titled sustainability, funding, business model. The question is not "is it VC-funded?" but "how is the return on investment planned, and on what horizon?"
Signal 4 — Licence duality: what the licence actually permits
The open-source licence says what you can do with the code. It does not say what the vendor will do with the code in the future. Two situations to distinguish.
The licence is permissive or classic copyleft (MIT, Apache 2.0, GPL, AGPL): you have the right to fork, modify, and redistribute. If the vendor changes course, you can continue with the last free version. This is the case with Jellyfin (GPL-2.0) — all published versions remain freely forkable.
The licence is a Business Source Licence (BSL) or SSPL: these licences contain a "change date" or commercial restriction clause. HashiCorp, Elasticsearch, and others have demonstrated that a licence migration applies to future versions, not past ones. An existing deployment is protected; a future deployment may not be.
How to verify. The LICENSE file at the root. grep -r 'Business Source License\|SSPL\|Commons Clause' <repo>/ to detect restrictive clauses. The git history of LICENSE: a recent modification is a strong warning signal. The project's SPDX page if it exists. A project may also have a dual licence (community edition under AGPL, enterprise edition under commercial licence) — which is readable and predictable.
Signal 5 — Fork-ability: can you take back control?
Fork-ability is the real — not theoretical — capacity to continue the project autonomously if the vendor changes course. It depends on several technical factors.
Public CI. If the build pipeline is in .github/workflows/ or a public equivalent, you can reproduce the artefacts. If the CI relies on private runners, undocumented secrets, or a proprietary system, the fork will not compile.
Proprietary dependencies. Some projects include calls to vendor services (analytics, licensing, telemetry) that do not work without a proprietary account or API key. grep -r 'app.getport.io\|license.example.com\|api.vendor' <repo>/src/ to detect these dependencies.
Obfuscated code or precompiled binaries. A repository containing .jar, .dll, or minified files without corresponding source creates opaque zones in the fork.
How to assess. Clone the repository and attempt a local build from zero following only the public documentation. Analyse the result of docker build — if the image pulls layers from a private vendor registry, fork-ability is compromised. Verify that the technical changelog is public and readable (not only a marketing feed).
Pre-deployment verification protocol for a client
Legal governance
Look for
GOVERNANCE.mdorMAINTAINERS.mdat the root. Identify the legal entity behind the project (GitHub Org → About, trademark WHOIS). Check whether a Fiscal Sponsor is declared inFUNDING.yml.Velocity over 90 days
Run
curl "https://api.github.com/repos/<owner>/<repo>/stats/commit_activity" | jq '[.[-13:][].total] | add'to get the total commits over the last 13 weeks. A result below 20 warrants investigation. Also check the date of the last release tag.Business model
Look for the project's Open Collective page. Consult Crunchbase for funding rounds. Read GitHub issues or discussions labelled
sustainabilityorbusiness. Identify whether the project has a Pro edition and read precisely what it contains.Licence audit
Read the
LICENSEfile in full. Rungrep -ri 'business source\|commons clause\|SSPL\|change date' ./at the root of the cloned repository. Consult the git history of the file:git log --follow -p LICENSEto detect a recent change.Fork-ability test
Clone the repository and run the documented build from zero. Inspect the Dockerfile with
grep -E 'FROM|COPY|RUN' Dockerfileto detect proprietary sources. Rungrep -r 'http' <repo>/src/ | grep -v github | grep -v localhostto identify outbound calls to vendor services.Search for prior breakage
Search GitHub Issues for labels
breaking-change,migration,deprecation. Read the CHANGELOG of the last 6 versions. Consult community forums (Reddit r/selfhosted, Hacker News) for recent discussions about the project.Maintainer network assessment
Consult the list of active contributors (
/graphs/contributorson GitHub). Check whether more than 60% of commits come from a single person — high bus factor risk. Look for whether external organisations contribute regularly.Client verdict documentation
Write a one-page summary per deployed app with: exact licence, legal entity, velocity score, identified business model, assessed fork-ability. Keep this document in the project folder. Schedule an annual review to detect drift before it becomes an incident.
What these signals do not prove
A project that passes all five signals can still disappoint. Associative funding does not protect against gradual inactivity. A GPL licence does not protect against a project ceasing to be maintained. Distributed governance does not protect against technical disagreements that fragment the community.
These signals reduce risk — they do not eliminate it. The most robust stance for an agency is to treat each self-hosted app as a production dependency: it is monitored, reviewed annually, and has a documented exit strategy from day one of deployment. The question is not "is this app reliable?" but "if it changes its model in 18 months, how long do we need to migrate clients?"
Conclusion: audit before deploying, not after
The five cases from 2025–2026 share one thing: in each, the signals were readable before the breakage. Planka's LLC structure, Grist's investor presence, Portainer's public roadmap, Jellyfin's commit concentration — all of it was in the GitHub repository, in the issues, in the changelogs.
The difference between an exposed agency and a serene one is less about app choices than about qualification rigour. Deploying a self-hosted stack for a client without having checked these five signals means implicitly accepting that a decision taken in an office on the other side of the world could create an emergency in your schedule.
The audit takes 30 to 60 minutes per app. It is documented in a single page. And it is reviewed once a year — which is generally enough to see changes coming before they become incidents.