Skip to content

Relicense to AGPL-3.0, and say in writing that the models are yours - #10

Open
Oliver-Johnson wants to merge 1 commit into
mainfrom
claude/agpl-relicense
Open

Relicense to AGPL-3.0, and say in writing that the models are yours#10
Oliver-Johnson wants to merge 1 commit into
mainfrom
claude/agpl-relicense

Conversation

@Oliver-Johnson

Copy link
Copy Markdown
Owner

Relicenses from MIT to AGPL-3.0-or-later, with two additional clauses under section 7.

Not legal advice. This implements the intent you described — worth a solicitor's eye before you rely on it commercially.

Why AGPL

MIT let anyone take this, close it, and sell it. It already required your copyright notice be kept, which is the part people quietly drop.

AGPL keeps the software free in the sense that matters here: distribute it, or run a modified version as a public service, and you owe your users that version's source under the same terms. The network clause is the one that counts for a browser tool — without it, someone could host "DrawerForge Pro" behind a paywall and owe nothing.

It does not forbid charging. No open-source licence can. It removes the point of taking it closed.

The output exception (section 7 additional permission)

This is the clause that does what you actually asked for:

The files this program generates — including but not limited to STL, 3MF and ZIP files, and the geometry described in them — are NOT covered by this licence and are not works derived from it. You own the models you make with this program. You may use, share, modify and SELL them, and the objects printed from them, for any purpose and without restriction, attribution or obligation of any kind.

Program output generally isn't a derivative work anyway — but here the geometry is computed by the program's own code, and "generally" is a poor thing for someone to rest a small print business on. Written down, it cannot be argued about.

The name term (section 7(e))

7(e) exists for precisely this: declining to grant trademark rights. "Drawerforge", "Baseplate Studio" and the domain are reserved, with the customary carve-out for describing origin ("based on Drawerforge"). A fork gets the code and picks its own name.

This is often the more effective lever than the licence itself — it's what stops a rehost from looking like yours.

The honest limitation, stated in the file

Relicensing is prospective only. Everything published under MIT stays MIT for anyone who has it; that cannot be withdrawn, and pretending otherwise would be worse than useless. LICENSE says so explicitly rather than leaving someone to discover it. Anyone can still fork the last MIT commit and continue under MIT.

You are the sole copyright holder (both git identities are you, no outside contributors), so no one had to agree to this.

Third-party code

vendor/ is untouched. three.js (MIT) and JSZip (MIT or GPLv3) keep their own terms — which is exactly why they can sit inside an AGPL work. LICENSE now names them so the combined position is legible.

Scope

Three files: LICENSE, README.md, package.json (SPDX id → AGPL-3.0-or-later). Nothing in the build or the test suite asserted the licence and the pages don't embed it, so there is no generated output to rebuild.

README's "free, open" framing, the fork-and-self-host instructions and CONTRIBUTING all stay accurate — AGPL is still open source. I added a short note to Self-hosting explaining the source-offer obligation for modified public deployments, since that's the one new duty a self-hoster picks up.

What this does not do

It does not stop someone selling copies, only selling closed copies. If you want commercial use forbidden outright, that needs a non-open-source licence (PolyForm Noncommercial, BUSL) — which would also block a print shop using the tool internally, and would mean rewriting the README's open-source framing. Say the word and I'll do that instead.

🤖 Generated with Claude Code

MIT let anyone take this, close it, and sell it. It also already required the
copyright notice be kept, which is the part people quietly drop. AGPL keeps the
software free in the sense that matters here: distribute it, or run a modified
version as a public service, and you owe your users that version's source under
the same terms. It does not forbid charging -- no open licence can -- it removes
the point of taking it closed.

Two additional clauses under section 7 carry the intent the licence alone does
not.

The output exception says what should never have to be argued: STL, 3MF, the ZIP
and the geometry in them are not covered and not derived works. Sell the files,
sell the prints. Program output generally is not a derivative work anyway, but
here the geometry is computed by this program's own code, and "generally" is a
poor thing to rest a small business on.

The name term is 7(e), which exists for exactly this. The code is there to build
on; "Drawerforge" is how a visitor knows whose work they are looking at. A fork
gets the code and picks its own name.

Relicensing is prospective only and the file says so. Everything published under
MIT stays MIT for whoever has it -- that cannot be withdrawn and pretending
otherwise would be worse than useless. Sole copyright holder, so no contributor
had to agree.

vendor/ is untouched: three.js and JSZip keep their own MIT terms, which is why
they can sit inside an AGPL work at all. LICENSE now names them.

