# Klipros third-party license audit

Date: 2026-10-26. Status: **NOT CLEARED FOR DESKTOP REDISTRIBUTION**.

This is a technical evidence audit, not legal advice. It audits the current
working-tree manifests, cached package metadata/notices, bundled media tools,
font license files, Haar model headers, and configured optional model URLs.
It does not certify existing published installers, trace a final linked binary,
or infer that every lockfile entry is shipped. Existing unrelated working-tree
changes are not certified by this audit.

## Evidence collected

- `package-lock.json`: 208 npm entries, including development dependencies and
  platform-specific optional packages. Missing local packages are reported.
- `worker/requirements.lock`: 55 locked Python distributions. All 55 installed
  versions matched during the first audit. Some wheels omit their license text;
  metadata alone is not treated as the missing text.
- `src-tauri/Cargo.lock`: 549 registry crates across all platforms and build
  dependencies. At the first audit 343 were cached, 206 were not. Uncached crates
  are not automatically Windows release blockers: first determine reachability
  from the exact release target/features, then collect notices for shipped code.
- 12 bundled font OFL files and license headers from 3 bundled Haar XML models.
- `ffmpeg.exe -L`, `ffprobe.exe -L`, and upstream reference texts, with SHA-256
  provenance in the generated inventory and `SOURCES.json`.
- Five configured optional models, plus bundled Deno and the bgutil POT provider.
  Optional downloads are distinguished from installer resources.

## Findings requiring action

### 1. FFmpeg is GPLv3+, not an LGPL-only build

The local tools identify as `8.1.2-full_build-www.gyan.dev`. Their build flags
include `--enable-gpl --enable-version3 --enable-static`, and `-L` states GPL
version 3 or later. The build script pins both executable hashes. The upstream
GPLv3 text is preserved, but a license copy is not corresponding source.

Before redistributing these binaries, obtain and verify the corresponding source
for this exact build, its enabled static dependencies, patches and build
instructions, and establish the applicable compliant source delivery route.
Follow-up obtained and hashed the FFmpeg source archive linked from the
publisher's 8.1.2 release, at commit
`38b88335f99e76ed89ff3c93f877fdefce736c13`. This is a specific upstream source
reference, not the complete corresponding source of the static full build.
The enabled dependency versions/patches/build recipe and applicable source
delivery route remain unresolved; no source offer was created.
Do not replace it with a link to an unrelated/latest FFmpeg source snapshot.
Use process separation as an architecture fact, not as a legal clearance.

### 2. bgutil POT provider also has GPL terms

`scripts/prepare-youtube-runtime.ps1` embeds provider v0.8.1 and its plugin ZIP
inside the worker. The provider's tagged upstream LICENSE is GPLv3. Deno v2.9.5
has an upstream MIT license, but a Deno license alone is not a complete notice
set for its bundled dependencies. Obtain the exact provider/plugin source and
dependency notices and determine how the combined worker distribution meets
the applicable terms. Do not label the entire embedded runtime permissive.
The follow-up source archive resolves v0.8.1 to commit
`185796c32deec605213134655d426e8d292927f6`; all three released plugin Python
files match that source byte-for-byte. Executable build correspondence, native
inputs and compliant source delivery remain unverified.

### 3. Worker dependencies have mixed terms

The installed metadata includes GPL-2.0-or-later for mutagen, MPL-2.0 for certifi,
MPL-2.0 AND MIT for tqdm, and NVIDIA-proprietary license references for CUDA
libraries. PyInstaller's GPL includes a distribution exception; preserve that
exception and do not treat it as a blanket exception for other dependencies.
PyAV and numerical wheels contain additional third-party library notices.

Determine the actual PyInstaller archive membership and bundled shared libraries,
then review terms for what is shipped, including required source/disclosure
steps and NVIDIA redistributable restrictions. No CUDA redistribution permission
is inferred from pip installation. Installed distributions and `--collect-all`
are evidence for investigation, not a final binary composition report.

### 4. Model weights need their own licensing evidence

YuNet's configured OpenCV Zoo revision is pinned; its model-specific upstream
license was obtained. The three bundled Haar model headers are preserved without
assuming the main OpenCV license applies to them.

Silero VAD, WeSpeaker ECAPA-TDNN512, multilingual MiniLM, and the Indonesian
embedding model use mutable upstream URLs with configured artifact hashes.
Whisper weights can be fetched separately by the transcription stack. Review
the exact weights, tokenizer, base-model terms, and upstream revisions for each
offered model. Model cards and a code repository license are not automatically
a grant for every model artifact or training dataset. In particular, do not infer
artifact-level clearance for the Indonesian embedding model from its base model.
The collected provider API declares MIT for the Indonesian repository and
CC-BY-4.0 for the WeSpeaker repository; the Xenova snapshot has no license
declaration. The follow-up mapped seven local weight/tokenizer artifacts to configured
hashes and pinned upstream revisions (HF LFS metadata, YuNet pointer and
downloaded Silero bytes). This resolves the hash/revision mapping gap, not
all licensing obligations. The Xenova conversion and Indonesian base-model
license-chain gaps remain open. See `ATTRIBUTION-REVIEW.md` in the generated public evidence directory
for the separate name/attribution review.
Do not redistribute unverified optional model weights in this notices update.

### 5. Missing notices and all-platform graph are explicit gaps

The generated inventory keeps missing/mismatched package evidence and reports
license-text gaps. It includes more than the runtime bundle on purpose. Complete
the final-target dependency trace and fill required gaps before changing
`distributionCleared` to true. Also review bootstrapper/build-tool redistribution
only where those tools or their runtime code are actually delivered to users.

## What this change does and does not do

- Adds truthful upstream credits and downloadable evidence to the landing page.
- Bundles available notices, inventory, provenance, and this audit in future
  Tauri packages; no executable or clipping algorithm is replaced.
- Keeps unresolved compliance findings visible, including proprietary components.
- Does not rebuild/sign/upload an installer, alter Identity or payments, change
  model download behavior, or claim a production desktop release.
- Publishing the static notices does not close the desktop release blockers.

## Follow-up evidence

See [source/model verification](SOURCE-VERIFICATION.md) and
[SOURCE-VERIFICATION.json](SOURCE-VERIFICATION.json) for exact revisions,
artifact hashes, archive hashes and unresolved source-delivery findings.
The Rust trademark policy was also retrieved; factual language references
remain neutral. No installer or site deployment was performed.

## Reverification

Run `python scripts/generate-third-party-notices.py` on the exact pinned Windows
environment and `node scripts/test-third-party-notices.mjs`. The latter checks
the snapshot, hash references, mirror parity, input hashes, packaging and public
links without requiring every optional cross-platform package to be installed.
The generator's `--check` additionally detects environment evidence drift.

For final release clearance, separately verify target-specific JS/Rust and
PyInstaller composition, binary hashes and source correspondence, source access,
applicable license notices, optional model permissions, and the actual installed
package contents. Do not edit the generated clearance flag to bypass findings.
