Repository navigation
Releases
PhotoReview 2.0.518
Requires Windows 10/11 x64 and the .NET 10 Runtime (Microsoft.NETCore.App 10.x; the Windows Desktop Runtime is not needed). Unzip and run PhotoReview.exe (Win32 + Direct2D shell).
This package holds only PhotoReview.exe; it does not change your file associations. If .jpg files were opened with the old PhotoReview.App.exe, register PhotoReview.exe again (deploy/install-photo-review-association.ps1).
SHA256 of PhotoReview-v2.0.518-win-x64.zip: DD4FC63947FF1E52B4098C3291B5F4274DE191CFACB5B8411CB4400ACB5BF0C6
SHA256 of PhotoReview.exe: 2CC6FFA18F40159EE91A37ABB967123B330DBF74260DF08BDEA62D77A24C8AB3
Changes since v2.0.510
Features
- submenu for multiple external editors, default editor + shortcut in #526
- Core file-rename engine (RenameNamePolicy, RenameAsync, case-only, group) - PR1 FEAT-RENAME in #527
- rename state (PR2: catalog/session/presenter/cache, Undo re-key, RenameCurrentAsync) in #529
- UI to rename the image being viewed (PR3 FEAT-RENAME): right-click menu + F2, Win32 in #530
Tests
- DrainAsync no longer leaves DispatcherTimer.Interval negative (flaky Soak) in #528
Docs
- WP28B-WARP-EDGE note (cause of random failures on WARP) in #524
- design for renaming the viewed image via right-click menu (unconfirmed) in #525
CI / Tooling
- release package contains only the Win32 shell PhotoReview.exe (RELEASE-SHELL-ONLY) in #531
Full Changelog: v2.0.510...v2.0.518
PhotoReview 2.0.510
Requires Windows 10/11 x64 and the .NET 10 Windows Desktop Runtime. Unzip and run PhotoReview.App.exe (the WPF app).
PhotoReview.exe (the Win32 + Direct2D shell) is a parallel build in the same folder; it does not change your file associations.
SHA256 of PhotoReview-v2.0.510-win-x64.zip: 48A3E9469A6B620E0348AF0758E66F1ECE0B870A563B0905FEA4F8776CE16959
SHA256 of PhotoReview.App.exe: 1A082A1B778885D0BCC7BA87484ADFCBDC7972CC08F2361F85BE36A588E55538
SHA256 of PhotoReview.exe: 677BEBE5042CFA62E5776548EEA32DEB686ED2446D0CB0CE69734FB44F8CCE08
Changes since v2.0.371
Features
- External Editor menu item always visible; opens Settings when unconfigured in #383
- Second Fit width (anchored at bottom third, own key) + assignable middle-click action in #385
- context menu Copy File Name / Copy Full Pathname + compact menu rows in #384
- WebP and HEIC/HEIF via Windows codecs (Q-FMT-WEBP-HEIC) in #388
- customisable right-click menu + Explorer 'Browse with PhotoReview' folder command in #390
- two-finger touchpad swipe (pan when zoomed, change image by swipe distance) + Refresh command (R / menu) in #391
- WP-01 Shell.* project skeleton + App.Shared, v1 contract and architecture tests in #399
- WP-13a interop Win32 (LibraryImport user32/kernel32/gdi32/dwmapi/shcore/comctl32/ole32/shell32) in #400
- WP-11 JSON source generation for the serializer in Core in #401
- WP-13b interop D3D11/DXGI/D2D1/DWrite + COM shell in #402
- WP-07 input and non-WPF UI seams (C-04 adapter, C-06, C-07) in #410
- WP-02 PixelBuffer, codec, PixelOps (C-01..C-03) + PixelAssert in #408
- WP-19a native dialogs + clipboard in #404
- WP-08 placement and F11 per HWND (C-14) in #403
- WP-14 window, message loop, dispatcher, frame clock (C-04/C-05/C-15 Win32) in #406
- WP-18 right-click menu model + native menu host in #409
- WP-10 golden recorder from the WPF build (G-VIEW/INPUT/KEY/MENU/OVL) in #405
- WP-16 pure viewport engine + ViewportController (do NOT merge before WP-10) in #411
- WP-05 TurboJpeg and LibRaw to PixelBuffer in #413
- WP-03 WIC Direct, embedded thumbnail, EXIF to PixelBuffer in #414
- WP-04 disk cache encode/decode via WIC, byte-compatible in #412
- WP-15 renderer Direct2D + GpuImageCache + tile (WIP) in #415
- contract v1.1 - C-07 App.Shared, C-09 IRenderSurfaceFactory, ExifOrientation locked in #441
- WP-06 split out PhotoReview.Imaging.Wpf, remove UseWPF from Imaging*, codecs mandatory in #442
- WP-17 DirectWrite text + overlay rounding + animator (C-11) in #443
- WP-12 WIC moved to [GeneratedComInterface] + LibraryImport (P2) in #444
- WP-09 split out PhotoReview.App.Shared (move files, AddPhotoReviewShared, inject clipboard/sink) in #445
- WP-19b App.WpfWindows + Shell.WpfBridge (late-loaded secondary WPF windows) in #446
- WP-20 composition root + startup shell (Win32 PhotoReview.exe actually runs) in #447
- WP-21 image presentation, compare, crossfade (Win32 shell) in #450
- WP-22 shell input (keys, mouse, wheel, touchpad, drag-drop) in #449
- WP-24 right-click menu, Zoom submenu, custom zoom in #453
- WP-23 HUD overlay, toolbar, status, auto-hide, native folder picker in #448
- WP-26 custom-drawn scrollbar (NE-3 a) matching WPF ScrollViewer in #451
- WP-25 F11, multi-monitor, DPI, dark title bar (Win32 shell) in #452
- WP-30 two-exe packaging, CI, Explorer association for PhotoReview.Shell in #458
- WP-29 perf host + probe, perf gate wave 3 (shell vs WPF, R2R) in #460
- WP-33 COM shell / Recycle Bin without late binding (IFileOperation, IShellItem2/IContextMenu, IShellWindows) in #470
- WP-36 Native AOT publish for PhotoReview.exe (separate artifact) + CI job in #475
- WP-34 IsAotCompatible everywhere + LibraryImport + AOT publish gate with 0 warnings in #477
- AOT - secondary windows stub: Settings opens config.json, other windows report they are unavailable in this build in #481
- bridge secondary WPF windows into the Win32 shell (Settings/Diagnostics/Recovery/... now open) in #486
- JSON measurement results with schema + compare + -PerfGate in #485
- WP-35 Phase 1 - native Win32 dialogs (ZoomPrompt, Diagnostics, Skipped, BatchReview) + secondary window router in #489
- WP-35 Phase 2 - new Win32 controls + Action profiles + modeless Benchmark in #490
- WP-35 Phase 3a - Win32 Settings frame + page contract + first 3 pages in #493
- WP-35 Phase 4 - Recovery as a native Win32 dialog in #494
- WP-35 Phase 3b - Performance page of Win32 Settings in #495
- WP-35 Phase 3b - Files page of Win32 Settings (Radio + FocusExternalEditor) in #497
- WP-35 Phase 3b - Shortcuts page of Win32 Settings (27 key-capture boxes, nested Action profiles) in #498
- WP-35 Phase 3b - Mouse page of Win32 Settings (20 properties, 18 right-click menu slots) in #496
Fixes
- Fit HUD percent, click-zoom key no-toggle setting, no stale-scroll frame on keyboard zoom in #387
- open file at its real position, undo Delete in place, refuse Delete without Recycle Bin up front in #386
- verify-all -Hidden -Parallel false failure + unique hidden-runner log names in #389
- arrow-key step equal in pixels on both axes (short viewport side) in #407
- clean up empty destination folder when the journal fails at Begin in #427
- single Recycle post-checks that the source has disappeared (B-06) in #433
- back up a newer config.json before Save overwrites it (C-04) in #434
- return graphics when child HWND is alive (fixes Flush hang on CI) + standalone shell test in #455
- WicCom.Wrap - failed QI exception no longer depends on leftover IErrorInfo (flaky CI) in #454
- agent-finish-check no longer falsely flags pre-existing empty files in #459
- Win32PresentationSink keeps FIFO when a UI-thread update arrives after a pending cross-thread update in #476
- Settings version line shows the build time again in #491
- owner-draw dark menu, app icon, shell-errors.log + Menu error in #492
- Win32 dialog dark theme no longer depends on uxtheme ordinals/DarkMode_* in #499
- scrolling Settings pages leaves no ghost images (WS_CLIPSIBLINGS) in #503
- Settings pages show full content (group boxes sent to bottom of Z-order) + not-all-background-color test in #511
- color emoji in the Win32 shell (L2 WP-27) in #516
- text in tall input boxes vertically centered + test that Tab does not blank the page (WP-35) in #517
- vertically center text in single-line inputs of Benchmark/ActionProfiles/ZoomPrompt in #522
- combobox has only one paint style after focus/selection (WP-35) in #523
Performance
- opening an image from Explorer - placement before showing, cloak until first frame (no white frame), decode launch image early in #394
- P-1 - decode first image from App_Startup, warm up config parser, remove JIT/...
PhotoReview 2.0.371
Requires Windows 10/11 x64 and the .NET 10 Windows Desktop Runtime. Unzip and run PhotoReview.App.exe.
SHA256 of PhotoReview-v2.0.371-win-x64.zip: 4B2C72795954FC359D623B028C80A8C284CC59E0D90DB144AF333B6043DDF454
SHA256 of PhotoReview.App.exe: A847298A5E7A9ABEC310FD38844A23E50DBA12E7F55CD4B781A601DC643E645A
Changes since v2.0.240
Features
- --set overrides + tune-matrix/tune-rank for device tuning by @ConanKLOP2 in #341
- pooled-latency ranking, resource sampler, MemBalloon, subset fixtures, stage files S1-S8 by @ConanKLOP2 in #358
Fixes
- RAW container fixes RV-R01..R04 by @ConanKLOP2 in #249
- never start queued file-action work under the gate lock (RV-A01) by @ConanKLOP2 in #250
- RV-S01/S03/S04 config load repairs by @ConanKLOP2 in #251
- decoding hardening (RV-I03..I08) by @ConanKLOP2 in #252
- RV-P01..P08 review fixes (restore guard, explorer enum, prefetch race, generator) by @ConanKLOP2 in #258
- review 2026-10 cache/preload fixes (RV-I02, I09..I16) by @ConanKLOP2 in #253
- review 2026-10 PR 9 - journal torn-tail repair + C05/C09/S02/S05/S06/S07 by @ConanKLOP2 in #257
- error-handling review - guards, catches, observed tasks across all projects by @ConanKLOP2 in #261
- error-handling review round 2 - journal/settings/undo guards, observed tasks, libraw search path, decoder bounds by @ConanKLOP2 in #263
- Settings > Import uses the same parse pipeline as startup Load by @ConanKLOP2 in #270
- a faulting present no longer replaces a failed file action's error text by @ConanKLOP2 in #279
- non-finite font size / keyboard zoom step settings (R05) by @ConanKLOP2 in #287
- queued file commands and undo reopen are scoped to their folder (R02, R08, R09) by @ConanKLOP2 in #288
- WIC factory failure ignores stale IErrorInfo (flaky test) by @ConanKLOP2 in #289
- Copy cleanup must not delete a foreign destination (R01); AtomicCacheFile temp ownership (R07) by @ConanKLOP2 in #290
- publish guard follows ancestor junctions (R03) by @ConanKLOP2 in #292
- R04 stale Fit correction + R10 fade identity on same-file swap by @ConanKLOP2 in #298
- LibRaw CancellationState frees its GCHandle once (suspected cause of red master) by @ConanKLOP2 in #300
- SessionWriter shutdown flush honours the budget around the save itself by @ConanKLOP2 in #296
- memory-admission refusal skips WPF fallback (R06); stale persist worker keeps newer cache file (C1) by @ConanKLOP2 in #299
- journal robustness (W2-FA-04, -07, -01, -03) by @ConanKLOP2 in #311
- recycle eligibility follows real volume (junction/mounted folder), fail closed (P-RB-01) by @ConanKLOP2 in #312
- Core audit follow-ups (D-06, W2-FA-02/05/06/10) by @ConanKLOP2 in #310
- folder-identity leftovers D-02/D-03/D-04 by @ConanKLOP2 in #309
- wave 2 platform/imaging/session P3 audit findings (P-EXP-01, P-COM-01, P-DISP-01, D-05, D-07, D-08) by @ConanKLOP2 in #314
- Core P3 robustness - diagnostics, updates, localization (W2CM-01..06) by @ConanKLOP2 in #313
- Core P3 robustness - catalog/model (W2-CC-01, 03, 06, 07) by @ConanKLOP2 in #315
- Core P3 robustness - IO/settings/session (F02, F03, F07) by @ConanKLOP2 in #316
- harden benchmark CLI (wave 2 tooling-b) by @ConanKLOP2 in #317
- PerfAnalysis t_decode, LowSampleWarning and summary.json keys (wave 2 tooling-a) by @ConanKLOP2 in #318
- R14 older folder open replacing newer, APP-P02 glide double-count by @ConanKLOP2 in #321
- permanent delete fails closed on unknown volumes (R11); recycle size re-read before shell call (R26) by @ConanKLOP2 in #322
- P2 candidates R16/R21/R23/R32 from review PR #284 by @ConanKLOP2 in #323
- recovery/undo/reconcile prove file identity, not existence (R15, R17, R18) by @ConanKLOP2 in #324
- volume-GUID paths bypass permanent-delete drive-type guard (R44) by @ConanKLOP2 in #325
- benchmark CLI report writes never go through links; unique report dir; slow-link bandwidth; action steps (R13, R30, R34, R35, R20) by @ConanKLOP2 in #329
- scripts/CI leftovers R12, R27, R28, R29 by @ConanKLOP2 in #330
- ORF thumbnail fallback byte accounting; ImagePresenter captured-token hardening (APP-P01) by @ConanKLOP2 in #331
- Copy rollback and startup reconcile prove file identity (R01a, R01b, R01c) by @ConanKLOP2 in #328
- sibling folder navigation skips Hidden/System folders by @ConanKLOP2 in #335
- back up config.json before load repairs overwrite it (F06 option B) by @ConanKLOP2 in #336
- F11 from maximized no longer flashes Fit big-then-small by @ConanKLOP2 in #339
- no stale image frames during F11 transition (measured) by @ConanKLOP2 in #346
- F11 never flips the OS window state (measured cause of the zoomed-crop jump) by @ConanKLOP2 in #351
- throwing Recycle Bin, busy guard, dead move entry by @ConanKLOP2 in #357
- SourceBytesCache never re-reads a range a racing reader just published by @ConanKLOP2 in #359
- coverage.ps1 single-project empty merge, per-case fuzz hang bound, RawDecoder first-failure contract by @ConanKLOP2 in #360
- auto-resume preload after a transient memory pause by @ConanKLOP2 in #356
- safety fixes from static review (coverage raw, fullscreen cleanup, A/A split, alias registration) by @ConanKLOP2 in #370
- review-2 LOW findings (fullscreen frame cleanup in finally, behavioural test, A/A split test) by @ConanKLOP2 in #371
- validate fullscreen-exit rect against current monitors; strengthen StopListening oracle by @ConanKLOP2 in #372
Tests
- kill surviving mutants in core/imaging (Stryker round 1) by @ConanKLOP2 in #269
- internal test seams for TurboJpeg/WIC/PhysicalFileSystem/OperationJournal survivors by @ConanKLOP2 in #271
- kill surviving mutants in RawDecoder, RawJpegIccProfile, SourceRawHeaderSource and LibRaw by @ConanKLOP2 in #273
- seams for prune/persist/late-dispose survivors; journal commit survives a failing clock by @ConanKLOP2 in #272
- kill surviving mutants in App view-models, services and WPF glue by @ConanKLOP2 in #274
- kill surviving mutants in App coordinators and input by @ConanKLOP2 in #275
- Core mutation gaps (SessionStore, DuplicateFinder, RecoveryFileCheck) by @ConanKLOP2 in #280
- kill surviving mutants in Imaging decoding, preload, caching by @ConanKLOP2 in #283
- mutation gaps in Imaging Metadata, Raw, LibRaw, TurboJpeg and journal tail by @ConanKLOP2 in #281
- raise App mutation score (round 3: seams for dialogs, mouse, dispatcher, file actions) by @ConanKLOP2 in #282
- mutation gaps in Core Diagnostics and Updates (FileLog, PerfCsvListener, PhotoReviewPerf, DiagOptions, AppVersion, UpdateChecker) by @ConanKLOP2 in #285
- kill surviving mutants in Localization, LenientEnumConverter, NavigationStatWorker by @ConanKLOP2 in #286
- mutation gaps in Imaging.LibRaw, TurboJpeg and journal tail (follow-up to #281) by @ConanKLOP2 in #291
- App mutation round 3b (stat refresh, listing, selection, zoom-target gaps) by @ConanKLOP2 in #295
- pin the logged failure when showing the original throws in ZoomDeta...
PhotoReview 2.0.240
Requires Windows 10/11 x64 and the .NET 10 Windows Desktop Runtime. Unzip and run PhotoReview.App.exe.
SHA256 of PhotoReview-v2.0.240-win-x64.zip: C299B7B57F19E3BBD9C3A85E7E1402E0B0E5EB230A61AE22A550B82DDA04ECC3
SHA256 of PhotoReview.App.exe: 1613BAB94EBB3C11B642B4AF344BEA58031A8C2FB02AD97E5BAE7499AA302D6B
Changes since v2.0.239
Features
- camera RAW support integration branch (RAW-01..RAW-70) by @ConanKLOP2 in #239
Full Changelog: v2.0.239...v2.0.240
PhotoReview 2.0.239
Requires Windows 10/11 x64 and the .NET 10 Windows Desktop Runtime. Unzip and run PhotoReview.App.exe.
SHA256 of PhotoReview-v2.0.239-win-x64.zip: 58B58DA97B151ED2B613ECAAFE531302D6216ACC4E0FD7CD13536A3A011E0089
SHA256 of PhotoReview.App.exe: 84A8C0B4551421050F951C520D618C6F78891BD994F134A92622D4D54ACE7C85
Changes since v2.0.231
Fixes
- review small findings — zoom-detail after compare failure, undo fingerprint leak by @ConanKLOP2 in #231
Performance
- IMG-07 single JPEG header marker walk in TurboJpegDecoder.Decode by @ConanKLOP2 in #234
- single parse per line + provably safe compaction by @ConanKLOP2 in #235
Tests
- hidden-desktop local runner keeps UI-category windows off the desktop by @ConanKLOP2 in #233
- fix 4 rotted Category=Slow MainWindow tests and run them in CI by @ConanKLOP2 in #240
Docs
- detailed camera RAW support plan + multi-agent task cards by @ConanKLOP2 in #237
- split AGENTS.md Tests detail into docs/TESTING.md, raise T0 budget to 18 KB by @ConanKLOP2 in #236
Other
- refactor(settings): guard SettingsWindow field-map sync, de-dup shortcut read, cache probe Actions parse by @ConanKLOP2 in #232
Full Changelog: v2.0.231...v2.0.239
PhotoReview 2.0.231
Requires Windows 10/11 x64 and the .NET 10 Windows Desktop Runtime. Unzip and run PhotoReview.App.exe.
SHA256 of PhotoReview-v2.0.231-win-x64.zip: 243190E0319095160F6D6AB619FE4564471249C19C16C11CE5B43EFE60764AC1
SHA256 of PhotoReview.App.exe: C6E2AD86CC9172F2A676BB506095C8CA3D24E2CFF0545BA450F9A3019274F03B
Changes since v2.0.223
Features
- Add Delete menu item, fix shortcut hint visibility, clarify terminology by @ConanKLOP2 in #225
Fixes
- Fit width/height always honor the configured anchor, settle scrollbar side effects by @ConanKLOP2 in #228
- v2.0.203 feedback triage — Q-R40..Q-R49 + OPEN-DECISIONS conflict mitigation by @ConanKLOP2 in #229
Performance
- ISourceReader seam + fix slow-link preload/viewer contention (Q-R29 C-2) by @ConanKLOP2 in #222
- eliminate JPEG header double-read and FileInfo allocation by @ConanKLOP2 in #224
- use HashSet instead of List for TrGenerator placeholder lookups by @ConanKLOP2 in #227
Other
- docs+test: cost-optimized review of remaining 8096 ledger rows (7 fixes, 1 false-positive rejected) by @ConanKLOP2 in #223
- #225 follow-ups: 'Move to Recycle Bin' wording in English; context-menu docs by @ConanKLOP2 in #230
Full Changelog: v2.0.223...v2.0.231
PhotoReview 2.0.223
Requires Windows 10/11 x64 and the .NET 10 Windows Desktop Runtime. Unzip and run PhotoReview.App.exe.
SHA256 of PhotoReview-v2.0.223-win-x64.zip: 55CDBF20F8A3E2CF395F7AFC990A086C534879AFD19A680677F89394316D2C3B
SHA256 of PhotoReview.App.exe: 3EE29E92F613B178AAC5E8E90A2047ECCA0A53053C3A20719676D0DDBB37AAF0
Changes since v2.0.203
Features
- setting to hide the zoom cluster, default off by @ConanKLOP2 in #213
- title-bar instance label for test/agent-launched windows by @ConanKLOP2 in #218
Fixes
- guard Recovery retry against a concurrent retry in another window (P02) by @ConanKLOP2 in #204
- stop seeding Undo from journal at startup (P03) by @ConanKLOP2 in #205
- make crossfade-completion test's opacity check CI-proof with a value-changed watcher by @ConanKLOP2 in #211
- harden publish-directory ownership guard (SEC-03) by @ConanKLOP2 in #215
- close Encode/TryDecode validation gap in forward protocol (SEC-02) by @ConanKLOP2 in #216
- push tag-version tags individually so one blocked ref can't fail the job by @ConanKLOP2 in #220
- close SEC-01 symlink/junction destination escape gap by @ConanKLOP2 in #219
- damp mouse-release kinetic glide speed (Q-R40) by @ConanKLOP2 in #221
Performance
- Q-R29 simulated slow-link measurement (option B) by @ConanKLOP2 in #202
- Q-R29 option C part 1 -- navigation stat off the UI thread by @ConanKLOP2 in #206
Tests
- automate 6 of 11 GUI manual checks with real-window UI tests by @ConanKLOP2 in #207
- fix FolderLoadCoordinator race-test flake (session sweep took the scan-block hook) + sibling flakes by @ConanKLOP2 in #209
- repo-wide dotnet test hang guard (test.runsettings) by @ConanKLOP2 in #208
- fix hang/flake/coverage gaps from test-suite review by @ConanKLOP2 in #214
Docs
- post-ledger review of master changes since 3ef2bb5 + screened-static hot path by @ConanKLOP2 in #201
- sync handoff to master dbd0d3a (post #199-#209) by @ConanKLOP2 in #212
- generate OPEN-DECISIONS.md's Decided table from decisions/ frontmatter by @ConanKLOP2 in #217
CI / Tooling
- group release notes by conventional-commit type by @ConanKLOP2 in #203
Full Changelog: v2.0.203...v2.0.223
PhotoReview 2.0.203
Requires Windows 10/11 x64 and the .NET 10 Windows Desktop Runtime. Unzip and run PhotoReview.App.exe.
SHA256 of PhotoReview-v2.0.203-win-x64.zip: FBA5A436C2FE888F1F3795939BFCC02D12C8D43D4232B728AAFED1AF622D5692
SHA256 of PhotoReview.App.exe: D055367AE187588CE3E0BDE6B463D78BE697D6505E8E3B5B08DCAA64B8F0ABF6
Changes since v2.0.137
Features
- Zoom card in Settings and Fit / Zoom-to-level in the right-click menu (#134)
- Keyboard zoom anchors at the pointer; arrow keys glide (#177)
- Fit width / Fit height modes, new initial zoom presets, keep zoom across images (#178)
- Optional fade transition when changing photo (#181)
- Redesigned right-click context menu (#183)
PHOTOREVIEW_DIAG_FORCE_LOGto enable AppLog for debugging without config edit (#179)- Change default sort mode, kinetic pan and keyboard zoom anchor (#186)
Fixes
- Unique temp file for window placement save (#145)
- BenchmarkWindow no longer logs a fake Fail row when closed mid-run (F-WIN-8) (#149)
- tools/CI review backlog: timing regex, temp zip, link check, culture (#144)
- Refuse Recycle when the drive's Recycle Bin is off or too small (F-WIN-2) (#154)
- Script audit fixes (idx 29, 38, 39, 48, 66) (#158)
- Late-navigation preload gap, SourceBytesCache evict race, comment drift (#164)
- FileActionController failure status, Copy leaves reads alone, undo restores order position (idx 43, 45, 52) (#168)
- docs-budget
-Checkfails closed (#138) - Undo drops dead Move entries; Diagnostics shows Explorer order; remove legacy Delete combo item (#147)
- Treat any damaged disk-cache entry as a miss; a faulting thumbnail no longer fails the image (#150)
- Readability probe result survives StopForAction (#146)
- Close-during-ownership race and localized folder-open failure (#142)
- LRU touch on disk cache hit; capacity 0 disables preview disk cache (#148)
- Survive unwritable default config on first run; migrate unversioned legacy config (#162)
- A partial user language override keeps shipped nativeName and plural rule (#163)
- Settings live-language refresh, benchmark logging restore, instance re-claim, Process disposal (#165)
- Keep Undo/Permanent flags when retrying a failed journal entry (#161)
- Dispose waits for a write the timer thread already drained (#166)
- IWICBitmapSourceTransform vtable order (F-IMG-6) (#143)
- Benchmark.Cli audit fixes (idx 5, 6, 40) (#157)
- Duplicate batch status survives reload; evict recycled files from RAM caches (idx 2, 14) (#169)
- Shutter text, toggle auto-repeat, drive-root title (idx 3, 33, 64 partial) (#170)
- Report TimedOut, not Canceled, when only the timeout fired (#174)
- Duplicate-check hashing streams oversized files, fewer redundant fades, close cancels hashing (#159)
- Close TOCTOU race in DarkScrollBarRenderingTests' Application creation (#180)
- Resolve unresolved merge-conflict markers left in master by #178 (#182)
- Recovery-dismiss race and stale glide-stop flag (#192)
- Queue rapid Move/Delete/Copy presses instead of dropping them (Q-T1 reversed) (#190)
Performance
- Skip hashing unremovable duplicate size groups; ReviewCatalog.Remove keeps the path index (#167)
- Measure and address UI-thread metadata I/O in navigation/compare/file-actions (#191)
- Measure preload contention and startup sweep cost (#195)
- Benchmark concurrency, preview-cache queue bound, benchmark-dialog enumeration; instance-forward evidence test (#194)
- Measure R15-R18 whole-project review findings (no fix needed) (#199)
Tests
- Arrow-pan step validation and click-zoom level tests (#137)
- Zoom context menu and Settings zoom shortcut summary (#141)
- Unit tests for KeyboardPan.Step with stepFraction parameter (#140)
- Fix flaky InfoOverlayFaultTests.SiblingSearchFault_* (#153)
- Isolate window placement file and caches from the real data dir (#156)
- Fix slow PreviewImageServiceDiskCacheTests (never-persisted 64px fixture) (#152)
- Tighten weak shortcut-validation asserts, cover ManagedIStream (#151)
- Replace source-text tests with behavioral tests (F-TEST-1, option B) (#155)
- Deterministic SourceBytesCache file-changed-while-reading test (#173)
- Make weak tests fail on real breakage (idx 56, 57, 7, 37) (#171)
- Make weak tests fail on real breakage (idx 20, 67, 74) (#172)
- Fix two PerfTraceTests fixtures too small to trigger the downscale path (#188)
- Categorize UI/STA tests, add parallel local test runner (#184)
Docs
- Prune stale archive and refresh status (#136)
- Docs and config audit fixes (idx 19, 59, 60, 73, 77) (#160)
- Never edit, commit or pull in the master checkout (#175)
- Consolidate GUI-check rows; all five PRs merged (#187)
- Carve out a fast-forward-pull exception for Release builds (#189)
- Whole-project review and optimization proposals (#185)
- Correct handoff after review PR merged (#196)
- Split decisions/perf logs into fragment files; stop routine PRs editing shared hub docs (#198)
- Deep-review 289 needs-deep-review ledger rows, fix 2 findings (#200)
- Fix stale doc-comment links; pin/fix navigation notification count (#193)
CI / Tooling
- Release notes list changes since the previous published release (#135)
- Require a green CI check on the tagged commit (#139)
- Run docs/i18n checks in a parallel repo-checks job (#176)
Full Changelog: v2.0.137...v2.0.203
PhotoReview 2.0.137
Requires Windows 10/11 x64 and the .NET 10 Windows Desktop Runtime. Unzip and run PhotoReview.App.exe.
SHA256 of PhotoReview-v2.0.137-win-x64.zip: 407DE8145FAEE005DDE98F2BC7175534C7CCB3CBF800E41487F21894B00F9BD4
SHA256 of PhotoReview.App.exe: 4611A7508C86BFBA18FA94950F7EE7B0606CEA1DEB0A8EC424A1A5DD85C83620
What's Changed
- feat(settings): configurable arrow-key pan step on a zoomed image by @ConanKLOP2 in #133
Full Changelog: v2.0.136...v2.0.137
PhotoReview 2.0.127
Requires Windows 10/11 x64 and the .NET 10 Windows Desktop Runtime. Unzip and run PhotoReview.App.exe.
SHA256 of PhotoReview-v2.0.127-win-x64.zip: 6FB3178BCC10AF0C513A06E9DDD8634DCD809005A3F90D330F4F63BE3BFFD3B2
SHA256 of PhotoReview.App.exe: 0B171D2945160DB37E242C9274A52330DA64496274B9BA787875A8378837BF5A
What's Changed
- feat(ui): tester feedback — dark chrome, toolbar auto-hide, title-bar fields, click-zoom controls, glide smoothing by @ConanKLOP2 in #123
Full Changelog: v2.0.126...v2.0.127