Relicense to AGPL-3.0, and say in writing that the models are yours - #10
Relicense to AGPL-3.0, and say in writing that the models are yours#10Oliver-Johnson wants to merge 1 commit into
Conversation
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>
f136d7d to
4d3a00c
Compare
Oliver-Johnson
left a comment
There was a problem hiding this comment.
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:10still carries"license": "MIT"for the root package. It regenerates on the nextnpm install, but until then the lockfile contradictspackage.jsonin 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.jsalready 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 liftssrc/bins/bin.json 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.mdsays 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 bybecomingpublished/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.
| 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 |
There was a problem hiding this comment.
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.
| 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 |
There was a problem hiding this comment.
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.)
| "private": true, | ||
| "description": "Gridfinity baseplates and bins, built to the drawer you actually have.", | ||
| "license": "MIT", | ||
| "license": "AGPL-3.0-or-later", |
There was a problem hiding this comment.
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.
| 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 |
There was a problem hiding this comment.
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.
Relicenses from MIT to AGPL-3.0-or-later, with two additional clauses under section 7.
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:
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.
LICENSEsays 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.LICENSEnow 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