Files
mExifEditor/CHANGELOG.md
T

14 KiB

Changelog

0.9.2

  • Apply pending preview rotations physically when saving JPG, PNG, and TIFF files.
  • Show an explicit overlay stating whether rotation will be saved or is preview-only.
  • Preserve pending rotation while navigating between photos during the current session.
  • Use lossless jpegtran rotation for compatible JPEG dimensions.
  • Fall back to one high-quality JPEG re-encode when a perfect lossless transform is unavailable.
  • Rotate PNG pixels losslessly and reject animated PNG files rather than dropping frames.
  • Rotate every page of a TIFF with lossless TIFF compression.
  • Restore existing metadata after PNG/TIFF reconstruction, then normalize EXIF/XMP orientation to 1.
  • Keep HEIF, DNG, and all camera RAW formats strictly preview-only for rotation.
  • Reject unsupported or invalid rotation requests at the backend.
  • Add libjpeg-turbo-progs to the container for lossless JPEG transforms.
  • Preserve all existing metadata editing, format support, viewport, and streamed-save behavior.

0.9.1

  • Lock the three-column desktop workspace to the available browser viewport height.
  • Keep the bottom photo-navigation bar visible without whole-page scrolling.
  • Let the photo list and metadata form scroll independently inside their panels.
  • Allow the image stage to shrink with shorter laptop displays while preserving aspect ratio.
  • Add a compact desktop-height layout for browser viewports 800 pixels tall or shorter.
  • Preserve normal document scrolling for tablet and mobile layouts.
  • Preserve all v0.9 format, metadata, preview, and streamed-save behavior.

0.9.0

  • Add the nikon format group with NEF and NRW support.
  • Add the sony format group with ARW and ARQ support.
  • Add exact NEF, NRW, ARW, and ARQ badges and format-sort compatibility.
  • Validate the TIFF headers used by Nikon and Sony RAW containers before processing.
  • Prefer embedded JPEG previews before loading the lazy LibRaw fallback.
  • Read and write EXIF, XMP, IPTC, dates, descriptions, keywords, GPS coordinates, and location labels.
  • Preserve Nikon and Sony maker notes, sensor data, embedded previews, and untouched camera metadata.
  • Use the established streamed save path, live transfer progress, and timing diagnostics.
  • Document every ENABLED_FORMATS group, its extensions, and its behavior in the README.
  • Keep older Sony SR2 as a future compatibility decision and exclude read-only SRF.
  • Preserve all existing JPG, PNG, TIFF, HEIF, DNG, and Canon RAW behavior.

0.8.3

  • Stream processed files from the backend in 256 KiB chunks with an explicit content length.
  • Write response chunks directly into the browser's protected writable file instead of creating a complete in-memory Blob.
  • Show live transferred bytes and percentage while saving.
  • Commit the local replacement only after the complete response stream closes successfully.
  • Cancel the response reader and abort the browser writable file if streaming fails.
  • Retain the buffered Blob workflow as a compatibility fallback for browsers without response streaming.
  • Report time to first byte and combined stream/write time for streamed saves.
  • Preserve all existing metadata, format, progress, and folder-state behavior.

0.8.2

  • Return inspection metadata and the JPEG preview in one compact binary response instead of Base64 JSON.
  • Remove Base64 response expansion and the corresponding browser decode loop.
  • Preserve the detailed save timing after the current photo reloads.
  • Include total, server/transfer, and local-write durations in the save notification.
  • Log end-to-end server duration for /api/inspect and /api/process.
  • Log temporary-copy, preview-extraction, and metadata-read timings for inspections.
  • Add request-duration and Server-Timing response headers for browser diagnostics.
  • Preserve all v0.8.1 RAW opening optimizations and existing format behavior.

0.8.1

  • Upload server-preview formats only once when opening them, returning the preview and metadata together.
  • Stop at the first usable embedded RAW preview instead of extracting every candidate.
  • Add RAW_PREVIEW_MAX_EDGE (default 1600) for smaller temporary RAW previews.
  • Keep LibRaw as a lazy fallback only when no embedded RAW preview is usable.
  • Show separate server/transfer and local-file-write durations after saving.
  • Log upload, ExifTool rewrite, and response-read timings and expose them through Server-Timing.
  • Allow up to three minutes for large DNG and Canon RAW metadata rewrites.
  • Preserve all existing format and in-place overwrite behavior.

