NoAdsTools is a privacy-first, client-side image editor and batch processor in the NoAds suite. Image files never leave the browser. Edit one image or a hundred — crop, resize, rotate/flip, brightness/contrast/saturation, blur, color-to-transparent, text overlays, freehand brush, shapes, blur/pixelate redaction, ML background removal, smart compression and "smallest size" preset, EXIF metadata stripping, auto-trim of transparent or solid-color borders, HEIC/HEIF import, and export to PNG, JPG, WebP, or PDF — per image or as a ZIP. All locally.
Image files never leave the browser. The site fetches its own code, fonts,
and ML model assets from this origin only. No third-party CDNs, no
analytics, no tracking, no cookies. See privacy.html or
the in-app privacy panel for the full disclosure (including the exact
localStorage keys we set and which vendored libraries load lazily on first
use).
This repo ships ~118 MB of pre-vendored binary assets under
js/vendor/bgremove/ so that the in-browser
"Remove background" feature works end-to-end after git clone && npm install
with no separate model-download step. With the v1.1 additions
(jsPDF ~420 KB and libheif ~1.1 MB), the total disk footprint of
the working tree is ~135 MB; including .git history the on-disk
repo is ~245 MB.
That's:
- The @imgly/background-removal ESM bundle (~170 KB, AGPL-3.0) and its license text.
- The ISNET fp16 segmentation model — content-addressable chunks fetched
from
staticimgly.com/@imgly/background-removal-data/1.7.0/once at install time, then vendored. - The ONNX Runtime Web SIMD WASM kernels — both the CPU path and the WebGPU/JSEP path — also as content-addressable chunks alongside the model. The browser only downloads the variant it actually uses at runtime.
- The matching onnxruntime-web@1.21.0
ESM bundles (CPU + WebGPU, ~800 KB total, MIT) under
js/vendor/onnxruntime-web/, resolved at runtime via an import map inindex.html. - The jsPDF UMD bundle (~420 KB,
MIT) under
js/vendor/jspdf/for image-to-PDF export. - The libheif-js
decoder (~1.1 MB JS + WASM, LGPL-3.0) under
js/vendor/heic/for HEIC/HEIF import. Loaded on first .heic open, gated by a one-time consent modal. - The JSZip library (~97 KB, MIT) at
js/vendor/jszip.min.jsfor batch ZIP export. - The MediaPipe BlazeFace face-detection
ONNX export (~600 KB, Apache-2.0) under
js/vendor/blazeface/, re-distributed by Qualcomm AI Hub Models. Powers the "Auto-detect faces" button in the redact tool. Tile-based multi-scale scanning catches small faces in group photos. - The Tesseract.js v7 OCR engine
(~22 MB across 6 LSTM-only WASM variants + English
eng.traineddata.gz, all Apache-2.0) underjs/vendor/tesseract/. Powers the "Detect text" button + preview-select mode with PII regex auto-marking. - The ONNX Runtime Web threaded JSEP WASM kernels
(~36 MB across
ort-wasm-simd-threaded.{jsep,}.{wasm,mjs}) also vendored underjs/vendor/onnxruntime-web/— required by both BlazeFace and the existing background-removal model at runtime.
A clone of this repo is consequently larger and slower than a typical
static-site repo. The trade is intentional: zero third-party CDN reliance,
self-hosted everything, and a deploy that works immediately on a freshly
cloned site. See THIRD-PARTY.md and
js/vendor/bgremove/.notice for the full
inventory + re-vendoring instructions.
- vanilla JS, no framework, no build step — native ES modules and a single CSS file.
- Self-hosted Onest font (variable, OFL) under
fonts/. - Vendored libraries under
js/vendor/:bgremove/(@imgly/background-removal + ISNET model + ONNX runtime WASM),onnxruntime-web/(peer ESM bundle + the threaded JSEP WASM kernels shared by BlazeFace + bg-remove),blazeface/(face detection ONNX, ~600 KB),tesseract/(OCR engine + English language data, ~22 MB),jspdf/(PDF export),heic/(HEIC decoder),jszip.min.js(ZIP batch export). - PWA manifest + icons — installable on desktop and mobile. Icons live
at
img/logo.svg,img/icon-192.png,img/icon-512.png,img/icon-512-maskable.png,img/apple-touch-icon.png(all generated fromimg/logo.svgvianode scripts/build-icons.mjs). - No analytics, no telemetry, no third-party requests at runtime.
This project is licensed under the GNU AGPL v3.0 — see LICENSE. The AGPL's source-availability requirement means the running site links to its own source repository in the footer and privacy panel.
Source: https://github.com/Dan512/NoAdsTools
Requires Node 22+.
nvm use && npm install— install dev deps (Playwright, axe-core)npm test— unit tests via Node's built-in test runnernpm run test:browser— Playwright browser tests (afternpm run test:browser:installto fetch browser binaries)npm run serve— local static dev server onhttp://localhost:4173node scripts/build-icons.mjs— re-renderimg/icon-*.pngfromimg/logo.svg(committed to the repo; only re-run if the logo changes)node scripts/install-blazeface.mjs— re-fetch the BlazeFace face-detect ONNX from Qualcomm AI Hub's S3 release bucket (already committed; only re-run after bumpingQAI_VERSION)node scripts/install-tesseract.mjs— re-fetch Tesseract.js v7 + tesseract.js-core v7 + Englisheng.traineddata(already committed; only re-run after bumping the pinned versions)node scripts/install-ort.mjs— re-fetch the ONNX Runtime Web threaded JSEP WASM kernels (already committed; only re-run after bumpingORT_VERSION)node scripts/measure-weight.mjs— print the initial-load wire byte count (raw + gzipped) for the static page