screentinker/frontend/legal/third-party.html
ScreenTinker 1bb24e7604 Choose the SQLite driver at runtime, and ship the FFmpeg licence with the binaries
TWO CHANGES, together because they touch the same packager hunks.

1. THE DRIVER.

The BrightSign package used to be MANUFACTURED. scripts/build-server-zip.sh dropped
better-sqlite3 from package.json and then installed db/sqlite-compat.js into
node_modules under that name, so every require resolved to the façade. It worked —
and it shipped a database layer that no test had ever executed. That is the same
shape as the TELEMETRY_COLLECTOR TDZ crash that took production down while 1676
tests and four CI jobs were green: a build-time rewrite cannot be tested by the
build that performs it.

db/sqlite-driver.js now decides at runtime: the native driver when it loads, the
node:sqlite façade otherwise. One artifact, one code path, and — the point — both
branches reachable from a test. ST_SQLITE_DRIVER=node runs the entire suite the way
a player runs it, and a new CI job does exactly that on Node 24 with --omit=optional
so the fallback is reached the same way it is on hardware, not by an env var alone.

better-sqlite3 becomes an optionalDependency, so a host with no compiler installs
cleanly and falls back rather than failing. preflight-deps stops trying to rebuild a
native module on a host that has no toolchain and a working built-in driver — on a
player that was a five-minute node-gyp failure ending in a server that never started.
Asking for the native driver BY NAME (ST_SQLITE_DRIVER=better-sqlite3) still fails
loudly, because a production box that has lost its native module is broken and should
say so rather than quietly running something else.

⚠️ NODE 24 IN PRACTICE. node:sqlite is unflagged only from 23.4; on the 22.x line it
needs --experimental-sqlite and on 20.x it does not exist. So the code probes rather
than comparing versions, the player package pins engines >=24, and the built-in cases
skip on the Node 20 CI job rather than failing there.

Verified on Node 24, both drivers, full suite:
  better-sqlite3   1762 pass / 0 fail
  node:sqlite      1762 pass / 0 fail
and the built payload resolves node:sqlite with no better-sqlite3 present at all.

2. THE LICENCE.

The ffprobe/ffmpeg binaries added in the previous commit are LGPL 2.1 and statically
linked, so the licence text has to travel WITH them — a link on a website is not the
copy the licence asks to accompany the work. The packager now copies
COPYING.LGPLv2.1 and a build README into bin/, and refuses to build if the licence is
missing. legal/third-party.html gains an LGPL section with the written offer required
by section 6 for static linking, and the exact configure line.

It also drops Sharp, which that page still listed although #263 removed it, and names
what actually does the image work now (jimp, @jsquash/webp, @jsquash/avif).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014kfhrUPit5MCqxeTQyqr56
2026-08-18 20:57:05 -05:00

