Skip to content

Commit 3c1bbca

Browse files
TMHSDigitalclaude
andcommitted
docs: a "Shipping to stores" guide (CC-BY anti-DRM, copyleft vs stores, LGPL on consoles)
New docs/shipping.md, rendered at /guide/shipping/. Each claim quotes the licence with the date it was read: - CC BY 3.0 s4(a) and 4.0 s2(a)(5)(B) anti-DRM text, and the 4.0 s2(a)(4) circumvention waiver that 3.0 lacks - OpenGameArt's FAQ on GPL, LGPL, CC-BY-SA and CC-BY against Apple's terms - LGPL 2.1 s6 and 3.0 s4(d) relinking terms, and why a console that runs only signed code cannot meet them - a pointer to the Steam AI disclosure in the AI guide licenses.md links it from the CC-BY-3.0, CC-BY-4.0, GPL and LGPL rows, and every CC-BY or copyleft entry page links it beside "what it means" (56 pages). README lists it. Closes #181 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LpkeXRUqm7oDedPDk3QWtK
1 parent 0a848de commit 3c1bbca

5 files changed

Lines changed: 110 additions & 6 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ Read these before you mix packs into a commercial build.
253253
| [`docs/unreal.md`](docs/unreal.md) | Fab and Epic content, UE-only licences, and what the Unreal EULA forbids combining |
254254
| [`docs/provenance.md`](docs/provenance.md) | Judging a supplier, and keeping a paper trail |
255255
| [`docs/high-risk.md`](docs/high-risk.md) | Sources to avoid entirely |
256+
| [`docs/shipping.md`](docs/shipping.md) | Steam, consoles and app stores: CC-BY anti-DRM, copyleft vs store terms, LGPL on consoles |
256257
| [`docs/ai-assets.md`](docs/ai-assets.md) | AI-generated assets |
257258
| [`docs/fivem.md`](docs/fivem.md) | GTA-format and FiveM assets |
258259
| [`docs/for-publishers.md`](docs/for-publishers.md) | What the catalog records about a source, and how its publisher corrects it or opts out of a preview |
@@ -383,7 +384,7 @@ npm run serve # preview at http://127.0.0.1:3000 (node site/serve.mjs, no dow
383384
│ one .md per source, plus a README index
384385
├── docs/
385386
│ ├── licenses.md fonts.md geodata.md game-vs-video-licensing.md
386-
│ ├── provenance.md high-risk.md ai-assets.md fivem.md trust-score.md
387+
│ ├── provenance.md high-risk.md shipping.md ai-assets.md fivem.md trust-score.md
387388
│ ├── godot-budget-stack.md unreal.md
388389
│ ├── data.md the JSON, CSV and feed exports
389390
│ ├── for-publishers.md what is recorded about a publisher, and how to correct it

‎docs/licenses.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ Quick reference for assets you might list or use. **Always re-check the source p
99
| License | Commercial use | Attribution | Notes |
1010
| --- | --- | --- | --- |
1111
| **CC0** | Yes | Not required | Safest default for closed-source games. Can embed in DRM builds. |
12-
| **CC-BY-4.0** | Yes | Required | Credit the author; a credits-screen link to the source usually satisfies. Keep a notices file. |
13-
| **CC-BY-3.0** | Yes | Required | Same commercial grant; some projects expect the **author named** (not only a site URL). Example: Game-Icons.net wants `Icons made by {author}. Available on https://game-icons.net`. |
12+
| **CC-BY-4.0** | Yes | Required | Credit the author; a credits-screen link to the source usually satisfies. Keep a notices file. DRM-wrapped store builds: see [shipping](shipping.md). |
13+
| **CC-BY-3.0** | Yes | Required | Same commercial grant; some projects expect the **author named** (not only a site URL). Example: Game-Icons.net wants `Icons made by {author}. Available on https://game-icons.net`. Its anti-DRM clause has no 4.0-style waiver, so check it before a console or iOS build; see [shipping](shipping.md). |
1414
| **CC-BY-SA** | Yes, **except Unreal** | Required | Share-alike applies to **derivatives of the asset**, not your whole game as code. Prefer shipping SA assets in extractable bundles (`.pck`, loose folders) rather than encrypted into the binary. The Unreal Engine EULA names CC-BY-SA (and GPL/LGPL) as licences you may not combine with the engine; see [unreal.md](unreal.md). |
1515
| **CC-BY-NC** | No | Required | Fine for prototypes / jam games; **reject for commercial catalogs** unless clearly marked non-commercial. |
1616
| **CC-BY-ND** | Yes | Required | No derivatives — **reject for games**. Interactive sync / remix is generally treated as a derivative; ND music and art are unsafe. |
@@ -61,8 +61,8 @@ Most `tools/` entries and many libraries carry one of these. They all allow comm
6161

6262
| License | Commercial use | Notes |
6363
| --- | --- | --- |
64-
| **GPL-2.0-only**, **GPL-2.0-or-later**, **GPL-3.0-only**, **GPL-3.0-or-later** | Yes | Strong copyleft on the program. Linking GPL code into your game makes the game GPL. Using a GPL editor does not, as the section below explains. The bare **GPL-2.0** and **GPL-3.0** values mean the project did not say "only" or "or later". |
65-
| **LGPL-3.0** | Yes | You may link the library from closed code if users can replace it, which in practice means dynamic linking. Changes to the library itself stay LGPL. The Unreal Engine EULA forbids combining LGPL code with the engine; see [unreal.md](unreal.md). |
64+
| **GPL-2.0-only**, **GPL-2.0-or-later**, **GPL-3.0-only**, **GPL-3.0-or-later** | Yes | Strong copyleft on the program. Linking GPL code into your game makes the game GPL. Using a GPL editor does not, as the section below explains. The bare **GPL-2.0** and **GPL-3.0** values mean the project did not say "only" or "or later". App stores and consoles: see [shipping](shipping.md). |
65+
| **LGPL-3.0** | Yes | You may link the library from closed code if users can replace it, which in practice means dynamic linking. Changes to the library itself stay LGPL. The Unreal Engine EULA forbids combining LGPL code with the engine; see [unreal.md](unreal.md). Consoles that allow no relinking cannot meet this; see [shipping](shipping.md). |
6666

6767
## How to read a `custom`, `varies` or `unknown` entry
6868

‎docs/shipping.md‎

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
# Shipping to Steam, consoles and app stores
2+
3+
Most free-asset licences were written for files you hand to someone else, not for a
4+
game sold through a store that wraps it in DRM, signs it, and forbids users from
5+
changing it. Three clauses cause most of the trouble at release time: the CC-BY
6+
anti-DRM clause, copyleft terms against app-store terms, and LGPL's relinking rule on
7+
platforms that allow no dynamic linking. Steam also asks you to disclose AI content.
8+
Each section quotes the licence text it relies on, with the date it was read. This is
9+
the catalog's reading, not legal advice.
10+
11+
## The CC-BY anti-DRM clause
12+
13+
The Creative Commons licences with conditions (CC BY and its variants; not CC0) forbid
14+
you to use technical measures to stop others from using the work as the licence allows.
15+
16+
- **CC BY 3.0**, Section 4(a), read 2026-11-03: "When You Distribute or Publicly Perform
17+
the Work, You may not impose any effective technological measures on the Work that
18+
restrict the ability of a recipient of the Work from You to exercise the rights
19+
granted to that recipient under the terms of the License."
20+
- **CC BY 4.0**, Section 2(a)(5)(B), read 2026-11-03: "You may not offer or impose any
21+
additional or different terms or conditions on, or apply any Effective Technological
22+
Measures to, the Licensed Material if doing so restricts exercise of the Licensed
23+
Rights by any recipient of the Licensed Material."
24+
25+
4.0 adds a release valve that 3.0 does not have. Section 2(a)(4), read 2026-11-03: the
26+
licensor "waives and/or agrees not to assert any right or authority to forbid You from
27+
making technical modifications necessary to exercise the Licensed Rights, including
28+
technical modifications necessary to circumvent Effective Technological Measures."
29+
Under 4.0, a recipient may lawfully get the work out of your DRM-wrapped build, which
30+
is the usual argument that a 4.0 asset can ship in a Steam, console or mobile build.
31+
The no-DRM sentence is still in 4.0, though, so CC0 remains the only choice with no
32+
question at all. Under 3.0 the restriction stands with no such waiver, so a CC BY 3.0
33+
asset inside an encrypted or signed package is the riskier case.
34+
35+
What to do:
36+
37+
- Prefer CC0 or CC BY 4.0 for anything that ships inside a protected build. The
38+
[LPC Revised Basics](../catalog/2d/lpc-revised-basics.md) entry takes the OGA-BY
39+
versions of its sprites for exactly this reason: OGA-BY 3.0 is CC-BY without the
40+
anti-DRM clause.
41+
- For a CC BY 3.0 asset you need, ask the author for a waiver or a 4.0 or OGA-BY
42+
licence, or ship the file where players can reach it (a loose file beside the
43+
executable rather than inside an encrypted package).
44+
- Share-alike (CC-BY-SA) licences carry the same clause, as well as their copyleft.
45+
46+
## App stores and copyleft
47+
48+
Store terms of use can restrict copying and changing what a customer downloads, which
49+
sits badly with licences that require every recipient to be free to do both. The
50+
[OpenGameArt](../catalog/2d/opengameart.md) FAQ, read 2026-09-26, answers the question of
51+
using its art on the Apple App Store with "Not necessarily": Apple's terms "conflict
52+
with the terms of the GNU GPL, the GNU LGPL, CC-BY-SA, and CC-BY". The catalog's advice
53+
for an App Store build is to prefer CC0, OGA-BY or a permissive code licence (MIT, BSD,
54+
Apache-2.0), or to get the author's written consent first.
55+
56+
The same reasoning applies to GPL code you link into the game: a store build is a
57+
distribution, and you cannot meet the GPL's terms if the store forbids what the GPL
58+
grants. GPL tools you only use to make assets, such as an editor, are a different case;
59+
see [the licence guide](licenses.md).
60+
61+
## LGPL on consoles and closed platforms
62+
63+
LGPL lets you ship a closed-source game that uses the library only if users can swap in
64+
a modified copy of the library.
65+
66+
- **LGPL 2.1**, Section 6, read 2026-11-03: you may "combine or link a 'work that uses the
67+
Library' with the Library to produce a work containing portions of the Library, and
68+
distribute that work under terms of your choice, provided that the terms permit
69+
modification of the work for the customer's own use and reverse engineering for
70+
debugging such modifications."
71+
- **LGPL 3.0**, Section 4(d), read 2026-11-03: you must either convey the source and
72+
application code "in a form suitable for, and under terms that permit, the user to
73+
recombine or relink the Application with a modified version of the Linked Version",
74+
or "Use a suitable shared library mechanism for linking with the Library. A suitable
75+
mechanism is one that (a) uses at run time a copy of the Library already present on
76+
the user's computer system, and (b) will operate properly with a modified version of
77+
the Library".
78+
79+
On a console or other platform that only runs signed code and allows no user-supplied
80+
libraries, the user can neither relink nor drop in a modified library, so neither
81+
option can be met in practice, so an LGPL library is not a safe choice there. On desktop, a dynamically
82+
linked LGPL library (a `.dll`, `.so` or `.dylib` beside the game) is the normal way to
83+
comply. The Unreal Engine EULA forbids combining the engine with GPL or LGPL code
84+
altogether; see [the Unreal guide](unreal.md).
85+
86+
## Steam's AI disclosure
87+
88+
Steam's Content Survey asks about AI-made content that ships with your game. The quote,
89+
and what it means for an entry tagged `ai-generated`, are in
90+
[the AI assets guide](ai-assets.md).
91+
92+
## Before you submit
93+
94+
1. List every third-party asset and library in the build, with its licence.
95+
2. CC BY 3.0, CC-BY-SA, GPL or LGPL in a console, iOS or other locked-down build: replace
96+
it, get the author's consent, or keep it out of that build.
97+
3. LGPL on desktop: link it dynamically and ship its licence and source offer.
98+
4. Ship your credits and licence notices; see [the licence guide](licenses.md).
99+
5. AI-made content: fill in the Content Survey's AI section.

‎site/config.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
{ "id": "for-publishers", "title": "For publishers", "path": "docs/for-publishers.md" },
4747
{ "id": "provenance", "title": "Provenance", "path": "docs/provenance.md" },
4848
{ "id": "high-risk", "title": "Not safe to ship", "path": "docs/high-risk.md" },
49+
{ "id": "shipping", "title": "Shipping to stores", "path": "docs/shipping.md" },
4950
{ "id": "ai-assets", "title": "AI assets", "path": "docs/ai-assets.md" },
5051
{ "id": "game-vs-video", "title": "Games vs video licensing", "path": "docs/game-vs-video-licensing.md" },
5152
{ "id": "unreal", "title": "Unreal Engine licensing", "path": "docs/unreal.md" },

‎site/lib/entry-page.mjs‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ export function engineScope(entry) {
5959
return native.length === 1 ? ENGINES[native[0]].label : null;
6060
}
6161

62+
/** Licence families with a store-build caveat (docs/shipping.md): CC-BY's anti-DRM clause, copyleft. */
63+
const SHIPPING_FAMILIES = new Set(["cc-by", "copyleft"]);
64+
6265
function credit(entry) {
6366
if (entry.attribution_required === true && entry.attribution_string) {
6467
const fill = fillInNote(entry.attribution_string);
@@ -99,7 +102,7 @@ export function entryPageHtml({ entry, leadHtml, restHtml, deprecatedReasonHtml,
99102
entry.engine_lock ? ["Engine lock", esc(ENGINE_LOCK_NOTES[entry.engine_lock] || entry.engine_lock)] : null,
100103
!entry.engine_lock && scope ? ["Engine", `Made for ${esc(scope)}: it only opens there.`] : null,
101104
entry.limits ? ["Limits", esc(entry.limits)] : null,
102-
["Licence", `${esc(licence)} <a class="facts-guide" href="../../guide/licenses/">what it means</a>`],
105+
["Licence", `${esc(licence)} <a class="facts-guide" href="../../guide/licenses/">what it means</a>${SHIPPING_FAMILIES.has(entry.licenseFamily) ? ' <a class="facts-guide" href="../../guide/shipping/">shipping to stores</a>' : ""}`],
103106
["Commercial use", esc(commercialLabel(entry.commercial))],
104107
["Credit", esc(c.value)],
105108
["Status", `${esc(entry.status)}: ${esc(STATUS_NOTES[entry.status] || "")}`],

0 commit comments

Comments
 (0)