Version 1.0.0-alpha.7 is out!

Edit: there’s a newer build now:

Changes in this build


Search improvements

  • :sparkles:/:bug:/:package: Search had been query-as-you-type. Now searches are only executed when the user hits return, clicks the magnifying glass, or taps the “search” key on their mobile keyboard.

  • :sparkles: Search results are now paged via lazy-loaded infinite scroll

  • :sparkles: The search button on non-root tags now pre-fills the search icon with the current tag to support paging through all inherited assets and as a start to adding more search criteria.

  • :sparkles: You can now clear prior searches (there’s an X to the right of the heading)

  • :bug: Fixed the prior search list

  • :bug: Query parameters from search no longer transfer when returning to the home page

  • :package: Reworked the search examples

  • :package: Search queries with unmatched quotes, AND, or OR are no longer considered valid.

  • :package: The search button isn’t hidden on mobile devices anymore.

Other improvements

  • :sparkles: Keyword extraction is now more configurable

  • :bug: now execs node, which lets docker shutdown propagate to PhotoStructure, and let it shut down gracefully (and avoid “Library is already opened by” errors)

  • :package: New openLockStaleMinutes setting, which defaults to 1 hour: If an opened-by lockfile has not been touched in this number of minutes, the file is considered stale and invalid. Libraries will refresh their lockfile more frequently than this period. The disk that hosts your library won't be able to idle if this is set too short

  • :package: yarn.lock is now copied into the docker container to ensure consistent contents

  • :bug: -alpha.1 changed some paths from PhotoStructure to photostructure. -alpha.2 reverted several of these changes, but logfiles were still being written to photostructure. -alpha.7 fixes this.

  • :package: Upgraded to Electron v12.0.4 and ExifTool v12.24

Installation instructions

See this for info about subscriptions (including a thank-you discount for alpha testers):


From reddit:

When I follow the upgrade instructions I get an error in the logs that a file is missing. If I switch back to main image it works fine though. Out of curiosity I also check the beta image and that works too.

The :beta image is actually still on v0.9.1, as I’ve only made alpha releases of v1.0.0 so far. I’ll muster some courage and promote the next build as a beta. :muscle:

I’m using the following volume for config. I’m working out of /opt/docker/photostructure and have manually created /opt/docker/photostructure/config.

  • type: bind
    source: “./config”
    target: /ps/config

Error: ENOENT: no such file or directory, open ‘/ps/config/PhotoStructure/settings.toml’

