Repository navigation
Releases: haavardnk/immich-edit
Release list
v0.7.2
Adds light, dark and system modes with a choice of theme and accent for each user.
Fixes
- The app stays dark when the operating system switches to a light colour scheme.
- The Keyboard shortcuts dialog scrolls in one region instead of two.
Improvements
- Settings > Appearance has Mode (Dark, the default, Light or System), Light theme and Dark theme.
- 12 built-in theme families: immich-edit, Immich, Catppuccin, Rosé Pine, Tokyo Night, Gruvbox, Solarized, Nord, Dracula, One, GitHub and Everforest.
- Light accent and Dark accent pick each mode's highlight colour from the theme. The logo and browser tab icon follow it.
- Appearance is stored per user on the server and follows the account to every device.
- A sun and moon button in the top bar switches between light and dark on wider screens.
- Photos, the editor canvas, scopes, curves and on-photo guides stay neutral in every theme.
- Some palette colours are adjusted to keep text at WCAG AA contrast.
- Adds a database migration for appearance settings, so v0.7.1 does not start on an upgraded database. Back up
DATA_DIRfirst; see Upgrade to v0.7.2.
What's Changed
- fix: scroll the shortcuts dialog once by @haavardnk in #397
- feat: add themes by @haavardnk in #396
- docs: add v0.7.2 upgrade notes by @haavardnk in #398
Full Changelog: v0.7.1...v0.7.2
v0.7.1
Renders photos and exports past the GPU's memory or texture limits in tiles that match a single-pass render.
Fixes
- A GPU render that panics, such as on a photo past the texture limit, falls back to the CPU for that render only.
Improvements
- Photos and exports up to 65535 px on the long edge, rendered on the GPU in tiles past its texture limit or memory budget, healing and clone strokes included, with identical output, histogram and scopes.
- More photos render in one pass: the GPU renderer uses the device's full texture and buffer limits.
- Server renders share a GPU memory budget measured from the device.
GPU_MEMORY_BUDGET_MBoverrides it, andGPU_TEXTURE_CACHE_MBdefaults to an eighth of it (256 to 4096 MB). - CPU renders wait for room in a host memory budget: RAM or container limit minus
RAW_FRAME_CACHE_MBandQUALITY_FRAME_CACHE_MB. Renders past it fail withThis photo is too large for the server's memory. - Zoomed browser previews match the server's Dehaze, Texture, Clarity and Shadows, also for photos too large for the GPU.
- Lower GPU memory use for edits without masks.
- Settings > Diagnostics shows Render plans and the GPU memory budget.
What's Changed
- ci: publish edge images from main by @haavardnk in #369
- fix: keep the gpu device on render errors by @haavardnk in #371
- ci: save rust caches from main only by @haavardnk in #389
- feat: size gpu renders from device memory by @haavardnk in #372
- feat: render large raws in gpu tiles by @haavardnk in #378
- feat: admit cpu renders within host memory by @haavardnk in #385
- feat: tile renders with retouch strokes by @haavardnk in #388
- perf: hold the working image across display tiles by @haavardnk in #390
- chore: bump rust to 1.99 and its dependencies by @haavardnk in #393
- chore: bump web dependencies by @haavardnk in #394
- chore: bump sveltekit to 3 by @haavardnk in #395
Full Changelog: v0.7.0...v0.7.1
v0.7.0
Adds AI Denoise, Lens Blur, guided upright, Kelvin white balance, the Immich trash and Replace original, and applies the corrections stored in phone and drone DNGs.
Breaking changes
- Migrations 0024 to 0027 rewrite white balance in
editsandedits_history, addluts.shaper_size, remove mask layercolorfrom edits, history and presets, and addexport_jobs.original_trashed. v0.6.x will not start on the migrated database, so back up the data directory before upgrading. See Upgrade to v0.7.0. - Edits store
basic.white_balanceas{mode: relative, temp, tint}or{mode: absolute, kelvin, tint}instead ofbasic.wb_tempandbasic.wb_tint. Positive tint is magenta, so stored tint values, mask tint included, are negated. Edit manifests below schema version 5, including v0.6.x preset files, are converted on read. - Saved edits render with the new noise reduction, hot pixel repair and DNG corrections. A LUT grades in sRGB for every output space, which can shift Display P3 renders.
- The render revision includes the release version, so previews, source tiles, preset thumbnails and edited thumbnails re-render once after this and every later upgrade.
- Shortcuts remapped: Develop, Geometry, Retouch and Masks are
Shift+D,Shift+R,Shift+QandShift+M; radial and linear masks areRandL; fullscreen isF, so favorite isPonly; the filmstrip isShift+Sand the tags panelShift+T; thumbnail info isI; copy and paste edits areCtrl+CandCtrl+V; Export isShift+E; the horizon line isA.Shift+Pshows the presets strip instead of the corner handles. Geometry'sEnterandShift+Xare gone.
Fixes
- Export jobs finish in the UI when the live event stream drops.
- A tooltip stays shut while its control's popover is open.
- Pressing
→several times at the end of the loaded photos in the loupe moves the full count once the next page loads. - Notices and warnings in Export, Retouch and the model settings use higher-contrast text.
- ONNX Runtime logs only warnings and errors, under the
onnxruntimelog target. - Dependency update for the
ctutilssecurity advisory (RUSTSEC-2026-0385).
Improvements
- Temperature in Kelvin and Tint for RAW files, starting at the camera's as-shot white. Other images keep relative sliders.
- Pick white balance (
W) samples a point or a dragged area and shows the resulting Temperature and Tint next to the pointer. - Auto white balance looks for neutral surfaces and stays near the camera's white when a scene has none.
- Auto (
Ctrl+U) meters the photo as rendered with profile, crop and lens corrections, weights detected faces, and sets white balance, tone, Clarity, Dehaze, Vibrance and Saturation. - Noise reduction measures each photo's noise, so the same settings suit ISO 100 and ISO 12800.
- AI Denoise for RAW files, with Strength and Detail. It runs once per photo on the server, keeps the result for later edits and exports, and needs its model from App settings > Models.
DENOISE_CACHE_MBcaps its disk use (4096 MB by default). - Lens Blur from a generated depth map, with Focal Range, Amount, circle, hexagon or octagon Bokeh, and Boost. Uses the depth model.
- Guided upright sets Angle, Vertical and Horizontal from two to four drawn lines.
- Phone and drone DNGs apply their stored lens shading, vignette, distortion and bad-pixel corrections. Hot and dead pixels are repaired on every Bayer and X-Trans RAW.
- More
.cubeLUTs import, including ones with a 1D curve before the 3D table and ones that declare their own input range. - Move to Immich trash from the selection bar, the loupe and editor menus, or
Del/Backspace, plus Move rejected to trash, with Undo. API keys needasset.delete. - Replace original on upload to Immich moves albums, shared links, favorite and stack to the upload, then trashes the original. API keys need
asset.copyandasset.delete. - Geometry edits apply live.
- Presets in a grouped strip under the photo with live thumbnails (
Shift+P). - Versions and view toggles in the editor toolbar.
- Copy, paste and reset confirm with a message.
- Every mask overlay shows in red.
- Support bundles list each GPU texture pool and AI Denoise disk use.
What's Changed
- feat: show white balance in Kelvin by @haavardnk in #308
- feat: replace bilateral NR with wavelet shrinkage by @haavardnk in #246
- fix: grade LUTs in sRGB before output by @haavardnk in #270
- feat: find neutral surfaces for auto WB by @haavardnk in #320
- feat: solve auto adjust on the real render by @haavardnk in #321
- chore: upgrade rust dependencies by @haavardnk in #339
- ci: let manual audits sync issues by @haavardnk in #341
- feat: draw every mask overlay in red by @haavardnk in #346
- feat: white balance area picker and readout by @haavardnk in #347
- feat: remap keyboard shortcuts by @haavardnk in #348
- feat: apply geometry live and add preset strip by @haavardnk in #349
- fix: load the tag library once by @haavardnk in #352
- feat: add AI denoise by @haavardnk in #353
- fix: quiet onnxruntime logs by @haavardnk in #354
- fix: use ModelRuntime in ml runtime test by @haavardnk in #355
- feat: trash photos and replace originals by @haavardnk in #359
- feat: add depth-based lens blur by @haavardnk in #361
- feat: add guided upright by @haavardnk in #362
- fix: match reset buttons to header icons by @haavardnk in #363
- feat: apply DNG opcodes and fix hot pixels by @haavardnk in #364
- chore: bump dependencies by @haavardnk in #365
- fix: re-render cached previews after upgrades by @haavardnk in #366
- fix: polish AI denoise and job follow-ups by @haavardnk in #367
- docs: add v0.7.0 upgrade notes by @haavardnk in #368
Full Changelog: v0.6.8...v0.7.0
v0.6.8
Picks the faster renderer for editor previews, reaches Immich behind Cloudflare Access and makes depth masks easier to aim.
Improvements
- Settings > Preview rendering has a new default, Fastest. The editor times the browser and the server and draws previews with whichever is clearly quicker. Browser and Server force one side. Browsers set to Browser when available move to Fastest. Settings > Diagnostics shows both measured speeds and the browser's GPU limits.
- Immich behind Cloudflare Access works without a private network: set
CF_ACCESS_CLIENT_IDandCF_ACCESS_CLIENT_SECRETto a service token. See Cloudflare Access. - A depth mask has one Near → Far slider with two handles in place of separate Near and Far sliders. Positions are shares of the photo, so 40 on the right handle keeps the nearest 40%. The selection shows in the layer color while you drag.
Fixes
- A GPU render that crashes no longer leaves the server stuck; that render and later ones fall back to the CPU.
- The GPU renders photos wider or taller than 8192 pixels, such as from 100 MP sensors.
- When Immich answers with a redirect, such as from an access proxy, the error says so instead of
upstream status 302. - Sign-in and setup show the error Immich gave instead of "The immich-edit server is not responding".
- Dependency updates for published security advisories in
rustls,rustls-webpki,webpki-root-certs,ruzstdandzip.
What's Changed
- fix(gpu): recover from panic and bump texture cap by @BakaAkari in #327
- chore: bump @immich/ui and bits-ui by @haavardnk in #307
- feat: pick the browser renderer by speed by @haavardnk in #343
- feat: support cloudflare access service tokens by @haavardnk in #344
- fix: make depth range near-to-far slider by @haavardnk in #345
Full Changelog: v0.6.7...v0.6.8
v0.6.7
Rebuilds clipped RAW highlights, fixes the edit history list and shows capture times as Immich does.
Fixes
- Capture date and time in the info panel, loupe and grid match Immich; photos without an EXIF time zone no longer shift by the browser's offset.
- Every History entry expands to show its changes and restores; some stayed on "Loading…".
- Repeating an edit that changes nothing, such as pressing an auto button again, no longer adds a History entry.
Improvements
- Clipped RAW highlights rebuild from the colors still recorded, keep the color of nearby surfaces and blend to white where every color clips. Existing edits of such photos render differently.
- Highlights below 0 darkens bright areas without flattening them or shifting their color.
What's Changed
- fix: send history as manifests by @haavardnk in #324
- fix: reconstruct clipped highlights on the mosaic by @haavardnk in #323
- fix: show capture time like Immich by @haavardnk in #326
Full Changelog: v0.6.6...v0.6.7
v0.6.6
Adds a filter panel with camera, lens, place, album, people, tag, date-added and file size filters, and Immich's five search types.
Fixes
- Editing the search query keeps the chosen search type and filters.
- The Search header and Search by buttons stay put while results reload.
- The search box clears when leaving search, including with the browser's Back.
- Context search offers only exact star ratings instead of applying at-least or at-most ratings to the loaded photos.
Improvements
- Filters, or
Shift+F, opens a docked filter panel beside the grid, grouped into sections that each reset on their own; active filters show as removable chips. - Filters live in the page address, so reloads, Back and Forward, bookmarks and shared links keep them.
- Make, Model, Lens, Country, State and City pickers narrow each other and offer Unknown; on Immich 3.2 each takes several values.
- Albums, People and Tags match all, any or none of the picked values on Immich 3.2, all of them before that.
- Not in any album, Untagged and, on Immich 3.2, No people sit beside their pickers.
- Added after and Added before filter by upload date.
- Min size (MB) and Max size (MB) filter by original file size; Immich 3.2 adds a file size sort, unsized photos last.
- Search by picks Context, File name, Description, Full path or folder or OCR, as in Immich; Context and OCR show only when Immich has smart search and OCR turned on. Old
mode=descriptionlinks run a description search.
What's Changed
- feat: richer browse filters by @haavardnk in #309
- feat: search by path, description and OCR by @haavardnk in #317
Full Changelog: v0.6.5...v0.6.6
v0.6.5
Adds rating sort and at-least, at-most or exact star filters on Immich 3.2, a date-added sort, and server-side reject and label filters, and logs every failed request.
Fixes
- 100MP+ RAWs such as Fujifilm GFX100S II RAFs render on the GPU instead of failing.
- Taken after and Taken before use Immich's date picker instead of the browser's date field.
- Buttons that open popovers and panels show styled tooltips.
- Failed background jobs, cleanups and model downloads reach the server log with their cause.
Improvements
- Rating picks Any, Unrated or a star count; on Immich 3.2 and later,
≥,≤or=matches at least, at most or exactly, and≤keeps unrated photos. - Rejected replaces Exclude rejected and shows, hides or shows only rejects; Only lists everything to delete in Immich.
- Immich applies Label and Rejected filters, so counts and every page match; Hide and No label need Immich 3.2.
- The sort menu picks Date taken or Date added; Immich 3.2 adds Rating, highest or lowest first across the whole result, unrated last.
- Every API response logs one line on the
httptarget with request ID, path, user, status and latency; errors add the code and message.tower_httpno longer carries request logs. LOG_FORMAT=jsonwrites one JSON object per line.- Browser errors from signed-in sessions reach the server log on the
clienttarget. - Diagnostics shows the Immich version, and Copy support bundle adds Immich and browser details as one block for issue reports.
What's Changed
- feat: log failures and forward browser errors by @haavardnk in #300
- feat: simpler issue reports by @haavardnk in #301
- fix(gpu): increase max_storage_buffer_binding_size to support 100MP+ by @BakaAkari in #304
- ci: lint PR and commit titles by @haavardnk in #305
- feat: server-side filters and sorts on Immich 3.2 by @haavardnk in #306
New Contributors
- @BakaAkari made their first contribution in #304
Full Changelog: v0.6.4...v0.6.5
v0.6.4
Keeps EXIF in every export, copies Immich's date, location, description and rating to uploaded edits, and makes other users' photos read-only.
Fixes
- Exports from RAF and every other source format keep their EXIF; uploads to Immich land at the original's capture time.
- Lossy WebP keeps metadata; Lossless is no longer forced on.
- Exports drop maker notes and the original's unique image ID, so Immich never mistakes the edit for the original.
- PNGs of every color type open, including palette, low bit depth and grayscale with alpha.
- Rating, favorite, reject, label and tag controls are disabled on photos another Immich user owns, as in Immich; hovering says why.
- Stack with original is disabled for another user's photo; a mixed batch reports
Stacking skippedfor those. - Changes Immich refuses show Immich's reason instead of an Immich unreachable error.
- The mask overlay button hides the overlay fully, and the overlay shows the selected mask in its layer color.
Improvements
- Uploaded edits get the date, time zone, map location, description and star rating Immich shows for the original; All but location leaves out the map location.
Metadata not copiedandMetadata copy failedlist under the export result and per photo in Jobs.- The mask overlay steps aside while dragging an adjustment, and a brush stroke shows its paint while drawing.
Full Changelog: v0.6.3...v0.6.4
v0.6.3
v0.6.3
Fixes 16-bit GPU renders with masks and smooths range masks; Clarity and range masks may render differently.
Fixes
- Photos with masks render again to 16-bit output on the GPU.
- High Clarity no longer leaves bright or dark halos along strong edges.
- Luminance range and Color range masks follow areas and edges instead of speckling on noise and grain.
- A new range mask opens with the mask preview on, and a color range shows it again after sampling.
Improvements
- Corner Boost under Capture Sharpening sharpens harder towards the corners for lenses that are softer there.
Full Changelog: v0.6.2...v0.6.3
v0.6.2
Reworks color and tone tools to keep hue and match between editor and export; existing edits may render differently.
Fixes
- Editor preview no longer shows the previous photo after switching between same-sized RAWs.
- Heal no longer brings the blemish back on large brushes.
- Lensfun corrections fit the image corners on every sensor shape.
- Linear gradient masks stay perpendicular on non-square photos; polygon feather is even on both axes.
- Mask overlay shows the same falloff as the render.
- Shadows in mask layers works on GPU renders.
- Curves no longer clip highlights; curve points line up with the histogram.
- Saturated blues no longer turn purple when mapped into sRGB or Display P3.
- Display P3 output with a DCP profile no longer gets sRGB colors on GPU renders.
- GPU lens correction is as sharp as CPU renders.
- Sharpening, grain, Texture and Clarity look the same at every preview size and in export.
Improvements
- HSL, Vibrance, saturation and color grading work in Oklab: hue holds and dark colors no longer crush.
- Vibrance protects dark and light skin alike, independent of exposure.
- HSL bands select bright highlights by their real hue.
- Contrast, Highlights and Blacks keep hue; contrast -100 no longer blows up near black.
- Whites targets highlights instead of acting as a second exposure slider.
- Clarity targets displayed midtones; Clarity and Shadows strength no longer follow exposure.
- Temperature and Tint re-derive the camera color at the new white, and the DCP profile follows the edit.
- DCP profile color applies before user color edits, as in DNG.
- Vignette darkens in stops with highlight priority; -100 no longer turns corners black.
- Grain sits in the midtones and no longer lifts blacks.
- Negative Dehaze adds haze by scene depth.
- Originals over 8 MiB download from Immich in parallel byte ranges.
Full Changelog: v0.6.1...v0.6.2