🐛 NoMedia directories weren’t respected. They are now only cached for a minute.
✨ Filesystem metadata (including UUID and NoMedia) is cleared when you pause and then resume the library import and sync processes (available via the system tray or system navigation menu).
✨ Service setup has a timeout to prevent zombie processes. This timeout can now be overridden with the
🐛 Added a per-volume timeout to gracefully handle mountpoints that are in an unhealthy state (which is fairly common on Windows).
🐛 Lens metadata matching “unknown” is now ignored.
🐛 NFS remote mountpoint metadata is now parsed correctly.
See our v0.8 version announcement
General updates #
✨ 🧭 Easier navigation
Click the new navigation button in the top-left part of the screen for access to
- Root tags, like “When,” “Camera,” “Keywords,” and “File Type”
- The About and Settings pages
- Links to control the sync process and shut down PhotoStructure
- The getting started and support pages on <PhotoStructure.com>
PhotoStructure for Servers users: this gets you to feature parity with Desktop users that have enjoyed these links in their system tray menu.
PhotoStructure for Desktop users on Linux and Windows: hit the
✨ 🚅💨 Faster sync
Library synchronization is much faster in this release.
In prior versions, PhotoStructure watched CPU utilization and only scheduled new work when your system was “idle enough.” In practice, this resulted in under-scheduling. On slower or busier systems, imports ran so slowly that they didn’t complete.
PhotoStructure now runs all child processes with a nice or BelowNormal priority level. This allows your operating system schedule work much more efficiently. Your system should remain responsive while simultaneously running synchronization tasks substantially faster, especially on multi-core systems.
processPriority settings allow for tuning this behavior.
Please email us ([email protected]) if you need to tweak the defaults for
✨ 💽💨 Faster writes
Prior versions serialized all database writes through the web process. This slowed down writes, and could make the UI less responsive during imports.
PhotoStructure now uses SQLite’s WAL mode to allow all processes to write directly to the database. This speeds up writes as well as allows the web UI to stay responsive, even during imports.
✨ 📹💨 Faster video transcodes
If you’re importing videos, and you’re using FFmpeg, we now import videos in parallel, which can substantially improve import speeds. VLC does not support parallel imports. See our video installation instructions for more details.
✨ 💪 More robust error handling in the UI
While browsing, if an asset is found that can’t be rendered due to an incomplete import, unmounted filesystem, or any other error, PhotoStructure will redirect you to the nearest valid asset as you browse while it runs a background repair job to try to fix the asset.
✨ 📨 More download options
The asset info panel now lets you download the original, large, medium, and
small resized versions of your images. These smaller versions are handy for emails or
texts, and are available on the first asset file’s
✨ 📹 Video support improvements
Video duration and FPS, if available, are now shown in the Asset Info panel. Duration and FPS will need to be backfilled for all videos in your library, and will happen automatically after you upgrade to this version.
Transcoding is (by far!) the most expensive operation that PhotoStructure has to
do during the import process, and has been refined in this new released. Previous
versions transcoded all videos not in
PhotoStructure now provides a
doNotTranscodeMimetypes, which adds three more commonly-supported video types
to avoid transcoding (as most browsers on most OSes can natively render them).
✨ 🔄 More robust rotation support
When you rotate your photos or videos with PhotoStructure, it now applies image content matching to ensure all asset file variants for the asset you rotated are in the same visual orientation.
Note that rotation is a non-destructive operation by writing a sidecar with the orientation next to your original. This behavior can be changed to edit in place with an advanced library setting.
✨ 🏷️ Hierarchical keyword support
PhotoStructure now extracts hierarchical keywords from
For non-hierarchical keyword sources, like pathnames, PhotoStructure splits by
commas and semicolons. For example,
car, blue, tree will be interpreted as
having the keywords
tree. This is configurable via the
PhotoStructure interprets keywords as “heirarchies”, or “paths”, when a keyword
includes one or more of the characters
⊃. Note that on
windows, there can be issues with filenames that have forward slashes, vertical
bars, or greater-than characters, so use the alternatives. This allows for tags
Flora ⊃ Fruit ⊃ Orange, or
Fauna > Oceanic > Pelican. This is configurable via the new
✨ 🌍🌏🌎 Better unicode support
Filenames and directories with non-latin characters should now be supported properly.
More frontend updates #
- ✨ 🔎 New zoom loupe control
- ✨ 💬 Chat widget on the settings and about pages, to get just-in-time help from our global team of friendly customer service agents (ok, it’s just me)
- ✨ The settings page now shows which suggested library paths are already PhotoStructure libraries.
- ✨ See your dupes: You can now view all Asset variants on both mobile and desktop views. Open the Asset info panel, and click on the pathname to view that file’s image. If the image is RAW, it will be converted to JPG so your browser can render it.
- ✨ Asset streams are centered around the current asset now.
- 🐛 On some mobile browsers, child tags and assets didn’t always lazy-load. A
Load More ...button now shows when needed.
- ✨ The Asset Streams panel on the bottom no longer overlays on the current photo.
Tagging improvements #
- 📦 The cache directory on linux is now
~/.cache/PhotoStructure. It had previously been in
/tmp. This can be changed via the
PS_CACHE_DIRenvironment variable, or the
- ✨ All taggers can be enabled or disabled via new library settings.
- ✨ New
Typetag, so you can view all videos, or all images of a specific type (see
- ✨ Date tagging can be “year”, “year/month”, or “year/month/day” (see
- ✨ Date tagging can be limited to only non-
- ✨ Lens tagging can use the full lens model (like “Canon EF-M 15-45mm f/3.5-6.3
IS STM”) or a just the lens information (“15-45mm f/3.5-6.3”) (see
Backend improvements #
- ✨ New “Rebuild library” option from the navigation menu.
- ✨ sidecar files use the full filename now, so image “pairs” (like JPG +
RAW) can have differing metadata values. For example, for
IMG_123.JPG.XMPwill be considered relevant sidecars for that file, and the enclosed metadata tags will be overlayed on the original image in order of newest-written-file-wins.
- 🐛 RAW image dimensions should be more accurate now.
- 🐛 Paths can now have non-latin characters.
- 🐛 Unicode keywords (both in ICMP/EXIF headers and in pathnames) are now supported.
- 🐛 Prior versions could persist settings that were set by command-line arguments or environment variables making it the new “default” value. If you had problems with the settings page not saving your values, this should fix that.
- 🐛 If an asset doesn’t have a metadata-encoded captured-at, we now infer the captured-at from the basename (if the file is named something like YYYYMMDD), and if no date is found in the basename, we examine the parent directory path.
- ✨ Improved make and model parsing for more cameras and smartphones.
- ✨ Image hashing has been sped up dramatically for images that have embedded thumbnails. Most original JPEG and RAW images have these thumbnails.
- ✨ Dominant color extraction is faster, more accurate, and dominant color comparisons now use more accurate color perception correlation.
- ✨ Idle background tasks, like
sync-fileare shut down automatically when they are idle to reduce system resource consumption.
PhotoStructure for Servers updates #
- 💔 The
photostructure.envscripts have been deleted. No beta users (to my knowledge) used them,
docker-composechanged their configuration format arbitrarily and had a questionable installation procedure, so it felt like it was just more moving pieces just to support upgrades. (If you want easy image upgrades, try https://www.portainer.io/!). The instructions for Docker have been rewritten and are much simpler to follow.
- 💔 The
PS_CONFIG_DIRis now directly written to. Prior versions would write to
$PS_CONFIG_DIR/PhotoStructure, which was surprising to several beta users. Please
mv $PS_CONFIG_DIR/PhotoStructure $PS_CONFIG_DIRbefore upgrading your image.
- ✨ Node.js version 12 and version 14 are now supported. 12 is now the minimum.
- ✨/📦 PhotoStructure for docker now uses Node.js v14 and Alpine. This dropped the image size from 1.5GB to 300M.
- 🐛/💔 Alpha, beta, and release builds post to different git branches and different docker tags now. Previously, PhotoStructure for Servers users pulled in the latest build, which might have been an alpha or beta pre-release.
- ✨ Instructions for building
libvips(required to support
.heic) were added to the README. Note that the docker image does not support
.heic/HEVC, due to licensing and patent restrictions. Tell Apple to switch to AV1!
- 📦 For PhotoStructure for Node users, if the version of PhotoStructure or
Node.js changes between runs,
- ✨ Added a link to the post-install tips in the “starting up” message
- ✨ Platform-default “back” and “forward” keystrokes now work for PhotoStructure for Desktops. On macOS, cmd-left and cmd-right to go back and forward, and on Windows and Ubuntu, alt-left and alt-right do the same.
- 🐛 The settings page doesn’t submit if the user hits the
- 🐛 Forced scrollbar to render on the info panel
- 🐛 Removed duplicate and bad library path suggestions in the welcome page
photostructure webnow accepts a
--helpfor all options.
- 🐛 library settings now correctly pass through non-default values.
- 🐛 Browsing via Firefox would sometimes raise
SIGPIPEs. These are handled gracefully now.
If you automatically upgraded to this version, you’ll need manually install v0.7.2, as this version never exits the splash screen. Apologies!
💔 Settings changes #
A number of settings were moved from the library settings file to the server settings file. This migration should happen automatically after you update your version of PhotoStructure (on all platforms). The affected settings are:
More information about changing advanced settings has been added to the support site.
Automatic upgrades on Windows and Linux #
Automatic upgrades may have broken for some users on Windows and Linux.
Please manually download and install the newest version. You don’t need to uninstall the previous version beforehand. Sorry for the inconvenience!
Scan path improvements #
- ✨ The custom scan paths field on the settings page now natively supports
multiple paths, and both os-specific delimiters (like
;) as well as
¦may be used (in case directories include the delimiter character).
PhotoStructure for Servers, take 2 #
If you’re a PhotoStructure for Docker user, please fetch new copies of the
start-docker.sh files. A bunch of new stuff is in
photostructure.envused to be a colon-separated value, but this is now a proper bash array. This supports paths that have colons in their names (like SMB mounts via GIO). Update your copy of
photostructure.envby following the instructions at https://support.photostructure.com/photostructure-for-docker/.
start-docker.shscript now automatically updates. If you already started using PhotoStructure for Docker, you’ll need to manually fetch a new copy by following the instructions at https://support.photostructure.com/photostructure-for-docker/.
PS_TMP_DIRscratch directory is now configurable, and should point to a fast scratch disk with several gigabytes free on the host machine. This is a new variable in
photostructure.env, and should be set properly to prevent container bloat and possible Docker crashes.
PS_*environment variables, set either in your
photostructure.envor set in the
envof the shell that is calling
start-docker.sh, are now passed through to Docker.
start-docker.shnow accepts an argument, which is passed through to
- To run the services in the background (and ctrl-c to stop), run
start-docker.sh start. This is the default.
- To run the services in the foreground (and ctrl-c to stop), run
- To just view the resulting
docker-compose.ymland not start services, run
- To stop services, run either
- To run the services in the background (and ctrl-c to stop), run
🐛 The settings page no longer allows the library path to be changed when running under docker. Instead, the library path should be changed in
start-docker.shshould be re-run.
Additional keyword extractors #
✨ Tags found in filenames or parent directories that follow
-- are now added
automatically. If you already have a library, run a full sync to pull in these
new tags. Here are a couple examples:
- All files found in the
/Users/bob/Pictures/2019-02-14/--event travel/directory would be tagged with
- The file
/home/karen/2018-11-23/P317812--ocean.jpgwould be tagged with
- Filename tags can be hierarchical by using the
keywordPathSeparatorssetting: for example,
/home/alice/Pictures/--event>wedding,/example.jpgwould be tagged with
🐛 Thumbnails for vertical videos are now correctly oriented and scaled.
🐛/✨ Symlink loops in filesystems are detected and skipped over (even on NAS!).
🐛 Main process error handling now respects the error rate setting, which defaults to 10 per minute. Prior versions would shut down PhotoStructure completely if any subprocess threw a fatal error.
🐛 The new “Starting sync…” and “Your library is currently empty” messages on the home page linked to the About window, but clicking that link didn’t work correctly. The link now correctly opens the about window in a separate page.
🐛 The “Restart sync” menu items were incorrectly
greyed (grayed?) outdisabled even after a library was set up. They are enabled after going through the welcome screen, now.
✨ PhotoStructure’s temp directory is cleaned every 15 minutes. Some beta testers had disk-full warnings with the prior settings of cleaning only every hour.
🐛/✨ Some Windows beta testers had configured their PowerShell to emit profiling information at startup, which prevented several systems from running properly. We now use both
-NoLogooptions which should help PowerShell spin up faster. We also validate PowerShell’s status as a health check on Windows, and include the PowerShell version in the About window. Note that PowerShell is used to copy files if native streaming methods fail, as well as test directories to see if they are hidden, as well as pulling filesystem and process table metadata.
✨ All dependencies were updated. Electron was updated for PhotoStructure for Desktop.
- 🐛 On web restart-on-error, prior library lock is released by main before restarting web. This resolves the “Library is already open” crash bug.
- 🐛 Sync restarts properly when settings are changed (including the library path)
- 🐛 Under certain circumstances, library paths could be removed from system settings, resulting in the welcome page being shown if PhotoStructure was restarted. This has been fixed.
- 🐛 Main process logs weren’t initialized correctly, preventing log persistence.
- 🐛 Downgraded Electron to 7.1.1 (may avoid new SIGSEGV from 7.1.2 on mac)
- 🐛 Extended filesystem timeout from 25 seconds to 35 seconds (external drives can be very slow to spin up!)
- ✨ Files that are found to be missing (and their mountpoint or parent directory still exists) are removed from the db, orphaned assets are subsequently removed from the library.
- ✨ Fixed grammar in progress bars
- ✨ Files that have been deleted are now removed from the db as well
- ✨ Assets that no longer have files associated to them are removed
Downloadsdirectories are now automatically ignored.
.photoslibrarysubdirectories are now ignored, except for
- 🐛 Window buttons on settings work within Electron
- 🐛 Electron updates were re-enabled for Linux AppImages
Please note that this version will require revisiting the files in your library to recompute metadata, compute image hashes, extract new lens and keyword tags, and re-encode preview images as progressive JPEGs. This will happen automatically after you upgrade PhotoStructure.
Thanks for your patience while PhotoStructure upgrades your library!
💔 Breaking changes
macOS is now notarized. Official support for macOS 10.11-10.13 (El Capitan through Sierra) has been dropped (although it may still work for you). Note that El Capitan hasn’t received a security update for more than a year. 64-bit binaries are now being built and tested on macOS Mojave.
maxPreviewResolutionlibrary setting with
previewResolutions. See the description of the setting for more details.
🚀 Performance improvements
ffmpeg, if installed, is now used for frame extraction and transcoding instead of VLC (in preparation for PhotoStructure for Servers). You may find ffmpeg faster than VLC. See https://support.photostructure.com/vlc-installation/ for more information.
- ✨ Preview images are progressively encoded now (see the
progressivelibrary setting, which defaults to
true). This takes a bit more time, and can be disabled in Settings.
- ✨ Captured-at times are stored in local-numeric-centisecond format, rather than an ISO string. This takes a fraction of space compared to the prior format.
- ✨ Home page queries for large libraries in previous versions took upwards of
500ms. The new
dbCacheSizeMbsystem setting now defaults to 128 MB, which should handle large (quarter-million asset) libraries. If you have a larger library, double this value, and be sure to email us if you see anything else not run quickly.
- ✨ The webserver was profiled and several hotspots were inlined. Average request latency on average desktop CPUs should now be 10 ms or less.
- ✨ CSS assets are all concatenated now.
- ✨ All static assets are now gzip’ed and transferred compressed.
- ✨ Image lazy loading was profiled and optimized.
- ✨ Icons in prior version used a webfont, which caused flashes of unstyled text. All icons were replaced with inline SVG components. At least on Firefox and Chrome, initial page load times are measurably faster.
- 📦 Both frontend and backend code is now compiled to es2015 (rather than es5), which reduced payloads by > 10%.
- ✨ Web requests are prioritized over RPC synchronization requests by the webserver, which allows the web UX to stay performant even during sync processes.
- ✨ Non-mutating API calls from the frontend are retried (should help smooth over webserver restarts or glitchy networks).
- ✨ The
logtailcommand now uses non-polling filesystem notifications (via
chokidar), and orders log lines chronologically.
💪 Robust de-duplication
- ✨ PhotoStructure’s photo and video merging algorithm was revisited in this version. The prior implementation used 2 hash comparisons, which failed to match after some lossy image and video transforms (like from cloud backups). The new implementation uses 10 different hash values, including several hashes based on actual image contents (using rotation-invariant Lab* values, if you’re interested). This (and lens and keyword tagging and better preview image generation and better video transcoding) is why this version requires prior libraries to be upgraded.
🎥 Lens tagging
- ✨ If a photo or video has lens metadata, that will be added as a tag, and is navigable via the new root tag, “Lens”.
🔄 Photo and video rotation
- ✨ Added support for photo and video rotation. Click on an asset, and hit
r(or the rotate icon in the header) to rotate counter-clockwise 90 degrees. Hit
ror click the rotation icon multiple times in a row to rotate more than 90 degrees. Saving happens in the background, and is non-destructive.
- 📦 The
writeMetadataToSidecarslibrary setting controls how the rotation metadata is persisted. The default is to save a new sidecar, or update an existing sidecar, with the new orientation.
- 📦 Asset thumbnails and preview images are now fetched with timestamp params. This allows the UI to stay in sync with the library database, and still cache images when appropriate. Depending on the speed of your browser, you may see a flash of an incorrectly-rotated image immediately after rotating: we know, and we’ll try to fix it in the next release.
🔍 Zoom on desktop
- ✨ When viewing an image full-screen, you can now type ‘z’, or single-click in the middle of the photo, click the new zoom icon in the upper right corner, or mousewheel-up to zoom into the image. Moving the mouse pans the position of the zoomed-in image. Mousewheel controls the scale of zoom. Typing ‘z’, the ‘esc’ key, clicking in the middle of the screen, or clicking the zoom icon will return to normal mode.
🔍 Zoom on mobile
- ✨ To zoom into an image or video on a tablet or phone, just pinch out on the image. As you zoom in, higher resolution images will be loaded in-place of the current image to ensure the highest quality pixel peeping experience.
📱 Responsive UI
- ✨ The welcome/settings page is now responsive and usable from an iPhone SE to a 4k display.
- ✨ The header slides away on scroll-down (and sliding back on scroll-up), providing more screen real-estate on mobile devices.
- 🐛 The “fullscreen” button was removed. There were a couple scrolling bugs that don’t seem to have nice workarounds, and the new hiding header makes this less pressing a feature on mobile.
✨ General improvements
- ✨ PhotoStructure for Desktop now has an application menu on macOS. YAY.
- ✨ Standard keystrokes for display zoom, copy, paste, and devtools now work.
- 🐛 Some people reported crashes on macOS after long (> 24 hour) sync runs. PhotoStructure now automatically restarts the sync process every 6 hours or if memory consumption exceeds 1GB, which should spackle over this issue.
- ✨ PhotoStructure now uses reverse-chronological order consistently. Photo streams had previously been chronological order, and tags were reverse-chron. Fixes #42.
- ✨ Image hashes are now used to coalesce similar assets that have had their metadata stripped.
- ✨ Excluding images due to missing Make or Model is now a Setting
- ✨ The
infotool now reports explaining why 2 files would or wouldn’t belong with the same asset
- 🐛/✨ Google Takeouts sometimes provides JSON sidecars with GPS and other metadata. PhotoStructure now knows how to read this sidecar metadata.
- 🐛/✨ Timeliner and other cloud storage solutions may provide edited versions of your images that are stripped of GPS tags. Prior ExifUID versions assumed GPS wouldn’t be deleted.
- 📦 Asset counts for tags are formatted nicely for the user’s locale (like
“1,523 assets” for
- 📦 The Asset Info panel had links for downloading and for showing the asset file in the enclosing folder, but most users didn’t know that those links existed. There’s now a pulldown menu by each asset file path with those options.
showItemInFoldernow runs directly from the webserver.
showItemInFolderon Ubuntu could fail if there were network filesystems in a bad state. We ignore those errors now, so the Nautilus window can stay shown.
- 🐛 Network disconnections (due to system sleep or suspend) should no longer raise error dialogs.
- 📦 Added
**/tmp/**to the directory exclusion filters. Previously only
/var/tmproot directories had been excluded.
- 📦 Ignore
- 📦 All third-party dependencies were updated, which pulled in several security patches, including SQLite 3.29.0.
- ✨ Database backups are automatically taken before every migration set is applied (to allow for recovery via customer support)
✨ Customer support
- ✨ The
aboutwindow now supports copying system metadata to the clipboard, or emailing to support via a
Send recent logsfrom the system tray sends all currently-running process logs to Sentry.
- 📦 Directory iteration uses a new, much smaller (non-cached) class to track filesystem metadata. This should help reduce memory consumption while scanning large filesystems.
- 📦 Ignore
- 📦 Support parsing folder names as dates that use
,field separators (like
- 📦 Launching PhotoStructure automatically checks for updates now. This can be
disabled with the
- 🐛 Random gallery contents no longer change every minute
- 🐛 Setting your
Cis supported (and considered a synonym for
Please note that this version will require a sync to revisit the files in your library. This will happen automatically.
✨ Synchronization improvements
✨ Sync runs periodically now. After
synccompletes importing all available volumes, it waits for
syncIntervalHours(configurable as a library setting), and restarts the sync process. This defaults to 24 hours, to balance picking up new files automatically and trying to avoid unnecessary wear and tear on your storage media.
✨ Files are processed concurrently now, depending on the number of CPUs your computer has. This may dramatically speed up sync.
✨ Syncs of previously-imported volumes should complete faster now, because files are only checked for changes every
fileSyncIntervalHours(configurable as a library setting). This defaults to every week, again, to try to balance PhotoStructure being in sync with your storage media, and wear and tear on your disks.
✨ NAS support for library storage: Library lockfiles prevents NAS-stored libraries from being corrupted by multiple simultaneous writers (or multiple instances of PhotoStructure on one machine from fighting). If the lockfile is lost (if, for example, you unplug the NAS or the external drive that your library is on), PhotoStructure will shuts down automatically.
✨ Multiple file asset support: When there are multiple files representing a given asset, and the most-recent file is not available, next-most-recent candidates are now considered for preview generation and tagging purposes.
✨ Keyword support: Assets are tagged with keywords. Keywords are found in the
KeywordIPTC tag and
XPKeywordEXIF tag. Sidecars keywords are included as well.
✨ Support for SD cards and smartphones: In previous versions of PhotoStructure, local volumes that weren’t available to
df, or that didn’t have UUIDs could cause… issues. OK, fine, they were 🐛. Unfortunately, smartphones, SD cards, and several other types of media don’t reliably have UUIDs, so if PhotoStructure failed to launch (especially on Windows), this version may fix that for you.
ExifUIDversion was updated to support more original/edited pairs (as many photo editing apps will delete timezone offset metadata). Whenever a new ExifUID version is released, your next sync will need to visit all your assets again. This should complete much faster than an initial sync.
scanPathsare scanned first, followed by
libraryPath, followed by mounted volumes (if
logDiris now a system setting (prep for
PhotoStructure for Servers)
📦 on Windows,
PowerShellis used rather than
attribto detect if a file is hidden. This turns out to be up to 10x faster, and as we do this for every folder, it can speed syncs up substantially.
📦 Validation of raw images takes between 3 and 30 seconds per file. The library setting
validateRawImagesallows this to be skipped if you don’t care to check raw images during library import.
sqliteon macOS as a 64-bit binary, which removes the “PhotoStructure is not optimized for your Mac and needs to be updated” dialog. See #154.
webencounters a show-stopper issue (like when the library hard drive gets unmounted unexpectedly), it can now tell the
mainprocess to shut PhotoStructure down (rather than just restarting endlessly).
🐛 On large tag gallery pages, lazy loading would sometimes load batches out of order or more than once. Now, they don’t duplicate themselves! And they maintain order! That was an ugly bug, sorry about that. See #121.
✨ Open item in folder: When browsing on the computer that is running PhotoStructure, you may now click the photo or video icon by a pathname in the asset info view, and the parent directory will be opened in the file explorer, with the current file selected. This lets you subsequently edit the file in other external apps.
✨ WVGA was added as a smaller
maxPreviewResolutionfor users only serving low resolution browsers.
🐛 Settings were rewritten unnecessarily due to a version parsing bug.
🐛 If the library directory goes away while PhotoStructure is running (for example, when the volume is unmounted or the NAS is shut down), the main process will shut down. Before this version, PhotoStructure’s
mainprocess would try to restart the web process indefinitely.
🐛 Error reporting throttles across processes and services now. Note that error reporting can be disabled in the system settings.
✨ All asset file originals are now directly downloadable via the asset info panel
✨ Metadata sidecar support:
.MIEfile types are supported
- If a sidecar is found, the metadata in the sidecar overlays the metadata in the source file.
- Sidecars are copied to your library along with your original files (if automatic library organization is enabled)
✨ During installation, you can now choose “scan everything”, “scan my pictures directory”, or “scan this custom folder.”
📦 Updates are only checked for once a day (rather than on every launch, and N minutes afterwards).
📦 Upgraded to Electron 5/node 12, which added
Direntsupport. Large directories will be scanned much faster thanks to this.
🐛 Changing settings now gracefully restarts sync processes.
✨ Some smartphone RAW images have slightly different exposure settings than their JPG counterpart. PhotoStructure now handles these “features” properly, and will merge the image pairs.
🐛 Only support VLC
v2.xdoesn’t support our transcoding options, and
v4.0.0-devhas bugs with window handling on Windows.
🐛 PowerShell parsing is now more robust. Some Windows beta testers had failed health checks due to missing filesystem volumes.
🐛 Large image directories with missing metadata confused the tag inference engine. Tag inference now only looks at the nearest N siblings.
🐛 Some people found that update notification dialogs could be hidden on Windows. Once an update has been downloaded and is ready to apply, the system tray now also provides a way to update and restart.
📦 Several more “ignorable” directory patterns were added, including “smart previews.”
psnetURIs have case-normalized hostnames
📦 DB SHAs were reduced from 224 to 192 bits to reduce index memory consumption
- 🐛 Force VLC to ignore existing system configuration to prevent terminal flashes. See #126.
🥂 Welcome, second wave of beta users! ✨
🐛 “Only examine my Pictures folder” works (again). See #118.
📦 All subdirectories in an iPhoto library are skipped except for
Masters. See #119.
🐛 Stream UX avoids video controls. See #57.
Released 2019-04-15 11:24:47
- ✨ Page titles (only visible on browsers) now reflect the page content
- ✨ added another timezone/date parsing heuristic for videos. See #29
- ✨ library asset subdirectory timestamp is now configurable via
- ✨ PID management now supports indefinitely-old processes (which was needed for web and sync). As long as the parent process id is alive, the process is allowed to continue.
- ✨ Common music directories (which may contain album art and music videos) are now automatically excluded from libraries.
- ✨ Processes watch their memory consumption now, and restart automatically if
they exceed the
maxMemoryMbsetting, which defaults to 1 GB. See #115.
- ✨ Service shutdown hung for long-lived services while it waited for all logfiles to be possibly compressed. This is now done during file rotation.
- ✨ Tag galleries support browsers that don’t comply with the Intersection API, like Safari on older iOS version, by adding a “Load more…” button.
- 📦 Add support for make/model extraction from new flagship smartphones
- 📦 support spawning
ceilsync-file processes, which should allow for more CPU saturation during sync.
Released 2019-03-26 10am
- 🐛 CPU scheduling should match maxCpuPercent closer now (the prior formula underscheduled work)
- ✨ Flaky filesystems (like NAS over noisy LAN or CDROMs) are retried and then
children are skipped if they can’t be scanned. See the new
- 📦 Settings I/O was updated with more help in the intro.
- 🐛 Fix metadata date parsing error from Luxon
- ✨ CPU utilization had been by “max CPUs,” but that proved difficult to
explain. The new
maxCpuPercentsetting is a “CPU utilization goal” that PhotoStructure will attempt to not exceed.
- 📦 Rebuilt and hand-validated new CpuUsage.
- 📦 All dependencies are scanned for vulnerabilities after updates
v0.2.12-alpha, v0.2.14 #
- 🐛 Error handling doesn’t crash subprocesses
- 📦 Heap allocation errors with Electron 4. Back to Electron 3.
- 🐛 Fix Ubuntu upgrade results in 2 tray icons
- 🐛 Default log level is now
error, so logfiles don’t bother people: #74
- 🐛 All files use ExpressJS’s
sendFilenow, which sets etags correctly and handles chunked encoding. This should fix #36
- 📦 New sharp and Electron 4. We’ll see how that goes.
- ✨ Mac’s TextEdit defaults to saving text files with smartquotes, which
settings.tomlfiles. PhotoStructure straightens out quotes for you.
- 🐛 Volumes weren’t being marked as “complete” properly.
maxProcsignored values greater than 1.
- ✨ External tasks on Windows were migrated from using
wmicto using long-lived, batch-cluster-managed
- ✨ Directory scanning doesn’t stat every file anymore. (It had been done before to update the progress bar, but it made scanning expensive, especially to NASes). See #80.
- ✨ all processes spawned by PhotoStructure are tracked by pidfiles now, which lets cleanup happen both while PhotoStructure is running, as well as on launch, to clean up from prior runs.
- 🐛 rebuilt file import timeout calculations, which incorrectly prevented some larger raw image and video files from being imported.
- ✨ added PullProgressObserver to video and raw image transcode ops
- ✨ long operations (like file copies, SHA, and video transcoding) now show up in progress reports.
- ✨ only 1 video transcode will happen concurrently (as ffmpeg and vlc are already multithreaded). If other CPUs are available, they will import pending images.
setting. Video streaming in the UI now autoplays instantly.
- ✨ added support for a number of new image and video file types.
- ✨ work planner supports prioritized on-idle workers, which means file scanning can happen while asset importing happens, simultaneously.
- 🐛 “stuck” detection was problematic. Removed for now.
- ✨ files and folders can be dragged onto the PhotoStructure icon, or on Mac, onto the menu bar icon, and the contents will be imported.
💔 Users must manually install VLC. See https://support.photostructure.com/vlc-installation/
🐛 On launch, if the prior library is not available, ask the user what to do (quit, reset, try again). Previously launching would just quietly exit, which was less than helpful.
🐛 Support library settings POST after library path is set
✨ Errors from child processes are now propagated to the desktop app for display to the user.
✨ New system setting to allow users to opt out of error reporting (see
✨ New system settings control sync behavior (see
✨ New library settings to control file validation (see
validateVideos). Validation slows synchronization, and video validation is especially expensive. Given that videos can still play even with bitrot, the default for videos is to do minimal validation (intact metadata and the ability to extract a frame from the beginning of the video).
✨ New library settings to control which images and videos are eligible for library import (see
maxFileSizeBytes). For min dimension settings, Images and videos must have both dimensions be greater than or equal to these values. They default to 480 for images and 240 for videos.
✨ New library settings to control what previews are created (see
✨ New system settings to manage when PhotoStructure checks for upgrades (see
updateCheckMinutes, which work in concert with
✨ New system settings to manage how many CPUs PhotoStructure is allowed to use (see
✨ PhotoStructure work scheduling was restructured, which should result in faster Asset processing, and should fix “stuck” synchronization.
Released 2019-01-26 20:30
- 🐛 Library settings are properly read on re-launch
- 🐛 Fixed empty terminal shell spawning on windows
Released 2019-01-26 14:00
🐛 Reverted back to Electron 3, as the system tray under linux was broken in Electron 4.
🐛 Fixed nslookup error in remote mountpoint name resolutions
Released 2019-01-26 12:02
✨ Support for persisted system and library settings. Any external edits must be done while PhotoStructure is shut down.
System settings paths:
Library settings path:
Settings are saved in TOML, which both supports comments, and was designed for humans to both read and write.
PhotoStructure’s updater now supports release channels (
beta) via your system settings.
A number of other system settings are exposed as well, including resolution of #53.
Released 2019-01-15 21:01
- Fixed ABI issue caused by Electron 4
Released 2019-01-15 19:00
- Rewrote volume detection to be async on Mac and Linux. This should help prevent volumes “disappearing” and causing PhotoStructure to pause synchronization of large external volumes.
- Updated to Electron 4.0
- Linux volumes include GVFS mounts, like SMB and AFS mounts via the Gnome Files app
- Breadcrumbs are included in Asset views
- Hostname resolution supports more routers now
- Reworked mountpoint scanning to use
findmnt --poll(whatever is available), which gives us real-time mountpoint updates on Mac and Linux. This should resolve the error where mountpoints can temporarily disappear (according to
df), which cancels synchronization on larger volumes.
- First external beta test on Mac OS 10.13
- Concurrent transcoding is serialized
dfinformation is shared across PhotoStructure processes, which should lower system resource load
- Phone selfies were being rejected by the image resolution filter. That criteria has been dropped to allow these ~1MP images.
- Progress per volume is isolated by separate message queues now.
- Sync process can be paused and resumed via the tray/menu bar icon
- videos are validated by ffmpeg before importing
- Automatic update support for Mac and Windows
- Automatic on-the-fly video transcoding for non-mp4 videos
- Additional timezone offset heuristics are applied when missing from metadata to prevent reverting to UTC
- Advisory locking surrounding asset importing ensures consistent behavior on multi-cpu hosts
- Special characters in metadata fields are now supported
v0.0.46 - 50 #
- Full-screen assets include the original image as a srcset value. This improves rendering quality for smaller assets, and allows for zooming to 1:1 with the original.
- UHD 5K is now the largest resized preview value.
- Preview sizes are skipped if they are not > 2x smaller than other sizes. This allows for more image sizes to capture different aspect ratio assets, but doesn’t increase the size of the PhotoStructure previews library.
- PhotoStructure library assets are always scanned first on startup.
- All thumbnails are lazy-loaded, which reduces load on the webserver when libraries are large.
- Large lists of thumbnails are loaded lazily now, as they scroll into view.
- Large file imports deliver async progress to the sync service (to answer the question “why is it stuck”? “Oh, it’s a 5GB GoPro video, that I will most definitely watch all of and warrant it taking up bajujibites of my HD.” )
- Vertical videos are rotated as expected
- Movies from old digital cameras are included by PhotoStructure libraries now
- Video streams now work across platforms and browsers (when the OS has the correct codec)
- Thumbnails for any given asset is generated from a single asset file version.
- Internal RPC was rebuilt to support retries and error backpropogation
- Added support for fullscreen video streaming
- Added web health check
- Fixed sometimes-missing video thumbnails
v0.0.41 - 44 #
- Dropped max filesize filter from 3gb to 1gb, given the asset processor timeout is currently static, and large videos were making the asset importer hang
- Fixed copy-file-to-library on mac, which was locking (?) the files. We force-unlock the .wip immediately after copying now (which should be fine, given that it’s our copy of the file, so we aren’t arbitrarily unlocking files).
pslibURI protocols now handle root directories
v0.0.20 - 40 #
- Work on auto-updating
- Auto-update available through the Tray
- Only half the system CPUs will be spawned for
sync-fileto reduce memory footprint
- Directory statistics are stored by URI, which is stable regardless of the mountpoint or drive letter, rather than path.
- Internal volume information is gathered with more robust stdout streaming, and retries and timeouts were added, all of which should make it more reliable.
- Upgrade to Electron 3.0 (comes with new node 10.2)
- ExifTool warnings don’t reject tag promises anymore
- CapturedAt interpolation now takes into account the fellow siblings that also don’t have metadata in order to maintain existing sort order