Draft — nothing here is settled. This is a first cut, published so it can be argued with. No lawyer has seen it. The name is not final. Do not rely on any of it.

The other half

The maintainer profile

Both sides publish. Licensees say what they are standing on; licensors say who they are and whether they are all right.

maintainer/0.1 JSON Schema Works with no licence at all

The question it answers

Is React’s maintainer Meta, or three unpaid people?

Take any dependency you rely on and try to answer that in under ten minutes. For most of your tree you cannot, and for the ones where you can, the answer often surprises you. Which means that “give where it is needed”, the principle every giving-back scheme rests on, is not actually a principle. It is a wish, because need is not computable.

A maintainer profile is a small JSON file that makes it computable. Walk the tree, resolve each component to its maintainer, read their profile. The give-back report stops being a gesture and becomes a picture.

https://your-project.example/.well-known/maintainer.json

What it says

FieldWhat it is, and why it is that shape
structure For-profit, not-for-profit, foundation, government, unincorporated, or individual. The single most useful fact, and the one people most often get wrong when guessing.
maintainers.band 1, 2-5, 6-20, 21-100, 100+. Bands, never headcount. Headcount is employment information and nobody needs it; a band answers the only question a licensee actually has.
maintainers.paid none, some, all. Combined with the band, this is the fragility signal.
funding.sufficient no, partly, yes. Self-assessed. The most useful field in the file and the hardest to fill in honestly.
funding.channels Where money can go. Existing channels only. GitHub Sponsors, Open Collective, an invoice address. This project runs no payment rail and never will.
funding.non_monetary What would help that is not money. Frequently the honest answer, and almost never asked.
products Package URLs, so a crawler can join a dependency tree to this profile without guessing.
updated A date. A profile untouched for four years is itself a signal, and an intended one.
Deliberately small

Every field asked for is a field somebody has to keep up to date, unpaid, forever. So the format asks for eight things and stops. A profile that is a chore to maintain becomes a profile that is stale, and a stale profile is worse than none because it is believed.

Two profiles, opposite ends

Loading…

Notice what the foundation’s profile does in its funding note: it tells you to give your money to somebody else. That is the behaviour the format is trying to make easy, and it is unavailable to any scheme where the recipient also runs the payment rail.

The conditional obligation

This is the part that makes the whole arrangement stand up without anybody policing it.

Licence section 5.2

If a licensor stops publishing its maintainer profile, the licensee’s obligation to declare lapses in respect of that licensor’s software, for as long as the failure continues.

WHEN BOTH PUBLISH Licensor publishes maintainer.json Licensee owes give-back.json duty applies WHEN THE LICENSOR STOPS Licensor profile gone or stale Licensee duty suspended duty lapses immediate licensor only, never down a chain

This does four things at once, which is unusual for one sentence of licence text:

  1. It kills the extraction objection. Nobody can say “you are taking from me and giving nothing”, because the obligation is symmetric and the licensor goes first.
  2. It gives licensees a reason to want their licensors alive and visible. A dead upstream is not a windfall; it is a project you now depend on that has stopped talking.
  3. It gives a lawyer a defined, verifiable trigger. Fetch a URL. It is there or it is not. That is a much better answer than any test involving good faith.
  4. It is self-enforcing with no institution at all. Nothing has to exist forever for this to keep working.

And because almost everyone building on a platform of this kind ends up being both a licensor and a licensee, the incentive turns inward. Dropping your own profile to escape your duty would simultaneously void the duty owed to you. You would be disarming yourself. That is a stronger mechanism than shame, and it needs no audience.

Why the lapse does not travel

Section 5.3 confines it to the immediate licensor. Without that limit, one neglected profile deep in a tree could cascade unpredictably, and a dependency cycle (A depends on B, B depends on A) could unravel the obligation entirely. Confining it also keeps the trigger checkable by the person who has to act on it, which matters more than theoretical completeness.

You do not need the licence to publish one

This is the point most worth taking away from the page. The profile format has no dependency on the licence whatsoever. Any project on any licence can publish one this afternoon, and several good reasons to do so have nothing to do with giving back:

  • It answers, once, the question you get asked in every enterprise procurement review.
  • It says plainly that you are one person and unfunded, which is information your users should have and currently have to infer.
  • It gives you somewhere to write “we do not need money, we need triage”, which almost nobody currently has anywhere to say.
  • It is how security.txt spread: publish an example and a page, not a specification, and let people copy it.

If the format spreads before the licence does, the licence becomes the formalisation of something people already do. That is the easiest adoption path any licence has ever had, and it is the intended one.