Nothing in the build or the tests asserted the licence, and the pages do not
embed it, so this is three files.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@Oliver-Johnson Oliver-Johnson left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict: incomplete as a relicense — one confirmed defect that would ship a false licence statement to users, plus several files the sweep missed.

Independent review. I have deliberately taken no position on whether AGPL is the right choice — that is Oliver's call and it is not a technical question. What follows is: if he merges this, does he get what he expects? Right now, not quite.

Not legal advice, and I am not a solicitor. The observations below are about consistency and mechanics, not about what the law would do.


1. Blocking: every Baseplates download still tells the user the software is MIT

src/ui.js:1102, untouched by this PR:

lines.push('Free and open source (MIT). Runs entirely in your browser.');

That line is written into the README.txt inside the exported ZIP — the artefact every Baseplates user actually downloads and keeps. After this merge, the tool would still be handing out a document asserting it is MIT-licensed.

The irony is sharp: it sits inside the very output the new section 7 exception is written to carve out, so a user reading their own download is told the program is MIT. If anyone ever wanted to argue they received an MIT grant, this is the strongest single piece of evidence they could point at, and it is dated after the relicense.

One line, but it is the difference between "relicensed" and "relicensed except where it counts".

2. Also missed

  • package-lock.json:10 still carries "license": "MIT" for the root package. It regenerates on the next npm install, but until then the lockfile contradicts package.json in the same commit.
  • No licence notice or source link on the shipped pages. The footers say "Drawerforge is free and open" and link to the issues page, not to source. The PR reasons "the pages don't embed it, so there is no generated output to rebuild" — I think that is the miss rather than the justification. Under AGPL section 13 the offer of Corresponding Source is the whole mechanism, and the README now tells self-hosters to put a link in their footer while Drawerforge's own footer has none to copy. build.js already generates these pages, so it is the natural place for both.
  • No SPDX headers or per-file notices anywhere in src/. Under MIT that was a shrug; under AGPL it matters more, and the FSF's own guidance is to state section 7 additional permissions in the files they apply to. As it stands, anyone who lifts src/bins/bin.js on its own gets a file carrying no notice at all — and no trace of the output exception, which is the clause you most want travelling with the code.
  • CONTRIBUTING.md says nothing about licensing. Fine under MIT where inbound=outbound is uncontroversial; worth one sentence under AGPL so a contributor knows what they are agreeing to.

3. GitHub will probably stop showing a licence badge

The repo currently reports:

$ gh api repos/Oliver-Johnson/Baseplate-Studio/license
{"name":"MIT License","spdx":"MIT","path":"LICENSE"}

This PR puts 69 lines of custom preamble (project notice, MIT-history paragraph, two section 7 sections, third-party table) ahead of the AGPL text — about 9.4% of the file. GitHub's detector matches on normalised similarity with a fairly tight threshold, and prepended non-licence content is the classic way to fall below it. I could not run licensee locally to confirm, so treat this as a likely outcome rather than a certainty — but it is worth checking the sidebar immediately after merge, because "Unknown" reads worse to a visitor than either MIT or AGPL.

The conventional structure avoids it: LICENSE holds the verbatim AGPL text and nothing else, and the additional permission and name term live in a separate file (LICENSE-EXCEPTIONS, or COPYING.ADDITIONAL) referenced from the source-file headers and the README.

4. The AGPL body itself is clean

I diffed lines 71–732 against https://www.gnu.org/licenses/agpl-3.0.txt. Two differences, both cosmetic and both harmless:

  • one re-wrapped line (published by becoming published / by) inside the "How to Apply These Terms" appendix, which is non-normative boilerplate, not part of the terms;
  • a trailing blank line.

Nothing in the operative text is altered. Good.

The sole-copyright-holder claim also checks out: git log on main shows two author identities, both Oliver. Worth knowing that 101 commits carry Co-Authored-By: Claude … trailers — that does not create a copyright interest, but a diligent third party reading the history will see a non-Oliver identity on most commits, so it is worth being ready to explain.

5. On the two section 7 clauses

The output exception reads correctly and is the clause most worth having. Program output is very unlikely to be a derivative work in the first place, so this is belt-and-braces — but it is cheap belt-and-braces, and "very unlikely" is a poor thing to ask someone to rest a print business on. The scoping sentence ("applies to the output alone; combining source code into another program is not covered") is the right guard.

The name term's citation looks off. It is filed entirely under 7(e), which covers "declining to grant rights under trademark law". The first paragraph does exactly that and is squarely 7(e). But the second says:

