This is a detailed list of changes per version.
Major version releases have posts summarizing bigger changes. See the posts tagged with “release notes”.
Stable, released versions are recommended. See the forum post for details about alpha, beta, and stable releases.
“Pre-release” builds (those that end with
beta) have not been thoroughly tested, and may not even launch.
betabuilds if you have recent backups.
If you update to an alpha or beta build and you want to downgrade to a prior version, know that older versions of PhotoStructure may not be able to open libraries created by newer versions of PhotoStructure. You will probably need to restore your library from a database backup.
To be released
We’re skipping a release of 2.0, as the changes in this release are substantial enough to return to “alpha” status: a lot is going on (including a substantial refactor of process scheduling that should address sync and database issues several users have reported, and better sync visibility (thanks to the new sync reports).
✨ Sync imports should be substantially faster, especially for larger libraries.
syncIntervalHourssetting was renamed to
syncNewIntervalHours. This setting ensures detection of new photos and videos happen daily (by default).
syncChangedIntervalHourssetting, which defaults to weekly, detects changes made to previously imported photos or videos.
syncs should take several orders of magnitude less disk I/O to complete, as they only have to
readdirevery directory, and not
✨ New sync reports are now emitted into
$library/.photostructure/sync-reports/. See the forum post for more details.
assetPathnameFormatsetting to customize automatic organization, which supports
ISOtokens. See this forum post for more details.
✨ New filter setting
respectFileExtensions: Normally PhotoStructure uses file extensions (like .JPEG or .MP4) to perform initial file filtering, which is much faster than having to open and examine the initial bytes of every file. If you have files that don’t use valid file extensions, you can set this to false, but know that file imports will be much slower.
✨ New filter setting:
maxVideoDurationSec, the maximum number of seconds that a video can be and still be imported. If this is set to 0 or unset (the default), no maximum duration limit will be applied.
--progresswhich shows real-time status of every concurrent file import. Note that this mode requires an ANSI-color terminal.
--recount-all-tagsswitches to manually run periodic maintenance tasks, including tag count updates, search index rebuilds, and database optimization, vacuuming, verification, and backup. These tasks are normally done by
✨/📦 Several additional lenses are now properly parsed, including Nikon VR and ZEISS Batis glass.
✨/🐛 Deduplication was improved: if the file extension matches, we respect the millisecond captured-at precision. If the file extension doesn’t match, the precision minimum is set to 1 second, as some dSLR encode RAW/JPEG pairs with slightly (< 1s) different captured-at times.
🐛 Restored the title bar on PhotoStructure for Desktops’s About page
🐛 Progress panels on the home page are now restored.
🐛 A new database migration was added to unset any invalid
Asset.deletedAtcolumn values, which could cause spurious assets showing as removed or deleted.
🐛 CSP directives had to be adjusted due to new Chrome
form-actionenforcement. See the
cspReportOnlysettings for details.
🐛 Zoom widgets aren’t hidden on touchscreen laptops anymore
🐛/📦 Cleaned up network error message “toasts” to be consistent.
🐛/📦 Work to reduce
syncnow uses threads rather than
sync-fileprocesses, and only
syncreads and writes to the library database. This results in more work done by the
syncprocess, but all CPU-intensive work (like image validation and preview generation) is offloaded to threads and a new child
workerprocess., and overall sync throughput should be higher, especially on high-core machines and larger libraries where write contention can wedge
🐛/📦 The “Skipping to first non-empty child tag…” tag only shows once for a specific tag redirect (thanks for the suggestion, Aidan!)
🐛/📦 Work to prevent db corruption:
- Database janitorial work is now only done by
maindoesn’t open db connections anymore
- Tag counting is wrapped with mutexes to prevent concurrency errors
- DB backups are only done by
- A codepath that could have resulted in a partial db replica copy now uses the work-in-progress file copier
- Database janitorial work is now only done by
🐛/📦 System profiling found that
readdirwas a hotspot, but the prior caching approach overwhelmed the garbage collector. The new caching readdir avoids filesystem caching if
readdir()returns quickly, resulting in a 10x speedup (!!)
sync-filehas been removed, as it is no longer used by
sync. Manual file and directory imports can be done via the
📦 Volume metadata is now cached on the filesystem (in both the library and the system config directory) to let PhotoStructure handle kernel hiccups where volume metadata goes missing (like with macOS after suspend, or Windows when it feels sad).
PS_MOUNTPOINTS_TTL_MSnow defaults to 0 on linux and macOS, and 15 minutes on Windows. This reduces no-op work for scanning mountpoints.
📦 Added a couple splash backgrounds because why not
syncGC load and memory consumption by more than 2x by refactoring several performance hotspots including caching, filesystem iteration, mutexes, and bounded concurrency.
📦 Docker container license validation is a bit more robust now. Apologies if you needed to re-authenticate: if you see this happen, please report it!
📦 Spawned, hung subprocesses (like
dfwhen eth0 drops) are proactively cleaned up
📦 Upgraded Docker container to Alpine 3.14/Node 16 LTS, Electron to v16.0.6, SQLite to 3.37, and the latest stable release for all third party code.