A Ninety-Minute Third-Party License Notice and Credits Hygiene Pass for Unity and Godot Shipping Builds (2026)
Store questionnaires and publisher intake packs stopped asking only whether your crash reporter encrypts traffic. They increasingly ask how you honor open-source licenses, where players can read attribution, and whether NOTICE files ship beside binaries that bundle patented codecs, TLS stacks, or permissively licensed middleware. If your answer is “we pasted licenses into a Google Doc once,” you are one diligent reviewer away from a yellow submission—or a delayed festival build—because credits hygiene is now adjacent to supply-chain evidence.
This article is a ninety-minute working session for Unity and Godot teams who need license notice bundles and in-game credits discipline that survive 2026 PC and mobile submissions without blocking engineering for a week. It complements dependency inventories—pair it with A Ninety-Minute SBOM and Dependency Evidence Pass for Unity and Godot Teams Before Partner Audits (2026)—integrity narratives from A Ninety-Minute Build Provenance and SLSA-Style Attestation Pass for Unity and Godot Teams Before Partner Audits (2026), and merge-queue hygiene from A Ninety-Minute CI SARIF and Static Analysis Triage Pass for Unity and Godot Merge Queues (2026). When reviewers ask how runtime crash signatures relate to third-party native libs, keep cross-links to your build failure signature registry resource habits so attribution rows and telemetry ownership stay aligned.
This article is engineering operations guidance, not legal advice. When obligations conflict or licenses interact oddly, escalate to counsel—your job here is repeatable evidence, not courtroom interpretation.
Maintenance note (May 2026): teams running late-Q2 to Q4 submission calendars are seeing stricter partner intake wording around third-party notices attached to the exact release artifact. This refresh adds explicit branch-gate language so your license bundle and credits evidence stay tied to the same RC identity used in store and publisher packets.