A modified version must be given a different name…

That is an affirmative requirement, not a declination — closer to 7(b) (preserving attributions) or 7(c) (prohibiting misrepresentation of origin), and arguably stricter than either. Section 7 permits only the six enumerated categories, and a term outside them may be removed by any recipient. So the practical risk is not that the licence breaks — it is that the sentence you are relying on most is the one most easily struck out. Citing 7(b), 7(c) and 7(e) together, or recasting the requirement as a pure declination of trademark permission, would be sturdier.

6. Two things worth knowing before deciding, stated neutrally

Not arguments for or against — just consequences I would want in front of me:

  • AGPL does not stop a verbatim rehost. Someone can take this as-is, put it on their own domain with ads, and owe nothing but the notices — that is true under MIT and equally true under AGPL, because they have modified nothing. What actually addresses that scenario is the name term, not the copyleft. Worth being clear-eyed that the clause doing the work here is the trademark one, and that a trademark policy can sit alongside MIT (Rust and Python both do this) if the copyleft is not independently wanted.
  • AGPL's network clause is unusually weak for this particular program. Section 13 exists for server software where users never see the code. Drawerforge is a self-contained static page that computes everything client-side — a user has already been handed the running code. The obligation is real for a modified deployment (built HTML is not the preferred form for modification, so src/ is still owed), but it is a much smaller lever here than it would be on a hosted service. Against that, AGPL carries a real adoption cost: a lot of organisations have blanket bans on it, and the handover records that the bottleneck for this project is that the site has not been advertised.

The prospective-only paragraph is correct and honestly stated, and putting it in LICENSE rather than leaving it to be discovered is the right instinct.


Summary of what to fix if this merges: src/ui.js:1102, package-lock.json:10, a footer source link + licence name on the generated pages, SPDX/notice headers in src/, and the LICENSE file structure if the GitHub badge matters.


Reviewed independently; I am not the approver. Flagging for the record that this PR was not requested — it arrived on the other session's own initiative.

Comment thread LICENSE
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Drawerforge

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Detection risk. 69 lines of custom preamble sit ahead of the AGPL text (~9.4% of the file). GitHub's licence detector matches on normalised similarity, and prepended non-licence content is the usual way to fall under the threshold. The repo currently reports {"name":"MIT License","spdx":"MIT"}; after this it may well report nothing.

I could not run licensee here to confirm, so: worth checking the sidebar right after merge.

The structure that avoids it — and that is also the FSF's own recommendation for section 7 terms — is LICENSE holding the verbatim AGPL and nothing else, with the additional permission and the name term in a separate referenced file plus per-file notice headers.

The AGPL body itself (lines 71-732) I diffed against gnu.org and it is verbatim, bar one re-wrapped line in the non-normative "How to Apply" appendix. That part is fine.

Comment thread LICENSE
work (for example, "based on Drawerforge") and in reproducing the content of
this licence and its notices.

A modified version must be given a different name, so that people can tell your

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This sentence is an affirmative requirement, but the section is cited solely under 7(e), which covers declining to grant trademark rights. Requiring a rename is closer to 7(b) (preserving attributions) or 7(c) (prohibiting misrepresentation of origin).

It matters because section 7 permits only the six enumerated categories, and a term outside them may be removed by any recipient. The risk is not that the licence breaks — it is that the clause you are relying on most is the one most easily struck out.

Citing 7(b)/(c)/(e) together, or recasting this as a pure declination of trademark permission, would be sturdier. (Not legal advice.)

Comment thread package.json
"private": true,
"description": "Gridfinity baseplates and bins, built to the drawer you actually have.",
"license": "MIT",
"license": "AGPL-3.0-or-later",

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

package-lock.json:10 still carries "license": "MIT" for the root package and is not in this diff. It regenerates on the next npm install, but until then the two files in the same commit disagree.

Comment thread README.md
2. Enable **GitHub Pages** (deploy from branch, root).
3. Done — Baseplates at the root, Bins at `/bins/`, the guide at `/guide/`.

Hosting it unmodified needs nothing further. If you **change** it and put it in front of

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This tells a self-hoster to put a source link in their footer — but Drawerforge's own footers (src/template.html:277, src/bins/template.html:373) link to the issues page, not to source, and name no licence at all ("free and open").

Under section 13 that offer is the entire mechanism, and the example a forker copies is the one in front of them. build.js generates these pages, so adding the licence name and a source link there is cheap — and it makes the claim in this paragraph true of the project making it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant