# 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.