Help us keep the list up to date and submit new video software here.
Tool
Complete Version history / Release notes / Changelog / What's New for VideoCull
VideoCull v2.4.1
Changed
The duplicate Samples setting can score pHash matches by the first sample only: the first sample where neither frame is dark decides, which finds more duplicates at the cost of more false positives.
The duplicate Similarity setting keeps a separate value for pHash and for visual similarity, and the value for the method that runs is used automatically.
The duplicate matching settings are reordered: Comparison Method comes first, followed by Similarity and Samples. How samples are scored (average, every sample, or first sample only) is now one choice under Samples instead of two checkboxes in Advanced.
The duplicate Similarity setting accepts any value from 0% to 100% instead of 80% and up, for copies in another resolution or quality that score lower. A note warns that unrelated videos start to match below 80% with pHash and at 90% or lower with visual similarity.
Duplicate matches are now scored by the average of their samples instead of the weakest one, so one differing frame no longer hides a real duplicate. This also applies to existing installs once; choosing Weakest sample under Samples brings back the stricter rule.
Fixed
The previous and next arrows in Review stay in the same place whether or not a video is playing.
Saving settings or the folder index no longer fails now and then on Windows when another save of the same file, antivirus or the search indexer briefly holds the file.
The delete button in the title bar, Delete Marked Videos and Ctrl + Backspace can no longer start a second delete while one is still running.
VideoCull v2.4.0
Added
One title bar in the app's style replaces the Windows title bar and the separate menu bar. The menus sit on the left, Windows still draws the minimise, maximise and close buttons in the light or dark theme, and on Windows 11 22H2 and newer the bar takes a soft tint from the desktop background, as Windows 11's own apps do; Tint the title bar with the desktop background in Settings > Interface > Window turns it off.
The middle of the title bar shows where you are: the path of the folder at the top of the grid, the video open in Review with its place such as 34 / 210, or the duplicate group at the top such as Group 3 of 40, with previous and next buttons and a number you can type to go to a group. Each part has a menu with counts and actions for that spot, and a path too long for the bar is shortened to , which opens the hidden folders.
Selecting a folder in the title bar path filters the grid to that folder and everything below it, whatever the sort order or grouping. The filter shows as a chip in the path and in the sidebar filters, can be limited to the folder alone, and clears with its Χ. Each in the path lists the folders one level down with how many videos each still has to review, and with several loaded folders a switcher at the start shows all of them or one and lists recent sessions to open. Alt + Left and Alt + Right step through earlier folder filters, and Ctrl + L focuses the path.
Ctrl + K (or the search icon in the title bar) finds menu commands, folders and videos in one search. Start with > for commands only, / for folders or @ for videos; Ctrl + G opens it on folders. A folder can be scrolled to or filtered to, a video selected in the grid or opened in Review, and the last row moves the text into the grid search.
While VideoCull is processing, the title bar shows the step and how far it is, with a pause button and a progress line along its bottom edge; the taskbar button shows the progress too. Selecting the status opens a panel with every running job and about how long each has left, plus Pause Processing and When Processing Finishes. In a narrow window the status shrinks to its progress, then to a progress ring.
In duplicate groups, Run Again with Visual Similarity or with pHash switches the comparison method to the one the shown groups were not found with, saves it and finds duplicates again; the notice that follows can undo the switch.
While videos are marked for deletion, the title bar shows how many and their total size; selecting it starts the usual delete flow with its confirmation.
New menu commands: Add Folder to Session, Open Recent, Close Session and Reveal Folder in Explorer (File); Find Duplicates and Pause Processing (Actions); Sort By, Group by Folder, Clear All Filters and Mute In-App Playback (View); Copy Path and Regenerate Thumbnails and Metadata (Video); Keyboard Shortcuts, Release Notes, Report a Problem, Open Log Folder, Online Help and Support VideoCull (Help).
The PC no longer goes to sleep on its own while VideoCull scans, reads video info, makes thumbnails or finds duplicates; Keep the PC awake while processing in Settings turns this off. Actions > When Processing Finishes can instead put the PC to sleep or shut it down once a run is done, after a 60-second countdown you can cancel. The choice applies to that run only. A pending update is held back when VideoCull shuts the PC down.
Bookmarks show as marks on the Review playback timeline.
Settings > About shows the license and a list of third-party notices for the bundled components.
Changed
Regenerating thumbnails for videos or a folder now also reads their file information (duration, codecs, bitrate, resolution, frame rate) again, and the commands are named Regenerate Thumbnails and Metadata.
VideoCull now bundles FFmpeg 9.0.2, built from published source and licensed under the GNU GPL version 3 or later. Duplicate fingerprints made with the previous FFmpeg are recalculated, so the first duplicate run after updating takes longer.
VideoCull requires Windows 10 version 22H2 (build 19045) or Windows 11.
The Review player uses the app's glass surfaces with rounder controls and calmer control fades, and the gradient behind persistent controls is limited to the control bar. Text and controls grow less in fullscreen and wide players.
Menu commands that cannot do anything right now are greyed out instead of silently doing nothing. Behind the privacy screen only Privacy Screen, Full Screen and Exit work.
Reveal in Explorer and Play Externally also act on the single selected video in the grid, and Copy Path and Regenerate Thumbnails and Metadata on every selected video. Delete Marked Videos shows how many are marked.
Menu names follow common Windows wording: Open Folder, Larger Cards and Smaller Cards; Settings sits next to Exit.
Right-click menus throughout the app now work from the keyboard: the arrow keys move through the items, a letter jumps to the next item starting with it, and Esc closes the menu.
The folder filter from a grid folder header and the one from the title bar are now one filter, and Review This Folder brings back the earlier folder filter when Review closes. Review names the filtered folder instead of "filtered selection".
Pausing processing moved from the sidebar to the title bar.
The sidebar's folder card is now one button with the folder's name, which opens Open Another Folder, Add Folder to Session, Rescan and Close Session; the full path is in the title bar. Recent folders open from a small button beside Include subfolders, and their right-click menu can also remove a folder from the list.
Duplicate gallery cards are narrower and sized to show 16:9 thumbnails without black bars; rows of portrait videos grow to show their thumbnails in full.
Filtering, sorting and the folder lists are faster in large sessions.
The sidebar remembers which sections are collapsed, shows how much of the library is reviewed above the status tiles, keeps Delete and Review pinned to the bottom with a summary of the marked videos, and shows the folder and video sort controls side by side. The rating filter is one line under Duration, the folder filter is spaced like the other filter buttons, and the extra filter buttons no longer cut off their labels.
The file size and duration sliders now line up with their thumbs, give smaller values more room on the track, and snap to the values shown in their labels.
Fixed
Time a video spends paused no longer counts against its thumbnail time limit.
Videos on slow drives get more time for their video info and are retried when it still times out.
Creation dates from before 1970 are kept, and a 1970 date reported for a video that has none is ignored.
Review keyboard shortcuts keep working without the player focused, and modal backdrops stay above the title bar.
Deleting marked videos is disabled while a scan runs.
The grid's scrollbar no longer runs behind the top toolbar, and scrollbars are easier to see in the dark theme.
The thumbnail notice says thumbnails were created, not rebuilt, when videos had none before.
Scrolling up through duplicate groups no longer jumps back to where it was.
Portrait videos in the duplicate gallery no longer run into the next group.
The file size slider can be moved with the arrow keys past every size it snaps to, instead of springing back to the same spot.
Review decisions that are still being saved are finished before another folder opens or VideoCull quits, which waits up to 2 seconds for them and warns if any could not be saved. A failed save that is retried later can no longer overwrite a newer decision.
Settings and cache files are written through a temporary file that then replaces the old one, so an interrupted write no longer damages them.
A scan no longer deletes the saved decisions and thumbnails of videos in a folder where a file could not be read. Cleanup skips such folders and the scan reports the skipped files.
Updating thumbnails or video information no longer undoes a video's status, rating, favourite or bookmarks. They are only reset when the file's size or date changed.
Thumbnails made from an earlier version of a video are no longer reused after the video is replaced.
Duplicate detection stops when folders are closed, the cache is cleared or the cache location is moved. Reading the frames of one video is limited to 120 seconds, and a video that times out is tried again on the next run instead of being remembered as failed.
Security
The VideoCull window can no longer navigate away from the app's own page, open new windows or embed web content, and the app's internal channels only answer the app's own window.
Removed
The interface reload (Ctrl + R) is no longer in the released app, and Clear Cache and Reload no longer has a shortcut; it sits at the bottom of the File menu.
[2.3.2] - 2026-09-30
Fixed
Rescanning a library no longer fails when a subfolder still has cache data but no longer contains any videos, for example after all of its videos were deleted or moved.
[2.3.1] - 2026-09-29
Changed
Reworked cache database handling to remove the slowdowns introduced in 2.3.0 on libraries spread across many folders. VideoCull 2.3.0 closed each folder's cache database as soon as it was no longer in use, so scans, metadata and review saves, duplicate runs, and deletions kept reopening the same databases.
Recently used cache databases now stay open within limits based on the computer's installed memory. Up to 128 idle databases stay open on systems with 8 GB of RAM or less, 256 with up to 16 GB, and 512 with more.
After five minutes without cache activity, idle databases above that number are closed gradually. Hard caps of 256, 512, or 1,024 idle and 512, 1,024, or 2,048 total open databases close the least recently used idle databases first when a library needs more.
Cache database work now runs on a background worker instead of VideoCull's main process. Queued cache work is finished before the app closes.
Scans now load and update each folder's cache in a single pass instead of reopening its database in every scan phase. Metadata and thumbnail results are saved in batches, and review decisions update only the fields that changed.
Duplicate detection keeps fingerprint data in memory for the rest of the session and reuses it on later runs. Visual comparison samples kept this way are limited to 64, 128, or 256 MB, depending on installed memory.
Generated thumbnails of deleted videos are now removed directly instead of being sent to the Recycle Bin.
Existing caches are used as they are; no migration is needed.
Duplicate detection now uses pHash by default because it produces far fewer false positives. Existing settings switch to pHash once; visual similarity remains available in Settings.
Each duplicate group now shows its weakest match instead of the average, which is the same value the Similarity setting tests; the average is shown on hover. With Require every sample to meet similarity on, a match is scored by its weakest sample. The minimum-similarity filter hides groups whose weakest match is below the chosen value.
Fixed
Deleting now refuses files that were replaced or modified since the last scan. Rescanning resets review state and cached details for replaced files, and duplicate detection no longer reuses fingerprints from changed files.
Changing the cache location no longer switches to the new location after a partly failed move. The previous caches stay in place and in use until every cache has moved.
Clearing the cache now reports a failure when a cache database cannot be deleted, for example because it is locked, instead of reporting success.
When several folders are loaded, a failed review save in one folder no longer discards pending retries for the other folders.
[2.3.0] - 2026-09-20
Added
Added a Microsoft Store edition with Store-managed installation and updates alongside the direct-download edition, including safeguards that prevent both editions from using the shared profile simultaneously.
Added transition notices that identify older, matching, newer, or unknown direct-install versions and can open the verified direct-edition uninstaller without removing shared profile data.
Added cache-location details in Settings, including availability and ownership information plus controls to open or copy active cache paths.
Added a sidebar control to pause and resume metadata, thumbnail, and duplicate processing without losing completed progress.
Added a per-group Select for deletion action in duplicate review. It follows the groups current selected keeper, stacks selections across groups, and preserves unrelated selections when a group is dismissed.
Changed
The Microsoft Store and direct-download editions now share the %APPDATA%\VideoCull profile, including settings, review decisions, databases, and the default thumbnail cache.
Store session, log, crash, and other disposable runtime data remains isolated inside the Windows package while persistent user data stays available to both editions. Incompatible profile formats are rejected before shared data is changed.
Microsoft Store builds now direct users to Microsoft Store for updates instead of using the GitHub updater.
Adding folders to an existing session now scans and merges only the newly added folders instead of repeatedly rebuilding the entire session.
Reduced UI stalls and memory growth in large sessions, especially when adding folders, changing duplicate keepers, and moving between duplicate and playback review.
Reduced cache connection, memory, and disk-activity spikes during scans, rapid review decisions, and background media processing.
Files that cannot be moved to the Recycle Bin are now listed for review before VideoCull offers permanent deletion.
Renderer crashes now produce local diagnostic dumps without uploading them, and the app log identifies the dump location.
Fixed
Returning from duplicate playback now preserves the duplicate lists scroll position.
Duplicate size comparison now marks the larger file as best independently of the other quality metrics.
Parent and child folders added to the same session no longer produce duplicate video entries.
Cached thumbnails are reused only when the complete expected filename set exists and every image is non-empty.
Failed metadata probes are recorded and temporarily backed off instead of being treated as successful incomplete results and retried repeatedly.
Web documentation links now open correctly from the in-app documentation window.
Deeply nested or long folder paths no longer create cache database paths that exceed Windows SQLite path limits.
[2.2.1] - 2026-09-09
Changed
Standardized the current product, executable, installer, shortcut, publisher, repository, and documentation identity as VideoCull by StippieDot.
Renamed the Windows installer to VideoCull.Setup.2.2.1.exe and the installed executable to VideoCull.exe while preserving the existing application ID and upgrade location.
Moved the production Electron profile from %APPDATA%\video-cull to %APPDATA%\VideoCull with an atomic directory rename. If Windows cannot rename it, VideoCull keeps using the original profile and tries again on the next launch.
Added directory-level safety checks and safe handling when both old and new profile folders exist. VideoCull never merges, copies, overwrites, or deletes those profiles automatically.
[2.2.0] - 2026-08-28
Added
Added a persistent light theme with app-wide styling, a visible theme control, a configurable keyboard shortcut, and startup persistence.
Added an option to keep the playback timeline and controls visible while reviewing videos.
Added a sessions-and-folders guide and expanded the in-app and website documentation for grid, review, duplicate, cache, settings, and safety workflows.
Changed
Replaced the Video Cull logo and application icon throughout the app, Windows executable, installer, uninstaller, and generated shortcuts.
Reorganized Interface settings into clearer sections for grid defaults, Review mode, and report export.
Changed downloaded updates to require an explicit choice between updating now, installing on exit, or being asked later.
Updated Electron and related runtime packages.
Fixed
Review shortcuts continue working after interacting with the embedded video player.
Playback controls remain accessible during keyboard-driven review sessions.
Grid scrolling stays anchored when batch status changes remove videos from the current filter.
Search shortcuts no longer interfere with editable fields, and cached thumbnails appear more reliably.
MPEG-4 Part 2 videos now open in the external player instead of showing a black frame in the built-in player.
[2.1.0] - 2026-08-22
Added
Added an offline, searchable in-app documentation modal opened from the Help menu, app chrome, or F1.
Added a Mintlify documentation site covering the main grid, review, duplicate, cache, processing, settings, formats, troubleshooting, FAQ, installation, and development workflows.
Added dedicated guides for delete safety and cache/processing decisions.
Added live in-app shortcut tables that reflect the user's configured keybindings while the website continues to show defaults.
Changed
Made the selected Mintlify MDX pages the shared source for both web and in-app documentation, with an explicit in-app allowlist for user-facing pages.
Redesigned the documentation modal around compact grouped navigation, collapsible sections, responsive fixed-height sizing, a smaller search field, and direct links to relevant settings.
Expanded and consolidated the user guides to remove repeated sections and make guidance more task-first.
Improved duplicate matching so exact matching respects duration and keeper selection prefers bitrate within the same resolution tier.
Fixed
Natural filename sorting now orders numbered files as people expect, such as file 2 before file 10.
Review shortcuts continue working after interacting with the video player using the mouse.
Closing duplicate video playback no longer intermittently resets the list to the top.
Previously decided videos again show their Keep, Delete, or Skip color when reopened in review mode.
[2.0.0] - 2026-06-24
Video Cull 2.0.0 has smarter duplicate review, richer media decisions, safer cache handling, clearer destructive actions, better mounted-drive behavior, and a UI that holds up better on very large libraries and high-resolution screens.
Added
Duplicate review mode for finding likely duplicates across all loaded videos or the current filtered view, with pHash and visual-similarity matching, adjustable thresholds, sample counts, sampling windows, flipped comparison, and optional run-after-scan.
Suggested keepers for duplicate groups using resolution, bitrate, duration, FPS, and size, plus manual keeper overrides, protected Keep/Skip videos, ignored match pairs, group dismissal, and right-click duplicate actions.
Richer review decisions with ratings, favorites, bookmarks, playback speed, global mute, next-undecided navigation, scoped review summaries, pending/delete totals, and undo-aware review flows.
Media insight throughout the app: codec, container, resolution, FPS, metadata date, compatibility badges, metadata-based sort options, and clearer labels for resolution/FPS.
Built-in playback fallback behavior for unsupported files, including compatibility checks, external-player handoff, and decode-error overlays when Chromium cannot play the stream.
Grid search by filename or path, with Ctrl+F as the default shortcut and full keybinding customization.
Context menus for grid videos, folder headers, duplicate rows, and duplicate groups, including reveal/copy-path, status changes, thumbnail regeneration, keeper selection, exclusion, and dismissal.
Maintenance controls for stale-cache cleanup, missing-subfolder cache pruning, empty-folder cleanup after delete, and thumbnail-count rebuild warnings.
Safer cache storage management across centralised, per-drive, and distributed cache modes, including cache-location validation and explicit migrate/start-fresh choices.
Custom Windows installer artwork and shortcut choices while keeping current-user installation and install-location selection.
App diagnostics and performance instrumentation for scan, render, duplicate, cache, and idle-state troubleshooting.
Changed
Upgraded Electron and refreshed the runtime/development dependency stack.
Reworked the sidebar around large-library culling, with denser status/filter controls, clearer folder/session feedback, duplicate-mode controls, and better skipped/inaccessible folder reporting.
Reworked the grid for large sessions with faster filtering/sorting, folder grouping, aggregate computation, virtualized rendering, stable search controls, and lower render churn during metadata and thumbnail updates.
Reworked review mode so thumbnail preview and playback fit normal, maximized, and high-resolution displays while keeping the action controls stable.
Improved scanner traversal throughput, stat batching, progress reporting, cancellation behavior, stale/superseded scan handling, and behavior on slow mounted drives.
Improved metadata and thumbnail processing with clearer progress phases, better cancellation, short-video handling, safer reuse of existing thumbnail sets, and smaller renderer update batches.
Improved duplicate detection performance with worker-based fingerprinting, batched database access, lower memory use, stronger candidate grouping, and more stable group IDs.
Improved cache loading, saving, migration, recovery, pruning, and corruption quarantine behavior for existing libraries, including lower thumbnail-cache write churn and conservative concurrent folder-cache loading for very large libraries.
Made potentially destructive or expensive maintenance behavior opt-in instead of surprising: stale-cache cleanup defaults off, empty-folder cleanup defaults off, and thumbnail-count changes warn before causing rebuild work.
Updated development and CI workflows around Node 24, Vitest, Playwright, IPC contract checks, installer checks, native cache checks, and release packaging.
Fixed
Existing cache decisions, metadata, thumbnails, bookmarks, ratings, favorites, duplicate fingerprints, recent folders, and settings now survive rescans, relaunches, and upgrades more reliably.
Destructive delete flows now validate loaded paths more strictly, clean related cache artifacts, report permanent-delete fallbacks clearly, and only clean truly empty folders when the user enables that option.
Cache migration and cache-mode changes now avoid partial/clobber-prone moves and communicate migrate/start-fresh outcomes more clearly.
Missing/offline folders and transient stat failures no longer silently prune cache by default.
Open/reveal/play external operations and custom thumb:// / video:// serving now validate loaded paths more carefully.
Built-in playback compatibility now better matches real browser support while FFmpeg-supported files can still be scanned for thumbnails and metadata.
Thumbnail cancellation, short-video thumbnail reuse, failed thumbnail regeneration, and thumbnail-count changes behave more predictably.
Duplicate reruns, deleted duplicate videos, stale duplicate selections, visual fingerprint settings changes, and hidden duplicate review state now clean up more reliably.
Sort state, resolution labels, feature toggles, keybinding capture, focused input behavior, shortcut conflicts, and privacy/shortcut precedence are more predictable.
New-folder and pending-scan UI states are clearer, reducing ambiguity when old videos are still visible while a new scan is starting.
Tooling
Added npm run check:ipc, npm run check:installer, npm run test:renderer, npm run test:duplicates, npm run test:cache-native, and expanded npm run test:ci.
Added Playwright Electron regression flows for smoke, delete safety, relaunch persistence, and duplicate reruns.
Added cache-clutter cleanup tooling, installer validation, release/test GitHub Actions updates, and broader regression coverage for Electron, renderer, cache, scanner, duplicate, processor, and settings flows.
[2.0.0-beta.2] - 2026-06-11
This beta focuses on scaling duplicate review, reducing large-library slowdown, tightening media compatibility behavior, and raising the regression-testing baseline before the persistent-library work begins.
Added
Expanded duplicate-review tooling with richer group handling, better keeper controls, safer rerun flows, and stronger duplicate-session management.
Context-menu actions and idle/performance diagnostics for faster inspection and debugging during heavy review sessions.
Broader automated coverage across Electron, renderer integration, duplicate workflows, relaunch persistence, and delete-safety flows.
Dedicated CI test workflow and Playwright/Vitest infrastructure for repeatable regression checking.
Changed
Improved app responsiveness across the renderer, sidebar, grid, review mode, scanner traversal, cache startup, and duplicate startup paths for larger libraries.
Reduced duplicate-detection overhead with more selective fingerprint loading, cleaner worker flow, and lower main-process startup cost before comparisons begin.
Improved cache and metadata persistence behavior with stronger save paths, better migration coverage, and more predictable reload/relaunch behavior.
Refined compatibility handling so built-in playback rules better match real browser support, while additional FFmpeg-supported formats are recognized during scanning.
Updated development and CI plumbing, including Electron/Vite dev-port coordination and refreshed GitHub Actions usage.
Fixed
Duplicate cleanup and delete flows are safer and more consistent, including reruns, fallback behavior, and follow-up state cleanup after removals.
Sort state now persists more reliably, and resolution labels are normalized more consistently across the UI.
Feature-setting toggles and related input behavior now behave more predictably.
Cache, duplicate, and scan edge cases now fail more safely under heavy or unusual workloads instead of leaving stale state behind.
Tooling
Migrated and expanded the automated test stack around Vitest, renderer integration tests, and E2E release checks.
Added more helper utilities, diagnostics hooks, and performance instrumentation to support future release hardening.
[2.0.0-beta.1] - 2026-05-12
This beta is a major step toward Video Cull v2.0: richer review decisions, smarter library filtering, clearer media insight, safer cleanup, and more predictable playback for large video collections.
Added
Smarter review workflow with ratings, favorites, review summaries, delete totals, scoped review context, and next-undecided navigation.
Richer library browsing with Library status filters, rating/favorite/incompatible filters, file-size and duration ranges, and cleaner active-filter controls.
Deeper media insight with codec, container, resolution, FPS, compatibility badges, and new metadata-based sort options.
More predictable playback with Video Cull's own compatibility policy, external-player fallback for unsupported media, decode-error overlays, and global mute.
Better user feedback with in-app notifications for cache recovery, save delays, update state, and background maintenance.
Feature toggles for enabling or hiding the new review, metadata, compatibility, and playback helpers.
Thumbnail regeneration controls for stale, partial, or interrupted thumbnail sets.
About/settings links for project, release, and support pages.
Changed
Upgraded Electron to 41 and refreshed application dependencies.
Reworked the custom video protocol for Electron 41 compatibility and stricter file-serving rules.
Reworked the sidebar around faster decision-making, with Library status filters promoted to the top and secondary filters kept more compact.
Improved large-library navigation with updated grid virtualization, better scroll restoration, and folder headers that show filtered size next to total size.
Made review and grid playback behave more consistently across compatibility, mute, metadata, ratings, favorites, and external-player actions.
Improved thumbnail generation with clearer progress phases, ordered results, retries around difficult timestamps, and safer reuse of existing thumbnail sets.
Cache loading and merging were hardened across central, per-drive, and distributed cache layouts.
Improved export reports for multi-directory sessions.
Made settings, cache migration, and update flows communicate their state more clearly.
Fixed
Unsupported audio/video decode failures now show an in-app explanation instead of failing silently.
Corrupt cache databases are quarantined and rebuilt instead of blocking the app from loading.
Deleted videos now remove related cache database rows, metadata entries, and thumbnail folders.
Empty parent folders left after deletion are removed when safe; cloud drives without Recycle Bin support now fall back to permanent removal only for verified-empty folders.
Partial or interrupted thumbnail folders are regenerated instead of being reused as if complete.
Stale cache rows are refreshed when rescans find newer metadata.
Save-cache failures now retry and warn the user when decisions may not yet be persisted.
Global shortcuts now avoid interfering with focused controls, settings, and shortcut overlays.
Update status handling now reports errors and ready states more reliably.
Tooling
Added an IPC contract checker for exposed Electron APIs.
Added a cache-clutter cleanup script for old thumbnail/cache artifacts from earlier builds.
[1.8.2] - 2026-05-01
Changed
Thumbnail generation now limits actual active FFmpeg processes directly: frames are extracted sequentially within each video while overall parallelism is spread across videos.
Auto concurrency now accounts for the current thread-limit setting and allows higher single-thread process counts on capable systems while still capping by available memory.
Hardware-accelerated thumbnail generation now pauses briefly between large batches to reduce GPU/driver pressure during long scans.
Processing settings now use clearer wording around parallel FFmpeg processes and one-thread-per-process behavior, with expanded manual process limits up to 32.
Removed the Minimal/Extended mode selector, first-run mode notice, View menu toggle, and mode shortcut because Video Cull no longer uses app-wide modes.
Fixed
Auto concurrency in Settings now recalculates from the unsaved local settings, so toggling thread limiting immediately updates the displayed process count.
Cancelling thumbnail generation now also applies to fallback frame extraction.
ElectronAPI TypeScript declarations now include the distributed cache confirmation API.
[1.8.1] - 2026-04-27
Fixed
Playing videos after scanning a whole drive now works correctly. Drive-root selections such as D:\ are now handled by the loaded-folder security check instead of rejecting every child path.
Closing the app during large thumbnail-generation runs no longer triggers a main-process "Object has been destroyed" error from delayed progress batch sends.
Video fullscreen now hides the Electron menu bar and restores it when fullscreen exits.
[1.8.0] - 2026-04-26
Added
Auto concurrency now factors in available RAM each ffmpeg instance uses ~400 MB, so the limit is capped to whichever is lower: half the CPU cores or (free RAM 1 GB) / 400 MB. Prevents out-of-memory on lower-spec machines.
Settings panel now shows the resolved thread count when Auto concurrency is selected, making the setting self-documenting.
Changed
Cache writes now fan out to per-folder SQLite databases that mirror the actual directory hierarchy on disk. Existing flat-root cache DBs are automatically split on first scan.
Thumbnail output directory is resolved per-video when using folder-distributed cache, keeping thumbs co-located with their DB.
Sidebar layout reorganized with improved visual hierarchy and spacing.
defaultGroupByFolder now correctly defaults to true for existing installs that predate the setting.
Fixed
Grid thumbnail flicker eliminated: filteredVideos selector upgraded to shallow equality, preventing react-window from remounting all visible rows on every thumbnail batch update.
getItemSize now uses a stable ref instead of reading rows state, removing a secondary source of row remounts.
Thumbnails now fade in with a CSS opacity transition instead of snapping in abruptly.
ElectronAPI TypeScript interface updated with missing getAutoConcurrency declaration.
[1.7.0] - 2026-04-25
Added
Multi-directory sessions with true Add to Session behavior for dropped or selected folders.
Cache storage modes for centralised, per-drive, and distributed cache layouts.
Cache migration flow when switching storage modes, with migrate, start fresh, and cancel choices.
First-run Minimal/Extended mode notice, Settings mode selector, View menu toggle, and configurable mode shortcut.
Per-drive and central cache location validation with write tests before settings are saved.
Changed
Thumbnail files now resolve through cache-mode-aware roots instead of assuming one central cache folder.
Grid folder labels include the root folder prefix when multiple roots are loaded.
SQLite cache handles are kept per DB path so multi-directory operations do not close each other's connections.
Cache writes now preserve future metadata columns when values are present.
Fixed
Batch cache saves fall back to chunked persistence for very large selections to avoid blocking the main process.
Distributed cache index entries are pruned on startup when folders are no longer available.
Scanner ignores distributed .videocull cache folders during recursive scans.
Per-drive cache overrides must stay on the drive they configure.
[1.6.0] - 2026-04-16
Added
Minimum duration filter in the sidebar, including a live mm:ss helper.
Batch selection mode in grid view with checkbox controls and actions for Keep, Delete, Skip, Reset, and Clear.
Folder header Review action to jump into review mode scoped to one folder.
Export Report flow in Settings and app menu, including scope selection for all or filtered videos.
Review mode reset shortcut with configurable keybind support.
Changed
Review counter pill now doubles as a progress indicator and shows decided versus remaining counts.
Report export HTML now includes folder/subfolder grouping and separate Keep, Delete, Pending, and Skipped sections.
Batch-delete fallback messaging now clearly reports permanent-delete outcomes when recycle-bin trashing is unavailable.
Fixed
Grid batch selection state now persists when leaving grid view and returning from review mode.
Settings tab routing now re-targets correctly from menu actions, including repeated requests to open Reports.
Export availability is disabled while scanning to avoid stale-data report generation.
Report export cancellation now shows a cancellation message instead of a generic failure.
[1.5.1] - 2026-04-13
Fixed
Grid mode now invalidates its virtualization cache immediately after folder or subfolder reordering, preventing large spacing gaps and overlap until the window is resized.
Closing review mode now returns to the previous grid scroll position instead of resetting to the top.
Autoplay from grid play-click is now one-shot: only the initially clicked video auto-plays, while next/previous navigation opens in thumbnail view.
[1.5.0] - 2026-04-13
Added
Drag-and-drop folder opening for the full app window, with directory validation and clear error feedback for invalid drops.
Folder choice flow when another directory is already open: "Open as new" or "Add to current session".
Privacy screen toggle on Shift+Esc with a full-window overlay image (src/assets/privacy-screen-dashboard-cover.png).
Recent directories with persisted timestamps, shown in both sidebar and empty state.
Toast notification system for info and error feedback, with auto-dismiss and manual close.
Keyboard-accessible folder choice modal with focus trapping and Escape-to-close.
Changed
Empty state recent-folders UI simplified to a minimal text-first layout.
Recent folders shown in UI are limited to the 5 most recent entries.
"Include subfolders" control moved directly under "Open Directory" for a cleaner flow.
"Clear all" in recent folders is styled as a clearer interactive control.
Relative-time and recent-path formatting utilities were centralized in src/utils.ts and reused across components.
Fixed
Renderer-to-main bridge now exposes dropped-path validation (validateDroppedPath) through preload.
Privacy mode now blocks non-toggle keyboard input and prevents conflicting actions while active.
Review-mode Escape handling no longer conflicts with Shift+Esc privacy toggle.
Stale recent-directory entries are removed when invalid and are also pruned on app startup.
Fixed regex path-splitting escape issue in sidebar recent-path formatting.
Documentation
Updated README.md with current quick-win features and privacy-screen shortcut.
In Progress
"Add to current session" currently shows a placeholder notification and is not fully implemented yet.
[1.4.0] - 2026-04-10
Final stable release for the SQLite migration track. This section is cumulative and includes all changes between v1.3.0 and v1.4.0 (including v1.4.0-alpha.1 and v1.4.0-alpha.2).
Added
SQLite cache layer migrated from JSON to better-sqlite3 with per-folder database files and a dedicated cache module.
Chunked bulk persistence added chunked SQLite writes with event-loop yielding to keep IPC/UI responsive during large saves.
Automatic JSON migration legacy .video-cull-cache.json is imported on first scan, preserving status and bookmarks.
Changed
Cache architecture all cache IO now goes through a single DB path resolver and centralized DB lifecycle.
Thumbnail storage location thumbnails now live under the app cache root (userData/video-cache) instead of colliding with Electron internals.
Thumbnail path handling DB stores relative thumbnail paths, renderer receives absolute paths via boundary conversion.
Scan merge behavior cache merge now preserves cached duration, metadata date, bookmarks, status, and thumbnail references.
Fixed
Cache wipe on restart resolved DB/thumb data loss caused by writing into Electron's internal cache area.
Cascade thumbnail loss on upsert replaced destructive replace behavior with safe ON CONFLICT DO UPDATE upserts.
Missed thumbnail migration path migration now checks filesystem state directly and supports cross-device move fallback.
Chunked path bypass bug ensured bulk initial scan saves use the chunked cache path (saveCacheChunked) instead of the blocking monolithic path.
Write amplification during thumbnail generation store now saves only changed videos (not whole arrays) for thumbnail/status/bookmark/undo updates.
Transient save failures added a retry queue for partial saves with race-safe token reconciliation.
Duration persistence on rescan cached duration now survives rescans when thumbnails already exist.
Delete flow overhead removed redundant full-cache save after batch delete.
Cache load performance removed N+1 thumbnail query pattern by bulk-loading and grouping thumbnail rows in memory.
Docs
README maintenance marked screenshots section as outdated for the v1.3.0 baseline prior to migration work.
Migration
Automatic transition old JSON cache files are imported and removed; durations/thumbnails are regenerated or merged from current cache/scan state as applicable.
[1.4.0-alpha.2] - 2026-04-10
Fixed
Cache persistence SQLite databases and thumbnails were being silently wiped on every app restart because the cache directory (userData/cache) collided with Electron's internal HTTP cache. Moved to userData/video-cache.
Thumbnail records lost on rescan INSERT OR REPLACE in SQLite triggers ON DELETE CASCADE, destroying thumbnail records on every scan even when not intended. Switched to ON CONFLICT DO UPDATE (true in-place upsert, no cascade).
Thumbnail migration skipped filesystem migration from .video-cull-thumbs to the cache dir was gated on DB records existing, so it silently no-ops after a JSONSQLite migration (which skips thumbnails). Now checks the filesystem directly.
Thumbnails stored flat all folders' thumbnails were written to a single thumbs/ directory. Now organised per-folder as thumbs/<folder-name>/ matching the DB filename.
saveCacheChunked never called bulk saves in the initial scan used the blocking single-transaction path instead of the chunked async path.
[1.4.0-alpha.1] - 2026-04-10
Added
Initial SQLite migration replaced JSON caching with SQLite (better-sqlite3) and introduced per-folder DB cache files.
Legacy import path first-run migration for existing JSON cache data into SQLite.
Changed
Cache architecture foundation introduced centralized cache module (electron/cache.js) and DB lifecycle management.
Thumbnail migration foundation moved thumbnail ownership into cache storage flow and updated scan merge behavior.
[1.3.0] - 2026-04-09
Changed
UI refinements updated accent and status colors (more vibrant keep/delete), subtler borders using alpha values, improved shadows and surface tones throughout
Deleted cards grayscale + opacity treatment makes marked-for-deletion videos visually recede in the grid; restores on hover
Filter pills active pills now use accent gradient with glow; keep/delete pills use solid status colors
Badge animation status badges (keep/delete) animate in with a pop on first appearance
Review mode counter and close button styled as matching pill/circle pair; keep/delete flash uses radial gradient
Improved
Empty state redesigned welcome screen with glowing icon container, gradient title text, and pill-shaped open button
Removed
Internal preview modal component (was unreachable dead code; grid play button opens review mode directly)
[1.2.0] - 2026-04-09
Added
Grid play button opens review mode clicking the play button on a video card now navigates directly to review mode and starts playback, instead of opening a separate preview modal.
Fully configurable keybindings all shortcuts can now be recorded as real key combinations (Esc, Delete, Ctrl+key, etc.) in Settings Keybindings. Includes conflict detection and a Reset to Defaults button.
Changed
Keybindings settings panel reorganised into logical groups (Navigation, Decisions, Playback, While Playing, Preview, Global).
"Play / Pause (Enter)" renamed to "Play / Pause (alternate)" to avoid implying the key is fixed.
[1.1.0] - 2026-04-08
Added
Bookmarks press B while playing to drop a bookmark at the current position. Bookmarks persist across sessions and appear as clickable chips below the player (click to seek, hover to reveal remove button). A count badge shows on the thumbnail strip when a video has bookmarks.
Playback speed controls [ / ] step through 0.5Χ, 0.75Χ, 1Χ, 1.25Χ, 1.5Χ, 2Χ. Speed is shown as an overlay badge and persists as you move between videos in the same session.
Keyboard shortcuts overlay press ? anywhere to open a reference of all shortcuts.
Fixed
Rare crash (black screen / render process gone) that could occur while interacting with the video player during playback. Root cause: frequent React re-renders of the Video.js player stack triggered a native access violation in Chromium's media pipeline.
[1.0.0] - 2026-03-01
Initial release.
Changed
The duplicate Samples setting can score pHash matches by the first sample only: the first sample where neither frame is dark decides, which finds more duplicates at the cost of more false positives.
The duplicate Similarity setting keeps a separate value for pHash and for visual similarity, and the value for the method that runs is used automatically.
The duplicate matching settings are reordered: Comparison Method comes first, followed by Similarity and Samples. How samples are scored (average, every sample, or first sample only) is now one choice under Samples instead of two checkboxes in Advanced.
The duplicate Similarity setting accepts any value from 0% to 100% instead of 80% and up, for copies in another resolution or quality that score lower. A note warns that unrelated videos start to match below 80% with pHash and at 90% or lower with visual similarity.
Duplicate matches are now scored by the average of their samples instead of the weakest one, so one differing frame no longer hides a real duplicate. This also applies to existing installs once; choosing Weakest sample under Samples brings back the stricter rule.
Fixed
The previous and next arrows in Review stay in the same place whether or not a video is playing.
Saving settings or the folder index no longer fails now and then on Windows when another save of the same file, antivirus or the search indexer briefly holds the file.
The delete button in the title bar, Delete Marked Videos and Ctrl + Backspace can no longer start a second delete while one is still running.
VideoCull v2.4.0
Added
One title bar in the app's style replaces the Windows title bar and the separate menu bar. The menus sit on the left, Windows still draws the minimise, maximise and close buttons in the light or dark theme, and on Windows 11 22H2 and newer the bar takes a soft tint from the desktop background, as Windows 11's own apps do; Tint the title bar with the desktop background in Settings > Interface > Window turns it off.
The middle of the title bar shows where you are: the path of the folder at the top of the grid, the video open in Review with its place such as 34 / 210, or the duplicate group at the top such as Group 3 of 40, with previous and next buttons and a number you can type to go to a group. Each part has a menu with counts and actions for that spot, and a path too long for the bar is shortened to , which opens the hidden folders.
Selecting a folder in the title bar path filters the grid to that folder and everything below it, whatever the sort order or grouping. The filter shows as a chip in the path and in the sidebar filters, can be limited to the folder alone, and clears with its Χ. Each in the path lists the folders one level down with how many videos each still has to review, and with several loaded folders a switcher at the start shows all of them or one and lists recent sessions to open. Alt + Left and Alt + Right step through earlier folder filters, and Ctrl + L focuses the path.
Ctrl + K (or the search icon in the title bar) finds menu commands, folders and videos in one search. Start with > for commands only, / for folders or @ for videos; Ctrl + G opens it on folders. A folder can be scrolled to or filtered to, a video selected in the grid or opened in Review, and the last row moves the text into the grid search.
While VideoCull is processing, the title bar shows the step and how far it is, with a pause button and a progress line along its bottom edge; the taskbar button shows the progress too. Selecting the status opens a panel with every running job and about how long each has left, plus Pause Processing and When Processing Finishes. In a narrow window the status shrinks to its progress, then to a progress ring.
In duplicate groups, Run Again with Visual Similarity or with pHash switches the comparison method to the one the shown groups were not found with, saves it and finds duplicates again; the notice that follows can undo the switch.
While videos are marked for deletion, the title bar shows how many and their total size; selecting it starts the usual delete flow with its confirmation.
New menu commands: Add Folder to Session, Open Recent, Close Session and Reveal Folder in Explorer (File); Find Duplicates and Pause Processing (Actions); Sort By, Group by Folder, Clear All Filters and Mute In-App Playback (View); Copy Path and Regenerate Thumbnails and Metadata (Video); Keyboard Shortcuts, Release Notes, Report a Problem, Open Log Folder, Online Help and Support VideoCull (Help).
The PC no longer goes to sleep on its own while VideoCull scans, reads video info, makes thumbnails or finds duplicates; Keep the PC awake while processing in Settings turns this off. Actions > When Processing Finishes can instead put the PC to sleep or shut it down once a run is done, after a 60-second countdown you can cancel. The choice applies to that run only. A pending update is held back when VideoCull shuts the PC down.
Bookmarks show as marks on the Review playback timeline.
Settings > About shows the license and a list of third-party notices for the bundled components.
Changed
Regenerating thumbnails for videos or a folder now also reads their file information (duration, codecs, bitrate, resolution, frame rate) again, and the commands are named Regenerate Thumbnails and Metadata.
VideoCull now bundles FFmpeg 9.0.2, built from published source and licensed under the GNU GPL version 3 or later. Duplicate fingerprints made with the previous FFmpeg are recalculated, so the first duplicate run after updating takes longer.
VideoCull requires Windows 10 version 22H2 (build 19045) or Windows 11.
The Review player uses the app's glass surfaces with rounder controls and calmer control fades, and the gradient behind persistent controls is limited to the control bar. Text and controls grow less in fullscreen and wide players.
Menu commands that cannot do anything right now are greyed out instead of silently doing nothing. Behind the privacy screen only Privacy Screen, Full Screen and Exit work.
Reveal in Explorer and Play Externally also act on the single selected video in the grid, and Copy Path and Regenerate Thumbnails and Metadata on every selected video. Delete Marked Videos shows how many are marked.
Menu names follow common Windows wording: Open Folder, Larger Cards and Smaller Cards; Settings sits next to Exit.
Right-click menus throughout the app now work from the keyboard: the arrow keys move through the items, a letter jumps to the next item starting with it, and Esc closes the menu.
The folder filter from a grid folder header and the one from the title bar are now one filter, and Review This Folder brings back the earlier folder filter when Review closes. Review names the filtered folder instead of "filtered selection".
Pausing processing moved from the sidebar to the title bar.
The sidebar's folder card is now one button with the folder's name, which opens Open Another Folder, Add Folder to Session, Rescan and Close Session; the full path is in the title bar. Recent folders open from a small button beside Include subfolders, and their right-click menu can also remove a folder from the list.
Duplicate gallery cards are narrower and sized to show 16:9 thumbnails without black bars; rows of portrait videos grow to show their thumbnails in full.
Filtering, sorting and the folder lists are faster in large sessions.
The sidebar remembers which sections are collapsed, shows how much of the library is reviewed above the status tiles, keeps Delete and Review pinned to the bottom with a summary of the marked videos, and shows the folder and video sort controls side by side. The rating filter is one line under Duration, the folder filter is spaced like the other filter buttons, and the extra filter buttons no longer cut off their labels.
The file size and duration sliders now line up with their thumbs, give smaller values more room on the track, and snap to the values shown in their labels.
Fixed
Time a video spends paused no longer counts against its thumbnail time limit.
Videos on slow drives get more time for their video info and are retried when it still times out.
Creation dates from before 1970 are kept, and a 1970 date reported for a video that has none is ignored.
Review keyboard shortcuts keep working without the player focused, and modal backdrops stay above the title bar.
Deleting marked videos is disabled while a scan runs.
The grid's scrollbar no longer runs behind the top toolbar, and scrollbars are easier to see in the dark theme.
The thumbnail notice says thumbnails were created, not rebuilt, when videos had none before.
Scrolling up through duplicate groups no longer jumps back to where it was.
Portrait videos in the duplicate gallery no longer run into the next group.
The file size slider can be moved with the arrow keys past every size it snaps to, instead of springing back to the same spot.
Review decisions that are still being saved are finished before another folder opens or VideoCull quits, which waits up to 2 seconds for them and warns if any could not be saved. A failed save that is retried later can no longer overwrite a newer decision.
Settings and cache files are written through a temporary file that then replaces the old one, so an interrupted write no longer damages them.
A scan no longer deletes the saved decisions and thumbnails of videos in a folder where a file could not be read. Cleanup skips such folders and the scan reports the skipped files.
Updating thumbnails or video information no longer undoes a video's status, rating, favourite or bookmarks. They are only reset when the file's size or date changed.
Thumbnails made from an earlier version of a video are no longer reused after the video is replaced.
Duplicate detection stops when folders are closed, the cache is cleared or the cache location is moved. Reading the frames of one video is limited to 120 seconds, and a video that times out is tried again on the next run instead of being remembered as failed.
Security
The VideoCull window can no longer navigate away from the app's own page, open new windows or embed web content, and the app's internal channels only answer the app's own window.
Removed
The interface reload (Ctrl + R) is no longer in the released app, and Clear Cache and Reload no longer has a shortcut; it sits at the bottom of the File menu.
[2.3.2] - 2026-09-30
Fixed
Rescanning a library no longer fails when a subfolder still has cache data but no longer contains any videos, for example after all of its videos were deleted or moved.
[2.3.1] - 2026-09-29
Changed
Reworked cache database handling to remove the slowdowns introduced in 2.3.0 on libraries spread across many folders. VideoCull 2.3.0 closed each folder's cache database as soon as it was no longer in use, so scans, metadata and review saves, duplicate runs, and deletions kept reopening the same databases.
Recently used cache databases now stay open within limits based on the computer's installed memory. Up to 128 idle databases stay open on systems with 8 GB of RAM or less, 256 with up to 16 GB, and 512 with more.
After five minutes without cache activity, idle databases above that number are closed gradually. Hard caps of 256, 512, or 1,024 idle and 512, 1,024, or 2,048 total open databases close the least recently used idle databases first when a library needs more.
Cache database work now runs on a background worker instead of VideoCull's main process. Queued cache work is finished before the app closes.
Scans now load and update each folder's cache in a single pass instead of reopening its database in every scan phase. Metadata and thumbnail results are saved in batches, and review decisions update only the fields that changed.
Duplicate detection keeps fingerprint data in memory for the rest of the session and reuses it on later runs. Visual comparison samples kept this way are limited to 64, 128, or 256 MB, depending on installed memory.
Generated thumbnails of deleted videos are now removed directly instead of being sent to the Recycle Bin.
Existing caches are used as they are; no migration is needed.
Duplicate detection now uses pHash by default because it produces far fewer false positives. Existing settings switch to pHash once; visual similarity remains available in Settings.
Each duplicate group now shows its weakest match instead of the average, which is the same value the Similarity setting tests; the average is shown on hover. With Require every sample to meet similarity on, a match is scored by its weakest sample. The minimum-similarity filter hides groups whose weakest match is below the chosen value.
Fixed
Deleting now refuses files that were replaced or modified since the last scan. Rescanning resets review state and cached details for replaced files, and duplicate detection no longer reuses fingerprints from changed files.
Changing the cache location no longer switches to the new location after a partly failed move. The previous caches stay in place and in use until every cache has moved.
Clearing the cache now reports a failure when a cache database cannot be deleted, for example because it is locked, instead of reporting success.
When several folders are loaded, a failed review save in one folder no longer discards pending retries for the other folders.
[2.3.0] - 2026-09-20
Added
Added a Microsoft Store edition with Store-managed installation and updates alongside the direct-download edition, including safeguards that prevent both editions from using the shared profile simultaneously.
Added transition notices that identify older, matching, newer, or unknown direct-install versions and can open the verified direct-edition uninstaller without removing shared profile data.
Added cache-location details in Settings, including availability and ownership information plus controls to open or copy active cache paths.
Added a sidebar control to pause and resume metadata, thumbnail, and duplicate processing without losing completed progress.
Added a per-group Select for deletion action in duplicate review. It follows the groups current selected keeper, stacks selections across groups, and preserves unrelated selections when a group is dismissed.
Changed
The Microsoft Store and direct-download editions now share the %APPDATA%\VideoCull profile, including settings, review decisions, databases, and the default thumbnail cache.
Store session, log, crash, and other disposable runtime data remains isolated inside the Windows package while persistent user data stays available to both editions. Incompatible profile formats are rejected before shared data is changed.
Microsoft Store builds now direct users to Microsoft Store for updates instead of using the GitHub updater.
Adding folders to an existing session now scans and merges only the newly added folders instead of repeatedly rebuilding the entire session.
Reduced UI stalls and memory growth in large sessions, especially when adding folders, changing duplicate keepers, and moving between duplicate and playback review.
Reduced cache connection, memory, and disk-activity spikes during scans, rapid review decisions, and background media processing.
Files that cannot be moved to the Recycle Bin are now listed for review before VideoCull offers permanent deletion.
Renderer crashes now produce local diagnostic dumps without uploading them, and the app log identifies the dump location.
Fixed
Returning from duplicate playback now preserves the duplicate lists scroll position.
Duplicate size comparison now marks the larger file as best independently of the other quality metrics.
Parent and child folders added to the same session no longer produce duplicate video entries.
Cached thumbnails are reused only when the complete expected filename set exists and every image is non-empty.
Failed metadata probes are recorded and temporarily backed off instead of being treated as successful incomplete results and retried repeatedly.
Web documentation links now open correctly from the in-app documentation window.
Deeply nested or long folder paths no longer create cache database paths that exceed Windows SQLite path limits.
[2.2.1] - 2026-09-09
Changed
Standardized the current product, executable, installer, shortcut, publisher, repository, and documentation identity as VideoCull by StippieDot.
Renamed the Windows installer to VideoCull.Setup.2.2.1.exe and the installed executable to VideoCull.exe while preserving the existing application ID and upgrade location.
Moved the production Electron profile from %APPDATA%\video-cull to %APPDATA%\VideoCull with an atomic directory rename. If Windows cannot rename it, VideoCull keeps using the original profile and tries again on the next launch.
Added directory-level safety checks and safe handling when both old and new profile folders exist. VideoCull never merges, copies, overwrites, or deletes those profiles automatically.
[2.2.0] - 2026-08-28
Added
Added a persistent light theme with app-wide styling, a visible theme control, a configurable keyboard shortcut, and startup persistence.
Added an option to keep the playback timeline and controls visible while reviewing videos.
Added a sessions-and-folders guide and expanded the in-app and website documentation for grid, review, duplicate, cache, settings, and safety workflows.
Changed
Replaced the Video Cull logo and application icon throughout the app, Windows executable, installer, uninstaller, and generated shortcuts.
Reorganized Interface settings into clearer sections for grid defaults, Review mode, and report export.
Changed downloaded updates to require an explicit choice between updating now, installing on exit, or being asked later.
Updated Electron and related runtime packages.
Fixed
Review shortcuts continue working after interacting with the embedded video player.
Playback controls remain accessible during keyboard-driven review sessions.
Grid scrolling stays anchored when batch status changes remove videos from the current filter.
Search shortcuts no longer interfere with editable fields, and cached thumbnails appear more reliably.
MPEG-4 Part 2 videos now open in the external player instead of showing a black frame in the built-in player.
[2.1.0] - 2026-08-22
Added
Added an offline, searchable in-app documentation modal opened from the Help menu, app chrome, or F1.
Added a Mintlify documentation site covering the main grid, review, duplicate, cache, processing, settings, formats, troubleshooting, FAQ, installation, and development workflows.
Added dedicated guides for delete safety and cache/processing decisions.
Added live in-app shortcut tables that reflect the user's configured keybindings while the website continues to show defaults.
Changed
Made the selected Mintlify MDX pages the shared source for both web and in-app documentation, with an explicit in-app allowlist for user-facing pages.
Redesigned the documentation modal around compact grouped navigation, collapsible sections, responsive fixed-height sizing, a smaller search field, and direct links to relevant settings.
Expanded and consolidated the user guides to remove repeated sections and make guidance more task-first.
Improved duplicate matching so exact matching respects duration and keeper selection prefers bitrate within the same resolution tier.
Fixed
Natural filename sorting now orders numbered files as people expect, such as file 2 before file 10.
Review shortcuts continue working after interacting with the video player using the mouse.
Closing duplicate video playback no longer intermittently resets the list to the top.
Previously decided videos again show their Keep, Delete, or Skip color when reopened in review mode.
[2.0.0] - 2026-06-24
Video Cull 2.0.0 has smarter duplicate review, richer media decisions, safer cache handling, clearer destructive actions, better mounted-drive behavior, and a UI that holds up better on very large libraries and high-resolution screens.
Added
Duplicate review mode for finding likely duplicates across all loaded videos or the current filtered view, with pHash and visual-similarity matching, adjustable thresholds, sample counts, sampling windows, flipped comparison, and optional run-after-scan.
Suggested keepers for duplicate groups using resolution, bitrate, duration, FPS, and size, plus manual keeper overrides, protected Keep/Skip videos, ignored match pairs, group dismissal, and right-click duplicate actions.
Richer review decisions with ratings, favorites, bookmarks, playback speed, global mute, next-undecided navigation, scoped review summaries, pending/delete totals, and undo-aware review flows.
Media insight throughout the app: codec, container, resolution, FPS, metadata date, compatibility badges, metadata-based sort options, and clearer labels for resolution/FPS.
Built-in playback fallback behavior for unsupported files, including compatibility checks, external-player handoff, and decode-error overlays when Chromium cannot play the stream.
Grid search by filename or path, with Ctrl+F as the default shortcut and full keybinding customization.
Context menus for grid videos, folder headers, duplicate rows, and duplicate groups, including reveal/copy-path, status changes, thumbnail regeneration, keeper selection, exclusion, and dismissal.
Maintenance controls for stale-cache cleanup, missing-subfolder cache pruning, empty-folder cleanup after delete, and thumbnail-count rebuild warnings.
Safer cache storage management across centralised, per-drive, and distributed cache modes, including cache-location validation and explicit migrate/start-fresh choices.
Custom Windows installer artwork and shortcut choices while keeping current-user installation and install-location selection.
App diagnostics and performance instrumentation for scan, render, duplicate, cache, and idle-state troubleshooting.
Changed
Upgraded Electron and refreshed the runtime/development dependency stack.
Reworked the sidebar around large-library culling, with denser status/filter controls, clearer folder/session feedback, duplicate-mode controls, and better skipped/inaccessible folder reporting.
Reworked the grid for large sessions with faster filtering/sorting, folder grouping, aggregate computation, virtualized rendering, stable search controls, and lower render churn during metadata and thumbnail updates.
Reworked review mode so thumbnail preview and playback fit normal, maximized, and high-resolution displays while keeping the action controls stable.
Improved scanner traversal throughput, stat batching, progress reporting, cancellation behavior, stale/superseded scan handling, and behavior on slow mounted drives.
Improved metadata and thumbnail processing with clearer progress phases, better cancellation, short-video handling, safer reuse of existing thumbnail sets, and smaller renderer update batches.
Improved duplicate detection performance with worker-based fingerprinting, batched database access, lower memory use, stronger candidate grouping, and more stable group IDs.
Improved cache loading, saving, migration, recovery, pruning, and corruption quarantine behavior for existing libraries, including lower thumbnail-cache write churn and conservative concurrent folder-cache loading for very large libraries.
Made potentially destructive or expensive maintenance behavior opt-in instead of surprising: stale-cache cleanup defaults off, empty-folder cleanup defaults off, and thumbnail-count changes warn before causing rebuild work.
Updated development and CI workflows around Node 24, Vitest, Playwright, IPC contract checks, installer checks, native cache checks, and release packaging.
Fixed
Existing cache decisions, metadata, thumbnails, bookmarks, ratings, favorites, duplicate fingerprints, recent folders, and settings now survive rescans, relaunches, and upgrades more reliably.
Destructive delete flows now validate loaded paths more strictly, clean related cache artifacts, report permanent-delete fallbacks clearly, and only clean truly empty folders when the user enables that option.
Cache migration and cache-mode changes now avoid partial/clobber-prone moves and communicate migrate/start-fresh outcomes more clearly.
Missing/offline folders and transient stat failures no longer silently prune cache by default.
Open/reveal/play external operations and custom thumb:// / video:// serving now validate loaded paths more carefully.
Built-in playback compatibility now better matches real browser support while FFmpeg-supported files can still be scanned for thumbnails and metadata.
Thumbnail cancellation, short-video thumbnail reuse, failed thumbnail regeneration, and thumbnail-count changes behave more predictably.
Duplicate reruns, deleted duplicate videos, stale duplicate selections, visual fingerprint settings changes, and hidden duplicate review state now clean up more reliably.
Sort state, resolution labels, feature toggles, keybinding capture, focused input behavior, shortcut conflicts, and privacy/shortcut precedence are more predictable.
New-folder and pending-scan UI states are clearer, reducing ambiguity when old videos are still visible while a new scan is starting.
Tooling
Added npm run check:ipc, npm run check:installer, npm run test:renderer, npm run test:duplicates, npm run test:cache-native, and expanded npm run test:ci.
Added Playwright Electron regression flows for smoke, delete safety, relaunch persistence, and duplicate reruns.
Added cache-clutter cleanup tooling, installer validation, release/test GitHub Actions updates, and broader regression coverage for Electron, renderer, cache, scanner, duplicate, processor, and settings flows.
[2.0.0-beta.2] - 2026-06-11
This beta focuses on scaling duplicate review, reducing large-library slowdown, tightening media compatibility behavior, and raising the regression-testing baseline before the persistent-library work begins.
Added
Expanded duplicate-review tooling with richer group handling, better keeper controls, safer rerun flows, and stronger duplicate-session management.
Context-menu actions and idle/performance diagnostics for faster inspection and debugging during heavy review sessions.
Broader automated coverage across Electron, renderer integration, duplicate workflows, relaunch persistence, and delete-safety flows.
Dedicated CI test workflow and Playwright/Vitest infrastructure for repeatable regression checking.
Changed
Improved app responsiveness across the renderer, sidebar, grid, review mode, scanner traversal, cache startup, and duplicate startup paths for larger libraries.
Reduced duplicate-detection overhead with more selective fingerprint loading, cleaner worker flow, and lower main-process startup cost before comparisons begin.
Improved cache and metadata persistence behavior with stronger save paths, better migration coverage, and more predictable reload/relaunch behavior.
Refined compatibility handling so built-in playback rules better match real browser support, while additional FFmpeg-supported formats are recognized during scanning.
Updated development and CI plumbing, including Electron/Vite dev-port coordination and refreshed GitHub Actions usage.
Fixed
Duplicate cleanup and delete flows are safer and more consistent, including reruns, fallback behavior, and follow-up state cleanup after removals.
Sort state now persists more reliably, and resolution labels are normalized more consistently across the UI.
Feature-setting toggles and related input behavior now behave more predictably.
Cache, duplicate, and scan edge cases now fail more safely under heavy or unusual workloads instead of leaving stale state behind.
Tooling
Migrated and expanded the automated test stack around Vitest, renderer integration tests, and E2E release checks.
Added more helper utilities, diagnostics hooks, and performance instrumentation to support future release hardening.
[2.0.0-beta.1] - 2026-05-12
This beta is a major step toward Video Cull v2.0: richer review decisions, smarter library filtering, clearer media insight, safer cleanup, and more predictable playback for large video collections.
Added
Smarter review workflow with ratings, favorites, review summaries, delete totals, scoped review context, and next-undecided navigation.
Richer library browsing with Library status filters, rating/favorite/incompatible filters, file-size and duration ranges, and cleaner active-filter controls.
Deeper media insight with codec, container, resolution, FPS, compatibility badges, and new metadata-based sort options.
More predictable playback with Video Cull's own compatibility policy, external-player fallback for unsupported media, decode-error overlays, and global mute.
Better user feedback with in-app notifications for cache recovery, save delays, update state, and background maintenance.
Feature toggles for enabling or hiding the new review, metadata, compatibility, and playback helpers.
Thumbnail regeneration controls for stale, partial, or interrupted thumbnail sets.
About/settings links for project, release, and support pages.
Changed
Upgraded Electron to 41 and refreshed application dependencies.
Reworked the custom video protocol for Electron 41 compatibility and stricter file-serving rules.
Reworked the sidebar around faster decision-making, with Library status filters promoted to the top and secondary filters kept more compact.
Improved large-library navigation with updated grid virtualization, better scroll restoration, and folder headers that show filtered size next to total size.
Made review and grid playback behave more consistently across compatibility, mute, metadata, ratings, favorites, and external-player actions.
Improved thumbnail generation with clearer progress phases, ordered results, retries around difficult timestamps, and safer reuse of existing thumbnail sets.
Cache loading and merging were hardened across central, per-drive, and distributed cache layouts.
Improved export reports for multi-directory sessions.
Made settings, cache migration, and update flows communicate their state more clearly.
Fixed
Unsupported audio/video decode failures now show an in-app explanation instead of failing silently.
Corrupt cache databases are quarantined and rebuilt instead of blocking the app from loading.
Deleted videos now remove related cache database rows, metadata entries, and thumbnail folders.
Empty parent folders left after deletion are removed when safe; cloud drives without Recycle Bin support now fall back to permanent removal only for verified-empty folders.
Partial or interrupted thumbnail folders are regenerated instead of being reused as if complete.
Stale cache rows are refreshed when rescans find newer metadata.
Save-cache failures now retry and warn the user when decisions may not yet be persisted.
Global shortcuts now avoid interfering with focused controls, settings, and shortcut overlays.
Update status handling now reports errors and ready states more reliably.
Tooling
Added an IPC contract checker for exposed Electron APIs.
Added a cache-clutter cleanup script for old thumbnail/cache artifacts from earlier builds.
[1.8.2] - 2026-05-01
Changed
Thumbnail generation now limits actual active FFmpeg processes directly: frames are extracted sequentially within each video while overall parallelism is spread across videos.
Auto concurrency now accounts for the current thread-limit setting and allows higher single-thread process counts on capable systems while still capping by available memory.
Hardware-accelerated thumbnail generation now pauses briefly between large batches to reduce GPU/driver pressure during long scans.
Processing settings now use clearer wording around parallel FFmpeg processes and one-thread-per-process behavior, with expanded manual process limits up to 32.
Removed the Minimal/Extended mode selector, first-run mode notice, View menu toggle, and mode shortcut because Video Cull no longer uses app-wide modes.
Fixed
Auto concurrency in Settings now recalculates from the unsaved local settings, so toggling thread limiting immediately updates the displayed process count.
Cancelling thumbnail generation now also applies to fallback frame extraction.
ElectronAPI TypeScript declarations now include the distributed cache confirmation API.
[1.8.1] - 2026-04-27
Fixed
Playing videos after scanning a whole drive now works correctly. Drive-root selections such as D:\ are now handled by the loaded-folder security check instead of rejecting every child path.
Closing the app during large thumbnail-generation runs no longer triggers a main-process "Object has been destroyed" error from delayed progress batch sends.
Video fullscreen now hides the Electron menu bar and restores it when fullscreen exits.
[1.8.0] - 2026-04-26
Added
Auto concurrency now factors in available RAM each ffmpeg instance uses ~400 MB, so the limit is capped to whichever is lower: half the CPU cores or (free RAM 1 GB) / 400 MB. Prevents out-of-memory on lower-spec machines.
Settings panel now shows the resolved thread count when Auto concurrency is selected, making the setting self-documenting.
Changed
Cache writes now fan out to per-folder SQLite databases that mirror the actual directory hierarchy on disk. Existing flat-root cache DBs are automatically split on first scan.
Thumbnail output directory is resolved per-video when using folder-distributed cache, keeping thumbs co-located with their DB.
Sidebar layout reorganized with improved visual hierarchy and spacing.
defaultGroupByFolder now correctly defaults to true for existing installs that predate the setting.
Fixed
Grid thumbnail flicker eliminated: filteredVideos selector upgraded to shallow equality, preventing react-window from remounting all visible rows on every thumbnail batch update.
getItemSize now uses a stable ref instead of reading rows state, removing a secondary source of row remounts.
Thumbnails now fade in with a CSS opacity transition instead of snapping in abruptly.
ElectronAPI TypeScript interface updated with missing getAutoConcurrency declaration.
[1.7.0] - 2026-04-25
Added
Multi-directory sessions with true Add to Session behavior for dropped or selected folders.
Cache storage modes for centralised, per-drive, and distributed cache layouts.
Cache migration flow when switching storage modes, with migrate, start fresh, and cancel choices.
First-run Minimal/Extended mode notice, Settings mode selector, View menu toggle, and configurable mode shortcut.
Per-drive and central cache location validation with write tests before settings are saved.
Changed
Thumbnail files now resolve through cache-mode-aware roots instead of assuming one central cache folder.
Grid folder labels include the root folder prefix when multiple roots are loaded.
SQLite cache handles are kept per DB path so multi-directory operations do not close each other's connections.
Cache writes now preserve future metadata columns when values are present.
Fixed
Batch cache saves fall back to chunked persistence for very large selections to avoid blocking the main process.
Distributed cache index entries are pruned on startup when folders are no longer available.
Scanner ignores distributed .videocull cache folders during recursive scans.
Per-drive cache overrides must stay on the drive they configure.
[1.6.0] - 2026-04-16
Added
Minimum duration filter in the sidebar, including a live mm:ss helper.
Batch selection mode in grid view with checkbox controls and actions for Keep, Delete, Skip, Reset, and Clear.
Folder header Review action to jump into review mode scoped to one folder.
Export Report flow in Settings and app menu, including scope selection for all or filtered videos.
Review mode reset shortcut with configurable keybind support.
Changed
Review counter pill now doubles as a progress indicator and shows decided versus remaining counts.
Report export HTML now includes folder/subfolder grouping and separate Keep, Delete, Pending, and Skipped sections.
Batch-delete fallback messaging now clearly reports permanent-delete outcomes when recycle-bin trashing is unavailable.
Fixed
Grid batch selection state now persists when leaving grid view and returning from review mode.
Settings tab routing now re-targets correctly from menu actions, including repeated requests to open Reports.
Export availability is disabled while scanning to avoid stale-data report generation.
Report export cancellation now shows a cancellation message instead of a generic failure.
[1.5.1] - 2026-04-13
Fixed
Grid mode now invalidates its virtualization cache immediately after folder or subfolder reordering, preventing large spacing gaps and overlap until the window is resized.
Closing review mode now returns to the previous grid scroll position instead of resetting to the top.
Autoplay from grid play-click is now one-shot: only the initially clicked video auto-plays, while next/previous navigation opens in thumbnail view.
[1.5.0] - 2026-04-13
Added
Drag-and-drop folder opening for the full app window, with directory validation and clear error feedback for invalid drops.
Folder choice flow when another directory is already open: "Open as new" or "Add to current session".
Privacy screen toggle on Shift+Esc with a full-window overlay image (src/assets/privacy-screen-dashboard-cover.png).
Recent directories with persisted timestamps, shown in both sidebar and empty state.
Toast notification system for info and error feedback, with auto-dismiss and manual close.
Keyboard-accessible folder choice modal with focus trapping and Escape-to-close.
Changed
Empty state recent-folders UI simplified to a minimal text-first layout.
Recent folders shown in UI are limited to the 5 most recent entries.
"Include subfolders" control moved directly under "Open Directory" for a cleaner flow.
"Clear all" in recent folders is styled as a clearer interactive control.
Relative-time and recent-path formatting utilities were centralized in src/utils.ts and reused across components.
Fixed
Renderer-to-main bridge now exposes dropped-path validation (validateDroppedPath) through preload.
Privacy mode now blocks non-toggle keyboard input and prevents conflicting actions while active.
Review-mode Escape handling no longer conflicts with Shift+Esc privacy toggle.
Stale recent-directory entries are removed when invalid and are also pruned on app startup.
Fixed regex path-splitting escape issue in sidebar recent-path formatting.
Documentation
Updated README.md with current quick-win features and privacy-screen shortcut.
In Progress
"Add to current session" currently shows a placeholder notification and is not fully implemented yet.
[1.4.0] - 2026-04-10
Final stable release for the SQLite migration track. This section is cumulative and includes all changes between v1.3.0 and v1.4.0 (including v1.4.0-alpha.1 and v1.4.0-alpha.2).
Added
SQLite cache layer migrated from JSON to better-sqlite3 with per-folder database files and a dedicated cache module.
Chunked bulk persistence added chunked SQLite writes with event-loop yielding to keep IPC/UI responsive during large saves.
Automatic JSON migration legacy .video-cull-cache.json is imported on first scan, preserving status and bookmarks.
Changed
Cache architecture all cache IO now goes through a single DB path resolver and centralized DB lifecycle.
Thumbnail storage location thumbnails now live under the app cache root (userData/video-cache) instead of colliding with Electron internals.
Thumbnail path handling DB stores relative thumbnail paths, renderer receives absolute paths via boundary conversion.
Scan merge behavior cache merge now preserves cached duration, metadata date, bookmarks, status, and thumbnail references.
Fixed
Cache wipe on restart resolved DB/thumb data loss caused by writing into Electron's internal cache area.
Cascade thumbnail loss on upsert replaced destructive replace behavior with safe ON CONFLICT DO UPDATE upserts.
Missed thumbnail migration path migration now checks filesystem state directly and supports cross-device move fallback.
Chunked path bypass bug ensured bulk initial scan saves use the chunked cache path (saveCacheChunked) instead of the blocking monolithic path.
Write amplification during thumbnail generation store now saves only changed videos (not whole arrays) for thumbnail/status/bookmark/undo updates.
Transient save failures added a retry queue for partial saves with race-safe token reconciliation.
Duration persistence on rescan cached duration now survives rescans when thumbnails already exist.
Delete flow overhead removed redundant full-cache save after batch delete.
Cache load performance removed N+1 thumbnail query pattern by bulk-loading and grouping thumbnail rows in memory.
Docs
README maintenance marked screenshots section as outdated for the v1.3.0 baseline prior to migration work.
Migration
Automatic transition old JSON cache files are imported and removed; durations/thumbnails are regenerated or merged from current cache/scan state as applicable.
[1.4.0-alpha.2] - 2026-04-10
Fixed
Cache persistence SQLite databases and thumbnails were being silently wiped on every app restart because the cache directory (userData/cache) collided with Electron's internal HTTP cache. Moved to userData/video-cache.
Thumbnail records lost on rescan INSERT OR REPLACE in SQLite triggers ON DELETE CASCADE, destroying thumbnail records on every scan even when not intended. Switched to ON CONFLICT DO UPDATE (true in-place upsert, no cascade).
Thumbnail migration skipped filesystem migration from .video-cull-thumbs to the cache dir was gated on DB records existing, so it silently no-ops after a JSONSQLite migration (which skips thumbnails). Now checks the filesystem directly.
Thumbnails stored flat all folders' thumbnails were written to a single thumbs/ directory. Now organised per-folder as thumbs/<folder-name>/ matching the DB filename.
saveCacheChunked never called bulk saves in the initial scan used the blocking single-transaction path instead of the chunked async path.
[1.4.0-alpha.1] - 2026-04-10
Added
Initial SQLite migration replaced JSON caching with SQLite (better-sqlite3) and introduced per-folder DB cache files.
Legacy import path first-run migration for existing JSON cache data into SQLite.
Changed
Cache architecture foundation introduced centralized cache module (electron/cache.js) and DB lifecycle management.
Thumbnail migration foundation moved thumbnail ownership into cache storage flow and updated scan merge behavior.
[1.3.0] - 2026-04-09
Changed
UI refinements updated accent and status colors (more vibrant keep/delete), subtler borders using alpha values, improved shadows and surface tones throughout
Deleted cards grayscale + opacity treatment makes marked-for-deletion videos visually recede in the grid; restores on hover
Filter pills active pills now use accent gradient with glow; keep/delete pills use solid status colors
Badge animation status badges (keep/delete) animate in with a pop on first appearance
Review mode counter and close button styled as matching pill/circle pair; keep/delete flash uses radial gradient
Improved
Empty state redesigned welcome screen with glowing icon container, gradient title text, and pill-shaped open button
Removed
Internal preview modal component (was unreachable dead code; grid play button opens review mode directly)
[1.2.0] - 2026-04-09
Added
Grid play button opens review mode clicking the play button on a video card now navigates directly to review mode and starts playback, instead of opening a separate preview modal.
Fully configurable keybindings all shortcuts can now be recorded as real key combinations (Esc, Delete, Ctrl+key, etc.) in Settings Keybindings. Includes conflict detection and a Reset to Defaults button.
Changed
Keybindings settings panel reorganised into logical groups (Navigation, Decisions, Playback, While Playing, Preview, Global).
"Play / Pause (Enter)" renamed to "Play / Pause (alternate)" to avoid implying the key is fixed.
[1.1.0] - 2026-04-08
Added
Bookmarks press B while playing to drop a bookmark at the current position. Bookmarks persist across sessions and appear as clickable chips below the player (click to seek, hover to reveal remove button). A count badge shows on the thumbnail strip when a video has bookmarks.
Playback speed controls [ / ] step through 0.5Χ, 0.75Χ, 1Χ, 1.25Χ, 1.5Χ, 2Χ. Speed is shown as an overlay badge and persists as you move between videos in the same session.
Keyboard shortcuts overlay press ? anywhere to open a reference of all shortcuts.
Fixed
Rare crash (black screen / render process gone) that could occur while interacting with the video player during playback. Root cause: frequent React re-renders of the Video.js player stack triggered a native access violation in Chromium's media pipeline.
[1.0.0] - 2026-03-01
Initial release.