0.8.0

  • Add the canon format group with CR2 and CR3 support.
  • Add exact CR2 and CR3 badges and format-sort compatibility.
  • Validate TIFF-based CR2 headers separately from ISO-BMFF-based CR3 headers.
  • Extract JpgFromRaw, PreviewImage, and ThumbnailImage, using the largest valid embedded preview.
  • Use the lazy LibRaw decoder only when a Canon RAW file has no usable embedded preview.
  • Read and write CR2 EXIF, XMP, IPTC, date precision, description, keywords, GPS coordinates, and location labels.
  • Read and write CR3 EXIF and XMP metadata without applying unsupported IPTC-IIM fields.
  • Preserve Canon maker notes, sensor data, embedded previews, and other untouched camera metadata.
  • Update enabled-format configuration, UI text, manifest, README, and the RAW roadmap, including planned Nikon and Sony phases.
  • Preserve all established JPG, PNG, TIFF, HEIF, and DNG behavior.
  • Bump the application and service-worker cache version to 0.8.0.

0.7.1

  • Add ENABLED_FORMATS with the available groups jpg, png, tiff, heif, and dng.
  • Expand each group to its associated extensions and expose the enabled groups/extensions through /api/config.
  • Omit disabled formats from browser folder scans and reject them at backend metadata, preview, and processing endpoints.
  • Generate the default page subtitle and empty-folder guidance from the enabled format groups.
  • Validate configuration strictly so unknown or empty format lists fail clearly at startup.
  • Load pillow-heif only on the first HEIF preview.
  • Prefer an embedded DNG preview without loading LibRaw, and import rawpy only when a rendered DNG fallback is actually required.
  • Keep a decoder loaded after first use until container restart, avoiding repeated load/unload overhead.
  • Preserve all format behavior when ENABLED_FORMATS is omitted.
  • Bump the application and service-worker cache version to 0.7.1.

0.7.0

  • Add DNG folder scanning, DNG format badges, and format-sort compatibility.
  • Add browser-friendly DNG previews by preferring embedded JpgFromRaw, PreviewImage, and ThumbnailImage data.
  • Add a half-size LibRaw rendering fallback for DNG files without a usable embedded preview.
  • Add rawpy and the container OpenMP runtime required by its LibRaw decoder.
  • Validate DNG uploads as TIFF-based files before processing.
  • Read and write DNG EXIF, XMP, IPTC, date precision, description, keywords, GPS coordinates, and location label metadata.
  • Preserve the original DNG container, sensor data, and embedded previews while overwriting the same local file.
  • Update the interface, manifest, environment example, README, and format roadmap.
  • Preserve all established JPG, PNG, TIFF, and HEIF processing behavior.
  • Bump the application and service-worker cache version to 0.7.0.

0.6.1

  • Add optional APP_TITLE and APP_SUBTITLE environment variables for the visible page heading and subtitle.
  • Keep APP_NAME backward-compatible as the title fallback and application identity.
  • Update the browser tab title from the configured page title.
  • Bump the application and service-worker cache version to 0.6.1.

0.6.0

  • Add HEIC, HEIF, and HIF folder scanning and in-place metadata processing.
  • Normalize all three HEIF-family extensions to a HEIF format badge and include them in format sorting.
  • Generate temporary browser-friendly JPEG previews for HEIF-family images while preserving and overwriting the original container on save.
  • Add pillow-heif and the container HEIF runtime needed to decode previews.
  • Validate HEIF-family files as ISO Base Media File Format containers with recognized HEVC image brands before processing, without admitting renamed AVIF files.
  • Read and write HEIF EXIF/XMP dates, precision marker, description, keywords, GPS coordinates, and location label without applying IPTC-IIM fields.
  • Return updated files using HEIC/HEIF media types while keeping the original filename and extension.
  • Update the interface, manifest, documentation, and empty-folder guidance for the new formats.
  • Preserve the established JPG, PNG, and TIFF processing paths.
  • Bump the application and service-worker cache version to 0.6.0.