132 lines
7.7 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Third-Party Licenses - ScreenTinker</title>
<style>
* { margin:0; padding:0; box-sizing:border-box; }
body { font-family:-apple-system,sans-serif; background:#111827; color:#e2e8f0; line-height:1.8; }
.container { max-width:800px; margin:0 auto; padding:40px 24px 80px; }
h1 { color:#3b82f6; font-size:32px; margin-bottom:8px; }
.updated { color:#64748b; font-size:14px; margin-bottom:40px; }
h2 { color:#f1f5f9; font-size:18px; margin:32px 0 8px; }
p, li { color:#94a3b8; font-size:14px; margin-bottom:8px; }
a { color:#3b82f6; }
.back { display:inline-flex; align-items:center; gap:6px; color:#64748b; font-size:13px; margin-bottom:24px; text-decoration:none; }
.back:hover { color:#94a3b8; }
.license-block { background:#0f172a; border:1px solid #1e293b; border-radius:8px; padding:16px; margin:12px 0 24px; font-size:12px; font-family:monospace; white-space:pre-wrap; color:#64748b; overflow-x:auto; }
table { width:100%; border-collapse:collapse; margin:16px 0 32px; }
th, td { padding:10px 12px; text-align:left; border-bottom:1px solid #1e293b; font-size:13px; color:#94a3b8; }
th { color:#cbd5e1; font-weight:600; }
</style>
</head>
<body>
<div class="container">
<a href="/" class="back">&larr; Back to ScreenTinker</a>
<h1>Third-Party Software Notices</h1>
<p class="updated">Last updated: March 24, 2026</p>
<p>ScreenTinker uses the following open-source software components. We gratefully acknowledge the contributions of these projects and their maintainers.</p>
<h2>Summary</h2>
<table>
<thead><tr><th>Package</th><th>License</th><th>Use</th></tr></thead>
<tbody>
<tr><td>Express</td><td>MIT</td><td>Web server framework</td></tr>
<tr><td>Socket.IO</td><td>MIT</td><td>Real-time WebSocket communication</td></tr>
<tr><td>better-sqlite3</td><td>MIT</td><td>SQLite database driver</td></tr>
<tr><td>Multer</td><td>MIT</td><td>File upload handling</td></tr>
<tr><td>uuid</td><td>MIT</td><td>Unique ID generation</td></tr>
<tr><td>Jimp</td><td>MIT</td><td>Image processing and thumbnails</td></tr>
<tr><td>@jsquash/webp, @jsquash/avif</td><td>Apache 2.0</td><td>WebP / AVIF encoding</td></tr>
<tr><td>FFmpeg (ffprobe, ffmpeg)</td><td>LGPL 2.1 or later</td><td>Video duration, dimensions and thumbnails. Bundled as unmodified binaries with the BrightSign player package only; built from unmodified FFmpeg 7.1.1 sources configured <code>--disable-gpl</code>, so no GPL component (including libpostproc) is included.</td></tr>
<tr><td>cors</td><td>MIT</td><td>Cross-origin resource sharing</td></tr>
<tr><td>bcryptjs</td><td>MIT</td><td>Password hashing</td></tr>
<tr><td>jsonwebtoken</td><td>MIT</td><td>JWT authentication tokens</td></tr>
<tr><td>Helmet</td><td>MIT</td><td>HTTP security headers</td></tr>
<tr><td>google-auth-library</td><td>Apache 2.0</td><td>Google OAuth verification</td></tr>
<tr><td>OkHttp</td><td>Apache 2.0</td><td>Android HTTP client</td></tr>
<tr><td>Gson</td><td>Apache 2.0</td><td>Android JSON parsing</td></tr>
<tr><td>AndroidX Media3 / ExoPlayer</td><td>Apache 2.0</td><td>Android video playback</td></tr>
<tr><td>AndroidX libraries</td><td>Apache 2.0</td><td>Android UI and lifecycle</td></tr>
<tr><td>Material Components for Android</td><td>Apache 2.0</td><td>Android UI components</td></tr>
<tr><td>Socket.IO Java Client</td><td>MIT</td><td>Android WebSocket client</td></tr>
<tr><td>Kotlin Coroutines</td><td>Apache 2.0</td><td>Android async operations</td></tr>
<tr><td>AndroidX Security Crypto</td><td>Apache 2.0</td><td>Encrypted SharedPreferences</td></tr>
<tr><td>AndroidX WorkManager</td><td>Apache 2.0</td><td>Background task management</td></tr>
</tbody>
</table>
<h2>MIT License</h2>
<p>The following packages are licensed under the MIT License:</p>
<p>Express, Socket.IO, better-sqlite3, Multer, uuid, cors, bcryptjs, jsonwebtoken, Helmet, Socket.IO Java Client</p>
<div class="license-block">MIT License
Copyright (c) respective authors and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.</div>
<h2>GNU Lesser General Public License v2.1</h2>
<p>
The BrightSign player package bundles two FFmpeg command-line programs, <code>ffprobe</code>
and <code>ffmpeg</code>, used to read the duration and dimensions of uploaded video and to
generate thumbnails. They are built from unmodified FFmpeg 7.1.1 sources
(<a href="https://ffmpeg.org/">ffmpeg.org</a>) and are licensed under the GNU Lesser General
Public License, version 2.1 or later.
</p>
<p>
They are configured with <code>--disable-gpl</code>, so no GPL-licensed FFmpeg component is
present — including <code>libpostproc</code>, which is GPL-only. No FFmpeg source was modified.
</p>
<p>
<strong>Written offer.</strong> These binaries are statically linked. On request we will supply
the complete corresponding source, the exact <code>configure</code> arguments used, and the
object files needed to relink the programs against a modified version of the library, as
section 6 of the LGPL requires. Contact <a href="mailto:support@screentinker.com">support@screentinker.com</a>.
The full licence text is at
<a href="https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html">gnu.org/licenses/lgpl-2.1</a>,
and a copy ships beside the binaries in the player package.
</p>
<h2>Apache License 2.0</h2>
<p>The following packages are licensed under the Apache License, Version 2.0:</p>
<p>@jsquash/webp, @jsquash/avif, google-auth-library, OkHttp, Gson, AndroidX Media3/ExoPlayer, AndroidX libraries, Material Components for Android, Kotlin Coroutines, AndroidX Security Crypto, AndroidX WorkManager</p>
<div class="license-block">Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.</div>
<h2>Contact</h2>
<p>If you have questions about the licensing of any component used in ScreenTinker, please contact us at support@screentinker.com</p>
</div>
</body>
</html>