A cross-platform command-line tool (Windows, Linux, macOS) for grouping photos and videos into albums (folders) based on time and location changes. It can also name these albums using real-world place names, making them easier to browse.
GroupMachine helps you organize large collections of photos and videos by grouping them into albums based on when and where they were taken. It’s especially useful if you’ve downloaded images from your camera, mobile phone or cloud service (like Apple iCloud or Google Photos), which often contain large, mixed sets from multiple locations and dates.
By default, the tool groups your photos and videos into albums - which are simply folders containing related media files. It creates a new album whenever there’s a significant gap in time or location between your shots (for example, different cities or days apart). This way, the folder structure naturally reflects your trips, events, or outings without manual sorting.
If you supply a GeoNames database file (freely downloadable) then GroupMachine can rename the folders to actual place names.
![]() |
|---|
Tip
Once you've grouped your photos, SideBySide can combine two portrait shots into a single landscape image, making them ready for digital frames without awkward cropping or black bars.
- 💻 Runs on Windows, Linux and macOS across x86, x64 and ARM devices.
- 📂 Organises photos and videos into albums (folders) based on time and location.
- 🗺️ Names albums using real-world place names with the GeoNames database.
- 📍 Infers missing GPS locations from nearby media taken at a similar time.
- 🍏 Keeps Apple Live Photos together as a single item.
- 🧭 Supports configurable time, distance and location precision thresholds.
- 📅 Customises album names with flexible date formats, prefixes and suffixes.
- 📦 Copies, moves, links or simulates changes without modifying your originals.
- 🧠 Detects identical files to avoid unnecessary duplicates.
- ⏳ Supports incremental processing using date filters and resume support.
Grouping is based on two key factors: the time between shots and the distance between their locations. When the gap between consecutive photos or videos exceeds either the time or distance threshold, a new album is started.
Using the default thresholds (48 hours and 10 km) means that photos/videos taken less than 2 days apart and within 10 kilometres (or 6.2 miles) will be grouped together. For example, photos/videos taken during a single day trip or a weekend away will usually fall into the same album. If you then travel to a different city a few days later, that will create a new album.
Because the grouping relies on metadata timestamps and GPS coordinates, it assumes your media files include accurate time and location information. These assumptions generally hold true for photos and videos taken by modern smartphones and digital cameras. If the time metadata is missing or invalid, GroupMachine can use the created or last modified timestamp of the file instead (whichever is the earliest).
You can override these defaults using -t (--time) and -d (--distance).
Tip
In regions where towns and landmarks are more widely spaced, a larger distance than the default 10 km may produce better album names - for example, the United States, Canada, Australia and New Zealand.
By default, album folders are named using date ranges reflecting when the photos or videos were taken. You can improve folder naming by using the GeoNames database, which maps GPS coordinates to nearby place names.
If you provide the GeoNames data, GroupMachine will look up suitable nearby locations for each photo or video using a prioritised search of geographic features. It then selects up to four place names for the album title. These are chosen in the order they first appear in the group, with less frequent locations dropped if more than four are found. The result is a name that prioritises the most representative places, kept in the order you visited them.
For example, an album might be named "Le Marais, Montmartre and Latin Quarter" instead of just "4 Apr 2025 - 7 Apr 2025".
If you frequently visit the same places, you can avoid album name collisions by appending a date to each name using -a or --append. For instance, using --append "MMMM yyyy" would label your album as "Le Marais, Montmartre and Latin Quarter (April 2025)"
Important
To enable geocoding, you must download a GeoNames dataset from the GeoNames download page. Use allCountries.zip for worldwide coverage (recommended) or the .zip file for your country. Unzip the archive and pass the resulting .txt file to GroupMachine using -g (or --geocode).
Rather than simply picking the closest place, GroupMachine works outward through a series of distance tiers, checking for the most specific locations first and only falling back to broader areas when nothing closer is found.
| Distance | Location types prioritised | Example results |
|---|---|---|
| Up to 100m | Spot features, landmarks and notable places | Eiffel Tower, Tower Bridge, Hyde Park |
| Up to 1km | Local features such as neighbourhoods and smaller areas | Montmartre, Le Marais, Greenwich |
| Up to 10km | Populated places | Paris, Bath, Bristol |
| Up to 100km | Larger geographic features and selected fallback locations | Somerset, Provence-Alpes-Côte d’Azur, English Channel |
The precision level controls which tiers are considered. The default mode (--precision 3) considers all tiers, starting with the most specific locations and falling back to broader areas when no suitable match is found.
Selected hydrographic features such as seas, gulfs and straits are included as a final fallback for photos and videos taken on water where no suitable land based location is available.
This keeps albums from being named after obscure database entries that happen to be nearby, while still using a recognisable landmark when one is genuinely close by.
Note
If a photo or video has missing or invalid GPS data, GroupMachine can infer its location from the nearest item taken close in time (imputing). This helps group media from the same event or trip, but the inferred location may not reflect any movement that occurred between shots.
Get the latest version from the Releases page.
Each release includes the following files (x.x.x denotes the version number):
| Platform | Download |
|---|---|
| Microsoft Windows 10 & 11 | GroupMachine-x.x.x-win-x64.exe ✅ Most users should choose this |
| Linux (x64 Intel/AMD) | GroupMachine-x.x.x-linux-x64 |
| Linux (ARM64), e.g. Pi 4 and newer | GroupMachine-x.x.x-linux-arm64 |
| Linux (ARM32), e.g. Pi 3 and older | GroupMachine-x.x.x-linux-arm |
| Docker, e.g. Synology NAS | GroupMachine-x.x.x-linux-x64 |
| macOS (Apple Silicon ARM64) | GroupMachine-x.x.x-osx-arm64 |
| macOS (Intel x64) | GroupMachine-x.x.x-osx-x64 |
| Developers or other platforms | Source code (zip / tar.gz) |
GroupMachine does not use an installer on Windows, macOS or Linux. Download the appropriate file from the table above and run it from the command line.
GroupMachine requires the .NET 8 Runtime. Do not install the SDK, ASP.NET Core Runtime, or Desktop Runtime.
- Download
GroupMachine-x.x.x-win-x64.exe. - No installation is required. Save the executable anywhere you like.
- Open Command Prompt or Windows Terminal and run it from that folder.
- If Windows SmartScreen warns that the app is unrecognised, click More info then Run anyway.
- Download the appropriate binary for your platform (see table above).
- Make the downloaded file executable:
chmod +x GroupMachine-x.x.x-<your-platform> - If you get
zsh: killedwhen running the executable then:- Apply an ad-hoc code signature:
codesign --force --deep --sign - GroupMachine-x.x.x-<your-platform> - Remove the quarantine attribute:
xattr -d com.apple.quarantine GroupMachine-x.x.x-<your-platform>
- Apply an ad-hoc code signature:
- Download the appropriate binary for your platform (see table above).
- Make the downloaded file executable:
chmod +x GroupMachine-x.x.x-<your-platform>
- Use the
GroupMachine-x.x.x-linux-x64binary inside the container. - Install the .NET 8.0 Linux runtime inside the container or use a .NET container image.
- Mount your photo folders into the container with appropriate read and write access.
- Tested extensively: Windows 11
- Tested moderately: Linux ARM64 (Raspberry Pi 5)
- Not tested: Windows 10, Linux x64, Linux ARM32, Docker, macOS (Intel & Apple Silicon)
Note
I do not have hands-on experience with Docker or macOS environments. GroupMachine should work, but platform-specific support will be limited.
This example organises a collection of photos and videos into dated albums. It scans d:\Photos and all subfolders, groups files taken within 48 hours and 10 km of each other into the same album, then moves them into dated folders under e:\My Album. Album names use the default date format (for example, 20 Jul 2025 or 20 Jul 2025 - 22 Jul 2025).
Tip
If this is your first time using GroupMachine, use -s (instead of -c, -m or -l) to run in simulate mode. This shows what would happen without actually copying, moving or linking any files.
GroupMachine "d:\Photos" -m -r -o "e:\My Album"
Explanation of options:
"d:\Photos": Source folder containing your photos and videos-m: Move files into the new album structure-r: Search subfolders recursively-o "e:\My Album": Destination folder for the albums
This example uses the GeoNames allCountries.txt database, the complete worldwide database of places and points of interest, to name albums based on location. GroupMachine uses specific landmarks where available and falls back to broader place names when needed. The four digit year is appended to each album name, and files are copied rather than moved, leaving the originals untouched.
GroupMachine "d:\Photos" -o "e:\My Album" -r -g c:\temp\allCountries.txt -a "YYYY" -c
Explanation of options:
"d:\Photos": Source folder containing your photos and videos-o "e:\My Album": Destination folder for the albums-r: Search subfolders recursively-g c:\temp\allCountries.txt: Use the GeoNames database for location based album names-a "YYYY": Append the four digit year to each album name-c: Copy files into the new album structure, leaving the originals unchanged
This example shows how to customise the way GroupMachine creates albums. It changes the grouping thresholds to 24 hours and 50 km, uses ISO-8601 date formatting (yyyy-MM-dd) for folder names, skips video files, and creates links to files instead of copying them.
Links avoid duplicating storage space by allowing multiple album folders to reference the same original files. When -l (--link) is used, GroupMachine will create hard links where possible, and automatically fall back to soft links when hard links cannot be created.
GroupMachine "d:\Photos" -r -o "d:\My Album" -t 24 -d 50 -f "yyyy-MM-dd" -nv -l
Explanation of options:
"d:\Photos": Source folder containing your photos and videos-r: Search subfolders recursively-o "d:\My Album": Destination folder for the albums-t 24: Group photos taken within 24 hours of each other-d 50: Group photos taken within 50 km of each other-f "yyyy-MM-dd": Use ISO-8601 date formatting for album names-nv: Skip video files-l: Create hard links where possible, falling back to soft links when required
GroupMachine is a command-line tool. Run it from a terminal or command prompt, supplying all options and arguments directly on the command line. Logs with detailed information are also written and you can find the log file location using --help (-h).
GroupMachine [options] -o <folder> <mode> <source> [<source> ...]
-
-o <folder>,--output <folder>
Specifies the destination folder for grouped albums. If the folder does not exist, it will be created automatically. -
<source folder> [<source folder> ...]
One or more folders containing the photos and videos to be grouped.
-
-c,--copy
Copy files from the source folder to the destination folder. -
-m,--move
Move files from the source folder to the destination folder. -
-l,--link
Link files from the source folder to the destination folder. This avoids duplicating content by creating a reference to the original file instead of copying it. GroupMachine first attempts to create a hard link, which behaves like a real file and doesn’t depend on the original path. If that fails (e.g. across different drives), it falls back to creating a soft link (symbolic link), which points to the original file and breaks if that file is moved or deleted. -
-s,--simulate
Runs all processing steps and outputs a report explaining what would happen. No files are copied, moved or linked. This is ideal for testing and previewing changes.
Note
Files are never overwritten. If a file with the same name already exists in the destination, it is compared by content. If the files are not binary identical, a number is appended to the new file (e.g., IMG_1234 (2).jpg) to preserve both versions.
-
-r,--recursive
Recursively scan all subfolders within the specified source folders. -
-nv,--no-video
Exclude videos (.mp4,.movand.m4v) from scanning. -
-np,--no-photo
Exclude photos (.jpgand.jpeg) from scanning. -
-df <date>,--date-from <date>
Include only files taken after this date. Files earlier than this date will be ignored. You must supply the date (and optional time) in ISO 8601 format:yyyy-mm-ddoryyyy-mm-dd hh:mm:ss. If you don't provide a time then midnight will be assumed.
Tip
You can also use the special value last to continue processing from the last file processed in a previous run. This is useful
when you are incrementally grouping new photos without reprocessing everything.
-dt <date>,--date-to <date>
Include only files taken on or before this date. Files later than this date will be ignored. You must supply the date (and optional time) in ISO 8601 format:yyyy-mm-ddoryyyy-mm-dd hh:mm:ss. If you don't provide a time then midnight will be assumed.
Tip
You can also use the special value last to continue up to the last processed file from a previous run. This is useful when limiting processing to a specific time window or when resuming partial groupings.
-
-xr(--exclude-recent)
Exclude very recent files within the-t(--time) time threshold (default is 48 hours) when grouping into albums. This holds off processing new content until it’s clear that no additional photos or videos will be added to the same album.For example, imagine you take a series of photos in the evening. If you run GroupMachine immediately, it might create an album with just the first few photos. A couple of days later, running GroupMachine again would group the remaining photos from that evening into a new album, even though they logically belong with the album created on the previous run - since they were taken within the same
-t(--time) timeframe. Using-xr(--exclude-recent) delays processing of the first set of files, ensuring that all photos are correctly grouped together in a single album once no further related content is expected.
Note
If you specify an end date and time with -dt (--date-to) that goes beyond the
window required by -xr (--exclude-recent), the date and time will be adjusted forward to ensure
that very recent files within the -t (--time) threshold are still ignored.
-
-d <number>,--distance <number>
Distance threshold in kilometers. If two consecutive photos or videos are taken more than this distance apart, a new album is started. Set to0to disable distance-based grouping. If not supplied, the default is 10 km.In regions where towns and landmarks are more widely spaced, a larger distance than the default 10 km may produce better album names - for example, the United States, Canada, Australia and New Zealand.
-
-t <number>,--time <number>
Time threshold in hours. If two consecutive photos or videos are taken more than this many hours apart, a new album is started. Set to0to disable time-based grouping. If not supplied, the default is 48 hours.
-g <file>,--geocode <file>
Full path to a GeoNames database file in.txtformat. Providing this file enables automatic renaming of albums based on location data. You will need to manually decompress the.zipfile provided by the GeoNames website before you can use it with GroupMachine.
Tip
For best performance, store the GeoNames database file on a local SSD. Loading it from a network share, USB drive, or HDD can be much slower.
-
-f <format>,--format <format>
Date format used for album folder names that use dates. This follows the .NET DateTime format syntax. The default isdd MMM yyyy(e.g., "20 Jul 2025"). Used when no GeoNames data is provided or no location can be determined. -
-p <number>,--precision <number>
Defines how detailed the location names are when GroupMachine generates album titles. Lower levels produce broader, more general location names, while higher levels allow more specific locations to be considered.The default is level 3 (precise).
Level Precision Location tiers considered Example 1 Broad Larger geographic features and final fallback locations Somerset, Provence-Alpes-Côte d’Azur, English Channel 2 Standard Local features, populated places, and broader fallback locations Le Marais, Montmartre, Latin Quarter 3 Precise All location tiers, including spot features ✅ Default Eiffel Tower, Louvre Museum, Notre-Dame Cathedral Higher precision levels allow GroupMachine to use more specific locations when they are available. For example, level 3 first checks for nearby spot features before falling back to local areas, towns, cities, and larger geographic features. If a more specific location cannot be found, GroupMachine continues searching using the broader location tiers available for that precision level.
Spot features are individual landmarks, buildings, or points of interest. Level 3 includes selected spot features that are typically relevant for tourist photography:
- Cultural landmarks: castles, monuments, palaces, temples, mosques, churches, theatres, opera houses.
- Historic and archaeological sites: ruins, tombs, pyramids, historical or archaeological sites.
- Recognisable structures: towers, arches, caves, lighthouses, piers, quays, squares, gardens.
- Public institutions and attractions: museums, zoos, famous universities, public libraries, stadiums.
- Leisure and resort areas: marinas, resorts, golf courses, spas.
- Religious or spiritual locations: missions, shrines.
The list of spot features is fixed and cannot be changed.
-
-a <format>,--append <format>
Date format to append to album folder names that use locations. Useful to distinguish multiple visits to the same location. Dates are appended within brackets - e.g. usingMMM yyyywill produce "Paris, Boulogne-Billancourt, and Saint-Denis (Apr 2025)". Dates are defined using the .NET DateTime format syntax. -
-nr,--no-range
Don't use a date range in album titles. By default, GroupMachine adds a date range (e.g. "12 Jun 2025 – 14 Jun 2025", using the format defined by-f,--format) when an album spans multiple days. With this option enabled, album names always use the date of the first item in the group, even if later items fall on different days. -
-np,--no-part
Don't add part numbers to album titles. Normally, if multiple albums form on the same day, date range or in the same location (e.g. due to the distance threshold being exceeded), GroupMachine appends part numbers to distinguish them (e.g. "Paris (part 2)"). With this option enabled, part numbers are omitted and such groups are merged into a single album.
Tip
If you regularly visit the same locations at different times of the year and want to keep those visits separate, consider appending the date, month, or year to album names using the -a (--append) option.
-pa <text>,--prefix-album <text>
Adds custom text in front of each album folder name. If the text contains/(or\on Windows), it is treated as part of the folder path, allowing you to create sub-folders. You can also include<...>placeholders using the .NET DateTime format syntax, which will expand based on the album’s date range.
Below are a few examples of using the prefix option to modify album names and/or create subfolders. In all cases, the album date is 5 April 2025. Examples marked with
| Command | Without GeoNames | With GeoNames | Notes |
|---|---|---|---|
-pa "Trip to " |
Trip to 5 Apr 2025 - 6 Apr 2025 |
Trip to Paris, Boulogne-Billancourt, and Saint-Denis |
Prefix every album. |
-pa "Weekend in" |
Weekend in5 Apr 2025 - 6 Apr 2025 |
Weekend inParis, Boulogne-Billancourt, and Saint-Denis |
|
-pa "<yyyy>/" |
2025/5 Apr 2025 - 6 Apr 2025 |
2025/Paris, Boulogne-Billancourt, and Saint-Denis |
Creates a year subfolder. |
-pa "<yyyy>/<MM>_" |
2025/04_5 Apr 2025 - 6 Apr 2025 |
2025/04_Paris, Boulogne-Billancourt, and Saint-Denis |
As above, but also month prefix on album name. |
-pa "Year <yyyy>/<MMMM>/" |
Year 2025/April/5 Apr 2025 - 6 Apr 2025 |
Year 2025/April/Paris, Boulogne-Billancourt, and Saint-Denis |
Deeper nesting folders. |
-pa "<yyyy>\<MMM>- " |
2025\Apr- 5 Apr 2025 - 6 Apr 2025 |
2025\Apr- Paris, Boulogne-Billancourt, and Saint-Denis |
Windows path seperator also supported. |
-pa "<yyyy>" |
20255 Apr 2025 - 6 Apr 2025 |
2025Paris, Boulogne-Billancourt, and Saint-Denis |
/ or / means prefix not folder. |
Caution
- If you don’t include a trailing space in your prefix, the album name will run directly after your text.
- If you are creating sub-folders, the prefix must end with
/(or\on Windows) otherwise the text will be added to the folder name instead of making a new folder.
-
-u,--unique
Always create new, unique albums. By default (and when using locations), GroupMachine may place photos into an existing folder if the album name matches. This can cause conflicts if you have two albums with the same name taken at different times. Using-u(--unique) forces a new folder to be created on each run. New folders use the same name with a numeric suffix such as(1),(2), and so on.You can also use
-pa(--prefix-album) and/or-a(--append) to change the album name by adding extra text. Both options can make an album title unique without relying on numeric suffixes.
-
-nc,--no-check
Disables GitHub version checks for GroupMachine.Version checks occur at most once every 7 days. GroupMachine connects only to this URL to retrieve version information. No data about you or your photo/video library is shared with the author or GitHub - you can verify this yourself by reviewing
GitHubVersionChecker.cs -
-ha <type>,--hash-algo <type>
Select the hashing algorithm for duplicate detection. By default, GroupMachine uses CRC64-ECMA-FAST, a very fast 64-bit checksum that reads only the first 64 KiB of each file. This is extremely efficient for spotting duplicates in large collections. You can override this with:md5- Well-known and widely supported. Reads the entire file, so it is slower than CRC64-ECMA-FAST, but more accurate for full-file deduplication.sha- Strong cryptographic hash. Slowest option, but provides maximum certainty when comparing full files. GroupMachine automatically chooses SHA256 on 32-bit systems and SHA512 on 64-bit systems.
-
-mp <number>,--max-parallel <number>
Controls how many files are processed at the same time during copying, moving, or linking. By default, GroupMachine automatically chooses a safe number of parallel tasks based on your CPU and storage type. If you experience crashes, performance or stability issues, try reducing the number of parallel tasks. Use-h(--help) to see the default value for your system. -
/?.-h,--help
Displays the full help text with all available options, credits and the location of the log files.
The -f (--format), -a (--append) and -pa (--prefix-album) options accept date formats using the .NET DateTime format syntax, allowing you to customize how dates appear. Below is a list of commonly used date formats for your reference:
| Format String | Description | Example Output |
|---|---|---|
dd MMM yyyy |
Day (two digits) Month abbrev. Year (four digits) | 20 Jul 2025 |
dd MMMM yyyy |
Day (two digits) Full month name Year (four digits) | 20 July 2025 |
MM/dd/yyyy |
Month/day/year (common US format) | 07/20/2025 |
dd/MM/yyyy |
Day/month/year (common UK format) | 20/07/2025 |
yyyy-MM-dd |
ISO 8601 format (sortable) | 2025-07-20 |
MMMM yyyy |
Full month name and year | July 2025 |
MMM yyyy |
Abbreviated month name and year | Jul 2025 |
yyyy |
Year only | 2025 |
dd-MM-yyyy |
Day-month-year with dashes | 20-07-2025 |
For a complete list of format specifiers, see Microsoft's Custom date and time format strings documentation.
You can run GroupMachine manually on any folder of photos/videos whenever you like. This is quick, flexible, and works well if you prefer to organise albums on demand.
However, for those who want more automation, you can also create a workflow that automatically downloads new photos from your cloud service (for example, iCloud or Google Photos) and then groups them into albums using GroupMachine. This allows you to maintain an organized library without manually moving files each time.
Key points for setting up an automated workflow:
- Automate downloads – Use a third-party tool to fetch images from your cloud service. For example, iCloud Photos Downloader can download photos and videos from iCloud. There are probably similar tools for Google Photos or other services.
- Process only new files – Use
-df last(--date-from last) to tell GroupMachine to only process files added since the last run. This prevents reprocessing older files and ensures incremental grouping. - Access the last processed date – If you need to incorporate further scripting, the last date processed is stored in
settings.ini. You can locate this file by checking the path displayed when you run-h(--help), usually in the parent folder to the log files. - Avoid premature album creation – Include
-xr(--exclude-recent) to hold off processing very recent photos. This ensures that files still likely to belong to the same album aren’t split across runs. - Organize album names – Use
-pa(--prefix-album) to place albums into folders (for example, by year) or-a(--append) to add date elements to the album name (such as year or month). This prevents multiple visits to the same location from merging into a single folder and keeps your albums clear and chronological. - Save disk space – If you plan to keep all downloaded photos, consider using
-l(--link) instead of copy or move. This creates links to the original files without duplicating them. - Keep geocode data current – If you’re using location-based album naming, update your GeoNames database periodically to ensure accurate place names.
- Integrate into Immich – If you host your photos and videos with Immich, use Immich Folder Album Creator to automatically turn the folders created by GroupMachine into albums within Immich.
- Use with other software – Picasa (Google’s legacy desktop app), as well as tools like PhotoPrism, LibrePhotos, Photoview, and digiKam, detect and display albums based on your folder structure, making them compatible with GroupMachine’s output. Synology Photos, however, doesn’t currently offer a way to auto-generate albums from newly added folders or files.
Tip
A simple workflow could be a daily or weekly script that downloads new images, then runs GroupMachine with -df last -xr -pa "<yyyy>/" to
incrementally organize new content into neatly named, chronological albums.
Please raise an issue at https://github.com/mrsilver76/groupmachine/issues.
GroupMachine currently meets the needs it was designed for, and no major new features are planned at this time. However, the project remains open to community suggestions and improvements. If you have ideas or see ways to enhance the tool, please feel free to submit a feature request.
- Gallery icons by Freepik - Flaticon (https://www.flaticon.com/free-icons/gallery)
- Apple and iCloud are trademarks of Apple Inc., registered in the U.S. and other countries. This tool is not affiliated with or endorsed by Apple Inc.
- Google and Google Photos are trademarks of Google LLC. This tool is not affiliated with or endorsed by Google LLC.
- .NET is a trademark of Microsoft Corporation. This tool is developed using the .NET platform but is not affiliated with or endorsed by Microsoft.
- GeoNames is a project of Unxos GmbH. This tool is not affiliated with or endorsed by Unxos GmbH.
- Optimised GeoNames location loading by filtering unnecessary data before processing. This has dramatically reduced memory usage and improved performance, especially for large photo and video collections.
- Significantly improved album naming by changing the GeoNames lookup logic to introduce a clearer prioritisation order. Location searches now use four distance tiers that better reflect how people typically name places - prioritising spot features within 100m, local features within 1km, populated places within 10km, and finally the nearest appropriate location within 100km.
- Added support for selected hydrographic features such as seas, gulfs and straits as part of the final fallback, ensuring support for photos and videos taken on water.
- Changed the default precision level to 3 (detailed) to include spot features by default.
- Added support for processing HEIC, HEIF and AVIF images.
- Improved album date accuracy by checking additional EXIF and QuickTime metadata fields.
- Upgraded MetadataExtractor package from 2.8.1 to 2.9.3.
- Fixed a bug that incorrectly prevented videos from being grouped by location.
- Fixed a bug that incorrectly quoted command line options in logs.
- Fixed bug that prevented GeoNames from being used for video content only.
- Updated
-s(--simulate) to display significantly more useful information in the terminal instead of only writing details to logs. - Cleaned up a lot of formatting to the console.
- Updated
-h(--help) output with more descriptive command information and improved formatting to respect terminal width. - Significantly sped up file size scanning by running operations in parallel.
- Cleaned up code and fixed compiler warnings and recommendations.
- Updated documentation, especially around the Quick Start section and location naming behaviour.
- Added support for extracting GPS metadata from videos - handles XMP, DMS, decimal and ISO 6709 formats commonly used by both iOS and Android.
- Improved progress bar accuracy - now calculated using bytes processed rather than files processed.
- Tidied up formatting of progress bar for better terminal compatibility.
- Updated default distance to 10km and default precision level to 2 for better album naming.
- Added checks to ensure invalid GPS data is not considered.
- Fixed a bug which meant that photos and videos were still scanned even if
-nvand/or-npwere used. - Updated the publish script to use
--no-self-containedas identified by dotnet/sdk#51888. - Updated documentation and copyright.
- Replaced
-p(--precise) with new-p(--precision) to support three levels of album naming detail. - Added progress bar for long running tasks; displays percentage complete and estimated time left.
- Updated GPL copyright version in comments to correctly reflect GNU GPL v2 (or later).
- Updated documentation.
- Improved grouping by filling missing/invalid GPS data (imputing) with locations inferred from photos taken close in time.
- Moved content sorting by date earlier in the process to support imputing and improve debugging with logs.
- Added automatic detection of a safe number of parallel tasks based on CPU and storage type to prevent
SEHExceptioncrashes on network drives. - Added
-mp(--max-parallel) option to allow users to override the default number of parallel copy, move, or link operations. - Default hashing switched to CRC64-ECMA-FAST (64 KiB prefix) for much faster performance; accidental collisions remain rare.
- Added
-ha(--hash-algo) to override the hashing algorithm with MD5 or SHA512 (SHA256 on 32-bit systems). - Added file size comparison before hashing to further improve duplicate-checking speed.
- Fixed a bug where the last processed timestamp would be incorrectly updated to an earlier date.
- Tidied up logging and removed superfluous entries.
- Fixed a bug where the version checker formatted version numbers using .NET conventions instead of semantic versioning.
- Updated publishing powershell script to avoid hanging after first build has been completed.
- Added
-df(--date-from) and-dt(--date-to) to define the photo date range. - Added support for using
lastwith both-dfand-dt, allowing resuming of previous runs. - Added
-xr(--exclude-recent) to skip photos that would appear in future albums (using-tthreshold). - Added
-p(--prepend) to prefix folder names; supports date formats and folder creation. - Added
-nc(--no-check) to disable GitHub version checking. - Files with no location data are counted to highlight potential issues.
- New header displays all key configuration information.
- Added
-u(--unique) to prevent existing album folders from being re-used when album names clash. - Improved logger performance by keeping files open instead of repeatedly opening/closing.
- Split utility functions into static classes for clearer structure.
- Resolved all .NET code analysis warnings to standardize style and tidy the codebase.
- Added documentation on how GroupMachine can be used in an automated workflow.
- 🏁 Declared as the first stable release.
- Enforced use of
-c(--copy),-m(--move), or-l(--link) to specify the copy mode. - Added
-l(--link) option for hard linking, falling back to soft links on failure. - Added
-p(--precise) to enable precise location names (e.g. stations, parks, landmarks, etc.) in album titles. - Added
-nr(--no-range) to show only the first date in folder names that span multiple days. - Added
-np(--no-part) to suppress part number suffixes. - Changed album title logic: dropped popularity sorting; locations now kept in time order with the least-used removed.
- Updated
-s(--simulate) to show the destination folder structure. - Refactored the "(part x)" numbering logic to ignore existing folders on disk, relying on date suffixes for uniqueness.
- Switched to SHA512 for identical file checks on 64-bit processors, 32-bit processors continue to use SHA256.
- Removed
-u(--unique) check due to poor performance and limited value. - Logger now includes OS details to assist with debugging.
- Re-ordered command-line arguments and grouped them into logical sections.
- Cleaned up various pieces of code (analyzer suggestions regarding naming, simplifications, and style)
- Initial release.
