exifcleaner-web/CHANGELOG.md
forgejo_admin 6779e59efd
All checks were successful
CI / Lint, Typecheck & Unit Tests (push) Successful in 38s
CI / E2E (Standalone single-file) (push) Successful in 2m0s
CI / E2E (Web) (push) Successful in 3m48s
Rebrand to MetaScrub + upstream attribution (#95)
Follow-up to #93 (Phase G). The "ExifCleaner" name no longer reflects what the project does — v5 strips PDF Info dicts, Office docProps, MP4 atoms, and JPEG/PNG markers, not just EXIF. The "wraps ExifTool" framing died in Phase D; Phase G drove the last nail. This PR renames the user-facing surface to **MetaScrub** and adds prominent attribution to the [szTheory/exifcleaner](https://github.com/szTheory/exifcleaner) upstream.

## What changed

**Brand surfaces renamed:**

- `package.json` — `name`, `productName`, `description` (dropped the no-longer-controlled `exifcleaner.com` author URL)
- `src/web/index.html` — page title
- `public/manifest.webmanifest` — PWA name / short_name / description
- `.resources/strings.json` — unsupported-RAW copy + zip filename template
- `src/infrastructure/web/batch_output.ts` — zip filename
- All user-facing docs (`README.md`, `CLAUDE.md`, `CHANGELOG.md`, `docs/architecture.md`, `docs/PRIVACY_GAPS.md`, `docs/android-apk.md`, `docs/animation-principles.md`, `docs/deploying.md`)

**Attribution:**

- README lead now carries a "Forked from [szTheory/exifcleaner](https://github.com/szTheory/exifcleaner)" banner under the title.
- New `## Credits` section at the bottom of the README walks through the lineage v3.6 → v4 (modernization) → v5 Phase A–G (WASM strategies, web-only, Electron retirement) → MetaScrub.
- `CLAUDE.md` and `docs/architecture.md` history note also link to upstream.

**localStorage migration (no data loss):**

- New key: `metascrub-settings-v1`
- One-time shim reads `exifcleaner-settings-v1` on first launch and copies it forward, then clears the legacy key. Existing PWA users keep their toggles. Covered by 4 new tests in `tests/renderer/infrastructure/web_api.test.ts`.

**Stale-URL cleanup bundled in:**

- Replaced all `https://github.com/obuvuyoviz26-lab/exifcleaner-web/issues/N` links across docs with bare `#N` refs (Forgejo auto-links these locally; the old GitHub URLs were dead since the May-12 migration).
- Dropped the in-app HEIC follow-up link — it was hard-coding `http://localhost:3000/forgejo_admin/exifcleaner-web/issues/48`, which is a private dev URL useless to end users.
- Cleaned a stale `https://exifcleaner.app/` comment in `vite.config.web.ts`.

**Forensic-scanner update:**

- `tools/forensic/{png,office}.ts` stray-marker regexes now also catch `/metascrub/i`. The `exifcleaner` pattern is kept alongside so any pre-rebrand fingerprint regression also fails. See the §"Forensic verification" rationale in `format-strategy-workflow.md`.

## Deliberately NOT renamed

- **Internal identifiers**: `ExifError` type, `formatExifError`, `src/domain/exif/`, CSS `--ec-*` tokens. Not user-facing brand surfaces; renaming would be pervasive cosmetic churn.
- **CHANGELOG.md historical entries**: v4.0.0 and earlier entries describe events that happened when the project was named ExifCleaner. Treating them as historical record.
- **`docs/superpowers/specs/*` and `docs/superpowers/plans/*`**: same rationale — historical snapshots of design / planning work.
- **Cloudflare Pages project name** (`exifcleaner-web` in `.github/workflows/deploy-web.yml` + the corresponding lines in `docs/deploying.md`): tied to a live Cloudflare resource. Renaming would orphan the existing deploy URL. Inline comment in deploying.md notes the legacy name + that renaming is a CF-dashboard operation.

## Verification

- `yarn lint` ✓
- `yarn typecheck` ✓
- `yarn test` ✓ (318 tests, +4 for the migration shim, all passing)
- `yarn check:deps` ✓
- `yarn build:web` ✓
- `yarn build:web:standalone` ✓

## Test plan

- [ ] CI green on the PR
- [ ] After deploy, existing PWA installs see "MetaScrub" name on next launch; settings persist across the rename (migration shim runs on first read)
- [ ] Fresh PWA install shows MetaScrub end-to-end (title, manifest name, zip filenames)
- [ ] Drop an unsupported file → "We don't support {ext}" message no longer points anywhere clickable for HEIC (was leaking localhost URL)

## Rollback

Single PR, squash-merge. `git revert <merge-sha>` restores the ExifCleaner brand. localStorage migration is one-way (legacy key is removed after copy), so a revert would leave new users without their settings on the next visit; existing users who never opened the app between PR merge and revert would be unaffected. Low-impact in practice.

Co-authored-by: Randa <obuvuyoviz26@gmail.com>
Reviewed-on: http://localhost:3000/forgejo_admin/exifcleaner-web/pulls/95
2026-05-14 10:39:19 +04:00

8.4 KiB

Changelog

Unreleased

  • Rebrand to MetaScrub. The project name changes from ExifCleaner to MetaScrub to reflect the broader format coverage (PDF, Office docProps, MP4 atoms — not just EXIF). Lineage: forked from szTheory/exifcleaner. Internal CSS variables (--ec-*) and the ExifError type stay — they are not user-facing brand surfaces. The localStorage settings key migrates from exifcleaner-settings-v1 to metascrub-settings-v1 on first launch (existing settings carry over via a one-time shim).
  • Phase G — Electron retired. PWA is the sole distribution channel. macOS xattr scrubbing documented as a gap in docs/PRIVACY_GAPS.md. See PR #93 / issue #80.

4.0.0

Complete modernization of ExifCleaner after a 5-year hiatus. Every layer of the application has been rebuilt — from Electron 11 to 35, vanilla DOM to React 19, loose scripts to DDD architecture, zero tests to 265 unit + 42 E2E tests.

Security

  • Upgrade to Electron 35 (from 11) with all Chromium security patches
  • Content Security Policy (CSP) meta tag blocks eval, inline scripts, and remote resources
  • Electron Fuses disable runAsNode, NODE_OPTIONS, and --inspect in production builds
  • IPC payload validation with Zod schemas on all 16 channels
  • IPC sender verification — only the authorized BrowserWindow can invoke handlers
  • Navigation hardening — renderer cannot navigate to external URLs
  • Permission gate — all Chromium permission requests denied by default
  • Renderer fully sandboxed with contextIsolation, no Node.js access

Added

  • Preserve orientation metadata — option to keep EXIF rotation tag so photos don't flip (issues #209, #234)
  • Save as copy — create _cleaned copy instead of overwriting original (issues #218, #124)
  • Remove macOS extended attributes — strips xattr/quarantine metadata (issue #86)
  • Preserve file timestamps — keep original created/modified dates
  • Folder recursion — drop a folder to process all files inside recursively (issues #171, #231)
  • Metadata inspection — expand any file to see before/after metadata diff
  • Language switching — change language from settings without restarting (issue #244, 25 locales)
  • WebP support verified working (issue #264)
  • Settings panel with 5 privacy toggles, theme selector, and language picker
  • Dark mode with intentional design respecting OS prefers-color-scheme
  • Playwright E2E test suite (42 tests, 10 specs, ~30s)
  • Vitest unit test suite (265 tests, ~1.4s)
  • GitHub Actions CI — lint, typecheck, unit tests, E2E tests, cross-platform builds
  • GitHub Actions release workflow with macOS code signing and notarization
  • SHASUMS256.txt generated automatically for all release artifacts
  • Translations: Persian, Catalan, Croatian updates merged

Changed

  • React 19 SPA replaces vanilla DOM renderer — component architecture with BEM CSS design system
  • DDD architecture — domain types, application commands/queries, infrastructure adapters, composition root
  • TypeScript 5.7 strict mode with all additional safety flags (noUncheckedIndexedAccess, exactOptionalPropertyTypes, etc.)
  • electron-vite 5 + Vite 7 replaces electron-webpack — faster builds, HMR, ESM
  • electron-builder 26 (from 22) with macOS universal binary support (Intel + Apple Silicon)
  • ExifTool v13.50 (from 12.25) with checksum verification
  • Hand-rolled ExifTool wrapper replaces node-exiftool — implements -stay_open protocol directly (~240 lines)
  • Full ESM"type": "module" throughout, verbatimModuleSyntax enforced
  • Platform requirements: macOS 10.15+, Windows 10+, Linux 64-bit (previously macOS 10.10+, Windows 7+)
  • Typed error handling with discriminated unions across 4 error domains

Removed

  • node-exiftool npm dependency (replaced by hand-rolled wrapper)
  • source-map-support (Node 22 has built-in source maps)
  • Spectre CSS framework (replaced by BEM CSS with custom properties)
  • electron-webpack and webpack (replaced by electron-vite)
  • Travis CI configuration (replaced by GitHub Actions)
  • Auto-update check on startup (never worked reliably, removed entirely)

3.6.0 - 4 May 2021

Security

  • Fix for XSS and Electron reverse shell vulnerabilities by sanitizing exiftool HTML output in the UI. To take advantage of this, an attacker would have had to write image metadata containing malicious script code to a file that you then download and run through ExifCleaner. Proofs of concept:

XSS:

exiftool -Comment='<img src=x onerror=alert("ok") /><b>OverJT</b>' -PixelUnits='meters' image.png

Electron reverse shell:

exiftool -Comment='<img src=x onerror=window.require("child_process").exec("/usr/bin/firefox") /><b>OverJT</b>' -PixelUnits='meters' image.png

3.5.1 - 1 May 2021

Infrastructure

  • Add support for Windows "portable" releases that don't require installation

3.5.0 - 1 May 2021

If you are running a previous version of ExifCleaner, update immediately due to a security vulnerability found in exiftool (the command-line tool that ExifCleaner uses under the hood). Thank you to all contributors for this release. As always, credits are listed in the README.

Security

Features

  • Add translations for Slovak, Russian, Ukranian, Danish, Arabic, Italian, Chinese (Mandarin)
  • Add support for the new Mac M1 ARM processors

Infrastructure

  • Upgrade to Electron 11
  • Update some NPM dependencies
  • Start maintaining a CHANGELOG file in source control

Fixes

  • Translation fixes for Portuguese (Brazil) and French
  • Update Linux AppImage category to fix exit status 1 issue

3.4.0 - 19 Oct 2020

Features

  • Huge speed increase for file processing, especially when batch processing many files with multiple CPUs (more efficient process pool algorithm, better integration with exiftool process keep-alive)
  • Multilingual support with translations for French, Polish, Japanese, Spanish (Spain), German, and Portuguese (Brazil)
  • Mac/Windows: show progress in dock when batch processing files
  • Linux: fix app icon in dock
  • Linux: dark mode works with Ubuntu

Bug Fixes

  • Linux: fix issue where icon.png was not found on startup with .deb installs

Infrastructure

  • Upgrade to Electron 10
  • Upgrade to exiftool 12.08
  • Add update_exiftool.pl Perl script to automate pulling down latest ExifTool binaries and verifying their checksums
  • Remove a bunch of NPM dependencies

3.3.1 - 11 Jul 2020

  • Change from JavaScript to TypeScript for improved stability of compiler static analysis.
  • Fix Windows UTF-8 filename bug.
  • Remove several NPM dependencies to simplify code.
  • Upgrade to Electron 9.
  • Minor UI polish.

3.2.0 - 27 Apr 2020

  • Fix Linux version (was not using correct ExifTool binary path)
  • Add File -> Open menu item
  • Add dock icon for Linux AppImage
  • Mac quit entire app when File -> Close menu item is selected
  • Linux clean up About screen
  • Update app start text to show that ExifCleaner also supports video and PDF files.

3.1.0 - 3 Feb 2020

  • Drop target should follow window size when you resize it to be taller
  • Set a minimium window size in BrowserWindow
  • On macOS, when you close the window, the app should quit.
  • night mode better icon display opacity
  • night mode font not so thin
  • remove Automatic updates from README (feature removed)

3.0.0 - 18 Jan 2020

  • properly clean up after exiftool perl5.18 processes
  • disable auto update
  • remove esm dep. fix dev env
  • disable unused preferences menu item. esm modules for import with node

2.1.0 - 10 Jan 2020

  • electron 7.1.8 which should fix auto update issue in electron-build, according to some developer reports

2.0.0 - 4 Jan 2020

  • electron 7.1.2 to fix electron-builder auto update regression

1.5.1 - 10 Dec 2019

  • fix node url require

1.5.0 - 10 Dec 2019

  • drastically simplify dark mode code
  • debugging dark mode in Electron 6. clean up js functions/modules

1.4.0 - 10 Dec 2019

  • downgrade to Electron 6 to fix auto-update

1.3.5 - 10 Dec 2019

  • fix mainwindow callback null error

1.3.4 - 10 Dec 2019

  • Automatic updates logger fix

1.3.3 - 10 Dec 2019

  • Auto-updater debug logging

1.3.1 - 10 Dec 2019

  • Fix popover hover bounds

1.3.0 - 8 Dec 2019

  • Fix popover transparency
  • Fix dark mode font color for exif values

1.1.0 - 8 Dec 2019

  • First release.