Skip to content

fix(licensing): ship MPL-2.0 third-party notices with the desktop bundles - #239

Open
hartsock wants to merge 1 commit into
mainfrom
fix/84-third-party-licenses
Open

fix(licensing): ship MPL-2.0 third-party notices with the desktop bundles#239
hartsock wants to merge 1 commit into
mainfrom
fix/84-third-party-licenses

Conversation

@hartsock

Copy link
Copy Markdown
Owner

Summary

Ships the third-party license notices #84 asked for — with the scope corrected by a license sweep of the locked dependency tree:

  • The original premise was stale: resvg/usvg 0.47 relicensed to Apache-2.0 OR MIT (verified in the vendored crates), so no MPL obligation attaches to the renderer path.
  • The real MPL-2.0 surface (via cargo metadata + cargo tree -e normal): cssparser 0.36.0, selectors 0.36.1, dtoa-short 0.3.5, option-ext 0.2.0 — statically linked into the desktop app bundles only, through the tauri → dom_query and dirs chains. Every Python wheel and crates.io package is MPL-free, so no maturin/pyproject changes are needed.

Changes:

  • LICENSE-MPL-2.0 (canonical text) + THIRD-PARTY-LICENSES.md (the four crates, versions, source URLs per MPL §3.2(b)) at the repo root.
  • Copies bundled into the desktop app via tauri.conf.jsonbundle.resources: ["licenses/*"].
  • README License section references both and states the wheels/crates are MPL-clean.
  • Regression tests (scrybe-app/src-tauri/tests/third_party_licenses.rs): bundled copies byte-identical to root; the four documented crates still present in Cargo.lock; the bundle keeps including licenses/*. All three fail before this change (missing files → include_str! compile error).

Deliberately not in this PR: cargo-deny/cargo-about CI automation (noted in #84 as a follow-up option) — keeping the packaging change reviewable on its own.

risk:high (touches bundle/packaging config) — left open for human review per the autonomy rules. Full verification trail in the #84 issue comments (2026-07-29).

Test plan

  • cargo test -p scrybe-app --test third_party_licenses — 3/3 pass.
  • tauri.conf.json validated as JSON; pre-push hook (full just check + feature-gated checks) passed locally.
  • Privacy scan on the diff: clean (no private IPs / internal DNS / secrets / PII).
  • Reviewer smoke suggestion: build any bundle target and confirm licenses/LICENSE-MPL-2.0 + licenses/THIRD-PARTY-LICENSES.md land in the app resources.

Fixes #84

🤖 Generated with Claude Code

…dles

WHAT: adds LICENSE-MPL-2.0 (canonical text) and THIRD-PARTY-LICENSES.md at the
repo root, bundles copies into the desktop app via tauri.conf.json
bundle.resources (licenses/*), references them from README's License section,
and adds regression tests (scrybe-app/src-tauri/tests/third_party_licenses.rs)
asserting: bundled copies stay byte-identical to the root files, the four
documented MPL crates are still in Cargo.lock, and the bundle keeps including
licenses/*.

WHY: the desktop bundles statically link four MPL-2.0 crates — cssparser
0.36.0, selectors 0.36.1, dtoa-short 0.3.5, option-ext 0.2.0 (via the
tauri->dom_query and dirs chains) — and shipped no MPL notice. Issue #84's
original resvg/usvg premise was stale (resvg 0.47 relicensed Apache-2.0/MIT);
a cargo-metadata sweep of the locked tree found the real MPL surface. The
wheels and crates.io packages carry no MPL code (cargo tree verified), so no
maturin/pyproject changes are needed.

Regression: before this change the tests fail (missing files = include_str!
compile error); after, all three pass.

Fixes #84

Co-Authored-By: Claude Fable 5 (gnuc agent) <[email protected]>
@hartsock hartsock added the risk:high Cross-cutting / CI / hook / deletion / untested — needs human review before merge label Jul 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:high Cross-cutting / CI / hook / deletion / untested — needs human review before merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

mermaid-render: licensing: add LICENSE-MPL-2.0 for resvg/usvg distribution

1 participant