0.5.0

  • Add in-place PNG metadata reading and writing.
  • Add in-place TIFF/TIF metadata reading and writing.
  • Generate temporary browser-friendly JPEG previews for TIFF files while preserving and overwriting the original TIFF on save.
  • Validate JPEG, PNG, and TIFF file signatures before metadata processing.
  • Add normalized JPG, PNG, and TIFF format badges to the left photo list.
  • Show the current file format alongside size and modified time in the viewer.
  • Add Sort: Format, grouping by normalized format and then filename.
  • Keep TIFF list thumbnails lazy: a format tile is shown until that TIFF has been opened and previewed.
  • Add configurable TIFF preview edge and pixel limits.
  • Bump the application and service-worker cache version to 0.5.0.

0.4.3

  • Fix favorite locations appearing empty after a browser refresh.
  • Load the shared server-side favorite list during application startup instead of waiting for Open photo folder.
  • Keep the existing refresh when opening a folder as a defensive re-sync for changes made by another family member.
  • Preserve all favorites already stored in the photo-date-editor-data Docker volume.
  • Bump the application and service-worker cache version to 0.4.3.

0.4.2

  • Added shared favorite locations to the Location tab.
  • Favorite names and coordinates are stored server-side in the persistent photo-date-editor-data Docker volume.
  • Added Use, Add current location, and Delete selected controls for favorite locations.
  • Favorite locations are available to every browser and family member using the same Docker stack.
  • Duplicate favorite names are rejected case-insensitively.
  • Documented MP4 as a later media phase after the planned photo formats.

0.4.1

  • Fix Shift+Tab so it activates the previous metadata tab immediately and focuses that tab's first field.
  • Keep Left/Right arrow keys dedicated to previous/next photo navigation.
  • Remove the tab-header Arrow/Home/End behavior that conflicted with photo navigation and was awkward on compact Mac keyboards.
  • Proxy OpenStreetMap tiles through the backend and serve them same-origin through Caddy, avoiding Brave third-party tile blocking.
  • Add an in-memory map-tile cache and clear map loading/error status text.
  • Add an explicit message when the Leaflet library fails to load instead of silently showing a dead map.
  • Add ca-certificates explicitly to the container image for outbound HTTPS map and geocoder requests.
  • Keep all map environment variables optional; existing .env files remain valid.
  • Bump the application and service-worker cache version to 0.4.1.

0.4.0

  • Add a dedicated Location tab with an interactive Leaflet map.
  • Add user-triggered address/place search through a backend geocoder endpoint.
  • Add click-to-place and draggable map markers.
  • Add editable decimal latitude and longitude fields plus an optional location label.
  • Read existing EXIF/XMP GPS metadata and repopulate the map and fields.
  • Write GPS coordinates to EXIF and XMP while preserving existing GPS unless the user changes it.
  • Add explicit Clear location behavior that removes app-managed GPS and location tags on save.
  • Add configurable tile, geocoder, and default map settings through optional environment variables.
  • Rate-limit uncached public geocoder calls to one request per second and cache results in memory.
  • Add Shift+Tab to cycle backward through right-side metadata tabs while keeping normal Tab field navigation.
  • Add arrow-key navigation when a tab header has focus.
  • Avoid service-worker caching of third-party map tiles and scripts.
  • Bump the application and service-worker cache version to 0.4.0.

0.3.0

  • Add status filtering for All, Pending, Saved, Skipped, and Failed photos.
  • Add sorting by filename or status; status order prioritizes Pending, then Failed, Skipped, and Saved.
  • Make previous/next and Save & Next follow the currently filtered and sorted list.
  • Replace the single blue progress fill with green Saved, yellow Skipped, and red Failed segments; Pending remains the grey remainder.
  • Add accessible progress text with counts for every status.
  • Document the proposed PNG, TIFF, HEIC/HEIF, DNG, Canon RAW, and Nikon RAW roadmap.
  • Explicitly drop DWG and BMP alongside the previously excluded formats.
  • Bump the service-worker cache and application version to 0.3.0.

0.2.0

  • Read EXIF/XMP/IPTC metadata from the selected JPEG and populate the editor fields.
  • Recognize files previously edited by Photo Date Editor from their XMP marker, including in another browser.
  • Show a saved metadata summary such as date, time precision, description presence, and keyword count.
  • Add a persistent Skipped state and sidebar icon.
  • Count Saved + Skipped photos as processed in the progress bar.
  • Rename the secondary save action to Save current.
  • Clarify Ctrl+S as Save current photo and stay on it.
  • Record whether an entered time was known or unknown in the app's XMP marker.
  • Preserve compatibility with progress state and files created by 0.1.