Why this matters now
Three shifts make license notice discipline a shipping-front topic for 2026, not a post-launch FAQ chore.
First, storefront compliance surfaces expanded beyond privacy nutrition labels into explicit open-source software sections on major mobile portals and partner portals that mirror enterprise procurement language. Teams that ship late often discover they never attached NOTICE tarballs to the same artifact bucket their SBOM references.
Second, engine and toolchain churn reshuffles package graphs monthly. A permissive asset you imported in January might pick up a copyleft transitive dependency after one analytics SDK bump in March. Credits files rot faster than gameplay code because nobody schedules attribution like they schedule physics fixes.
Third, community expectations hardened—players notice missing credits for fonts, music loops, and shader packs faster than they notice minor LOD bugs. The reputational hit arrives on social feeds before legal escalation does.
If your studio already maintains build metadata and changelog discipline, treat license rows as another release artifact with the same owner and retention expectations.
Practical trend trigger for this month: if your build lane now ships same-week demo + patch + storefront copy updates, run this pass before final upload cutoffs. Teams increasingly fail review not because notices are missing entirely, but because notices exist in one branch artifact while the shipped branch carries a different dependency graph.
Who this helps
- Teams preparing Steam, Epic, console, or mobile submissions where attribution bundles must accompany builds or store listings
- Unity teams juggling Package Manager graphs, native plugins, and Gradle-resolved Android deps
- Godot teams mixing GDScript, C#, GDExtension, and asset-store addons with heterogeneous licenses
- Producers who need one spreadsheet tab engineers can defend under audit without improvising answers mid-call
Beginner quick start
If you only finish six outcomes in this pass, make them these:
- Inventory every third-party component that ships in your player-facing binary—not only NuGet or UPM names, but fonts, audio beds, and shaders with explicit license files.
- Record SPDX id or license filename per component when available; mark
UNKNOWNwith an owner and a fetch deadline rather than guessing. - Generate one machine-readable bundle (folder or zip) that contains full license texts required by those licenses—not marketing summaries.
- Mirror the bundle version string with your release candidate id so reviewers map notices to the exact upload.
- Expose one in-game or launcher path that opens the bundle or an HTML index stored next to your executable—especially on PC where players expect an About ▸ Third-party licenses menu.
- Assign one rotating reviewer each milestone to diff the spreadsheet against package-lock changes.
Success check: another engineer can export yesterday’s notices bundle from your repo and match it to the same git tag your SBOM row cites without asking you on chat.
License families without pretending to be lawyers
You still need vocabulary that survives partner reviews:
Permissive licenses (MIT, BSD, Apache-2.0 flavors) usually demand attribution and copyright preservation. They rarely infect your proprietary source when linked dynamically, but read each notice—some assets bundle unusual clauses.
Copyleft licenses (GPL family, LGPL where relevant) introduce distribution triggers that matter when you statically link or combine code in ways those licenses define as derivative works. Your ninety-minute pass flags items that deserve counsel review—not silent thumbs-up.
Creative Commons appears on art and audio. NC and ND variants conflict with commercial games unless you secured alternate grants—your spreadsheet should mark creative assets distinctly from software libraries.
Document unknown rows honestly; audits prefer visible unknowns over invisible optimism.
The ninety-minute agenda
Use a timer. The failure mode is twenty minutes arguing whether SIL Open Font License counts as “software.”
Minutes 0 to 10 — Freeze scope
- Pick one release candidate id (example:
rc/2026.05.05-store). - Decide whether today targets PC, mobile, or both—mixed targets split notice bundles more often than teams expect.
- Assign one owner who signs the spreadsheet footer.
Minutes 10 to 25 — Unity inventory sweep
- Export manifest.json / lock snapshot from Packages/.
- List native plugins under Assets/Plugins with license files or vendor URLs.
- Capture Android Gradle resolved libraries when mobile ships—many OSS notices hide there instead of UPM.
Minutes 25 to 40 — Godot inventory sweep
- Enumerate enabled addons under
addons/with version pins. - Record export templates and GDExtension binaries with fetch URLs.
- Note Font and audio imports separately from code deps.
Minutes 40 to 55 — Bundle assembly
- Create
ThirdParty/orLegal/folder in repo with subfolders per license family if helpful. - Drop verbatim
LICENSE/NOTICE/COPYINGfiles from upstream archives—do not paraphrase legal text. - Write
INDEX.htmllisting package name, version, license id, and relative path to full text.
Minutes 55 to 65 — Player-facing surface
- Add Credits scene or menu stub pointing at
INDEX.htmlor a lightweight scroll view listing package titles at minimum. - Keep navigation keyboard or controller reachable where platform guidelines expect accessibility parity.
Minutes 65 to 80 — Cross-check against SBOM
- Verify each SBOM row with critical security relevance also appears in notices bundle or has explicit waiver justification documented.
- Flag duplicate rows where two package names resolve to the same upstream tarball—dedupe to reduce reviewer fatigue.
Minutes 80 to 90 — Publish the governance note
- One paragraph in your release checklist: who updates notices, when (same PR as dependency bump), where bundle lands in artifact storage.
Spreadsheet columns producers can defend
Store these headers:
component_nameversion_or_commitlicense_spdx_or_filenamesource_urlship_surface(player_binary,tools_only,server_only,editor_only)notice_file_path_in_repomust_ship_text_in_menu(yes,no,best_effort)counsel_review_required(yes,no)owner_lane
Add last_verified_at_utc quarterly if your graph is noisy.
Unity-specific drill hints
Package Manager versus embedded vendors
UPM packages sometimes omit readable license files until you open the cached tarball. Your ritual should include opening the cache path once per milestone for critical packages—not every cosmetic shader—but especially analytics, authentication, and compression libs.
IL2CPP and native blobs
When IL2CPP brings libil2cpp plus static libs, confirm whether middleware vendors require additional notices inside the Android APK assets/ folder versus Windows folders beside the exe.
Burst and jobs packages
Burst-related packages may pull LLVM-derived pieces—your spreadsheet should note LLVM-adjacent obligations when vendor README demands them.
Godot-specific drill hints
Export presets and embedded PCK
Players extract PCK contents in mod-friendly communities—assume license texts for shipped assets should live inside the package or accessible offline if your game promises offline play.
GDNative versus GDExtension naming drift
Track extension ABI rows separately so reviewers do not confuse Godot engine obligations with your extension vendor obligations.
Comparison table — notices versus SBOM versus credits marketing copy
| Artifact | Answers | Does not replace |
|---|---|---|
| SBOM dependency rows | What packages exist | Full license text hosting |
| NOTICE bundle | Legal text obligations | Player-friendly marketing story |
| In-game credits | Community expectation + accessibility | Substitute for required legal notices |
Ship all three when budgets allow; never substitute marketing credits alone when licenses demand verbatim text availability.
Failure modes that embarrass submissions
- Paraphrased MIT paragraphs pasted from blog summaries instead of upstream LICENSE files.
- Font subsetting that removes copyright headers embedded in metadata—some SIL workflows require separate attribution rows even after subsetting.
- Analytics SDK upgrades that replace transitive OkHttp versions without refreshing Android notices.
- Forked repos where Git history shows license changes across forks—your row must cite the exact commit you vendored.
- Steam depot containing demo and full game but only one notices bundle referenced from the demo menu—align both launchers.
Where Steam and mobile reviewers converge
Document whether notices ship:
- Beside executables on disk
- Inside settings ▸ legal menus with reachable navigation
- As separate downloadable packs linked from store pages when binary size is extreme
Cross-link habits from Steam store page ninety-minute QA when About pages must stay synchronized with store metadata.
Worked example — one risky row end-to-end
Suppose you bundle libjpeg-turbo through a native plugin:
- Record exact version string compiled into your binary, not only the wrapper NuGet version.
- Fetch upstream LICENSE.md into
ThirdParty/libjpeg-turbo/LICENSE. - Mark
ship_surfaceasplayer_binarybecause the.dll/.soships to customers. - Add menu entry Image codecs ▸ acknowledgments linking to the README section that lists IJG and libjpeg-turbo terms as required.
- Attach bundle hash or folder commit id to your SBOM row for the same RC.
This pattern scales down to single-font SIL rows—same discipline, smaller byte count.
Automation hooks that survive small teams
You do not need enterprise composition analysis tools on day one—just stop repeating manual hunting every release.
- Add a CI step that fails when
ThirdParty/NOTICE.sha256is missing or stale compared to the spreadsheet checksum column—same philosophy as Unity Addressables lockfile hashing, but for legal bundles. - Teach Dependabot or Renovate PR templates to include “update notices sheet” as a checkbox beside dependency bumps—borrow rhythm from your Git LFS hygiene pass so binary and legal churn stay paired.
- Store HTML INDEX files as UTF-8 without BOM surprises when consoles reject malformed legal pages—mirror newline discipline from your Steam depot identity pass where byte-identical artifacts matter.
Authoritative references worth bookmarking for reviewer conversations—these sites change slowly but should still be cited as “consult current upstream text,” not copied into legal conclusions:
- SPDX License List for stable ids when package manifests cooperate.
- Choose a License for human-readable summaries that do not replace full texts—use them only as routing hints for engineers.
Mobile appendix — Play and App Store adjacent habits
Even when portals do not demand a literal .zip upload, they frequently ask whether OSS ships inside your binary and whether notices are accessible from the device.
Android
- Keep Gradle-generated dependency reports alongside your notices bundle—tie compile classpath libraries to rows even when Unity hides them behind templates.
- After 16 KB page-size or NDK bumps, re-verify native stacks listed in Google Play alignment passes—toolchain churn often shifts which
.sofiles appear without a gameplay feature headline.
iOS
- Some middleware ships XCFramework slices with nested licenses—flatten nested
LICENSEfiles into your INDEX with relative paths so App Review can navigate quickly. - If you reference remote URLs for notices, confirm TLS chains on-device—not only desktop browsers—mirroring privacy inventory discipline from App Store Connect App Privacy ninety-minute pass.
Producer red-team prompts
Ask these aloud during the final ten minutes—if any answer is hesitant, keep the branch yellow until resolved:
- If Steam/Epic reviewers unzip our depot tomorrow, will they find LICENSE files beside each native DLL we ship without needing our wiki login?
- Does the demo build expose the same notices entry point as the premium build when both share engine tech?
- Did anyone paste shortened MIT text from Stack Overflow instead of the upstream tarball—where is the corrective commit?
- Which music or font rows cite Creative Commons variants that ban commercial use—and did marketing approve replacements?
- Will localization swap credits strings without dropping mandatory English legal paragraphs—who verifies?
Extended failure modes — licensing traps that look boring until lawyers care
- Dual-licensed upstream packages where your company executed Commercial License Agreement B while engineers still read README option A—the spreadsheet must cite the executed agreement id.
- Apache-2.0 artifacts bundled with NOTICE files listing dozens of transitive attributions—ship the concatenated NOTICE content, not only
LICENSE. - BSD advertising clause remnants in legacy physics libs—easy to miss when names sound generic.
- Steam Workshop or modding hooks that encourage players to inject GPL tooling—your base-game notices must still describe what you shipped by default.
Key takeaways
- License notices are release artifacts—version them beside SBOM exports and build provenance packets for 2026 audits.
- Use verbatim upstream license files in a NOTICE bundle; paraphrase only in non-binding summaries clearly labeled as unofficial.
- Unity teams must sweep UPM, Plugins, and Gradle outputs—OSS hides in all three surfaces.
- Godot teams must track addons, export templates, and binary extensions separately from engine licensing.
- Expose at least one player-visible path to legal text on PC builds; mobile portals increasingly expect comparable transparency.
- Mark copyleft and Creative Commons rows for counsel review early instead of hiding uncertainty.
- Diff notices spreadsheets whenever dependency bumps land—treat breaks as release risks, not documentation chores.
FAQ
Do we need separate notices bundles per platform?
Often yes when static linking differs—Android may include extra TLS or codec stacks. At minimum document platform deltas explicitly.
Can we ship only URLs instead of embedded files?
Some licenses allow remote references until hosts disappear—prefer shipped copies for long-lived PC titles and include URLs as secondary pointers.
What if a vendor refuses to provide SPDX ids?
Store the license file name and URL to the archived tarball you imported—unknown SPDX beats fabricated certainty.
How does this relate to our CycloneDX export?
SBOM lists components; notices bundles host legal text. Cross-reference bom-ref or package coordinates in your INDEX table when automating.
Our game uses only paid assets—skip the pass?
Paid assets still carry EULAs—track them in the same spreadsheet under a commercial_license column variant.
Does Epic or Steam require exact formatting?
They require honest availability—precise templates vary; consistent internal formatting reduces reviewer confusion even when portals differ.
Who owns updates when design buys new music mid-milestone?
Define an audio_lane owner in the spreadsheet and block audio merges without a license row stub—prevents Friday-night surprises.
Should we translate license texts?
Translate UI chrome and navigation labels, but keep primary legal text in the language your counsel requires unless a license explicitly authorizes translation—note any localized companion files in the INDEX with a translation_status column your legal owner approves.
Written by GamineAI Team. For dependency export mechanics before you freeze notices text, start from the SBOM ninety-minute pass linked near the top; for CI merge hygiene that catches suspicious native upgrades early, pair with the SARIF triage article.