# Changelog ## 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: ```bash exiftool -Comment='OverJT' -PixelUnits='meters' image.png ``` Electron reverse shell: ```bash exiftool -Comment='OverJT' -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 - Update exiftool to 12.25 to mitigate [CVE-2021-22204 arbitrary code execution](https://twitter.com/wcbowling/status/1385803927321415687) ### 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.