{“fatal”:true,“exit”:true,“status”:14,“pid”:21,“ppid”:14,“error”:“main setup failed: Error: code ENOENT: ENOENT: no such file or directory, open '/ps/config/PhotoStructure/settings.toml’¹”}

I wonder if docker-compose is resolving your relative source: path correctly? I’ve always used full path names.

It might be enlightening to enable debug logs, if you add this

      # PhotoStructure has _tons_ of settings. See
      # <>

      - PS_LOG_LEVEL=info
      - PS_LOG_STDOUT=true
      # - UID=1000 # < this is the new v1.0.0 way to run as a non-root user
      # - GID=1000

and then run docker-compose up (omit the -detach) to get logging on your terminal.

Continuing conversation from reddit.
So i switched to absolute file paths for volumes and am getting the same issue. The error is correct the file does not exist.

The actual docker location for the file is /ps/config/settings.toml and the absolute path is /opt/docker/photostructure/config/settings.toml

Console output:

photostructure_1 | start: 1619892719519,
photostructure_1 | argv: [ ‘/usr/local/bin/node’, ‘/ps/app/bin/main.js’ ],
photostructure_1 | arch: ‘x64’,
photostructure_1 | platform: ‘linux’,
photostructure_1 | isDocker: true,
photostructure_1 | isPacked: true,
photostructure_1 | isElectron: false,
photostructure_1 | versions:
photostructure_1 | { node: ‘14.16.1’,
photostructure_1 | v8: ‘8.4.371.19-node.18’,
photostructure_1 | uv: ‘1.40.0’,
photostructure_1 | zlib: ‘1.2.11’,
photostructure_1 | brotli: ‘1.0.9’,
photostructure_1 | ares: ‘1.16.1’,
photostructure_1 | modules: ‘83’,
photostructure_1 | nghttp2: ‘1.41.0’,
photostructure_1 | napi: ‘7’,
photostructure_1 | llhttp: ‘2.1.3’,
photostructure_1 | openssl: ‘1.1.1k’,
photostructure_1 | cldr: ‘37.0’,
photostructure_1 | icu: ‘67.1’,
photostructure_1 | tz: ‘2020a’,
photostructure_1 | unicode: ‘13.0’ },
photostructure_1 | settings: { logLevel: ‘info’, httpPort: 1787, rpcPort: 1807, libraryPath: ‘/ps /library’ },
photostructure_1 | NODE_ENV: ‘production’,
photostructure_1 | PS_LOG_COLOR: ‘true’,
photostructure_1 | PS_LOG_LEVEL: ‘info’,
photostructure_1 | PS_LOG_STDOUT: ‘true’ }
photostructure_1 | 2021-05-01T18:11:59.860Z main-21 warn BaseFile(/ps/config/PhotoStructure/settin gs.toml) trap: readFile() failed: Error: ENOENT: no such file or directory, open ‘/ps/config/PhotoSt ructure/settings.toml’
photostructure_1 | 2021-05-01T18:11:59.870Z main-21 warn BaseFile(/ps/config/PhotoStructure) trap: mkdirp() failed: Error: EACCES: permission denied, mkdir ‘/ps/config/PhotoStructure’
photostructure_1 | Error: code ENOENT: ENOENT: no such file or directory, open ‘/ps/config/PhotoStr ucture/settings.toml’
photostructure_1 | Error: ENOENT: no such file or directory, open ‘/ps/config/PhotoStructure/settin gs.toml’
photostructure_1 | 2021-05-01T18:11:59.872Z main-21 warn Service(main) exit() { status: 14,
photostructure_1 | reason:
photostructure_1 | “main setup failed: Error: code ENOENT: ENOENT: no such file or directory, op en '/ps/config/PhotoStructure/settings.toml’¹”,
photostructure_1 | waitForJobs: false,
photostructure_1 | ending: false }
photostructure_1 | {“fatal”:true,“exit”:true,“status”:14,“pid”:21,“ppid”:14,“error”:“main setup fai led: Error: code ENOENT: ENOENT: no such file or directory, open '/ps/config/PhotoStructure/settings .toml’¹”}
photostructure_1 | 2021-05-01T18:11:59.874Z main-21 info Endable endEndables() { isTest: false, is SingleSpecTests: false }
photostructure_1 | 2021-05-01T18:11:59.875Z main-21 info PromiseTimer timings: {}
photostructure_1 | 2021-05-01T18:11:59.875Z main-21 warn PromiseTimer error counts: [ [ ‘fs.readFi le’, 2 ], [ ‘fs.mkdirp’, 1 ] ]
photostructure_1 | 2021-05-01T18:11:59.877Z main-21 info Error onError(): (ignorable): Error: code ENOENT: ENOENT: no such file or directory, open ‘/ps/config/PhotoStructure/settings.toml’
photostructure_1 | Error: ENOENT: no such file or directory, open ‘/ps/config/PhotoStructure/settin gs.toml’ { message: ‘unhandledRejection’ }
photostructure_1 | 2021-05-01T18:12:00.629Z main-21 error Caught error from file write stream Error : EACCES: permission denied, open ‘/ps/logs/2021-05-01/main-21-001.log’
photostructure_1 | 2021-05-01T18:12:01.434Z main-21 warn Deferred(close) observeQuietly.reject() { errno: -2,
photostructure_1 | code: ‘ENOENT’,
photostructure_1 | syscall: ‘open’,
photostructure_1 | path: ‘/ps/logs/2021-05-01/main-21-001.log’,
photostructure_1 | stack:
photostructure_1 | [ “Error: ENOENT: no such file or directory, open ‘/ps/logs/2021-05-01/main-2 1-001.log’” ] }
photostructure_1 | 2021-05-01T18:12:01.434Z main-21 warn Endable LogWriter(/ps/logs).end() rejecte d: Error: ENOENT: no such file or directory, open ‘/ps/logs/2021-05-01/main-21-001.log’
photostructure_photostructure_1 exited with code 14

Can you check the permissions on that directory in your docker host? I suspect either /ps/config/PhotoStructure is 755, or /ps/config/PhotoStructure/settings.toml is 644, and that both are owned by root.

If you were using v0.9.1, PhotoStructure was probably running as root.

I added linuxserver-style PUID and PGID support to the PhotoStructure docker image a couple alpha builds ago. If you’ve got UID or PUID set, the v1.0.0 docker image now tries to run as that user id, which may not have read or execute permission for that bind mount path.

You can set UID=0 and GID=0 in your environment: section to disable this, if you don’t want to hassle with chowning stuff on your host machine.

In the meantime, I’ll look into improving this error message!

I just upgraded from 0.9.1 to 1.0.0 Beta 2 by running the install file. Immediately after the upgrade the PhotoStructure splash screen is displayed with the cloud animation. This splash screen remained for ~10 minutes. I was about to terminate the app when it progressed to the main app window and indicated it was re-indexing my 65,600 assets & that it would take ~8 hours to do so. There should be some indication on the splash screen of what it is doing. A few seconds longer & I would have terminated the app.

Thanks for the suggestion: I’ll fix this in the next release.