From 322e358bb0ca00ce92ebe2ddc8ce9d23f652c8f1 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Thu, 24 Sep 2026 00:01:33 +0800 Subject: [PATCH] docs(browser): audit engine licenses and non-AGPL alternatives (#154382) * docs(browser): audit engine licenses and non-AGPL alternatives Preserve the reviewed browser-stack change while incorporating the landed prerequisites. Original revision: 8f41f08a1e92c079ad19ab9f3b849be26cf1559b * test(gateway): complete prepared placement read fixture Supply the required empty policyConfig in the placement lifecycle read fixture. This repairs the inherited check-test-types-core-4 failure while keeping the production browser-stack changes unchanged. --- deploy/lightpanda/README.md | 103 ++++++++++++++++++++++++++++++ deploy/lightpanda/compose.yaml | 2 + docs/tools/browser/lightweight.md | 64 +++++++++++++++++++ 3 files changed, 169 insertions(+) create mode 100644 deploy/lightpanda/README.md diff --git a/deploy/lightpanda/README.md b/deploy/lightpanda/README.md new file mode 100644 index 000000000000..230cff0caedb --- /dev/null +++ b/deploy/lightpanda/README.md @@ -0,0 +1,103 @@ +# Lightpanda deployment provenance + +These files configure an optional, externally managed engine. See the +[deployment instructions](https://docs.openclaw.ai/tools/browser/lightweight). +They do not add an engine binary, container layer, or npm dependency to OpenClaw. + +## License boundary + +OpenClaw's adapter is MIT-licensed. Lightpanda 0.4.1 is +**AGPL-3.0-or-later**, as stated in its +[source header](https://github.com/lightpanda-io/browser/blob/614c1640af8065b1972559abef7ca4cea06f8ba3/src/main.zig#L1) +and [license](https://github.com/lightpanda-io/browser/blob/614c1640af8065b1972559abef7ca4cea06f8ba3/LICENSE). +The engine is independently installed and communicates with OpenClaw over CDP; +OpenClaw does not link, vendor, or relicense its implementation. This is not an +MIT-only stack or a certification that every deployment is legally compliant. +Do not select Lightpanda when your policy excludes copyleft software. + +Before redistributing a binary or image, review AGPL sections 4–6, preserve +notices, and provide the required complete Corresponding Source. Before serving +a modified engine, also review section 13's network-source requirements. +Third-party and container-package obligations remain separate. A process or +socket boundary alone does not decide whether software forms an independent +work; see the [GNU aggregation guidance](https://www.gnu.org/licenses/gpl-faq.html#MereAggregation). + +## Artifact integrity + +Reviewed on **2026-09-21**: + +- [Release 0.4.1](https://github.com/lightpanda-io/browser/releases/tag/0.4.1) + resolves to source commit `614c1640af8065b1972559abef7ca4cea06f8ba3`. +- [SHA256SUMS](SHA256SUMS) records all four official Linux/macOS x86-64/ARM64 + binary digests. Each matched the corresponding release API digest. +- [compose.yaml](compose.yaml) pins the official multi-platform image index, + rather than relying on the version tag alone. + +| OCI object | SHA-256 digest | +| -------------------- | ------------------------------------------------------------------ | +| Image index | `73f67d2dc0bc243f3a8c87065c9871c98b121197baf7b650df5da91b33b98f02` | +| Linux amd64 manifest | `a20e5d4671a3c5d4af42eb41c1c451e0aa684b0ea9cfe5fa18901ad82dc9ad88` | +| Linux arm64 manifest | `c7b93852d3f40693826209e2763327199bafe50d376fa9b805d90954f8a06de3` | + +Both image engine layers were downloaded and hashed without execution. Their +`usr/bin/lightpanda` contents matched the corresponding Linux binary checksums +in `SHA256SUMS`. The attached SLSA provenance identifies +[browser-docker commit `844bcb2e3df1aac108f7301edb97f8859edd7e35`](https://github.com/lightpanda-io/browser-docker/blob/844bcb2e3df1aac108f7301edb97f8859edd7e35/Dockerfile) +and build argument `TAG=0.4.1`. Neither architecture's attestation manifest +included an SPDX or CycloneDX SBOM. This observation is not signature verification +or proof of a reproducible build. + +That Dockerfile's final stage copies the engine, CA bundle, and Tini; it does not +explicitly copy Lightpanda's license, source, or third-party notices. Its engine +layers contain only the executable. The sample pulls upstream artifacts directly; +it does not establish that mirroring or repackaging them satisfies redistribution +obligations. + +## Existing JavaScript clients + +The adapter reuses these pre-existing dependencies without changing package +manifests or the lockfile: + +| Package | Version | License | Verified npm tarball integrity | +| -------------------------------------------------------------------- | ------- | ---------- | ------------------------------------------------------------------------------------------------- | +| [playwright-core](https://registry.npmjs.org/playwright-core/1.63.0) | 1.63.0 | Apache-2.0 | `sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==` | +| [ws](https://registry.npmjs.org/ws/8.21.3) | 8.21.3 | MIT | `sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==` | + +Downloaded tarball SHA-512 values matched `pnpm-lock.yaml`. Playwright's package +also bundles 79 npm components, including its own `ws` 8.21.0, plus a WebP codec. +Ordinary npm dependency traversal does not inventory this inlined code. +Preserve its `LICENSE`, `NOTICE`, `ThirdPartyNotices.txt`, and `lib/*.LICENSE` +files, including the libwebp/Emscripten notices. Preserve `ws`'s `LICENSE` too. +Permissive dependencies can accompany an MIT project without becoming MIT-only. + +## Engine dependency scope + +The pinned [Zig dependency manifest](https://github.com/lightpanda-io/browser/blob/614c1640af8065b1972559abef7ca4cea06f8ba3/build.zig.zon) +and [build-tool versions](https://github.com/lightpanda-io/browser/blob/614c1640af8065b1972559abef7ca4cea06f8ba3/.github/actions/install/action.yml) +identify these components. This table is a source-level inventory, not a complete +binary SBOM or a replacement for their notices. + +| Component | Pin | License evidence | +| -------------------- | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| BoringSSL | `535cc391915c37912ff9b3edb0cff9b3c5c77db0` | [Apache-2.0 root](https://github.com/google/boringssl/blob/535cc391915c37912ff9b3edb0cff9b3c5c77db0/LICENSE) and [Zig wrapper](https://github.com/lightpanda-io/boringssl-zig/blob/f07cc58fa4a051eb0985287e691db5dbb0e7e76f/LICENSE); third-party terms remain separate | +| Brotli | 1.2.0, `028fb5a23661f123017c060daa546b55cf4bde29` | [MIT](https://github.com/google/brotli/blob/028fb5a23661f123017c060daa546b55cf4bde29/LICENSE) | +| curl | 8.22.0 | [curl license](https://github.com/curl/curl/blob/01346829096c61b372692f6dc43ffa778c6caccd/COPYING) | +| isocline | `ec538faf435c616a6b38716f53980b5815c30f8a` | [MIT](https://github.com/arrufat/isocline/blob/ec538faf435c616a6b38716f53980b5815c30f8a/LICENSE) | +| nghttp2 | 1.69.0 | [MIT](https://github.com/nghttp2/nghttp2/blob/68cb6900fde14c77f0cd7add0e094a862960eb99/COPYING) | +| PCRE2 | 10.48 | [BSD-3-Clause WITH PCRE2-exception](https://github.com/PCRE2Project/pcre2/blob/7978954dbd2efc6f2196869290553cf1871b4ce6/LICENCE.md) | +| SQLite build wrapper | `7a615f5af79009cd733e3480658586d9b0d28b35` | [MIT wrapper](https://github.com/allyourcodebase/sqlite3/blob/7a615f5af79009cd733e3480658586d9b0d28b35/LICENSE); SQLite's own terms are separate | +| V8 | 14.9.207.35 | [BSD-style root and separately licensed components](https://github.com/v8/v8/blob/933ce636c562cd54d68e7f7c93ab5cdffd685fca/LICENSE); [MIT Zig wrapper](https://github.com/lightpanda-io/zig-v8-fork/blob/31b233ce6162c18eb37cacd001473057f75daad9/LICENSE) | +| zenai | `be5d2e70d3dcc9866041dbdbcfa1f18799601a30` | [Apache-2.0](https://github.com/lightpanda-io/zenai/blob/be5d2e70d3dcc9866041dbdbcfa1f18799601a30/LICENSE) | +| zlib | 1.3.2 | [Zlib](https://github.com/madler/zlib/blob/da607da739fa6047df13e66a2af6b8bec7c2a498/LICENSE) | + +The [Rust lockfile](https://github.com/lightpanda-io/browser/blob/614c1640af8065b1972559abef7ca4cea06f8ba3/src/rust/Cargo.lock) +contains 105 registry packages. All pinned versions' crates.io license metadata +was checked: declarations use permissive families including MIT, Apache-2.0, +BSD, Zlib, and Unicode-3.0, sometimes in combination. Metadata review does not +verify every file in those crates. The bundled fonts have their own +[Bitstream/DejaVu/Arev notices and naming conditions](https://github.com/lightpanda-io/browser/blob/614c1640af8065b1972559abef7ca4cea06f8ba3/src/rust/render/fonts/LICENSE). + +This review does **not** cover all OpenClaw dependencies, V8's complete third-party +closure, platform system libraries, Debian image packages, or availability of +complete Corresponding Source for every distributed artifact. Recheck these +boundaries and pins when changing the engine version or distribution model. diff --git a/deploy/lightpanda/compose.yaml b/deploy/lightpanda/compose.yaml index 8f0c8a1c8269..215d36b441da 100644 --- a/deploy/lightpanda/compose.yaml +++ b/deploy/lightpanda/compose.yaml @@ -2,6 +2,8 @@ # the repository's docker-compose.yml for an unpublished container-only endpoint. services: lightpanda: + # Optional external AGPL-3.0-or-later engine, not an MIT-only image. + # See README.md before mirroring, bundling, or modifying this distribution. # Official 0.4.1 multi-platform index: linux/amd64 and linux/arm64. image: docker.io/lightpanda/browser:0.4.1@sha256:73f67d2dc0bc243f3a8c87065c9871c98b121197baf7b650df5da91b33b98f02 environment: diff --git a/docs/tools/browser/lightweight.md b/docs/tools/browser/lightweight.md index f048e9f7cc3e..210528e034b4 100644 --- a/docs/tools/browser/lightweight.md +++ b/docs/tools/browser/lightweight.md @@ -17,6 +17,70 @@ and applications that require unsupported browser features. The examples pin Lightpanda **0.4.1**. They do not change your existing browser profile, install a service, or migrate a logged-in Chrome profile. +## Licensing and distribution + +OpenClaw's adapter remains MIT-licensed. The optional Lightpanda engine is +**AGPL-3.0-or-later**, not MIT: see its +[pinned source notice](https://github.com/lightpanda-io/browser/blob/614c1640af8065b1972559abef7ca4cea06f8ba3/src/main.zig#L1) +and [license](https://github.com/lightpanda-io/browser/blob/614c1640af8065b1972559abef7ca4cea06f8ba3/LICENSE). +The existing Playwright client is Apache-2.0; the existing `ws` client is MIT. +Their licenses and third-party notices still apply. + +These examples connect over CDP to an independently installed, unmodified engine. +They do not bundle or relicense Lightpanda in OpenClaw's package or image. +The engine and its container dependencies are not an MIT-only distribution. +If your deployment excludes copyleft software, do not select this engine. + +Mirroring or bundling the engine requires a separate redistribution review, +including license notices, Corresponding Source, and third-party obligations. +Modifying a network-served engine also requires reviewing AGPL section 13. +A separate process is not a blanket legal exemption, and checksum verification +does not establish license compliance. See the +[artifact and dependency review](https://github.com/openclaw/openclaw/blob/main/deploy/lightpanda/README.md) +for the verified pins and remaining limits. + +## Alternatives reviewed + +The following is a licensing comparison as of **2026-09-21**, not a claim that +these alternatives have passed OpenClaw integration or cross-platform tests. +An MIT-compatible application and an entirely permissive engine distribution +are different requirements. + +| Option | Engine and licensing boundary | +| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chromium headless shell | An established CDP engine, not an all-permissive binary. The inspected 153.0.8010.12 distribution's `LICENSE.headless_shell` includes LGPL and MPL notices; its pinned sources identify [FFmpeg's LGPL terms](https://chromium.googlesource.com/chromium/third_party/ffmpeg/+/53fa34a23be9054d25ac2500dbdae9a0e570bb5c/README.chromium) and [mixed-license hyphenation data](https://chromium.googlesource.com/chromium/src/+/971a7443b0c9b0a9b2860529b33331b76077ec62/third_party/hyphenation-patterns/README.chromium). | +| Cloudflare Kitesurf | A [hosted, stateless Browser Run engine](https://developers.cloudflare.com/browser-run/kitesurf/), not a downloadable replacement in this review. Cloudflare's [announcement](https://blog.cloudflare.com/kitesurf/#final-notes) describes open-sourcing as future work; a self-hosted engine release and its license were not available for this audit. Service terms are separate from client-library licenses. | +| Obscura 0.2.3 | A standalone Rust engine with embedded Deno/V8 and an [Apache-2.0 root license](https://github.com/h4ckf0r0day/obscura/blob/1a3169da276d7720732c7b20535474942917fb83/LICENSE). It is the strongest standalone lightweight candidate reviewed for avoiding an AGPL engine, but has MPL dependencies and unresolved redistribution-notice work. It is not an all-permissive replacement. | + +Automation clients do not replace the engine. For example, +[Vercel's agent-browser](https://github.com/vercel-labs/agent-browser/blob/44583ac8385d814ab98cbf40feec97620376b50e/README.md) +offers Chrome and Lightpanda backends; its own Apache-2.0 license does not change +the selected engine's license. The same distinction applies to Playwright and +Puppeteer clients. + +### Obscura audit boundary + +[Release v0.2.3](https://github.com/h4ckf0r0day/obscura/releases/tag/v0.2.3) +was reviewed at commit `1a3169da276d7720732c7b20535474942917fb83`. +Its [lockfile](https://github.com/h4ckf0r0day/obscura/blob/1a3169da276d7720732c7b20535474942917fb83/Cargo.lock) +contains 471 registry packages. Their license declarations include no AGPL, +but five are MPL-2.0-only: `cooked-waker` 5.0.0, `cssparser` 0.34.0, +`cssparser-macros` 0.6.1, `dtoa-short` 0.3.5, and `selectors` 0.26.0. +These dependencies remain in the no-render engine's DOM/JavaScript paths. +[MPL's file-level obligations](https://www.mozilla.org/en-US/MPL/2.0/FAQ/) +do not require unrelated MIT adapter files to become MPL; they still apply to +the covered code and its distribution. + +The downloaded Linux x86-64 no-render archive matched release SHA-256 +`b5e55e8f2c97814127a521cd59af1a84b79dc40cf658fda04df04af81a2d89f3`. +It contained only `obscura` and `obscura-worker`, without license or notice files. +The pinned [release workflow](https://github.com/h4ckf0r0day/obscura/blob/1a3169da276d7720732c7b20535474942917fb83/.github/workflows/release.yml) +packages only those executables and does not use Cargo's `--locked` flag. +Consequently, source-lock metadata is not proof of the complete dependency set +inside each release binary. Full V8/third-party and platform-library review, +notices, source availability, and runtime compatibility remain to be verified +before bundling or recommending an integrated deployment. + ## Choose where the engine runs | OpenClaw location | Lightpanda location | Profile CDP URL |