From 9bc36674588dd15001defeaa0bbd9a3090e9ed74 Mon Sep 17 00:00:00 2001 From: CRTkafa <299241515+CRTkafa@users.noreply.github.com> Date: Mon, 28 Sep 2026 02:34:13 +0700 Subject: [PATCH 1/2] Fix the installer bitmaps' blur at its actual source The previous anti-aliasing pass (2dce1c2) assumed the blur came from Windows DPI-virtualizing a non-DPI-aware installer, and concluded it was unfixable without shrinking the whole window. That assumption was wrong: Tauri's generated installer.nsi already sets ManifestDPIAware true and ManifestDPIAwareness PerMonitorV2, and NSIS's MUI2 scales dialog controls to the real per-monitor DPI itself (confirmed by reading the generated target/release/nsis/x64/installer.nsi). The header and sidebar bitmap controls default to MUI_HEADERIMAGE_BITMAP_STRETCH "FitControl", so at anything above 100% scaling NSIS was stretching our 150x57 / 164x314 (96 DPI-sized) source bitmaps up with GDI -- upscaling a 1x source is exactly what produces the softness, independent of how the source pixels were anti-aliased. Regenerated both bitmaps at 4x native resolution (600x228, 656x1256) from the actual app icon (src-tauri/icons/128x128@2x.png) and the app's own ink/ink-dim/background colour tokens, with Bahnschrift Bold text rendered with grayscale (non-ClearType) anti-aliasing. FitControl now downsamples from oversampled source at every realistic scale factor instead of upsampling, which is what actually fixes it -- verified by reproducing NSIS's stretch-to-control-size step against both the old and new bitmaps at 150% and 200%. --- src-tauri/installer/header.bmp | Bin 25818 -> 410454 bytes src-tauri/installer/sidebar.bmp | Bin 154542 -> 2471862 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src-tauri/installer/header.bmp b/src-tauri/installer/header.bmp index 362e065e204dd4d0342b86d73853526bc4cb0ee8..7665cab49f2e3c8fa20feb990a803aec831325ed 100644 GIT binary patch literal 410454 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ⅇ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 z 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 z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs 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 From c912ff371f043ebe2717af008742fa1476fe1132 Mon Sep 17 00:00:00 2001 From: CRT Date: Wed, 30 Sep 2026 17:50:55 +0700 Subject: [PATCH 2/2] Build releases without the build machine's paths, and scan the installer before it ships A binary embeds the absolute paths of its sources: Rust panic locations in textream.exe, and __FILE__ in the sherpa-onnx library, which this build compiles locally with MSVC. `bun run release` now builds through wayBetter's build-env (paths remapped for Rust, trimmed for MSVC C++) and then runs its privacy-scan over the finished installer; a hit fails the release. The reviewed false positives (an ONNX operator name, an HTTP header name) are in privacy-allowlist.txt. --- README.md | 18 ++++++++++++++++++ package.json | 3 ++- privacy-allowlist.txt | 17 +++++++++++++++++ scripts/release.mjs | 39 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 privacy-allowlist.txt create mode 100644 scripts/release.mjs diff --git a/README.md b/README.md index 0449e74..8a4162d 100644 --- a/README.md +++ b/README.md @@ -233,6 +233,24 @@ Build the installer: bun run app:build ``` +Build the installer for a release: + +```bash +bun run release +``` + +A binary embeds the absolute paths of what it was compiled from — Rust panic +locations, and `__FILE__` in the sherpa-onnx library this build compiles with +MSVC — and on a developer's machine those paths hold the account name. The +release build therefore runs through two commands of +[wayBetter](https://git.crt.fyi/CRT/waybetter)'s CLI (set `WAYBETTER_CLI` to its +`packages/waybetter/bin/waybetter.mjs`, or have `waybetter` on the `PATH`): +`build-env` builds with those paths remapped or trimmed, and `privacy-scan` +opens the finished installer and fails the release if the account name, or any +name listed in the file `WAYBETTER_FORBIDDEN_TERMS` points at, is still in it. +Reviewed false positives live in `privacy-allowlist.txt`. It needs CMake and +7-Zip, and only an installer that passed is published. + Run the test suite: ```bash diff --git a/package.json b/package.json index 109f809..74667fb 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "check": "svelte-check --tsconfig ./tsconfig.json", "tauri": "tauri", "app": "tauri dev", - "app:build": "tauri build" + "app:build": "tauri build", + "release": "node scripts/release.mjs" }, "dependencies": { "@tauri-apps/api": "^2.11.1", diff --git a/privacy-allowlist.txt b/privacy-allowlist.txt new file mode 100644 index 0000000..9f18425 --- /dev/null +++ b/privacy-allowlist.txt @@ -0,0 +1,17 @@ +# Reviewed false positives of the release scan (scripts/release.mjs), one per line: +# : > +# +# onnxruntime.dll is Microsoft's prebuilt runtime. It names ONNX operators and quotes their +# documentation, and one operator's name is an ordinary English word that can also be a name. +# None of these is a path or a person. +**/onnxruntime.dll: AtanhMin +**/onnxruntime.dll: onnxruntime::_\d+< +**/onnxruntime.dll: sequence length was +**/onnxruntime.dll: detections to output +**/onnxruntime.dll: is_bidirectional distance +**/onnxruntime.dll: = ?\( +**/onnxruntime.dll: [QX]_[ ,)_] +# +# textream.exe holds the names of the HTTP headers its webview layer knows; one of them carries +# the same English word. +**/textream.exe: Access-Control--Age diff --git a/scripts/release.mjs b/scripts/release.mjs new file mode 100644 index 0000000..e826bac --- /dev/null +++ b/scripts/release.mjs @@ -0,0 +1,39 @@ +// The release build: the installer, built without this machine's paths, then scanned. +// +// A binary embeds the absolute paths of what it was compiled from: Rust panic locations, and +// `__FILE__` in the sherpa-onnx library this build compiles with MSVC. On a developer's machine +// those paths hold the account name. wayBetter's `build-env` runs the build with them remapped or +// trimmed, and its `privacy-scan` opens the finished installer and looks for what must not be in +// it. Nothing is published from here: a clean scan is what makes the installer publishable. +// +// bun run release (WAYBETTER_CLI: path to waybetter's bin/waybetter.mjs, else `waybetter`) +import { spawnSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = dirname(dirname(fileURLToPath(import.meta.url))); +const { version } = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')); +const installer = join(root, 'target', 'release', 'bundle', 'nsis', `Textream_${version}_x64-setup.exe`); +const waybetter = process.env.WAYBETTER_CLI ? ['node', process.env.WAYBETTER_CLI] : ['waybetter']; + +function run(step, [command, ...args]) { + console.log(`\n== ${step}`); + const quoted = [command, ...args].map(arg => (/\s/.test(arg) ? `"${arg}"` : arg)).join(' '); + const { status } = spawnSync(quoted, { cwd: root, stdio: 'inherit', shell: true }); + if (status !== 0) { + console.error(`\nrelease: "${step}" failed (exit ${status ?? 'none'}). Nothing here is publishable.`); + process.exit(status || 1); + } +} + +// CMake does not recompile objects when only the environment changed, so a sherpa-onnx left over +// from an ordinary build would keep its paths. +run('clean the release profile', ['cargo', 'clean', '--release']); +run('build the installer, path-free', [...waybetter, 'build-env', '--root', root, '--', 'bun', 'run', 'app:build']); +if (!existsSync(installer)) { + console.error(`release: the build left no ${installer}`); + process.exit(1); +} +run('scan the installer', [...waybetter, 'privacy-scan', installer, '--allow', join(root, 'privacy-allowlist.txt')]); +console.log(`\nClean. Publishable: ${installer}`);