Compare commits

...

1195 Commits

Author SHA1 Message Date
Michael Mayer
bd3de03c79 Merge branch 'develop' into feature/batch-edit 2025-09-21 13:53:34 +02:00
Michael Mayer
6901225a2b CLI: Add "--json" as an additional output format to show commands #5220
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-21 13:46:59 +02:00
Michael Mayer
ecdec6b408 CLI: Update Download CLI developer docs and testing hints #5219
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-20 14:59:48 +02:00
Michael Mayer
f7fe6b569a CLI: Improve "photoprism dl" post-processing and default settings #5219
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-20 14:36:41 +02:00
Michael Mayer
5e84da55e5 CLI: Improve "photoprism dl" to download multiple URLs with auth #5219
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-20 13:14:58 +02:00
Michael Mayer
d447adc59c Index: Don't fail if thumbs for a sidecar file cannot be created
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-19 07:53:06 +02:00
Michael Mayer
41da164469 Backend: Add fix for concurrent cleanups to convert_sidecar_json.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-19 07:06:33 +02:00
Michael Mayer
29ca2c1331 CLI: Improve "photoprism cluster" sub-commands #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-19 06:52:45 +02:00
Michael Mayer
2fe48605a2 Auth: Update cluster/instance/bootstrap.go and registry/client.go #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-19 05:21:17 +02:00
Michael Mayer
75af48c0c0 API: Refactor the node registry to use the entity.Client model #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-19 04:15:53 +02:00
Michael Mayer
13e1c751d4 API: Update entity.Client and cluster config options #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-19 01:13:32 +02:00
Michael Mayer
f6f4b85e66 Specs: Update AGENTS.md and CODEMAP.md to reflect code changes
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-19 01:10:23 +02:00
Michael Mayer
eee1b3fbfc Import: Fix duplicates handling in internal/photoprism/import_worker.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 18:05:13 +02:00
Michael Mayer
ce2d793a48 API: Update internal/api/cluster_nodes_register_test.go #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 17:57:58 +02:00
Michael Mayer
83a12fb58b API: Clean up nodes dir in internal/api/api_test.go #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 17:51:23 +02:00
Michael Mayer
1315df8c1f Auth: Reformat internal/auth/acl/roles_test.go #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 17:39:50 +02:00
Michael Mayer
c9e6b7c22b Auth: Add tests to internal/auth/acl/roles_test.go #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 17:35:11 +02:00
Michael Mayer
518079450e Docs: Update quick start tips
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 17:32:26 +02:00
Michael Mayer
aa5368e00a Docs: Update quick start tips
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 17:29:19 +02:00
Michael Mayer
1c3009d9b5 Auth: Add alias for RoleNone and improve unit tests coverage #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 17:10:39 +02:00
Michael Mayer
2818a9e6a8 Auth: Add "instance" and "service" roles, fix entity/auth_client.go #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 15:23:06 +02:00
Michael Mayer
464a64339f Tests: Fix internal/photoprism/import_worker_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 15:07:14 +02:00
Michael Mayer
b40e4c5597 CLI: Improve usage descriptions of client/user management commands #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 14:30:19 +02:00
Michael Mayer
887a39e7d9 Auth: Add "node" and "portal" roles, refactor session entity #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 13:33:18 +02:00
Ömer Duran
64182a9b8a Frontend: Refactor batch test mocks 2025-09-18 12:51:54 +03:00
Ömer Duran
1736701fe5 Merge branch 'feature/batch-edit' of https://github.com/photoprism/photoprism into feature/batch-edit 2025-09-18 12:20:08 +03:00
Ömer Duran
1003f649e2 Frontend: Clean up unused component mocks in batch tests #271 2025-09-18 12:19:12 +03:00
Michael Mayer
2a116cffb3 API: Remove auth check from cluster health endpoint #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 10:28:02 +02:00
Michael Mayer
8fc0227b73 Merge branch 'develop' into feature/batch-edit 2025-09-18 09:53:40 +02:00
Michael Mayer
1f10dcaf85 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 09:52:43 +02:00
Michael Mayer
202d513019 Scripts: Update dist/install-nodejs.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 09:52:02 +02:00
Michael Mayer
e221a8ee73 Frontend: Update npm install targets in Makefile and package.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 09:51:11 +02:00
Michael Mayer
fb27969e30 Dev: Add "git-pull" target to Makefile (pulls all changes)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 09:05:57 +02:00
Michael Mayer
4a7c355d28 Specs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-18 08:45:30 +02:00
Michael Mayer
c7380111b2 Specs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-17 14:49:20 +02:00
Ömer Duran
7664ee7556 Frontend: Remove original states tracking from chip-selector and update batch component logic 2025-09-17 15:48:43 +03:00
Michael Mayer
40a4dbfe26 API: Improve cluster theme endpoint and tests #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-17 14:28:30 +02:00
Michael Mayer
1ab4c32ee8 Specs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-17 14:25:51 +02:00
Michael Mayer
19b09ebf0b Specs: Update AGENTS.md and CODEMAP.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-17 12:01:52 +02:00
Michael Mayer
00088d66cd Specs: Update AGENTS.md and CODEMAP.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-17 11:56:36 +02:00
Ömer Duran
1342b1d1a2 Frontend: Improve code readability in chip-selector and batch component #271 2025-09-17 11:42:48 +03:00
Michael Mayer
e04df34453 Specs: Add CODEMAP.md and frontend/CODEMAP.md files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-17 00:50:23 +02:00
Michael Mayer
e1d031bea7 Config: Add cluster instance bootstrap and registration hook #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-16 23:30:23 +02:00
Michael Mayer
ec8ea96f31 Specs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-16 23:17:56 +02:00
Michael Mayer
b3fec4a2f5 Specs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-16 22:12:50 +02:00
Michael Mayer
0ce82056ca Specs: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-16 21:42:35 +02:00
Michael Mayer
dbf1650c1c CLI: Add cluster operations and management commands #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-16 18:09:09 +02:00
Michael Mayer
5db044284b Frontend: Update Makefile, package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-16 18:06:11 +02:00
Michael Mayer
3c821a3ea7 Frontend: Add "@ctrl/tinycolor" version override to package.json
Popular Tinycolor npm Package Compromised in Supply Chain Attack:
https://socket.dev/blog/tinycolor-supply-chain-attack-affects-40-packages

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-16 10:34:51 +02:00
graciousgrey
0277419f3b Merge branch 'develop' into feature/batch-edit 2025-09-16 10:08:22 +02:00
Michael Mayer
5a4e03eff0 Update .gitignore and .dockerignore files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-15 15:04:39 +02:00
Michael Mayer
a4cd1ac1fd API: Move "service/cluster" package from "pkg" to "internal" #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-15 13:40:56 +02:00
Ömer Duran
2d690afe21 Tests: Add tests for ChipSelector and BatchEdit components #271 2025-09-15 14:32:02 +03:00
Michael Mayer
ea8d413deb Config: Add "portal-uuid" to report.go and improve usage description #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-15 10:55:40 +02:00
Michael Mayer
b5c9e9f160 Docs: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-15 10:44:36 +02:00
Ömer Duran
5c75f6b035 Tests: Add unit tests for album and labels functionality #271 2025-09-15 08:58:02 +03:00
Quentin BARON
d3775f02e6 API: Add cluster operations endpoints to manage and register nodes #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-15 06:43:43 +02:00
Ömer Duran
716e856110 Frontend: Refactor batch editing logic to improve selection handling and add unit tests #271 2025-09-15 07:11:42 +03:00
Michael Mayer
efbcf34588 Docs: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-15 04:43:37 +02:00
Michael Mayer
ced562dfb3 API: Update swagger.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-14 21:40:55 +02:00
Michael Mayer
3283941ba0 Merge branch 'develop' into feature/batch-edit 2025-09-14 20:14:09 +02:00
Michael Mayer
e639c962d7 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-14 20:13:42 +02:00
Michael Mayer
efd55b50d9 Update license NOTICE files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-14 20:13:13 +02:00
Michael Mayer
8de7fa35af CI: Add Instructions for GitHub Copilot
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-14 20:12:15 +02:00
Michael Mayer
970a0a190e Config: Improve site-url and internal-url usage descriptions #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-14 14:51:23 +02:00
Michael Mayer
f0b9faac8b Setup: Fix typo in WEBUI_URL example
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-13 15:21:57 +02:00
Michael Mayer
023fbe3a1d Pkg: Add service/cluster package & rename media/http → service/http #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-13 12:58:28 +02:00
Michael Mayer
3f11165f61 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-13 04:12:10 +02:00
Michael Mayer
c36e66c847 Config: Add fs.ExtYml file extension const for transitioning to ".yaml"
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-13 02:09:22 +02:00
Michael Mayer
dbf0fa6c25 Scripts: Add dist/install-codex.sh and update Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-13 01:23:50 +02:00
Michael Mayer
4ea628af5c Dev: Update Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 23:40:37 +02:00
Michael Mayer
cd81094d25 Setup: Add "open-webui" service to compose.yaml config examples
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 16:13:17 +02:00
graciousgrey
11c7d9f7af API: Improve swagger annotations 2025-09-12 15:46:49 +02:00
Michael Mayer
64da1d36ed AI: Fix "photoprism-vision" service in compose.yaml (development only)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 15:29:52 +02:00
Michael Mayer
e45a23f9a4 AI: Add "open-webui" service to compose.yaml (development only)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 15:28:59 +02:00
Michael Mayer
cc93144bcb Develop: Upgrade base image from 250907-plucky to 250912-plucky
Includes additional CLI tool packages for development.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 14:06:48 +02:00
Michael Mayer
7ff62e0194 Config: Update flags and options for cluster configuration #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 13:52:37 +02:00
Michael Mayer
ce6546c635 Docker: Update env variables in compose.yaml files (development only)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 13:15:52 +02:00
Michael Mayer
b894079f62 Dev: Reformat Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 13:11:52 +02:00
Michael Mayer
7bed1cd46a Dev: Update "dep-codex" target in Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 13:11:03 +02:00
Michael Mayer
886794874d Docs: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 13:10:26 +02:00
Michael Mayer
55755f6ede Dev: Add ".local" to ignore files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 13:10:07 +02:00
Michael Mayer
acdf91d668 Dockerfiles: Add system packages for the development environment
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 13:07:53 +02:00
Michael Mayer
f84bfbefaa Docker: Update Dockerfiles for development base images
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 11:38:32 +02:00
Michael Mayer
9d79f448bd Docs: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 11:34:56 +02:00
Michael Mayer
3f519b7a87 Docker: Update compose.yaml files for development environment
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 11:17:41 +02:00
Michael Mayer
cdbd6a9fb6 Dev: Update .gitignore and .dockerignore files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 11:16:35 +02:00
Michael Mayer
aaf222e29b Docs: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 10:49:48 +02:00
Michael Mayer
29dcf7070c Docs: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 10:35:57 +02:00
Michael Mayer
9bb323f965 Docs: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-12 10:26:48 +02:00
Ömer Duran
7ca6b45217 Backend: Refactor photo conversion and date logic tests for clarity and structure 2025-09-12 10:46:22 +03:00
Ömer Duran
a920e10b7d Backend: Refactor date logic tests to ensure year value is preserved when month is unknown 2025-09-11 17:33:48 +03:00
Ömer Duran
46b8913ca4 Backend: Add date logic and conversion tests for photo metadata updates 2025-09-11 17:13:43 +03:00
Michael Mayer
0d572032a9 API: Add GET /cluster/theme endpoint and refactor config package #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-11 06:47:45 +02:00
Michael Mayer
7032a071e5 Merge branch 'develop' into feature/batch-edit 2025-09-09 13:08:14 +02:00
Michael Mayer
68d387778e Frontend: Harden NPM usage and add version overrides to package.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 12:56:40 +02:00
Michael Mayer
ffba22034a Merge branch 'develop' into feature/batch-edit 2025-09-09 11:34:14 +02:00
Michael Mayer
71f5bab407 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 11:24:37 +02:00
Michael Mayer
08616ae426 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 11:24:14 +02:00
graciousgrey
5ee5974188 AI: Increase vision client timeout 2025-09-09 10:56:12 +02:00
Michael Mayer
52beb0580c Merge branch 'develop' into feature/batch-edit 2025-09-09 09:56:21 +02:00
Michael Mayer
ea5dd3c002 Develop: Add a note about the naming of photoprism binaries to AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 09:55:36 +02:00
Michael Mayer
28b9c39f1b Develop: Update AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 09:10:53 +02:00
Michael Mayer
f948cd4efb Develop: Update Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 05:21:38 +02:00
Michael Mayer
a806ef8d71 Develop: Update tips for watching frontend changes in AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 04:44:50 +02:00
Michael Mayer
c27052a735 Develop: Add Docker Compose examples in AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 04:40:20 +02:00
Michael Mayer
4f3b694164 Develop: Improve Docker Compose examples in AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 04:28:37 +02:00
Michael Mayer
634445fb97 Develop: Add docker compose logs -f example to AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 04:25:22 +02:00
Michael Mayer
6cdca39fad Develop: Add a note about Windows to AGENTS.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 04:18:29 +02:00
Michael Mayer
6a57daffb4 Develop: Refine examples and context in AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 04:10:46 +02:00
Michael Mayer
13730174fe Develop: Add/update "help" and "list" targets in Makefiles
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 03:36:37 +02:00
Michael Mayer
632cc1f425 Develop: Update AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 02:44:19 +02:00
Michael Mayer
f0df9d2c88 Develop: Shorten AGENTS.md file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 02:30:11 +02:00
Michael Mayer
5afc09ecaf Develop: Add AGENTS.md file
Provides guidelines and context for coding agents:
- https://agents.md/
- https://agentsmd.net/

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-09 02:24:14 +02:00
Ömer Duran
30609fbd17 Batch Edit: Ensured PhotoDay remains consistent with computed values when only Month and/or Year are updated. 2025-09-08 11:50:32 +03:00
graciousgrey
cc0661eff6 AI: Improve rules.yml 2025-09-08 10:16:25 +02:00
Michael Mayer
a6f66127fb Config: Update Progressive Web App (PWA) flag usage and defaults
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-07 22:03:05 +02:00
Michael Mayer
7d3978cfd4 UX: Update Default and Lightbox themes in frontend/src/options/themes.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-07 19:29:12 +02:00
Michael Mayer
2b850b42b7 Merge branch 'develop' into feature/batch-edit 2025-09-07 16:26:37 +02:00
Michael Mayer
e7d4bc509d Frontend: Update deps in package.json and package-lock.json #5014 #5087
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-07 16:25:48 +02:00
Michael Mayer
d44b85a0df Frontend: Update src/locales/json/fr.json #5196
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-07 16:08:01 +02:00
Michael Mayer
74982c8d75 Merge branch 'develop' into feature/batch-edit 2025-09-07 16:05:29 +02:00
Michael Mayer
b0c3572432 Backend: Refactor function calls with missing params... after Go update
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-07 16:02:54 +02:00
Michael Mayer
cb9ada8478 Develop: Upgrade base image from 250822-plucky to 250907-plucky
Includes Go v1.25.1

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-07 15:30:17 +02:00
Ömer Duran
95c6743b2c Tests: Remove Karma / Mocha and switch to Vitest #4995 #5014 #5087
* Tests: Remove unused Karma configuration and test files

This commit deletes the Karma configuration file and  test files that are no longer needed

* Tests: Refactor setup file for Vitest and remove legacy vue-setup.js

* Tests: Update truncate test case to use Vitest string

* Tests: Add unit tests for PLocationInput component using Vitest

* Tests: Improve unit tests for PLoadingBar component

* Tests: Move karma test to vitest

* Frontend: Update deps in package-lock.json

* Tests: Adapt test to vitest

* Tests: Refactor Makefile and package.json for test commands
2025-09-07 15:29:01 +02:00
Michael Mayer
22863b8b0f Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-07 14:58:55 +02:00
Ömer Duran
933606873a Tests: Adapt batch/photos_test 2025-09-06 10:41:14 +03:00
Michael Mayer
351c3688b8 Merge pull request #5196 from photoprismci/weblate-photoprism-frontend 2025-09-04 20:25:20 +02:00
Weblate
95ac440d28 Weblate: Update frontend translations 2025-09-04 18:02:04 +00:00
graciousgrey
db9e9e8624 Tests: Add tests #271 2025-09-04 15:39:48 +02:00
graciousgrey
ad925ded45 Tests: Improve unit tests #271 2025-09-04 10:16:34 +02:00
Michael Mayer
4f326faeea Merge branch 'develop' into feature/batch-edit 2025-09-03 16:38:05 +02:00
Michael Mayer
2e3d187938 API: Update swagger.json endpoint documentation
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-03 16:34:32 +02:00
Michael Mayer
e7e49c3644 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-03 16:33:29 +02:00
Michael Mayer
d932f6f49f Merge branch 'develop' into feature/batch-edit 2025-09-03 16:19:21 +02:00
Michael Mayer
f2ec047c85 Frontend: Update *.json translation files in src/locales/json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-03 16:18:24 +02:00
Weblate
9545cd8a3e Weblate: Update frontend translations 2025-09-03 16:17:26 +02:00
Michael Mayer
34c66ebfdd Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-03 16:13:14 +02:00
Michael Mayer
22d7e65f3f Frontend: Refactor source name translations in the edit dialog
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-03 16:11:53 +02:00
Michael Mayer
07dd5a1b8b Merge branch 'develop' into feature/batch-edit 2025-09-03 11:48:17 +02:00
Michael Mayer
f5a4aacc5c Videos: Log ffmpeg command in debug mode #5189
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-03 11:48:06 +02:00
Michael Mayer
1a738c936a Merge branch 'develop' into feature/batch-edit 2025-09-03 11:44:40 +02:00
Michael Mayer
c36bb566af Videos: Refine still image extraction with ffmpeg #5189
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-03 11:44:09 +02:00
Ömer Duran
21e48a1876 Metadata: Clamp Day to valid month/year in details and batch editor and recompute TakenAtLocal with clamped day in backend batch conversion. 2025-09-02 17:25:17 +03:00
Michael Mayer
7a7a7353f0 Merge branch 'develop' into feature/batch-edit 2025-09-02 12:17:57 +02:00
Michael Mayer
a88580af7c AI: Update compose.yaml config examples #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-02 11:06:11 +02:00
Michael Mayer
f8f94ad814 Merge branch 'develop' into feature/batch-edit 2025-09-02 11:02:20 +02:00
Michael Mayer
9ea676c7e5 AI: Add "photoprism vision sources" CLI command #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-02 11:01:52 +02:00
Michael Mayer
b7c6ab1c90 Merge branch 'develop' into feature/batch-edit 2025-09-01 18:18:50 +02:00
Michael Mayer
2dc82bfa48 Videos: Improve log message when image extraction fails #5189
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 18:12:12 +02:00
Michael Mayer
ff2c3b9559 Videos: Skip non-keyframes when extracting images with FFmpeg #5189
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 18:02:23 +02:00
Michael Mayer
b5fdbf7c5e Merge branch 'develop' into feature/batch-edit 2025-09-01 16:03:53 +02:00
Michael Mayer
a0b44b2ca2 Setup: Update Ollama service examples in compose.yaml files #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 16:03:27 +02:00
Michael Mayer
c3537b10e5 AI: Use "gemma3" as default caption model #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 14:54:49 +02:00
Michael Mayer
44a2d902c2 Merge branch 'develop' into feature/batch-edit 2025-09-01 14:13:31 +02:00
Keith Martin
aa6c62abcb Search: Add escaping capability for the characters "|" and "&" #5188
* Backend: Add query escape capability
* Tests: escape capability verification
* Backend: Clean up comments and remove commented out code.
2025-09-01 14:00:26 +02:00
Michael Mayer
1c8450d94c Merge branch 'develop' into feature/batch-edit 2025-09-01 13:07:45 +02:00
Michael Mayer
19fff8b0bf Setup: Update Ollama service examples in compose.yaml files #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 13:07:22 +02:00
Michael Mayer
406ef8b645 Merge branch 'develop' into feature/batch-edit 2025-09-01 12:28:48 +02:00
Michael Mayer
fccdc50e6e AI: Update ApiRequestOptions in internal/ai/vision/api_request.go #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 12:21:38 +02:00
Michael Mayer
7de8ee88d8 Setup: Update Ollama service examples in compose.yaml files #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 12:08:33 +02:00
Michael Mayer
2c17b21569 AI: Update caption model defaults to work with Ollama #127 #5123 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 11:18:28 +02:00
Michael Mayer
09e8a15a7f AI: Update testdata/vision.yml #127 #5123 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 10:52:50 +02:00
Michael Mayer
6c61eb5010 AI: Change Ollama caption default prompt #127 #5123 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 10:51:50 +02:00
Michael Mayer
6766cc330d AI: Add Ollama options to model configuration #127 #5123 #5011
This also renames the Meta option to TensorFlow so it is clear these
values are to configure TensorFlow models only.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 10:13:16 +02:00
Michael Mayer
b887ef9aed Config: Refactor options and command flags
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 10:04:05 +02:00
Michael Mayer
de4b8b9539 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 10:02:04 +02:00
Michael Mayer
8241f1c559 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-09-01 10:01:44 +02:00
Michael Mayer
fd6216ad3a CLI: Update command flag description in migrations.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-29 10:03:22 +02:00
Michael Mayer
14241c4d25 Merge branch 'develop' into feature/batch-edit 2025-08-28 19:36:21 +02:00
Michael Mayer
a8dd73737f CLI: Update command flag usage descriptions
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 19:36:08 +02:00
Michael Mayer
fc781b5647 Merge branch 'develop' into feature/batch-edit 2025-08-28 19:29:38 +02:00
Michael Mayer
619949ffc1 CLI: Update usage description of "backup-database" flag
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 19:29:20 +02:00
Michael Mayer
01cd1c32c9 Merge branch 'develop' into feature/batch-edit 2025-08-28 19:13:23 +02:00
Michael Mayer
0357bc9abd CLI: Update usage descriptions for Boolean command flags
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 19:10:36 +02:00
Michael Mayer
68590ab408 API: Update metrics endpoint swagger documentation #213
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 16:16:42 +02:00
Michael Mayer
27d6834a22 Thumbs: Update package config, add IccProfilesPath & ExamplesPath #5178
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 15:39:12 +02:00
Michael Mayer
1b437c38f4 Auth: Add portal resource grants #98
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 12:14:50 +02:00
graciousgrey
5b61fe3782 Tests: Improve unit test to be case-insensitive 2025-08-28 11:42:18 +02:00
Michael Mayer
7bebf3bd60 API: Update swagger endpoint documentation #5133
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 11:20:00 +02:00
Michael Mayer
0823dceab1 API: Update swagger endpoint documentation #5133
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 11:13:28 +02:00
Michael Mayer
8337eb268c API: Update swagger endpoint documentation #5133
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 11:00:19 +02:00
Michael Mayer
b1eda7abe1 API: Update swagger endpoint documentation #5133
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 10:56:30 +02:00
Michael Mayer
cfe1bf62fd Backend: Update github.com/stretchr/testify in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 09:54:32 +02:00
Michael Mayer
45e998d941 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 09:54:11 +02:00
Michael Mayer
0cb4acbc20 Develop: Add "traefik.docker.network" label to compose.yaml files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-28 09:52:44 +02:00
Michael Mayer
a1ea21161b API: Update swagger endpoint documentation
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-27 17:16:03 +02:00
Michael Mayer
e9fca94656 API: Update swagger endpoint documentation
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-27 17:08:06 +02:00
Michael Mayer
2e15e1868f API: Update swagger endpoint documentation
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-27 16:57:02 +02:00
Michael Mayer
b096361d51 Merge branch 'develop' into feature/batch-edit 2025-08-27 10:32:13 +02:00
Michael Mayer
9980cf5bdc AI: Reduce vision API client timeout from 10 to 5 minutes
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-27 09:54:37 +02:00
Ömer Duran
b0b03ef631 Batch Edit: Sync photo selection state between fullscreen viewer and batch edit sidebar 2025-08-26 23:08:36 +03:00
Michael Mayer
55fbb474bb Merge branch 'develop' into feature/batch-edit 2025-08-26 08:58:51 +02:00
Michael Mayer
6e50ef0135 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-26 08:58:38 +02:00
Michael Mayer
09ce6c77de Develop: Update .gitignore
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-26 08:56:03 +02:00
Michael Mayer
16dc286976 Develop: Add Docker Compose "down" target to Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-26 08:54:52 +02:00
Michael Mayer
46683a155c Backend: Upgrade Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-26 08:54:17 +02:00
Michael Mayer
7470924a84 Develop: Add upload config options to compose.yaml files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-26 08:44:37 +02:00
Ömer Duran
9160bb2fea Batch Edit: Enhance save button with loading state and disable functionality during save operation 2025-08-25 21:12:50 +03:00
graciousgrey
39391e94a2 Tests: Add tests #271 2025-08-25 17:38:18 +02:00
graciousgrey
c05e892ad4 Tests: Add tests #271 2025-08-25 17:09:09 +02:00
Ömer Duran
72fa563edc Batch Edit: Change logic todelete or block labels based on source and uncertainty levels 2025-08-25 14:58:14 +03:00
Michael Mayer
8a976825bf Develop: Add start-traefik and stop-traefik targets to Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-25 09:45:45 +02:00
Keith Martin
e80c1e1df7 Docker: Ensure that cmd.sh terminates its child processes when the parent script closes #5172
* Scripts: Ensure that child processes are terminated when parent script closes
* Scripts: Exclude pgrep process id from kill
2025-08-24 12:44:38 +02:00
Michael Mayer
c7e71bbbe2 CLI: Refactor photoprism/dl test suite
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-23 14:31:39 +02:00
Ömer Duran
e3e624b4b4 Batch Edit: Check for unsaved changes before closing. Refactor save method to handle async operations and notify users of success or failure. 2025-08-23 10:06:07 +03:00
Ömer Duran
53703c5eb2 Batch Edit: move batch logic to internal/photoprism/batch; refactor API 2025-08-23 09:12:52 +03:00
Michael Mayer
5e6c5d4b9f Merge branch 'develop' into feature/batch-edit 2025-08-22 15:28:49 +02:00
Michael Mayer
37908ca3b5 Develop: Upgrade base image from 250808-plucky to 250822-plucky
Includes the latest dependencies, such as Go v1.25.0.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-22 15:28:19 +02:00
Michael Mayer
b0b74db258 Merge branch 'develop' into feature/batch-edit 2025-08-22 15:08:40 +02:00
Michael Mayer
2a8e991550 CLI: Skip remaining YouTube download tests until issues are resolved
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-22 15:08:24 +02:00
graciousgrey
7380244f6d Tests: Add tests #271 2025-08-22 14:57:10 +02:00
graciousgrey
f04a84fd40 Tests: Skip test until related function is refactored #271 2025-08-22 12:23:01 +02:00
graciousgrey
0ad7ed4021 Tests: Adapt tests to updated fixtures #271 2025-08-22 12:21:51 +02:00
Michael Mayer
41ecea6360 Merge branch 'develop' into feature/batch-edit 2025-08-22 11:02:49 +02:00
Michael Mayer
a55a4f8ae4 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-22 10:58:56 +02:00
Michael Mayer
eba9e89380 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-22 10:58:28 +02:00
Oleksandr Redko
589ed92904 Videos: Refactor slice to array conversion (#5150) 2025-08-22 10:55:28 +02:00
Ömer Duran
f0667dab83 Merge branch 'feature/batch-edit' of https://github.com/photoprism/photoprism into feature/batch-edit 2025-08-21 20:18:31 +03:00
Michael Mayer
c9e7fc51b6 Merge branch 'develop' into feature/batch-edit 2025-08-21 11:58:27 +02:00
Ömer Duran
3c5eaeb1df Batch Edit: Refresh available label options 2025-08-21 11:45:12 +03:00
Michael Mayer
41804a262b CLI: Skip YouTube download tests until issues are resolved
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-20 13:17:50 +02:00
Ömer Duran
bd4f8a2582 Labels: Standardize label editing across dialogs for consistent source/probability handling and actions 2025-08-20 11:35:15 +03:00
graciousgrey
597593f4ee Tests: Adapt fixtures to have valid slugs 2025-08-19 19:44:23 +02:00
Ömer Duran
c9e306274c Batch Edit: Refactor batch photo editing logic and introduce new batch form handling without import cycle 2025-08-19 17:40:00 +03:00
Michael Mayer
e3e034cc68 Index: Refactor error logging to happen inside IndexRelated() #5166
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-19 12:31:43 +02:00
Michael Mayer
0bce60c046 Index: Improve logging when PDF documents cannot be indexed #5166
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-19 12:24:29 +02:00
Michael Mayer
d1f9f681c8 Merge branch 'develop' into feature/batch-edit 2025-08-19 09:58:55 +02:00
Michael Mayer
13177b0c32 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-19 09:58:37 +02:00
Michael Mayer
af7983b77c Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-19 09:56:14 +02:00
Ömer Duran
4f86c04ebe Batch Edit: Update label removal logic 2025-08-18 09:46:21 +03:00
Michael Mayer
ecb9d6c9dc Merge branch 'develop' into feature/batch-edit 2025-08-16 16:47:40 +02:00
Michael Mayer
4da369d8b8 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-16 16:47:07 +02:00
raystlin
519a6ab34a AI: Add TensorFlow model shape detection #127 #5164
* AI: Added support for non BHWC models

Tensorflow models use BHWC by default, however, if we are using
converted models, we can find that the expected input is BCHW. Now the
input is configurable (although the restriction of being dimesion 4 is
still there) via Shape parameter on the input definition. Also, the
model instrospection will try to deduce the input shape from the model
signature.

* AI: Added more tests for enum parsing

ShapeComponent was missing from the tests

* AI: Modified external tests to the new url

The path has been moved from tensorflow/vision to tensorflow/models

* AI: Moved the builder to the model to reuse it

It should reduce the amount of allocations done

* AI: fixed errors after merge

Mainly incorrect paths and duplicated variables
2025-08-16 15:55:59 +02:00
Michael Mayer
2a7351ee9a Database Schema: Update internal/entity/schema/mariadb.sql
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-16 11:46:27 +02:00
Michael Mayer
9e747aa72d Merge branch 'develop' into feature/batch-edit 2025-08-15 22:47:53 +02:00
Michael Mayer
ff00681137 Scripts: Add dist/export-help.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-15 22:47:15 +02:00
graciousgrey
3056623934 Tests: Adapt acceptance tests to changes #271 2025-08-14 11:30:16 +02:00
Michael Mayer
21c8b18bf0 API: Update internal/api/swagger.json #5133
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-13 16:16:35 +02:00
Michael Mayer
0b74d21e58 Merge branch 'develop' into feature/batch-edit 2025-08-13 16:00:03 +02:00
Michael Mayer
a7a41fe000 API: Add OPTIONS wildcard handler to serve CORS preflight requests #5133
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-13 15:59:38 +02:00
Michael Mayer
d47b38bc8b Server: Add standard liveness/readiness check endpoints
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-13 13:07:01 +02:00
Michael Mayer
52204ee246 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-13 13:02:20 +02:00
Michael Mayer
3d4e2bde49 Setup: Update compose.yaml examples
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-12 17:33:10 +02:00
Weblate
05a550aa8a Weblate: Update frontend translations 2025-08-12 16:45:00 +02:00
graciousgrey
3ef0f1a646 Tests: Add fixtures and update tests #271 2025-08-12 15:13:28 +02:00
Michael Mayer
6eb85d9419 Merge branch 'develop' into feature/batch-edit 2025-08-11 18:11:53 +02:00
Michael Mayer
f55a7190fc Frontend: Update .json translation files #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-11 18:11:10 +02:00
Michael Mayer
3996c165d1 Merge branch 'develop' into feature/batch-edit 2025-08-11 18:10:28 +02:00
Weblate
0f999703c3 Weblate: Update frontend translations 2025-08-11 18:09:31 +02:00
Michael Mayer
db3a2b0309 Frontend: Update .po translation files #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-11 18:07:36 +02:00
Weblate
39be3d7122 Weblate: Update frontend translations 2025-08-11 18:06:46 +02:00
Michael Mayer
db22069997 Frontend: Add "batch" source and translation to edit dialog #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-11 18:06:04 +02:00
Michael Mayer
745a0a3661 Batch Edit: Increase source priority of changes to 64 (like manual) #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-11 18:02:39 +02:00
Ömer Duran
b6d3af9c58 Backend: Update Location logic to support batch source in SavePhotoForm 2025-08-11 16:12:59 +03:00
Ömer Duran
0ea64c68ea Batch Edit: Refactor getData method to avoid duplicates 2025-08-11 14:30:11 +03:00
Ömer Duran
9fc72f3178 Backend: Photo date field updates to exclude batch source 2025-08-11 13:48:20 +03:00
Ömer Duran
5d5ed13cf5 Batch Edit: Updating label and album methods 2025-08-11 12:48:06 +03:00
Michael Mayer
242083080d AI: Increase timeout for API client requests from 1 to 10 minutes
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-10 20:34:54 +02:00
Michael Mayer
40b5b938f5 Merge branch 'develop' into feature/batch-edit 2025-08-10 17:24:07 +02:00
Michael Mayer
e7db7efc58 Frontend: Update install and update targets in Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-10 17:22:43 +02:00
Michael Mayer
28ed71988f Merge branch 'develop' into feature/batch-edit 2025-08-10 17:14:07 +02:00
Michael Mayer
dbfe4e5dc1 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-10 17:13:29 +02:00
Michael Mayer
a890f8da16 Backend: Update Go dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-10 14:42:29 +02:00
Michael Mayer
c22c5c0151 CLI: Update count flag usage in commands.go, find.go, and vision_run.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-10 14:41:51 +02:00
Michael Mayer
fde47ebd3a Merge branch 'develop' into feature/batch-edit 2025-08-08 19:26:37 +02:00
Michael Mayer
6655a66e8f Develop: Upgrade base image from 250805-plucky to 250808-plucky #127
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-08 19:25:43 +02:00
Michael Mayer
875880110b Build: Simplify assets/.buildignore file #127
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-08 19:09:17 +02:00
Michael Mayer
ab0bd1c732 Config: Change default vision model assets path to assets/models/ #127
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-08 19:06:56 +02:00
Michael Mayer
2b48fe20dd Frontend: Update src/locales/json/en.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-08 19:00:16 +02:00
Ömer Duran
6f6d985848 Batch Edit: refresh form after apply 2025-08-08 12:55:24 +03:00
Ömer Duran
0d10020eba Batch Edit: Implement fetching and updating of albums and labels in batch processing 2025-08-08 12:18:41 +03:00
Weblate
ca8490d048 Weblate: Update frontend translations 2025-08-08 10:32:43 +02:00
Michael Mayer
12ed1ab507 Merge branch 'develop' into feature/batch-edit 2025-08-06 20:13:20 +02:00
Michael Mayer
2b9a3c9924 Setup: Update compose.yaml config examples #5123
Related Documentation:
- https://github.com/photoprism/photoprism-docs/pull/203
- https://docs.photoprism.app/developer-guide/vision/caption-generation/

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-06 20:13:07 +02:00
graciousgrey
3c84771c01 AI: Update rules.yml to work with original ImageNet1k labels 2025-08-06 17:22:58 +02:00
Michael Mayer
e5cd2f1ceb Merge branch 'develop' into feature/batch-edit 2025-08-06 10:00:11 +02:00
Michael Mayer
a6d840056c Media: Log underlying error when MIME type detection fails #5149
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-06 09:59:38 +02:00
Ömer Duran
95dc2e9a10 Batch Edit: Update source tracking for photo fields to use SrcBatch instead of SrcManual 2025-08-05 19:02:22 +03:00
graciousgrey
bbd7759d3b Tests: Add fixtures and update tests #271 2025-08-05 15:16:46 +02:00
Michael Mayer
51f877aef2 Merge branch 'develop' into feature/batch-edit 2025-08-05 12:47:23 +02:00
Michael Mayer
0d24ec5abb Develop: Create default network in custom compose YAML files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-05 11:12:01 +02:00
Michael Mayer
fb6d920b1b Develop: Upgrade base image from 250724-plucky to 250805-plucky #5149
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-05 11:10:48 +02:00
Michael Mayer
9c7c6c3d27 Docker: Preinstall "libmagic-mgc" package for media type detection #5149
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-05 10:56:29 +02:00
Michael Mayer
b8cd22d14b Merge branch 'develop' into feature/batch-edit 2025-08-05 10:10:04 +02:00
Michael Mayer
16ac7a9d11 Batch Edit: Add SrcBatch to internal/entity/src.go #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-05 10:09:46 +02:00
Michael Mayer
9388cb7f66 Backend: Update license NOTICE file #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-05 10:09:21 +02:00
Michael Mayer
29c70cb0a9 Backend: Update deps in go.mod and go.sum #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-05 10:07:38 +02:00
Michael Mayer
6a20ca45b5 Frontend: Update deps in package.json and package-lock.json #5081 #5087
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-05 10:05:54 +02:00
Michael Mayer
8e91f077b8 Merge branch 'develop' into feature/batch-edit 2025-08-04 13:25:07 +02:00
Michael Mayer
34065a6bf8 AI: Allow to use defaults when having a custom vision.yml #127 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 13:24:27 +02:00
Michael Mayer
b241fa621d AI: Refactor error logs in internal/ai packages #127 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 12:14:23 +02:00
Michael Mayer
b7dc81fe29 Frontend: Update deps in package.json and package-lock.json #5081 #5087
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 10:47:03 +02:00
Michael Mayer
f83d77e40a AI: Make built-in model names lowercase in internal/ai/vision #127 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 10:32:08 +02:00
Michael Mayer
3177a61f75 AI: Update log messages and tests in internal/ai/classify #127 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 10:31:39 +02:00
Michael Mayer
523605f7d7 AI: Update log messages in internal/ai/tensorflow/labels.go #127 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 10:08:03 +02:00
Michael Mayer
10fe7d2b40 AI: Make error messages lower case in ai/tensorflow/info.go #127 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 10:00:09 +02:00
Michael Mayer
75785ff2f3 Merge branch 'develop' into feature/custom-tf-model-127 2025-08-04 09:58:18 +02:00
Michael Mayer
f6c922be00 AI: Update inline comments in internal/ai/tensorflow/info.go #127 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-04 09:57:09 +02:00
Ömer Duran
cdb13c9711 Backend: Implement batch photo proof of concept metadata updates 2025-08-04 07:14:27 +03:00
Michael Mayer
3a07e7049f Merge branch 'develop' into feature/batch-edit 2025-08-02 11:10:18 +02:00
Michael Mayer
a80bdf065f AI: Improve logging in "photoprism vision run" command #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-02 10:58:32 +02:00
Michael Mayer
8a82b10d23 Merge branch 'develop' into feature/batch-edit 2025-08-02 10:48:00 +02:00
Michael Mayer
977d06b560 AI: Fix logging in "photoprism vision run" command #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-02 10:47:20 +02:00
Michael Mayer
3d030601ea Merge branch 'develop' into feature/batch-edit 2025-08-02 10:20:03 +02:00
Michael Mayer
c2b4af2a3a AI: Improve "photoprism vision run" command #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-02 10:19:31 +02:00
Michael Mayer
fd3f6311d4 Backend: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-01 18:14:56 +02:00
Michael Mayer
5246677ffa Backend: Update deps in go.mod and go.sum #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-01 14:37:58 +02:00
Michael Mayer
6e955523b6 AI: Add "--count" flag to the photoprism vision run command #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-01 14:37:36 +02:00
Michael Mayer
1bd9bb9d0c Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-01 14:32:03 +02:00
Michael Mayer
98e9daf687 Server: Add "trusted-platform" config option
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-08-01 13:51:03 +02:00
Ömer Duran
423d232bf2 Frontend: Refactor location input component placement 2025-07-30 11:38:35 +03:00
Ömer Duran
939e912f2d Frontend: Add readonly state to country field and update country on location change 2025-07-30 11:20:59 +03:00
Ömer Duran
b83dbf1cb5 Frontend: Move mixed to the middle 2025-07-30 10:43:02 +03:00
Ömer Duran
31916ef7ae Frontend: Replace "<mixed>" with "mixed" in batch dialog options 2025-07-30 10:33:39 +03:00
Michael Mayer
31901ff2e3 Server: Add "proxy-ip-header" config option
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-29 13:16:14 +02:00
Ömer Duran
583777f065 Frontend: Remove outlined variant from v-combobox and title prop from ChipSelector 2025-07-29 14:10:21 +03:00
Ömer Duran
44d2a6e771 Frontend: Clear input and restore placeholder after selection 2025-07-29 13:52:33 +03:00
Ömer Duran
4c16b8d9c5 Merge branch 'feature/batch-edit' of https://github.com/photoprism/photoprism into feature/batch-edit 2025-07-29 13:37:51 +03:00
Ömer Duran
8f417febb4 Frontend: Remove title prop from BatchChipSelector and add section headers for Albums and Labels 2025-07-29 13:37:38 +03:00
Michael Mayer
fca60eb816 Merge branch 'develop' into feature/batch-edit 2025-07-29 12:11:24 +02:00
Michael Mayer
e5dcf23f0c Config: Add "trusted-proxy" defaults to pkg/media/http/header/cidr.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-29 12:11:05 +02:00
Michael Mayer
0f5b774b06 Scripts: Update dist/install-forward-dns.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-29 09:54:41 +02:00
Michael Mayer
34b71f800e Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-28 16:35:58 +02:00
Michael Mayer
2df90b45fa Scripts: Update dist/install-forward-dns.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-28 16:35:27 +02:00
Michael Mayer
8ea7494456 Scripts: Add dist/install-forward-dns.sh to set up a forward DNS service
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-27 12:44:47 +02:00
Michael Mayer
96137a849a Scripts: Add dist/install-k8s-tools.sh for managing Kubernetes clusters
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-27 09:20:53 +02:00
raystlin
aeba5bfc4c Added labels download to model_external_test
If a model needs to have its labels downloaded from another source, it
can now be added to the test information.
2025-07-26 22:27:20 +00:00
raystlin
eef76ded5f Added new params to vision models for completion
ResizeOperation and ColorChannelOrder, just to have them on the
examples.
2025-07-26 21:43:12 +00:00
raystlin
b4ac12c301 Merge branch 'develop' into feature/custom-tf-model-127 2025-07-26 21:24:05 +00:00
Michael Mayer
38cafb1c2b Scripts: Add dist/add-swap.sh to help configure swap on Linux
see https://docs.photoprism.app/getting-started/troubleshooting/docker

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-26 10:21:33 +02:00
raystlin
3b1e1bb32a Added tests for resize operations
And fixed a typo detected by using them.
2025-07-25 22:22:19 +00:00
raystlin
e704ccfc47 Merge branch 'develop' into feature/custom-tf-model-127 2025-07-25 21:22:28 +00:00
Ömer Duran
0b5f9a783f Frontend: Update batch edit to use photo ID instead of UID for selected photos 2025-07-25 16:31:44 +03:00
Ömer Duran
f2b2697da0 Frontend: Remove unused variable 2025-07-25 14:34:40 +03:00
Ömer Duran
5813e8dbba Merge branch 'feature/batch-edit' of https://github.com/photoprism/photoprism into feature/batch-edit 2025-07-25 14:33:06 +03:00
Ömer Duran
00bf7ad680 Frontend: Fix batch edit save functionality to use currently selected photo UIDs 2025-07-25 14:33:04 +03:00
Ömer Duran
b9a1282f8e Frontend: Fix batch edit save functionality to use currently selected photo UIDs 2025-07-25 14:31:23 +03:00
Ömer Duran
6e8575840e Frontend: Fix action handling, delete field display, and undo functionality for position changes 2025-07-25 01:45:14 +03:00
Michael Mayer
fe7af9ec91 Backend: Update deps in go.mod, go.sum, and license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-24 20:27:35 +02:00
Michael Mayer
18799b1481 Merge branch 'develop' into feature/batch-edit 2025-07-24 15:46:57 +02:00
Michael Mayer
8149d4c63a Setup: Update compose.yaml config examples #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-24 15:46:41 +02:00
Michael Mayer
bdec8e25ce Merge branch 'develop' into feature/batch-edit 2025-07-24 15:40:37 +02:00
Michael Mayer
fce72f01a2 Develop: Upgrade base image from 250709-plucky to 250724-plucky
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-24 15:40:09 +02:00
Michael Mayer
d622c4d214 Setup: Upgrade traefik image version from v3.4 to v3.5
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-24 15:17:17 +02:00
Michael Mayer
2e229d8a98 Merge branch 'develop' into feature/batch-edit 2025-07-24 14:55:50 +02:00
Michael Mayer
468080ec6d Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-24 14:55:36 +02:00
Michael Mayer
9c24a30126 Merge branch 'develop' into feature/batch-edit 2025-07-24 13:07:30 +02:00
Michael Mayer
4c24973a24 Setup: Update compose.yaml examples and add ollama service #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-24 13:07:11 +02:00
Ömer Duran
204c944804 Frontend: Remove options text in batch edit dialog 2025-07-24 01:02:41 +03:00
Ömer Duran
61f85604c6 Frontend: Refactor chip-selector component for improved item handling and placeholder logic 2025-07-24 00:59:44 +03:00
Ömer Duran
d23c3b10a1 Frontend: Enhance chip-selector component with tooltips and improved item removal logic 2025-07-23 20:36:06 +03:00
Ömer Duran
3656cefb23 Frontend: Update chip-selector component to use persistent placeholder and clear label 2025-07-23 20:13:04 +03:00
Michael Mayer
811d359343 Merge branch 'develop' into feature/batch-edit 2025-07-23 02:33:08 +02:00
Michael Mayer
9d5a5d848a Develop: Add .project, .vscode, and *.tmproj to .gitignore file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-23 02:32:44 +02:00
Michael Mayer
5a7c5613b1 CLI: Refactor internal/commands/reset.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-23 00:53:34 +02:00
Michael Mayer
7ba6171ff9 Merge branch 'develop' into feature/batch-edit 2025-07-22 22:09:39 +02:00
Michael Mayer
4b5e3b574a Index: Improve generation, caching and logging of labels #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 22:09:00 +02:00
Michael Mayer
99159f072a Frontend: Update json translation files #1152 #5129
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 20:50:56 +02:00
Weblate
f0939094fc Weblate: Update frontend translations 2025-07-22 20:50:13 +02:00
Michael Mayer
a851e325dd Frontend: Update templates to always have a context for "Archive" #1152
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 20:48:16 +02:00
Michael Mayer
0ff2d0df5e Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 20:47:12 +02:00
Michael Mayer
f6d9ff8e43 Backend: Regenerate .po translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 20:09:21 +02:00
Michael Mayer
f1a33a5516 Frontend: Regenerate .po translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 20:09:08 +02:00
Michael Mayer
3dcc33260e Frontend: Update src/locale/json/ar.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 20:07:31 +02:00
Michael Mayer
7dd870fcf1 Scripts: Add Kustomize to dist/install-admin-tools.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-22 20:06:20 +02:00
graciousgrey
1afc7d955a Translations: Add context #1152 2025-07-22 17:10:52 +02:00
graciousgrey
b2d36b395b Tests: Add unit tests 2025-07-22 13:01:22 +02:00
Weblate
3448d1a635 Weblate: Update backend translations 2025-07-21 17:32:44 +02:00
Weblate
02ab8caef1 Weblate: Update frontend translations 2025-07-21 17:32:16 +02:00
Michael Mayer
1809c12d9d Merge branch 'develop' into feature/batch-edit 2025-07-21 12:22:42 +02:00
Michael Mayer
da86263390 AI: Use defaults when returning classify label from response #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-21 12:19:55 +02:00
Michael Mayer
db16a9d546 Merge branch 'develop' into feature/batch-edit 2025-07-21 10:51:25 +02:00
Michael Mayer
ae42af54d8 AI: Generate captions using the Ollama API #5011 #5123
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-21 10:43:49 +02:00
Ömer Duran
910aac9545 Frontend: Update batch edit logic to ensure actions are only updated when changes occur; update chip styles for better theming 2025-07-20 19:19:34 +03:00
graciousgey
f67ba0e634 Tests: Adapt acceptance tests #465 2025-07-18 18:27:01 +02:00
Ömer Duran
822dc87d8e Frontend: Update computedInputLabel to return an empty string if no label is provided 2025-07-18 10:39:07 +03:00
Ömer Duran
58ce717004 Frontend: Remove input labels for album and label name in batch edit 2025-07-18 10:37:40 +03:00
Ömer Duran
718ed254b8 Frontend: Delete useless comments 2025-07-18 10:19:59 +03:00
Ömer Duran
f96b49d5a3 Frontend: Add reusable ChipSelector component and integrate into batch edit 2025-07-18 10:12:45 +03:00
raystlin
1912f17aaf Changed InputOrder to ColorChannelOrder
The previous name was not clear enough.
2025-07-17 21:26:50 +00:00
Michael Mayer
9f11c2c773 Merge branch 'develop' into feature/batch-edit 2025-07-17 12:27:22 +02:00
Michael Mayer
6a803a8614 Search: Improve camera and lens filter notes in form annotations #5113
https://docs.photoprism.app/user-guide/search/filters/#filter-reference
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-17 12:23:14 +02:00
Michael Mayer
96cf07dd94 Merge branch 'develop' into feature/batch-edit 2025-07-17 12:15:21 +02:00
Michael Mayer
57f4e39b33 Search: Improve type filter description in form annotations #5113
https://docs.photoprism.app/user-guide/search/filters/#filter-reference
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-17 12:15:00 +02:00
Michael Mayer
c71c1db568 Merge branch 'develop' into feature/batch-edit 2025-07-17 12:03:55 +02:00
Michael Mayer
aa533ff7ef Search: Improve position filter descriptions in form annotations #5113
https://docs.photoprism.app/user-guide/search/filters/#filter-reference
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-17 12:03:29 +02:00
Michael Mayer
3ff0a30469 Metadata: Improve search filter and media type documentation #5113
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-17 11:55:20 +02:00
Michael Mayer
61c34713d8 Merge branch 'develop' into feature/batch-edit 2025-07-16 18:35:53 +02:00
Michael Mayer
6cccef7ae8 Backend: Update deps in go.mod, go.sum, and license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-16 18:35:38 +02:00
Michael Mayer
c6f7a6f373 Frontend: Update deps in package-lock.json #5087
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-16 18:35:04 +02:00
Michael Mayer
ae0162c8d8 Merge branch 'develop' into feature/batch-edit 2025-07-16 18:29:52 +02:00
Michael Mayer
ddd343d528 Frontend: Refactor user model and permission checks #5087
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-16 18:29:35 +02:00
Michael Mayer
4fccb0ff6c Merge branch 'develop' into feature/batch-edit 2025-07-16 14:59:24 +02:00
Michael Mayer
c05fe19ba9 AI: Default to the 720x720 fit thumb for generating captions #3438 #5011
These changes also auto assign labels based on the generated captions.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-16 14:58:44 +02:00
graciousgrey
b608eae3e5 Tests: Add unit tests #683 2025-07-16 14:25:39 +02:00
graciousgrey
df61612d73 Tests: Add unit tests #5111 2025-07-16 14:13:15 +02:00
Ömer Duran
3561f3fcc9 Frontend: Update form data handling for date and type fields in batch edit component 2025-07-16 09:51:59 +03:00
Ömer Duran
458ac57ce3 Frontend: Simplify checkbox event handling in batch edit component 2025-07-16 08:58:08 +03:00
Ömer Duran
49ab48a5a1 Frontend: Update label for title field in photo details 2025-07-16 01:43:07 +03:00
Michael Mayer
f7f403fef7 AI: Add link to qwen2.5vl release notes in vision/caption.go #3438 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 18:12:56 +02:00
Michael Mayer
4341bb2fb4 Merge branch 'develop' into feature/batch-edit 2025-07-15 18:03:43 +02:00
Michael Mayer
1c5cea7683 Docs: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 18:03:21 +02:00
Michael Mayer
2a7e06e35f Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 18:03:05 +02:00
raystlin
adc4dc0f74 Added new parameters to model input.
New parameters have been added to define the input of the models:
* ResizeOperation: by default center-crop was being performed, now it is
  configurable.
* InputOrder: by default RGB was being used as the order for the array
  values of the input tensor, now it can be configured.
* InputInterval has been changed to InputIntervals (an slice). This
  means that every channel can have its own interval conversion.
* InputInterval can define now stddev and mean, because sometimes
  instead of adjusting the interval, the stddev and mean of the training
data should be use.
2025-07-15 13:31:31 +00:00
Michael Mayer
cd3be44a3c Merge branch 'develop' into feature/batch-edit 2025-07-15 12:52:26 +02:00
Michael Mayer
4bc9cd6ca2 AI: Add "source" flag to the "photoprism vision run" command #3438 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 12:52:02 +02:00
Michael Mayer
f1b59fd01c Merge branch 'develop' into feature/batch-edit 2025-07-15 11:23:28 +02:00
Michael Mayer
eb8d2062a5 AI: Update caption prompt and replace existing captions #3438 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 11:23:03 +02:00
Michael Mayer
889fc20fc1 Merge branch 'develop' into feature/batch-edit 2025-07-15 10:25:32 +02:00
Michael Mayer
4e6e0d287b API: Add mock album and label items to batch edit form for testing #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 10:25:03 +02:00
Ömer Duran
45914d1eac Frontend: Improve location input component with undo/delete functionality 2025-07-15 07:44:56 +03:00
Ömer Duran
c26573eb5b Frontend: Adjust column layout for boolean flags in batch edit component 2025-07-15 06:35:11 +03:00
Ömer Duran
9a19a71551 Merge branch 'feature/batch-edit' of https://github.com/photoprism/photoprism into feature/batch-edit 2025-07-15 06:20:41 +03:00
Ömer Duran
d553508449 Frontend: Update click handling for photo selection in batch edit and enhance cursor style for thumbnails 2025-07-15 06:20:19 +03:00
Michael Mayer
3f2022f693 Merge branch 'develop' into feature/batch-edit 2025-07-15 05:13:55 +02:00
Michael Mayer
546635f8b6 AI: Update photoprism vision default prompt for captioning #3438 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 05:13:33 +02:00
Ömer Duran
e98889b09e Frontend: Simplify label for photo title input in details form 2025-07-15 06:07:00 +03:00
Ömer Duran
04630f25f1 Frontend: Better select-field handling in batch edit, update Type field logic 2025-07-15 05:56:39 +03:00
Michael Mayer
ff229e1bd0 AI: Update photoprism vision defaults for captioning #3438 #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-15 00:51:46 +02:00
Michael Mayer
26a80227b9 Merge branch 'develop' into feature/batch-edit 2025-07-14 23:36:05 +02:00
Michael Mayer
e029a64632 AI: Update photoprism vision defaults for captioning #5011
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 23:32:00 +02:00
Michael Mayer
e75bb20027 Merge branch 'develop' into feature/batch-edit 2025-07-14 20:12:02 +02:00
Michael Mayer
e2763c4aee Frontend: Update .po and .json translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 20:11:30 +02:00
Andres Hočevar
e24d8f532a Quickfix spanish locale 2025-07-14 20:09:42 +02:00
Weblate
2ad1466e06 Weblate: Update frontend translations 2025-07-14 20:09:18 +02:00
Michael Mayer
b24631244c Merge branch 'develop' into feature/batch-edit 2025-07-14 19:32:59 +02:00
Michael Mayer
a571a228e6 Backend: Upgrade github.com/klauspost/cpuid/v2 in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 19:32:01 +02:00
Michael Mayer
b6b260fa36 Merge branch 'develop' into feature/batch-edit 2025-07-14 19:30:46 +02:00
Michael Mayer
f7a6b0fa6c Config: Add an option to disable the web user interface #5111
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 19:30:24 +02:00
Michael Mayer
88126e3e48 Search: Add "reverse" query param to sort results in reverse order #683
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 18:08:05 +02:00
Michael Mayer
1269668edd Merge branch 'develop' into feature/batch-edit 2025-07-14 11:14:20 +02:00
Michael Mayer
66cd55461f API: Always send and expect "mixed" fields in batch edit endpoint #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 11:13:04 +02:00
Michael Mayer
829bc180a9 Merge branch 'develop' into feature/batch-edit 2025-07-14 10:42:47 +02:00
Michael Mayer
65b8503f63 API: Allow batch edit fields to be empty in requests and responses #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 10:42:34 +02:00
Michael Mayer
d14097f335 Merge branch 'develop' into feature/batch-edit 2025-07-14 09:33:45 +02:00
Michael Mayer
6e859ceecb Frontend: Add inline code comments for clipboard use #5106
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 09:33:30 +02:00
Michael Mayer
ba67081c56 Merge branch 'develop' into feature/batch-edit 2025-07-14 09:27:25 +02:00
Michael Mayer
2b4234da00 Frontend: Update .json translation files #5106
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 09:27:01 +02:00
Michael Mayer
28873182be Auth: Activate 2FA, even if the recovery code cannot be copied #5106
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-14 09:23:02 +02:00
Ömer Duran
b3d839de49 Frontend: Adjust column width in batch editing component 2025-07-14 08:57:16 +02:00
Ömer Duran
acdfde36c8 Frontend: Wrapping form controls in v-row 2025-07-14 08:55:29 +02:00
Ömer Duran
b0781b6451 Frontend: Improving toggle button layout 2025-07-14 08:50:24 +02:00
Ömer Duran
76eaaa812c Frontend: Refactor batch editing component to use v-data-table for better performance and usability in both desktop and mobile views 2025-07-14 08:30:21 +02:00
Ömer Duran
2996d64600 Frontend: Improve batch editing functionality by adding support for albums and labels selection, updated form data structure #271 2025-07-14 02:48:59 +02:00
Michael Mayer
a910795525 Setup: Update service image names for the Raspberry Pi #4414 #5100
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 16:36:36 +02:00
Michael Mayer
b8469d6ced Merge branch 'develop' into feature/batch-edit 2025-07-11 16:31:17 +02:00
Michael Mayer
d5816e0f9f Setup: Update compose.yaml defaults for the Raspberry Pi #4414 #5100
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 16:30:59 +02:00
Michael Mayer
2b85d47d3b Merge branch 'develop' into feature/batch-edit 2025-07-11 12:20:18 +02:00
Michael Mayer
f1cfe8d406 Scripts: Refactor dist/heif-convert.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 12:00:05 +02:00
Michael Mayer
aca000854c Scripts: Add doctl CLI command to install-admin-tools.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 11:59:46 +02:00
Ömer Duran
312f8e10be Raspberry Pi: Upgrade mariadb version in compose.yaml #4414 #5100
* Setup: Update mariadb version
* Setup: Remove unnecessary mariadbd from MariaDB container command
2025-07-11 11:58:33 +02:00
Michael Mayer
2b511e87ca Merge branch 'develop' into feature/batch-edit 2025-07-11 06:02:02 +02:00
Michael Mayer
1fa7b455a1 Tests: Reformat .js test files with "npm run fmt" #5087
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 06:01:23 +02:00
Michael Mayer
86401086ba Frontend: Add ContentTypeMp4AvcHigh to common/media.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 06:00:06 +02:00
Michael Mayer
de2e322a4e Merge branch 'develop' into feature/batch-edit 2025-07-11 03:34:13 +02:00
Michael Mayer
342519a518 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 03:33:59 +02:00
Michael Mayer
ad653db969 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 03:33:38 +02:00
Michael Mayer
675c2a3f95 Setup: Add build script for the PhotoPrismPi SD card image #4414
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-11 00:37:44 +02:00
Michael Mayer
78f5a48b0b Setup: Remove "Ofelia" from DigitalOcean app image docs #4414
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 22:08:38 +02:00
Michael Mayer
e6a1b54547 Setup: Reorganize config files for Raspberry Pi and DigitalOcean #4414
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 22:02:38 +02:00
Ömer Duran
11d0cc3d26 Merge branch 'feature/batch-edit' of https://github.com/photoprism/photoprism into feature/batch-edit 2025-07-10 18:05:19 +02:00
Ömer Duran
d61dd9c16e Places: Added location input and dialog components for better location selection. 2025-07-10 18:05:11 +02:00
Michael Mayer
1f53458111 Merge branch 'develop' into feature/batch-edit 2025-07-10 16:50:08 +02:00
Ömer Duran
287b921d4f Setup: Update user-data for PhotoPrismPI #5099
* Setup: Update user-data for PhotoPrismPI
* Setup: Replaces '<your IP address>' with '<IP address>'
2025-07-10 16:49:08 +02:00
Michael Mayer
66ae99e486 Merge branch 'develop' into feature/batch-edit 2025-07-10 11:16:46 +02:00
Michael Mayer
31614697a2 API: Update Swagger docs of batch edit endpoint #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 11:16:23 +02:00
Michael Mayer
1469b5ae78 Merge branch 'develop' into feature/batch-edit 2025-07-10 11:08:42 +02:00
Michael Mayer
2229ee32fb API: Add batch.PhotosResponse and update Swagger docs #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 11:08:17 +02:00
Michael Mayer
0d6fba0f62 Merge branch 'develop' into feature/batch-edit 2025-07-10 10:29:00 +02:00
Michael Mayer
41dc0febba API: Rename album and label value to "items" in batch edit response #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 10:28:47 +02:00
Michael Mayer
05113217e4 Merge branch 'develop' into feature/batch-edit 2025-07-10 10:18:13 +02:00
Michael Mayer
50c345f0ad API: Add empty Albums and Labels to the batch edit response #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 10:18:01 +02:00
Michael Mayer
2531616b53 Merge branch 'develop' into feature/batch-edit 2025-07-10 09:39:07 +02:00
Michael Mayer
38da638f88 API: Improve logging of bad request errors across all endpoints #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 09:38:36 +02:00
Michael Mayer
a2880be47d Merge branch 'develop' into feature/batch-edit 2025-07-10 09:06:23 +02:00
Michael Mayer
6bfbad40af API: Add batch edit form validation error to gin.Context #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-10 09:06:11 +02:00
Michael Mayer
5bfa14702b Merge branch 'develop' into feature/batch-edit 2025-07-09 16:53:04 +02:00
Michael Mayer
02ef7dbdee Develop: Upgrade base image from 250703-plucky to 250709-plucky
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-09 16:48:38 +02:00
Michael Mayer
845813d642 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-09 16:48:22 +02:00
Michael Mayer
ed005962bd Merge branch 'develop' into feature/batch-edit 2025-07-09 15:35:25 +02:00
graciousgrey
f99fee1fe7 Tests: Add unit tests #465 2025-07-09 14:57:32 +02:00
graciousgrey
ee443c066b Tests: Add unit tests #5089 2025-07-09 14:42:01 +02:00
graciousgrey
02109cf4e6 Tests: Add unit tests #5038 2025-07-09 14:42:01 +02:00
Michael Mayer
38e331a48d Intel QSV: Add libvpl2 if PHOTOPRISM_INIT is set to "intel" #4967 #5098
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-09 14:13:28 +02:00
Michael Mayer
940533c59e Merge branch 'develop' into feature/batch-edit 2025-07-09 13:31:02 +02:00
Ömer Duran
61683015f2 Places: Refactor Adjust Location dialog to reuse the p-map component #465 #5097
* Places: refactor location dialog to reuse PMap component
* Places: Refactor map and location dialog components coordinate validation
* Places: Update map and location dialog components to use coordinates array for better validation
* Places: Rename coordinates prop to latlng in map and location components for consistency
* Places: Simplify latlng watcher
* Places: Map component with animation settings and handle missing style images
2025-07-09 13:26:26 +02:00
Michael Mayer
c6cdcb6b1f Merge branch 'develop' into feature/batch-edit 2025-07-08 10:41:28 +02:00
Michael Mayer
9ad5a533af Backend: Update github.com/golang/geo in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-08 10:41:03 +02:00
Michael Mayer
2481de49c4 API: Improve form and tests for POST /batch/photos/edit endpoint #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-08 10:40:45 +02:00
Anastasiia
2a044832be Frontend: unblock Apply btn and send request with error #271" 2025-07-08 09:51:22 +02:00
Michael Mayer
004feeb708 Index: Re-determine media types when "Complete Rescan" is selected #5096
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-07 17:22:15 +02:00
Michael Mayer
f06c65c217 Merge branch 'develop' into feature/batch-edit 2025-07-07 12:45:51 +02:00
Michael Mayer
d28b3101e0 Build: Update .buildignore and .dockerignore files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-07 12:44:59 +02:00
Michael Mayer
ca9bac63e6 Merge branch 'develop' into feature/batch-edit 2025-07-07 11:15:30 +02:00
Michael Mayer
8fcc2a232b Live Photos: Reset duration and improve type checks when indexing #5089
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-07 11:15:02 +02:00
Michael Mayer
2a4627cc47 Merge branch 'develop' into feature/batch-edit 2025-07-06 14:07:02 +02:00
Michael Mayer
5ad7f6318b Live Photos: Require video type MOV as sidecar for HEIC and JPEG #5089
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 14:04:15 +02:00
Michael Mayer
efa57f417c Merge branch 'develop' into feature/batch-edit 2025-07-06 11:33:47 +02:00
Michael Mayer
cedc8799d3 Places: Update compose.yaml config examples #883
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 11:24:50 +02:00
Michael Mayer
5860b01248 Live Photos: Delete pkg/media/video/live.go #5089
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 11:10:24 +02:00
Michael Mayer
f80ac62e6b Live Photos: Only flag actual Live and Motion Photos as "Live" #5089
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 11:07:25 +02:00
Michael Mayer
57349bdb99 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 11:04:34 +02:00
Michael Mayer
0fc3ec8183 Frontend: Update .json translation files #5089 #5092
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 11:02:58 +02:00
Weblate
b582133df7 Weblate: Update frontend translations 2025-07-06 11:00:25 +02:00
Michael Mayer
037c0351d9 Docs: Update internal/api/swagger.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 10:58:31 +02:00
Michael Mayer
ff6151f84a Docs: Update license NOTICE files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 10:58:05 +02:00
Michael Mayer
3ff0ec01be Frontend: Add translations and update .po translation files #5089
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-06 10:57:12 +02:00
Michael Mayer
96356caaa6 Merge branch 'develop' into feature/batch-edit 2025-07-04 10:58:43 +02:00
Michael Mayer
595b116ae6 Config: Update automatically generated docs for configuration options
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-04 10:51:13 +02:00
Michael Mayer
73374cb325 Backup: Do not delete old dumps when filename is set manually #5088
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 20:59:54 +02:00
Michael Mayer
568fd0d62a Merge branch 'develop' into feature/batch-edit 2025-07-03 20:45:47 +02:00
Michael Mayer
77ac3b545f Darktable: Update install-darktable.sh script
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 20:38:02 +02:00
Michael Mayer
5b139b5c9e Merge branch 'develop' into feature/batch-edit 2025-07-03 19:47:05 +02:00
Michael Mayer
c49ba11288 Frontend: Reformat karma.conf.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 19:46:38 +02:00
Michael Mayer
395ee8426e Develop: Upgrade base image from 250630-plucky to 250703-plucky
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 19:34:44 +02:00
Michael Mayer
d43ec9492a Frontend: Update install-nodejs.sh script
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 19:27:30 +02:00
Michael Mayer
20a82df0e8 Frontend: Remove package eslint-plugin-promise
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 19:27:10 +02:00
Michael Mayer
f57792511e Merge branch 'develop' into feature/batch-edit 2025-07-03 12:58:57 +02:00
Michael Mayer
55704fea58 Frontend: Update dependencies in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 12:58:35 +02:00
Michael Mayer
02d8525ade Places: Add config option to specify location details locale #465 #883
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-03 12:58:20 +02:00
Michael Mayer
5c57d23990 Merge branch 'develop' into feature/batch-edit 2025-07-02 20:45:52 +02:00
Michael Mayer
4b1cc5d424 API: Update swagger.json #465
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 20:45:22 +02:00
Michael Mayer
829611c37f API: Update Swagger docs for the /api/v1/places endpoints #465
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 20:42:48 +02:00
graciousgey
cb208bc09f Tests: Adapt acceptance tests to changes 2025-07-02 17:14:22 +02:00
Michael Mayer
24b7b03f7b CSS: Move embedded map styles to css/places.css #465 #5080 #5082
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 12:23:45 +02:00
Michael Mayer
aba5faa870 CSS: Move embedded map styles to css/places.css #465 #5080 #5082
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 12:21:40 +02:00
Michael Mayer
915e9b4b6c Merge branch 'develop' into feature/batch-edit 2025-07-02 12:10:53 +02:00
Michael Mayer
1b4b478067 Frontend: Update translations in fr.json #5086
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 11:57:36 +02:00
Weblate
76f6f2d52f Weblate: Update frontend translations 2025-07-02 11:56:34 +02:00
Michael Mayer
5b152ac542 Metadata: Reset the day string value to 01 if exact day is unknown #5038
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 11:33:13 +02:00
Michael Mayer
d7298eeb80 Backend: Update github.com/golang/geo in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 11:07:13 +02:00
Michael Mayer
c18d04e104 Frontend: Update dependencies in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 11:00:18 +02:00
Michael Mayer
8b5b06d116 API: Add unit tests for new /api/v1/places endpoints #465 #5080 #5082
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-02 10:59:07 +02:00
Michael Mayer
7fb447897e Location: Update .json frontend translation files #465 #5080 #5082
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 17:33:17 +02:00
Weblate
9c5470744f Weblate: Update frontend translations 2025-07-01 17:30:53 +02:00
Michael Mayer
bd4ca7b848 Docs: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 17:28:46 +02:00
Michael Mayer
3a74db145a Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 17:28:33 +02:00
Michael Mayer
6bf5e03336 Backend: Regenerate assets/locales/js/default.po
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 17:27:27 +02:00
Michael Mayer
24025524ab Location: Update .po frontend translation files #465 #5080 #5082
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 17:27:08 +02:00
Michael Mayer
80ba7e9934 Location: Change "No results" message in dialog.vue #465 #5080 #5082
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 17:26:38 +02:00
Michael Mayer
a5c50b1301 Places: Refactor Location API, Dialog and Input #465 #5080 #5082
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 17:21:26 +02:00
Anastasiia
70665e6c24 Frontend: add new select-field Type #271" 2025-07-01 17:12:57 +02:00
Michael Mayer
318d38a1da Places: Round coordinates returned by s2.LatLng() #465 #5080
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 10:19:39 +02:00
Michael Mayer
08ae7b0229 Places: Add new package pkg/geo/latlng #465 #5080
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-07-01 10:12:54 +02:00
Ömer Duran
ee0f104262 UX: Refactor position dialog #465 #5082
* Places: Use $nextTick for state updates
* Places: Refactor duplicate code
2025-06-30 16:29:56 +02:00
Michael Mayer
a30c04bab6 UX: Adjust config of places search autocomplete component #465 #5080
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-30 10:21:04 +02:00
Ömer Duran
056c6f3917 UX: Replace v-menu with v-autocomplete and add loading state to apply button #465 #5080
* Places:  Replace v-menu with v-autocomplete for better search experience
* Places: Add loading state for location info retrieval
2025-06-30 09:38:01 +02:00
Michael Mayer
10f15431ff Videos: Set timestamps to zero when remuxing containers to MP4 #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-30 09:35:26 +02:00
Michael Mayer
1709f708ed Viewer: Disable video looping when seeking manually #1307 #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-30 09:35:26 +02:00
Michael Mayer
4475a8d914 Develop: Upgrade base image from 250608-plucky to 250630-plucky
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-30 09:35:26 +02:00
Simon Rettberg
00d1cddf37 Metadata: Update list of unwanted descriptions (#5078)
Signed-off-by: Simon Rettberg <simon.rettberg@rz.uni-freiburg.de>
2025-06-29 17:15:01 +02:00
Michael Mayer
a39c1d3248 Download: Skip Playlist test in dl_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-29 17:13:26 +02:00
Michael Mayer
dec24ece73 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-29 17:09:08 +02:00
Michael Mayer
fd33e54c20 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-29 17:08:06 +02:00
Michael Mayer
af3357bfdc Metadata: Update list of stop words in pkg/txt
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-29 17:07:05 +02:00
Michael Mayer
761cf6a47e Metadata: Refactor position input and dialog components #465 #5043 #5069
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-27 15:35:49 +02:00
Michael Mayer
7e2d55ece4 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-27 15:33:44 +02:00
Ömer Duran
0e66db223c UX: Improve GPS position input and dialog components #465 #5069
* Places: Remove the close button for design consistency #465
* Places: Enhance coordinate input in photo edit details #465
* Places: Refactor layout in location dialog #465
* Places: Improve layout and styling in location dialog #465
* Places: Delete coordinate input formatting in photo edit details #465
* Places: Create reusable coordinate input component
2025-06-27 12:38:42 +02:00
Keith Martin
22e865c66a SQLite: Fix "too many SQL variables" error when flagging pictures as hidden #3742 #5074
* Backend: Refactor update statement to resolve too many sql variables (retro fit from gorm2)
* Backend: Refactor subquery to gorm1 compliance
2025-06-27 12:28:50 +02:00
graciousgrey
3679c11c34 Scans: Add scan detection for epson scanner #5703 2025-06-26 11:42:22 +02:00
graciousgey
55575623c5 Tests: Adapt acceptance test #4999 2025-06-26 11:39:15 +02:00
graciousgrey
40df1d71cf Translations: Update fr.json 2025-06-26 09:25:05 +02:00
Weblate
c2d981e4d1 Weblate: Update frontend translations 2025-06-26 09:10:26 +02:00
Ömer Duran
aadde256eb Setup: Add Cloud-Init configuration for the PhotoPrismPi SD image #4414 #5068
This adds initial cloud-init configuration files for the automatic installation of PhotoPrism on a Raspberry Pi. The files include metadata, network configuration, and an in-depth user-data script that installs Docker, configures paths, sets services, and prepares the system for PhotoPrism with Traefik and MariaDB.
2025-06-25 14:44:39 +02:00
Michael Mayer
60cb5684c2 UX: Redirect to the collection page when albums are deleted #4994
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-25 13:20:42 +02:00
Michael Mayer
8cef088bba Places: Refactor location input and dialog styles #465 #5043
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-25 04:20:57 +02:00
Michael Mayer
7a2cb27c1f Places: Refactor search and reverse API endpoint validation #465 #5043
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-25 03:07:50 +02:00
Michael Mayer
033cfc4922 Places: Refactor search and reverse API endpoints #465 #5043
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-25 00:43:31 +02:00
Michael Mayer
bcbbbcd7b3 Backend: Add WebLocale formatting function to clean package #465 #5043
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-25 00:03:41 +02:00
Ömer Duran
baa5f2d9a0 UX: Add a map for selecting locations in the Edit dialog #465 #5043
* Frontend: Map Dialog first version
* Frontend: Simplify street address handling and remove reset location control in map dialog
* Frontend: Enhance map undo functionality
* Frontend: Refactor location info handling to use backend API for reverse geocoding
* Frontend: Improve coordinate input handling
* Frontend: Adjust layout in photo details
* Frontend: Add feature to clear coordinates
* Frontend: Update button alignment
* Frontend: Implement place search feature in map dialog
2025-06-24 23:22:16 +02:00
Ömer Duran
7d1c453960 Setup: Update DigitalOcean Docker configuration (#4978)
* Setup: Update Digital Ocean Docker Image

* Setup: update digital ocean docs

* Setup: Update Docker CE version in cloud README

* Setup: Update Traefik version to 3.4

* Setup: Update software versions in DigitalOcean README
2025-06-24 22:54:18 +02:00
Michael Mayer
4dc703c855 Frontend: Regenerate .json translation files #4994 #4999 #5067
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-24 21:44:32 +02:00
Weblate
58ffaf1bfa Weblate: Update frontend translations 2025-06-24 21:43:57 +02:00
Michael Mayer
d1c6efa2b6 Frontend: Regenerate .po translation files #4994 #4999
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-24 21:36:02 +02:00
Michael Mayer
595e528258 UX: Refactor album toolbar menu and add "danger" theme color #4994 #4999
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-24 21:34:51 +02:00
Ömer Duran
95cb881f56 Albums: Add "Delete Album" action to the album toolbar menu #4994 #4999
* Frontend: Add "Delete Album" option to album toolbar #4994
* Frontend: Replace dialog with confirmation dialog in toolbar #4994
* Frontend: Refine visibility condition for "Delete Album" option in toolbar #4994
2025-06-24 20:44:25 +02:00
graciousgey
702b83870f Tests: Add test #5018 2025-06-24 17:52:36 +02:00
Anastasiia
a62fb24d8d Frontend: add action logic for toggle fields #271" 2025-06-24 16:25:09 +02:00
Michael Mayer
e201e27842 Frontend: Update test deps and scripts in package.json #5014
This removes the "test-" prefix from vitest script targets.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-24 12:59:17 +02:00
Michael Mayer
a965c32188 Backend: Upgrade github.com/olekukonko/tablewriter from v0.0.5 to v1.0.7
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-24 12:48:38 +02:00
graciousgrey
982f864cc0 Translations: Update cs.json 2025-06-24 11:19:01 +02:00
Weblate
b054a1e09a Weblate: Update frontend translations 2025-06-24 11:01:20 +02:00
Anastasiia
efcfafd5b1 Frontend: fix select-field actions #271" 2025-06-24 10:21:37 +02:00
Anastasiia
57f08d5b30 Frontend: add setting action values for text and input fields #271" 2025-06-23 20:18:20 +02:00
findnature
b3bdd5d8ce Media: Replace sort.Slice with slices.Sort for natural ordering (#4981)
Signed-off-by: findnature <cricis@aliyun.com>
2025-06-23 15:38:55 +02:00
Michael Mayer
47f9a509b1 Backend: Update dependencies in go.mod and go.sum #5042
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-23 15:34:33 +02:00
graciousgrey
a49181f75d Tests: Skip unstable test #5014 2025-06-23 15:33:05 +02:00
Brandon Richardson
1d8fa4e3ea Backend: Set content-type on metrics endpoints (#5042)
The prometheus text format requires metrics endpoints respond with the
content-type 'text/plain; version=0.0.4'. Without this, newer versions
of prometheus fail to scrape the metrics endpoint and report an error.
It's possible to work around this by setting the
'fallback_scrape_protocol' setting in the prometheus scrape target
configuration, but this revision sets the content type appropriately to
avoid this in the first place.
2025-06-23 15:32:01 +02:00
Michael Mayer
758d86f903 Frontend: Update test deps in package.json and license NOTICE #5014
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-20 16:39:38 +02:00
Ömer Duran
a82d657b6b Frontend: Convert tests from mocha to vitest #5014
* Tests: convert all common tests from mocha to karma

* Tests: refactor Vuetify setup in tests

* Tests: update package-lock.json

* Tests: convert all model test to vitest 1/2

* Tests: convert all model test to vitest 2/2

* Tests: fix broken test

* Tests: time zone UTC

* Tests: Add playwright screenshots folder to gitignore

* Tests: Add timezone to vitest scripts

* Tests: Add Vitest scripts to Makefile

* Tests: delete unused timezone configs

* Tests: Update some tests

* Tests: Update vitest config

* Tests: Delete usesless try-catch
2025-06-20 16:28:26 +02:00
Ömer Duran
985e2febf4 Fix: timezone handling in sidebar component (#5015) 2025-06-20 01:22:39 +02:00
Michael Mayer
40be3cc290 Backend: Fix typo in inline function documentation #5059
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-20 01:19:49 +02:00
Michael Mayer
087594161e Frontend: Update *.json translation files #5061
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-19 20:13:38 +02:00
Weblate
a9d0f3e9a4 Weblate: Update frontend translations 2025-06-19 20:12:26 +02:00
Michael Mayer
44c85a8a46 Docs: Update license NOTICE files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-19 20:06:49 +02:00
Michael Mayer
55b8042c98 Auth: Update ACL grants and actions
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-19 20:04:33 +02:00
Michael Mayer
2596fe0252 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-19 18:37:35 +02:00
Michael Mayer
1e89fa5d32 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-19 18:37:07 +02:00
Michael Mayer
7d05ecab9a Frontend: Add .overflow-hidden style to css/layout.css #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-19 17:40:52 +02:00
graciousgrey
f7218f67e2 Classify: Improve rules.yml #5057 2025-06-19 09:14:02 +02:00
graciousgey
cdcfc69e05 Tests: Refactor acceptance tests 2025-06-17 20:20:48 +02:00
Anastasiia
2b77e5f929 Frontend: fix the name of image in the images list #271" 2025-06-17 12:26:10 +02:00
Anastasiia
402f674618 Frontend: fix mobile images list view #271" 2025-06-17 12:13:04 +02:00
Anastasiia
92440bcb75 Frontend: fix mobile images list view #271" 2025-06-17 12:06:26 +02:00
Anastasiia
e025e5a077 Frontend: fix white border for dark theme #271" 2025-06-16 17:58:42 +02:00
Anastasiia
011b3c0c77 Frontend: change logic for icons, fix batch edit model #271" 2025-06-16 17:32:03 +02:00
Michael Mayer
d57ee7b7ab Header: Add "Content-Language" const
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-12 02:30:48 +02:00
Michael Mayer
fd056913d8 Frontend: Improve user interface styles
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-12 00:32:58 +02:00
Michael Mayer
c8ce9ec772 Videos: Extract embedded metadata with ExifTool #4982 #4892 #5040
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-11 21:49:02 +02:00
Michael Mayer
6a65f86bf9 Frontend: Improve user interface styles
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-11 21:11:53 +02:00
Michael Mayer
42a22f1377 M2TS: Improve inline code docs #4982 #4892 #5040
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-11 19:26:43 +02:00
Michael Mayer
86fe4404ef M2TS: Extract embedded metadata with ExifTool #4982 #4892 #5040
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-11 19:22:20 +02:00
Michael Mayer
6fa0ab4734 Setup: Update inline docs in compose.yaml config examples #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-11 10:58:18 +02:00
Michael Mayer
7759aad68f Videos: Auto-install/update yt-dlp in the dev environment #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-11 10:54:09 +02:00
Michael Mayer
47a4d1ab0a Docs: Update license NOTICE files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-10 14:31:04 +02:00
Michael Mayer
38c8fec985 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-10 14:29:46 +02:00
Michael Mayer
e9a76efc3b Videos: Update yt-dlp when building new Docker images #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-10 14:27:03 +02:00
Michael Mayer
cf7aaa5059 Videos: Add "update-yt-dlp" init target to scripts/dist/Makefile #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-10 14:22:07 +02:00
Michael Mayer
dc265085a8 WebDAV: Add "/import/" path check to internal/service/heuristic.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-10 14:02:57 +02:00
Michael Mayer
03f5bb322d Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-10 14:01:47 +02:00
Michael Mayer
2e2ebab433 Videos: Improve downloading, remuxing, and transcoding #4982 #4892 #5040
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-06-09 15:31:23 +02:00
graciousgrey
a45d9d30b9 Update SPONSORS.md 2025-06-09 15:15:13 +02:00
graciousgrey
7a1929797c Translations: Update fr.po 2025-06-07 08:51:18 +02:00
Weblate
1ac9a8a3bf Weblate: Update frontend translations 2025-06-07 08:23:22 +02:00
Anastasiia
0227d495e7 Frontend: add delete/undo button when input-field has value #271" 2025-05-28 16:30:19 +02:00
Anastasiia
7d74d58a98 Frontend: add toggle-fields functionality #271" 2025-05-27 23:10:59 +02:00
Anastasiia
a2e9eae388 Frontend: add delete/undo buttons functionality for input-fields #271" 2025-05-27 20:47:07 +02:00
Anastasiia
78143a08ee Frontend: add delete/undo buttons functionality for text-fields #271" 2025-05-27 14:54:03 +02:00
graciousgrey
f98f2bcc8e Translations: Update hu.json and zh.json 2025-05-26 11:58:17 +02:00
Weblate
eda33e2032 Weblate: Update frontend translations 2025-05-26 11:46:53 +02:00
graciousgey
cf9258949a Tests: Adapt acceptance tests to be more stable 2025-05-25 11:26:56 +02:00
Michael Mayer
ae530fec1b CLI: Force overwrite of existing video and metadata downloads #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-25 07:03:35 +02:00
Michael Mayer
3bcc415c06 Frontend: Update package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-25 01:47:02 +02:00
Michael Mayer
72fdd05358 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-25 01:41:28 +02:00
Michael Mayer
798c77464e Develop: Upgrade base image from 250507-plucky to 250524-plucky #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-25 01:40:13 +02:00
Michael Mayer
69600fdbe3 Video Downloads: Update test video URL #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-25 01:33:59 +02:00
Michael Mayer
03dba1fe20 Video Downloads: Set --playlist-index and --embed-metadata flags #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-25 01:20:59 +02:00
graciousgrey
2499b13f51 Tests: Add unit tests #271 2025-05-21 13:16:11 +02:00
Anastasiia
15b6a3331d Frontend: add the placeholder/value checking for select-fields #271" 2025-05-19 21:02:27 +02:00
raystlin
c682a94a07 Updated vision.yml testdata
This version adds the new fields to the test configuration
2025-05-18 11:08:34 +00:00
raystlin
f28f3d1a07 Fixed format on model_external_test
make fmt-go was applied
2025-05-18 11:06:34 +00:00
graciousgey
af832247fc Tests: Update testcafe timeouts 2025-05-16 16:48:55 +02:00
Michael Mayer
d691f59594 Merge branch 'develop' into feature/batch-edit 2025-05-15 16:37:46 +02:00
Michael Mayer
a5aef038ef Batch Edit: Fix PhotoLng.Mixed flag in form/batch/photos.go #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-15 16:37:28 +02:00
Anastasiia
d01823d130 Frontend: add the placeholder/value checking for input-fields #271" 2025-05-15 13:39:49 +02:00
graciousgey
fce886f077 Tests: Refactor page model for more stability 2025-05-15 08:57:50 +02:00
raystlin
7214479bc4 Merge remote-tracking branch 'upstream/develop' into feature/custom-tf-model-127 2025-05-14 21:08:35 +00:00
Anastasiia
6240d2e31e Frontend: add the placeholder/value checking #271" 2025-05-14 22:19:16 +02:00
graciousgrey
876a421ad7 Frontend: Update ja.json 2025-05-14 14:18:44 +02:00
Weblate
8292f97469 Weblate: Update backend translations 2025-05-14 13:12:48 +02:00
Weblate
f5ee512a70 Weblate: Update frontend translations 2025-05-14 13:12:21 +02:00
graciousgrey
0ecc08750b Tests: Update test commands 2025-05-14 10:58:49 +02:00
Anastasiia
91d65a9b07 Merge remote-tracking branch 'origin/feature/batch-edit' into feature/batch-edit 2025-05-13 19:38:47 +02:00
Anastasiia
9230b585c1 Frontend: fix gettext in details.vue #271" 2025-05-13 19:38:30 +02:00
Anastasiia
86bf05293b Frontend: add toggle functionality, fix title, add form logic #271" 2025-05-13 19:38:10 +02:00
Michael Mayer
f840efd90e Merge branch 'develop' into feature/batch-edit 2025-05-13 14:37:29 +02:00
Michael Mayer
4326523194 GitHub: Update PULL_REQUEST_TEMPLATE.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 14:36:55 +02:00
Michael Mayer
465245eb85 GitHub: Update PULL_REQUEST_TEMPLATE.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 14:30:55 +02:00
Ömer Duran
7ab90720ff Tests: write Initial Tests for .vue Components (#5003)
* Tests: Add initial Vue component tests
* Tests: Update package scripts
2025-05-13 11:53:17 +02:00
Michael Mayer
e17bd03a14 Merge branch 'develop' into feature/batch-edit 2025-05-13 11:34:35 +02:00
Michael Mayer
b642be2c91 API: Update swagger.json endpoint documentation #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 11:34:23 +02:00
Michael Mayer
cfc8bac26f Batch Edit: Return -2 for mixed CameraID and LensID values #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 11:08:04 +02:00
Michael Mayer
e754af0e08 Batch Edit: Return -2 for mixed day, month, and year values #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 10:50:47 +02:00
Michael Mayer
1b87d57442 Merge branch 'develop' into feature/batch-edit 2025-05-13 10:25:19 +02:00
Michael Mayer
bf37bf44c7 API: Update swagger.json endpoint documentation #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 10:24:17 +02:00
Michael Mayer
9a39adebae API: Refactor /batch/photos/edit endpoint to return "models" #271
The "photos" array in the response has been renamed to "models". This
data is now always returned, so using the "return" flag in the request
is no longer necessary.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 10:22:35 +02:00
Michael Mayer
bdaab4b412 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 10:09:27 +02:00
Michael Mayer
e89efc9d39 Clean: Add version assertions to version_test.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-13 10:06:07 +02:00
raystlin
05808241b9 Fix AI Faces test.
The test was broken because of the new parameters
2025-05-12 18:48:42 +00:00
raystlin
38956e0f4a Merge remote-tracking branch 'upstream/develop' into feature/custom-tf-model-127 2025-05-12 18:46:57 +00:00
Michael Mayer
699cff429c GitHub: Update PULL_REQUEST_TEMPLATE.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-10 12:05:48 +02:00
Anastasiia
ff8a5308d2 Frontend: add getting data from the request with images #271" 2025-05-09 23:32:53 +02:00
Michael Mayer
f6908837ee Vision Client: Allow a custom prompt to be included in requests
see https://github.com/photoprism/photoprism-vision/issues/11

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-09 18:59:28 +02:00
graciousgrey
832ae90652 Frontend: Open thumb fromPhotos on the batch edit dialog #271 2025-05-09 12:17:54 +02:00
Michael Mayer
9c16bb11b8 GitHub: Update PULL_REQUEST_TEMPLATE.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-09 10:05:36 +02:00
graciousgrey
e02f543808 Frontend: Open thumb fromPhotos on the labels tab 2025-05-08 13:02:33 +02:00
Michael Mayer
0e74afa358 GitHub: Update PULL_REQUEST_TEMPLATE.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 05:31:58 +02:00
Michael Mayer
53d43f7933 GitHub: Update PULL_REQUEST_TEMPLATE.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 04:51:50 +02:00
Michael Mayer
0597269fc4 GitHub: Update PULL_REQUEST_TEMPLATE.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 04:49:23 +02:00
Michael Mayer
bf2ece0023 Merge branch 'develop' into feature/batch-edit 2025-05-08 01:39:21 +02:00
Michael Mayer
1554d52b00 Frontend: Update yaml dep in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 01:38:37 +02:00
Michael Mayer
3c09bb9475 Frontend: Update babel deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 01:35:59 +02:00
Michael Mayer
9c16aa6227 Merge branch 'develop' into feature/batch-edit 2025-05-08 01:22:52 +02:00
Michael Mayer
43238cf6e4 Frontend: Update dependencies in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 01:22:18 +02:00
Michael Mayer
7958239f7e Vision Client: Add configured model version to request data #1090
also see https://github.com/photoprism/photoprism-vision/issues/1

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 01:19:13 +02:00
Michael Mayer
2eb731e721 Develop: Update GPU device count in compose.nvidia.yaml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 00:24:34 +02:00
Michael Mayer
ade2c5e269 Develop: Upgrade base image from 250505-plucky to 250507-plucky
The new image includes updated dependencies such as Go v1.24.3.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-08 00:22:22 +02:00
graciousgrey
2ddfa5c9a1 Tests: Add unit tests #4947 2025-05-07 15:00:09 +02:00
graciousgrey
1a794da1fe Tests: Add unit tests #4969 2025-05-07 12:03:50 +02:00
Michael Mayer
dd1f3b820f Frontend: Update fr.json and ja.json translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-06 17:01:32 +02:00
Cathie Integra
39e8b5b9ad Weblate: Update frontend translations (#4993)
Co-authored-by: Weblate <noreply@weblate.org>
2025-05-06 17:00:31 +02:00
graciousgrey
cccb0ca00a Tests: Add unit tests 2025-05-06 16:52:02 +02:00
Michael Mayer
e0034ec1b0 Merge branch 'develop' into feature/batch-edit 2025-05-06 16:24:20 +02:00
Michael Mayer
ade59eebf0 Docs: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-06 16:23:41 +02:00
Michael Mayer
7b2a9a11c3 Backend: Update dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-06 16:23:22 +02:00
Michael Mayer
2e626b8221 Backend: Run fmt-go to format photos_test.go and selection_test.go #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-06 16:22:51 +02:00
Ömer Duran
4f04ffe133 Frontend: Integrate Vitest test framework #4990
- Includes fixtures and mocks system for API and models as well as npm scripts for running tests, watch mode, coverage and UI
- Adds test setup with JSDOM environment and utility function tests
- Converts marker model tests from Mocha/Chai to Vitest
2025-05-06 16:18:39 +02:00
Michael Mayer
b5d2d1c7fb Makefile: Remove "docker-" prefix from nvidia and intel targets
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-06 16:02:08 +02:00
Cathie Integra
d18be7e76c Weblate: Update frontend translations (#4991)
Co-authored-by: Weblate <noreply@weblate.org>
2025-05-06 15:32:31 +02:00
Michael Mayer
2787059411 GitHub: Update question.md and PULL_REQUEST_TEMPLATE.md templates
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-06 15:07:59 +02:00
graciousgrey
5e4d258860 Tests: Add unit tests #271 2025-05-06 14:45:58 +02:00
graciousgrey
79b6a75703 API: Add security definitions to swagger annotations 2025-05-05 16:50:33 +02:00
Michael Mayer
723dee6620 Develop: Upgrade base image from 250502-plucky to 250505-plucky #4979
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 12:23:00 +02:00
Michael Mayer
cbcee62444 Dist: Update install-tensorflow.sh script #4979
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 11:57:54 +02:00
Michael Mayer
4349087272 Entity: Use Db() instead of UnscopedDb() in details_fixtures.go
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 11:17:11 +02:00
Michael Mayer
83717bda02 TensorFlow 2: Build AMD64 binaries for generic x86-64 march #4979
see https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 10:57:01 +02:00
Michael Mayer
333c54f3a2 TensorFlow 2: Build AMD64 binaries with "nocona" compatibility #4979
see https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 10:46:22 +02:00
Michael Mayer
80e6d02509 TensorFlow 2: Build AMD64 binaries with Prescott compatibility #4979
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 10:41:58 +02:00
Michael Mayer
4484b885d4 TensorFlow 2: Update docker/tensorflow/Makefile #4979
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 10:33:49 +02:00
Michael Mayer
2b788fd258 TensorFlow 2: Build AMD64 binaries with Pentium 4 compatibility #4979
see https://github.com/photoprism/photoprism/discussions/4979

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 10:32:32 +02:00
Michael Mayer
de9ee0a04d Merge branch 'develop' into feature/batch-edit 2025-05-05 09:26:22 +02:00
Michael Mayer
c4ddc4a119 API: Remove unused Filter property from batch request forms #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 09:25:52 +02:00
Michael Mayer
d44233d811 Merge branch 'develop' into feature/batch-edit 2025-05-05 09:08:29 +02:00
Michael Mayer
3d325015af Setup: Update nvidia/compose.yaml configuration example #4986
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 09:06:17 +02:00
Michael Mayer
f50bae84b1 Develop: Update compose.nvidia.yaml and compose.intel.yaml #4986
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 09:05:55 +02:00
Michael Mayer
a55b3ecc9c Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 08:57:39 +02:00
Michael Mayer
6bd86d6032 Develop: Update compose.nvidia.yaml configuration #4986
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 08:57:24 +02:00
Michael Mayer
ca843987f7 Setup: Update compose.yaml configuration examples #4986
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-05 07:40:21 +02:00
Michael Mayer
a9d87aa8c8 Merge branch 'develop' into feature/batch-edit 2025-05-04 16:00:33 +02:00
Michael Mayer
fdea09518c UX: Remove transition from "scroll to top" button for faster rendering
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-04 16:00:06 +02:00
Michael Mayer
6462ddc628 Merge branch 'develop' into feature/batch-edit 2025-05-04 15:29:54 +02:00
Michael Mayer
b6d031a4ba API: Omit markers when serializing JSON search results #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-04 15:09:40 +02:00
Michael Mayer
576d6c1201 Merge branch 'develop' into feature/batch-edit 2025-05-04 14:34:37 +02:00
Michael Mayer
3d730884ce Docs: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-04 14:33:33 +02:00
Michael Mayer
b20f9d6e50 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-04 14:32:32 +02:00
Michael Mayer
5973aeca5f Backend: Update dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-04 14:31:09 +02:00
Michael Mayer
6e999eb2cc Merge branch 'develop' into feature/batch-edit 2025-05-04 14:09:48 +02:00
Michael Mayer
dd6e17e97e API: Rename /batch/photos endpoint to /batch/photos/edit #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-04 14:09:23 +02:00
Michael Mayer
8264cd090f Merge branch 'develop' into feature/batch-edit 2025-05-03 12:44:10 +02:00
Michael Mayer
b423b1980b API: Add /batch/photos endpoint to get metadata of selected photos #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-03 12:43:01 +02:00
graciousgrey
43ff8b2a8d Tests: Add unit tests 2025-05-03 10:25:58 +02:00
Michael Mayer
c80f703ecd UX: Maintain scroll position when refreshing search results #4985
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-03 10:05:53 +02:00
Michael Mayer
bd4b7b3ad3 API: Update swagger.json endpoint documentation
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-03 09:30:42 +02:00
Michael Mayer
6f3f1fd392 Backend: Update dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-03 09:29:41 +02:00
Michael Mayer
6b4a32a1b3 UX: Optimize generation of thumbnail image URL in photo.js #4985
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-03 09:25:55 +02:00
Michael Mayer
033a956e21 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-03 09:12:57 +02:00
graciousgey
a23058ce4b Tests: Refactor acceptance tests 2025-05-02 18:44:32 +02:00
graciousgrey
b61f3063d9 Tests: Add unit tests #4973 2025-05-02 18:39:40 +02:00
Michael Mayer
d530ab4f23 Frontend: Regenerate translation .po files #4980
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 14:32:33 +02:00
Michael Mayer
4677579f9a i18n: Change locale "ja_JP" to "ja", so it matches the filename #4980
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 14:30:37 +02:00
Michael Mayer
4a992dc350 CLI: Add image, vector, raw, pdf, and audio support to dl command #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 13:55:52 +02:00
Theresa Gresch
fb0c22fb4b Merge pull request #4974 from photoprism/unit-test-stack-original-name
Tests: Add unit tests for photo stack determination and original file retrieval
2025-05-02 12:25:01 +02:00
Michael Mayer
607b285443 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 12:17:14 +02:00
Michael Mayer
de14b30570 Videos: Add "photoprism dl" CLI command to import from a URL #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 12:16:59 +02:00
Michael Mayer
06529c3854 Develop: Upgrade base image from 250426-plucky to 250502-plucky #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 10:06:18 +02:00
Michael Mayer
8faf3fc918 Import: Add ytdl package for downloading videos from URLs #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 10:04:34 +02:00
Michael Mayer
a7d927a83b Videos: Add install-yt-dlp.sh script #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-05-02 09:57:52 +02:00
hardlydearly
060924c19a Backend: Use slices.Contains to simplify code (#4975)
Signed-off-by: hardlydearly <799511800@qq.com>
2025-04-30 15:25:05 +02:00
graciousgrey
bb67dca507 Tests: Add unit tests and test fixtures 2025-04-30 14:07:04 +02:00
Anastasiia
275e6b62ea Frontend: add search request to load selected photos #271" 2025-04-29 21:57:26 +02:00
Ömer Duran
9526f1d4dc Tests: Add unit tests for photo stack determination and original file retrieval 2025-04-29 21:54:11 +03:00
graciousgey
8ce192ceba Tests: Refactor sharing test to be stable 2025-04-29 16:45:44 +02:00
Theresa Gresch
d0f7393ebe Merge pull request #4972 from photoprism/cover-test-improvements
Tests: Enhance album cover selection logic in acceptance tests
2025-04-29 10:24:52 +02:00
Michael Mayer
fe3071ba18 Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-29 08:56:32 +02:00
Michael Mayer
a64e2ea445 Sharing: Allow authenticated clients to share albums #4973
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-29 08:54:16 +02:00
Radon Rosborough
138cc3c458 Upload: Generate a more elegant random token #4970 #4971
* Upload: More elegant generateToken
* Add unit test
2025-04-29 08:01:44 +02:00
Ömer Duran
aeaa39969b Tests: Enhance album cover selection logic in acceptance tests 2025-04-29 01:46:53 +03:00
Anastasiia
1d9dbbef2f Frontend: add max height to images on mobile, optimize layout #271" 2025-04-28 18:47:11 +02:00
graciousgey
ba8d38a761 Tests: Refactor acceptance tests 2025-04-28 10:35:54 +02:00
Michael Mayer
05b68db22d Config: Update internal/api/swagger.json #4969
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-27 15:08:32 +02:00
Michael Mayer
3f2f0a7e67 Config: Allow FFmpeg bitrate limit to be disabled with -1 #4969
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-27 15:07:28 +02:00
Michael Mayer
eb4fc032ff Config: Add preset, quality, and device options for FFmpeg #4969
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-27 14:36:36 +02:00
raystlin
6565fb2d6f AI: Fixed unitialization problems
* vision_list command failed silently for models without meta.
* face model panicked for models without meta.
2025-04-27 10:41:53 +00:00
Michael Mayer
27ec7a1282 Videos: Add "va-driver-all" and "libva2" to Docker base images #4967
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 11:41:01 +02:00
Michael Mayer
9ab1772b64 Develop: Export SEMVER_MAJOR and SEMVER_MINOR in Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 11:25:01 +02:00
Michael Mayer
a3883c1cd4 Docs: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 11:11:18 +02:00
Michael Mayer
591ec1fad7 Backend: Update dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 11:10:51 +02:00
Michael Mayer
a7ee4a6cff Frontend: Update dependencies in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 11:10:29 +02:00
Michael Mayer
98f2cbd51b Develop: Export SEMVER_VERSION, BUILD_TAG and BUILD_ARCH in Makefile
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 10:59:26 +02:00
Michael Mayer
eb9c64772f Develop: Upgrade base image from 250418-plucky to 250426-plucky #4967
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 09:40:50 +02:00
Michael Mayer
8fbe03ee1b Videos: Update driver packages for Intel QSV and add "amd" target "#4967
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-26 09:09:26 +02:00
Anastasiia
b64202aefd Frontend: photo viewer hide edit button #271" 2025-04-25 18:11:53 +02:00
Anastasiia
4b8191a308 Frontend: Fix dialog width, icons position, mobile view, renamed label and add two scroll #271" 2025-04-25 16:45:07 +02:00
Anastasiia
1ec4adf44f Frontend: Center the checkbox of the selected photos in the column #271" 2025-04-25 16:41:04 +02:00
Michael Mayer
21ddba4595 Setup: Install optimized TensorFlow 2 version on first startup #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-25 11:05:21 +02:00
Michael Mayer
cbc415d32b CLI: Correct indentation of backup and restore command descriptions
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-25 08:34:43 +02:00
Michael Mayer
71a623b5e0 Docker: Increase TF_CPP_MIN_LOG_LEVEL from 2 (info) to 4 (error)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-25 07:56:27 +02:00
Michael Mayer
eddb096adb Docker: Reduce MALLOC_ARENA_MAX from 4 to 2 for less memory consumption
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-25 07:52:49 +02:00
Anastasiia
9c0a5d4101 Merge develop into feature/batch-edit #271" 2025-04-24 16:37:44 +02:00
Michael Mayer
f73b703123 Videos: Increase transcoding bitrate limit default to 60 Mbps #1307
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 11:59:29 +02:00
Michael Mayer
9e39b2f81d Videos: Improve log message when file has already been transcoded #1307
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 11:25:15 +02:00
Michael Mayer
fed0cfff6a Videos: Stream AVC only if native format/codec is not supported #1307
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 11:18:10 +02:00
Michael Mayer
cc5a4a6fd8 NSFW: Remove "nsfw:" prefix from returned errors
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 08:49:00 +02:00
Michael Mayer
7c7f89b2ac Convert: Update commands after upgrading ImageMagick from v6 to v7 #4963
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 08:48:13 +02:00
Michael Mayer
2a2a55b9fa Docs: Update license NOTICE files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 07:24:01 +02:00
Michael Mayer
451c172a70 Docs: Update internal/api/swagger.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 07:23:47 +02:00
Michael Mayer
5648469247 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 07:22:24 +02:00
Michael Mayer
c6e571aab1 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-24 07:22:14 +02:00
Michael Mayer
f2a89063c6 Metadata: Fix typo in LocationUTC() function #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 17:54:33 +02:00
Michael Mayer
e59fdded1b Metadata: Preserve UTC time when a location time zone is set #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 17:15:49 +02:00
Michael Mayer
56ba9f1ee5 Metadata: Use Local time for file modification timestamps #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 16:15:00 +02:00
Michael Mayer
5e77c6a3bb Metadata: Improve timezone parsing in /pkg/time/tz #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 15:35:43 +02:00
Michael Mayer
4c7ca93dcc Metadata: Improve handling of Local and UTC timezones #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 15:08:15 +02:00
Michael Mayer
947e7a0fb1 Metadata: Normalize timezone names from YAML sidecar files #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 13:39:22 +02:00
Michael Mayer
d96b8027bd Metadata: Ensure that time zone names are always normalized #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 13:29:48 +02:00
Michael Mayer
8e17a8780b Backend: Limit error message chars, not runes
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 13:25:55 +02:00
Michael Mayer
36afc4a215 Backend: Clip error messages when too long
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 13:22:52 +02:00
Michael Mayer
c4d4b91488 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 12:52:37 +02:00
Michael Mayer
b9dda9337a Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 12:52:21 +02:00
Michael Mayer
5cd2c25489 Metadata: Move timezone related functions to /pkg/time/tz #4622 #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-23 12:50:12 +02:00
Michael Mayer
598be273aa Metadata: Set time zone based on location #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 15:45:18 +02:00
Michael Mayer
2a9741e826 Metadata: Default to "Local" if no time zone is set #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 14:44:50 +02:00
Theresa Gresch
44a3a9dcba Merge pull request #4944 from photoprism/test/album-cover-setting
Tests: Add test for setting album cover
2025-04-22 13:21:28 +02:00
Michael Mayer
da7af617f7 Docs: Update internal/api/swagger.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 10:48:51 +02:00
Michael Mayer
4bd4d17c5c Docs: Update license NOTICE files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 10:48:32 +02:00
Michael Mayer
20036b5de0 Frontend: Update .po translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 10:48:03 +02:00
Michael Mayer
582fc5d359 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 10:46:47 +02:00
Michael Mayer
c9777b39ed Frontend: Upgrade maplibre-gl to v5.4.0 in package.json #4959
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 10:46:26 +02:00
Michael Mayer
3bf5e59c63 Places: Add raster planet and hillshading tiles to Default map #4959
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-22 10:42:54 +02:00
Michael Mayer
bb8d835034 Frontend: Update .po and .json translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-21 12:54:52 +02:00
Cathie Integra
f8563adbcc Weblate: Update frontend translations (#4958)
Co-authored-by: Weblate <noreply@weblate.org>
2025-04-21 12:52:59 +02:00
Michael Mayer
e616ced26e Places: Remove "Buildings" map style (now included in Default)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-21 12:52:10 +02:00
Michael Mayer
264a1d67f6 Places: Add "Buildings" map style
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-20 19:45:31 +02:00
Michael Mayer
7d56a454dc Viewer: Remove experimental flag checks for info sidebar #4930 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 18:50:11 +02:00
Michael Mayer
a86d64b828 Viewer: Remove experimental flag check for info sidebar #4930 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 18:49:12 +02:00
Michael Mayer
ddf5924917 Viewer: Ignore jpeg codec for non-image media types #4930 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 18:19:26 +02:00
Michael Mayer
f50d833a0e Viewer: Display additional metadata in the Info sidebar #4930 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 18:13:18 +02:00
Ömer Duran
91ebcfab33 Tests: Implement album cover setting functionality across multiple pages 2025-04-19 16:24:29 +02:00
Michael Mayer
27b72aa1e9 Search: Parse lat,lng string into float64 coordinates #4930 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 16:04:44 +02:00
Michael Mayer
e7bb9bfb56 Viewer: Add link to maplibre.org/maputnik/ in comments #4930 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 14:52:43 +02:00
Michael Mayer
bbac7b91f0 Viewer: Don't render sidebar map when Places is disabled #4930 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 14:46:02 +02:00
Michael Mayer
ecf8af193b Viewer: Refactor #4930 to load dynamic map in info sidebar #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 14:24:41 +02:00
Ömer Duran
ca1f5cf781 Tests: Fix album cover test using proper selectors 2025-04-19 11:46:16 +02:00
Ömer Duran
140dc7b23c Viewer: Add Interactive Map to Sidebar Info (#4930)
* Backend: Clean up Unix socket file on shutdown

* Backend: Clean up Unix socket file on startup

* Backend: Clean up Unix socket file

* Refactor Unix socket cleanup in server startup process

* Viewer: Reorganize the sidebar to display additional metadata attributes based on file type #4812

* Viewer: Add map view to sidebar #4812

* Viewer: Improve sidebar metadata spacing. #4812

* Viewer: Optimize megapixels calculation #4812

* Viewer: Move styles to lightbox.css #4812

* Viewer: Removing click event from Lat Lng #4812

* Viewer: Adjust css for map

* Viewer: extract map component from sidebar info

* fix: restore actions array in sidebar info

* Viewer: Offline map feature removed from sidebar

* Viewer: Use TakenAtLocal for consistent sidebar date format

* Viewer: Add zoom controls to the map component

* Viewer: Add map attribution in sidebar with default collapsed state
2025-04-19 11:15:06 +02:00
Michael Mayer
f0629cb151 Frontend: Update dependencies in go.mod and go.sum #4952
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 11:05:58 +02:00
Michael Mayer
d60a4c5767 Frontend: Update timestamp formats #4952
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-19 11:02:20 +02:00
Ömer Duran
555936d939 Merge branch 'develop' into test/album-cover-setting 2025-04-19 10:20:28 +02:00
Michael Mayer
79ceeb1ada Settings: Apply custom time zone under App Passwords and Services #4952
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 17:14:01 +02:00
Michael Mayer
e811422c44 Config: Shorten time zone in timestamps #4952
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 16:41:13 +02:00
Michael Mayer
4a0f285a2c Config: Use configured timezone for logs, errors and mod dates #4952
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 16:06:15 +02:00
Michael Mayer
a746cc1779 Docker: Upgrade libheif to v1.19.7 in jammy base images
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 14:43:42 +02:00
Michael Mayer
ac8ee9e4dd Build: Change variable export in Makefiles for Make v4 compatibility
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 13:52:14 +02:00
Michael Mayer
9e521b244d Develop: Upgrade default base image from oracular to plucky
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 13:12:47 +02:00
Michael Mayer
eb228b0e45 Docker: Install libheif v1.19.5 in jammy base images
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 12:54:26 +02:00
Michael Mayer
b64ba76bc5 Scripts: Update install-libheif.sh and install-tensorflow.sh
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 12:53:56 +02:00
Michael Mayer
bdf97fff58 Makefile: Add build-libheif build commands for Ubuntu 25.04 (Plucky)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 11:55:19 +02:00
Michael Mayer
fa3d7d831d Dist: Update install-libheif.sh script and related Makefile targets
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 11:51:37 +02:00
Michael Mayer
da4e9d57c1 Develop: Add deploy image for Ubuntu 25.04 (Plucky Puffin)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 11:24:11 +02:00
Michael Mayer
d7ea086c5d Develop: Add Docker base image files for Ubuntu 25.04 (Plucky Puffin)
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 11:18:17 +02:00
Michael Mayer
9e56672019 Frontend: Update dependencies in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 11:17:20 +02:00
Michael Mayer
7dad78eb91 Backend: Update Go dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 11:16:59 +02:00
Michael Mayer
d15c6e59fa Frontend: Update .json translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 11:07:46 +02:00
Weblate
1c086455e2 Weblate: Update frontend translations 2025-04-18 11:07:06 +02:00
Michael Mayer
9b78cc3406 Frontend: Update .po translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-18 10:58:32 +02:00
graciousgey
c83d5f2f17 Tests: Adapt acceptance tests 2025-04-17 18:07:09 +02:00
graciousgrey
53c853dae5 Tests: Add unit tests #4942 2025-04-17 15:40:42 +02:00
Michael Mayer
b6423e5090 UX: Add wide sidepanel style for batch edit dialog #271
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 15:13:45 +02:00
Michael Mayer
5877be38df Search: Improve generated search filter documentation #4947
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 12:51:09 +02:00
Michael Mayer
7da6a97d15 Search: Improve generated search filter documentation #4947
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 12:46:57 +02:00
Michael Mayer
2b66db8216 Search: Improve generated search filter documentation #4947
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 12:44:27 +02:00
Michael Mayer
46e4810391 Search: Improve generated search filter documentation #4947
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 12:40:46 +02:00
Michael Mayer
f7b80bf34d Search: Update generated search filter documentation #4947
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 12:12:02 +02:00
Michael Mayer
9c33235a83 Frontend: Update dependencies and package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 11:38:32 +02:00
Michael Mayer
04ac2a383e Search: Find pictures with a specific term in Title or Caption #4947
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-17 11:38:08 +02:00
Michael Mayer
dff52f8ca0 Frontend: Update vuetify from v3.8.1 to v3.8.2 in package.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 19:48:49 +02:00
Michael Mayer
23a1182d00 Settings: Ensure that defaults are used instead of empty values
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 19:28:05 +02:00
Michael Mayer
b3a38224af Settings: Change the initial maps style to "default"
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 18:15:03 +02:00
Michael Mayer
1b519fbc33 Places: Change the Default map setting value to "default"
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 18:09:23 +02:00
Michael Mayer
49e84c4a7f Config: Apply configured default time zone to user settings #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 17:56:57 +02:00
Michael Mayer
557a25a6b5 Metadata: Change date_med_tz to datetime_med_tz #4812 #4946 #4930
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 17:39:08 +02:00
Michael Mayer
a440eb6bc7 Metadata: Update tests after changing Local timezone identifier #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 17:36:25 +02:00
Michael Mayer
5f32d75700 Metadata: Use "Local" as identifier for the local time zone #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 17:12:37 +02:00
Michael Mayer
dddfee3920 Frontend: Update .po translation files #4946
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 17:10:35 +02:00
Michael Mayer
e21bdc3b22 Frontend: Update translation .json files #4945
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 12:52:27 +02:00
Weblate
3f5e040a5a Weblate: Update frontend translations 2025-04-16 12:50:49 +02:00
Ömer Duran
4096583b1c Tests: Remove 'only' flag from album cover test 2025-04-16 10:50:15 +02:00
Ömer Duran
33afc04d86 Tests: Add test for setting album cover 2025-04-16 10:48:42 +02:00
raystlin
d082929dee Removed parameter Channels
It seems to be standarized, so it is now used as an additional check for
input signatures.
2025-04-16 08:19:58 +00:00
Michael Mayer
6ee74461ed API: Update swagger.json docs
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 10:10:15 +02:00
Michael Mayer
a446218933 Docs: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 10:10:01 +02:00
Michael Mayer
35e0e112bd Frontend: Update translation .po and .json files #4942
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 10:09:22 +02:00
Michael Mayer
f28aaac518 Frontend: Update deps in package.json and package-lock.json #4942
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 10:08:47 +02:00
Michael Mayer
fbcd210578 UX: Add language selector to login page #4942
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 10:07:32 +02:00
Michael Mayer
fcd17f8859 Frontend: Update translation .json files #4941
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-16 10:07:32 +02:00
Weblate
af7c71e762 Weblate: Update frontend translations 2025-04-16 10:07:26 +02:00
Weblate
e1b9946448 Weblate: Update frontend translations 2025-04-16 08:12:47 +02:00
Michael Mayer
7f4f63775d Frontend: Update translation .po and .json files #4939
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-15 17:00:02 +02:00
Weblate
208ff18a5d Weblate: Update frontend translations 2025-04-15 16:57:55 +02:00
Michael Mayer
c22b118dd6 MediaFile: Use thumb.FileInfo() to determine image width and height
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-15 15:43:24 +02:00
Michael Mayer
96dbb5ccbc Config: Refactor command flags, reports, and client options
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-15 15:42:03 +02:00
Michael Mayer
2c47644ea8 Metadata: Add "local" as an alias for an unknown (local) time zone
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-15 15:39:04 +02:00
Michael Mayer
161b18e5e8 Backend: Update Go dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-15 15:35:36 +02:00
Michael Mayer
55394d4137 AI: Remove Hidden flag from "photoprism vision run" command #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-15 14:51:55 +02:00
Anastasiia
97ad4710b4 Frontend: Add expansion panel for the photos list on mobile view #271" 2025-04-14 22:31:13 +02:00
raystlin
eca0bc5205 AI Test: Added path protection to tests
As we are decompressing, we have to check the paths before writing to
disk.
2025-04-14 19:32:42 +00:00
Anastasiia
2672f23bbf Frontend: add opening photo viewer when click to photo #271" 2025-04-14 19:47:59 +02:00
Michael Mayer
a89d386541 UX: Tweak video controls background in fullscreen viewer
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 19:08:39 +02:00
Michael Mayer
eb39662e36 UX: Darken video controls background in fullscreen viewer
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 18:58:24 +02:00
Michael Mayer
b2a36c24dc UX: Refactor notification styles in notify.css
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 18:46:02 +02:00
Michael Mayer
0b390f356f UX: Add role attributes to progress bars in templates/app.gohtml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 17:41:49 +02:00
Michael Mayer
61ceed0726 UX: Refactor notification styles in notify.css and notify.vue
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 17:41:05 +02:00
Michael Mayer
60e41b425b UX: Refactor notification teleport and transition in notify.vue
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 17:29:58 +02:00
Michael Mayer
41d9dd7c21 Frontend: Refactor setTokens() and updateTokens() in common/config.js
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 15:35:05 +02:00
Theresa Gresch
c3741cb912 Merge pull request #4934 from photoprism/keyboard-shortcut-tests
Tests: Add Keyboard Shortcuts
2025-04-14 12:20:25 +02:00
Michael Mayer
ac8db75a3f UX: Improve mobile notification styles in notify.css
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 10:31:02 +02:00
raystlin
8d9a16cef6 AI Test: Added resolution to external models
The definition of the models now contain the expected resolution. This
has improved the results for efficientnet-m.
2025-04-14 08:15:10 +00:00
Ömer Duran
65fcb25952 Merge branch 'develop' into keyboard-shortcut-tests 2025-04-14 10:11:51 +02:00
Ömer Duran
ab31f20508 Test: Move nav selectors to constructor 2025-04-14 10:11:25 +02:00
Michael Mayer
38155190c5 Import: Ignore archive sidecar files #4929
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 08:59:21 +02:00
Michael Mayer
66b7d83d7e Search: Reset view when there are no results or an error occurs #4935
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 08:46:31 +02:00
Michael Mayer
d4becb575f Docs: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 07:46:30 +02:00
Michael Mayer
bc4f1f3080 API: Update swagger.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 07:45:56 +02:00
Michael Mayer
328938d268 Backend: Update dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 07:44:10 +02:00
Michael Mayer
f8bf1d45fc UX: Improve notification styles in notify.css and notify.vue
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-14 07:42:58 +02:00
raystlin
5521d06bc0 Added Interval parameter to PhotoInput
This parameter allows us to rescale the input of the models because some
of them need values between [0, 1] and other between [-1, 1].
2025-04-13 20:32:02 +00:00
raystlin
e55536e581 Merge remote-tracking branch 'upstream/develop' into feature/custom-tf-model-127 2025-04-13 15:27:50 +00:00
raystlin
457a47b36f AI: Added a test for external models
The tests has a envar check to avoid running it by default, as it
downloads the models and generates a lot of errors.
2025-04-13 14:54:42 +00:00
raystlin
ad94d03576 Fixed classify and nsfw tests
They were broken when the constructors changed to include metadata.
2025-04-13 14:53:34 +00:00
raystlin
d993eb2a85 AI: Added some intelligence to label loading.
Now when loading labels internal/ai/tensorflow package will try to look
for all the files that match the glob label*.txt and will return the
labels that match the expected number. Some models add a first label
called background, which is a bias.
Also, a new parameter has been added to models to allow a second path to
look for the label files. This path is set to nasnet asset on
internal/ai/vision.
2025-04-13 14:49:54 +00:00
Michael Mayer
f09aa7749b UX: Update tabindex attributes and remove focus workaround in notify.vue
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-13 13:44:25 +02:00
Michael Mayer
914476ffe7 Backend: Update dependencies in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-13 11:36:50 +02:00
Michael Mayer
41abde5db8 Frontend: Update dependencies in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-13 11:36:35 +02:00
Michael Mayer
916276e36a UX: Check if elements are already active before setting focus
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-13 11:35:10 +02:00
Michael Mayer
8189503a69 AI: Add additional vision service API configuration options #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-13 10:58:15 +02:00
Michael Mayer
e5916b98b9 UX: Remove .is-rtl styles from css/notify.css
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 20:08:42 +02:00
Michael Mayer
1d77c2306f UX: Remove unnecessary notification classes in notify.vue
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 20:03:28 +02:00
Michael Mayer
e6ec733303 UX: Improve notification styles
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 19:27:37 +02:00
Michael Mayer
6f3ad2dea3 UX: Replace v-snackbar component with div elements
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 19:03:01 +02:00
Michael Mayer
377c7ed1d5 Config: Change the order of options in settings.yml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 17:53:46 +02:00
Michael Mayer
128df65f54 Develop: Upgrade base image from 250407-oracular to 250412-oracular
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 15:30:37 +02:00
Michael Mayer
8068e471d1 Develop: Update Makefile and compose.nvidia.yaml
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 15:30:22 +02:00
Michael Mayer
494f75917c Develop: Update service configuration in compose.yaml files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 15:11:09 +02:00
Michael Mayer
52cc9b1cd3 Docker: Update install-s6.sh script
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 15:10:37 +02:00
Michael Mayer
06de8e2b66 Docker: Refactor service initialization and reduce startup log verbosity
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 14:06:39 +02:00
Michael Mayer
b03f06a1a2 Dist: Refactor install-s6.sh script
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 12:22:30 +02:00
Michael Mayer
1831261cfd Dist: Add script to install the latest nats-server binary
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 11:50:12 +02:00
Michael Mayer
43c794d242 AI: Add script to install the latest qdrant database binary #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-12 11:49:03 +02:00
Ömer Duran
7d39c51e31 Merge branch 'keyboard-shortcut-tests' of https://github.com/photoprism/photoprism into keyboard-shortcut-tests 2025-04-12 11:35:22 +02:00
Ömer Duran
d0a23491df Tests: Refactor lightbox archive and download shortcut tests 2025-04-12 11:33:25 +02:00
Ömer Duran
36c5b7012f Merge branch 'develop' into keyboard-shortcut-tests 2025-04-12 10:57:05 +02:00
Ömer Duran
26b552bb58 Tests: Remove 'only' from photo scroll test to ensure it runs with other tests 2025-04-12 10:55:45 +02:00
Ömer Duran
285c0f4543 Tests: Test scroll restoration and fix deprecation 2025-04-12 10:54:36 +02:00
Ömer Duran
6d6671c356 Tests: verify search not focused before ctrl+f 2025-04-12 10:27:21 +02:00
Ömer Duran
6088ebd617 Tests: Update selector for upload dialog visibility check 2025-04-12 10:22:04 +02:00
Ömer Duran
6c05e02077 Tests: Changed test messages for slideshow functionality 2025-04-12 10:20:03 +02:00
raystlin
0895a085a1 Migrated nsfw to the new model loading system.
nsfw/model.go and vision/model.go modified to make it work. Testing
remains undone.
2025-04-11 20:29:31 +00:00
raystlin
88508679b0 Modified classify to add custom models
Vision input parameters have also been changed to support the new
parameters needed for the models.
2025-04-11 20:01:36 +00:00
Michael Mayer
63fb46578a API: Remove unused "api/hooks" package
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 20:02:08 +02:00
Michael Mayer
07e22b0c14 API: Remove unused Webhook endpoint due to architecture change
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 19:39:39 +02:00
Michael Mayer
63d72ee867 AI: Refactor Webhook endpoint and improve related unit tests #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 19:22:54 +02:00
raystlin
8bc7121394 Added a comment to clarify
EnsureShape operation may seem unnecesary, but PredictCosts fails it it
is not added to the graph.
2025-04-11 16:57:27 +00:00
Michael Mayer
f2ffb0fdce AI: Add Webhook endpoint and refactor ACL for Vision API #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 18:41:54 +02:00
raystlin
7bcbaea492 Dynamically add a softmax layer to a loaded graph.
By inspecting existing models we saw that many times logits are returned
instead of probabilities. Photoprism uses probabilites to rank the
quality of the results, so we need to transform those logits. Our
approach is to add a new layer at runtime to the graph that performs the
softmax operation.
2025-04-11 14:32:17 +00:00
raystlin
d0f6d903e2 Added utilities to inspect tensorflow models.
These new functions allows us to inspect the saved models, get the tags
and try to guess the inputs and outputs.
2025-04-11 14:30:48 +00:00
Ömer Duran
7925ab205d Tests: Add acceptance tests for keyboard shortcuts
The following shortcuts are tested:
- Common page shortcuts: Search focus (Ctrl+F), Refresh (Ctrl+R), Upload dialog (Ctrl+U).
- Lightbox shortcuts: Info panel toggle (Ctrl+I), Mute/Unmute (Ctrl+M), Slideshow play/pause (Ctrl+S), Archive (Ctrl+A), Download (Ctrl+D), Edit (Ctrl+E), Fullscreen toggle (Ctrl+F), Like/Unlike (Ctrl+L).
- Expansion panel toggle (Shift+Ctrl+F) and focusing search fields on specific pages (People, Labels, Library Errors) (Ctrl+F).
2025-04-11 15:22:36 +02:00
Michael Mayer
35bfe0694b API: Disable gzip compression for /api/v1/dl endpoint #127 #1090
Required for compatibility with the Python HTTP client. In addition,
this commit refactors function names and adds tests.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 14:13:25 +02:00
Michael Mayer
bd634c828b AI: Shorten "face/embeddings" model type to just "face" #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 05:48:00 +02:00
Michael Mayer
720d83ef3a AI: Disable Vision API in demo mode #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 05:37:08 +02:00
Michael Mayer
c14be8f57e Frontend: Update deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 05:20:08 +02:00
Michael Mayer
76757811cb Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 05:19:47 +02:00
Michael Mayer
f80acab4c2 AI: Add "photoprism vision run" command and vision worker #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 05:15:14 +02:00
Michael Mayer
5b8be2f5d4 AI: Add "photoprism vision" CLI subcommands #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 02:11:53 +02:00
Michael Mayer
6fcce84623 AI: Add photoprism-vision test service and caption API client #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-11 01:17:47 +02:00
Michael Mayer
068ee52301 AI: Improve code comments in vision package #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-10 22:08:49 +02:00
Michael Mayer
627f4f8d21 AI: Refactor API client in vision package #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-10 21:16:03 +02:00
Michael Mayer
0304ed37c3 AI: Set default vision API client timeout to one minute #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-10 21:07:57 +02:00
Michael Mayer
190be2a1b5 AI: Finalize facial embeddings, labels and nsfw API endpoints #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-10 20:28:26 +02:00
Michael Mayer
caf3ae1ab5 AI: Refactor use of face embeddings, labels, and nsfw models #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-10 16:49:34 +02:00
graciousgey
ecef34a8da Tests: Adapt acceptance tests 2025-04-10 11:27:49 +02:00
Michael Mayer
204ce2b100 Logs: Allow restart of logging after database provider reset #47 #4831
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-09 16:31:06 +02:00
Michael Mayer
eaea3a416d Logs: Stop logging errors when database connection is gone #47 #4831
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-09 12:50:44 +02:00
Michael Mayer
cf3b933e59 API: Refactor data URL encoding and decoding in pkg/media #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-09 10:58:48 +02:00
Anastasiia
19cf3e4b38 Frontend: add left side form view with mocked data 2025-04-08 22:59:23 +02:00
Michael Mayer
7f1041c434 Labels: Add image classification service client #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-08 04:14:18 +02:00
Michael Mayer
42897bde35 API: Add download package to allow temporary file downloads #127 #1090
This is necessary to provide external services with temporary access to
specific media files without giving them permanent access, a regular
download, or an access token.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 23:56:35 +02:00
Michael Mayer
0f76186663 AI: Reject API requests with content-type multipart/form-data #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 23:05:34 +02:00
Anastasiia
f4e94f4e9f Frontend: add right side form view 2025-04-07 23:03:56 +02:00
Michael Mayer
d304509c0d AI: Add VisionApi, VisionUri, and VisionKey config options #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 20:30:07 +02:00
Michael Mayer
2a6b9fb237 AI: Add config option to specify the vision.yml settings file #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 13:18:03 +02:00
Michael Mayer
9d648f74dd AI: Add Code and Error to Vision API service response #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 12:51:44 +02:00
Michael Mayer
f3e066af45 AI: Add Vision API service endpoint for image classification #127 #1090
This is a proof of concept and still under development. The other
Vision API endpoints are stubs for testing and not yet functional.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 12:19:39 +02:00
Michael Mayer
907850cb80 Develop: Upgrade base image from 250402-oracular to 250407-oracular #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 11:36:51 +02:00
Michael Mayer
c6b6bfde70 CI: Exclude ARMv7 when building new Docker images and packages #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 11:36:16 +02:00
raystlin
ae735f6a1e Migrated arm64 Dockerfile to jammy
To support more gcc versions
2025-04-07 06:08:05 +02:00
raystlin
fd0baeb5a4 Modified comment on Dockerfile
Simply to add the llvm installation to the existing comment.
2025-04-07 06:08:05 +02:00
Michael Mayer
bfdb839d01 AI: Add TensorFlow utility package and improve model loading #127 #1090
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-07 05:26:45 +02:00
Michael Mayer
35e9294d87 AI: Add vision package and vision API endpoints #127 #1090
These changes allow to configure the computer vision models through an
optional vision.yml configuration file. Note that the API endpoints
are not yet functional and require further work.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 23:39:37 +02:00
Michael Mayer
b791896fc6 UX: Prevent buttons and menus from getting selected
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 15:04:25 +02:00
Michael Mayer
043f6c2569 Build: Downgrade TensorFlow from v2.18.0 to v1.15.2 in docker/armv7 #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 11:03:08 +02:00
Michael Mayer
332e57d59f AI: Update build target and install-tensorflow.sh for AVX512 #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 10:15:34 +02:00
Michael Mayer
a3456637cd AI: Detect AMX-AVX512 instructions in install-tensorflow.sh #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 10:01:22 +02:00
Michael Mayer
5650ea29b5 AI: Update libtensorflow-avx512 build target in Makefile #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 10:00:20 +02:00
Michael Mayer
c9e305808b AI: Add nano package to tensorflow Dockerfiles #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 09:41:26 +02:00
Michael Mayer
efe36603f8 AI: Add libtensorflow-avx512 to default targets in Makefile #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 09:39:21 +02:00
Michael Mayer
96fdd1a41a AI: Add libtensorflow build target for Intel AMX-AVX512 #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 09:37:49 +02:00
Michael Mayer
0b9233f44b AI: Build libtensorflow with --copt=-O2 instead of --copt=-O3 #222 #4922
This should optimize for fast execution as much as possible without
significantly increasing the binary size.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 09:25:20 +02:00
Michael Mayer
5a9e3a8645 AI: Update Makefile targets for tensorflow build images #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 09:14:06 +02:00
Michael Mayer
3900573a7c AI: Fix libtensorflow tar.gz path in create_archive.sh #222 #4922
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 09:09:03 +02:00
Michael Mayer
d9c260b865 AI: Use Docker build argument to specify TensorFlow version #222 #4922
This also ensures that the archives will be created in /build.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 09:05:06 +02:00
Michael Mayer
a97d66d6e4 AI: Update libtensorflow build targets in Makefiles #222 #4922
This normalizes the archive names and adds required compiler flags.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-06 08:35:06 +02:00
Michael Mayer
5256a7f276 Viewer: Add title and caption styles for collapsible sidebar #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 23:22:00 +02:00
Michael Mayer
eed7bfff73 Viewer: Refactor getViewport() function in component/lightbox.vue #4927
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 22:42:44 +02:00
Michael Mayer
d6c215c9c6 Viewer: Set max video width to 100% in lightbox.css #4927
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 22:42:18 +02:00
Michael Mayer
b6ca5a1717 Config: Add upload-limit flag to limit total upload size #4929 #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 15:44:13 +02:00
Michael Mayer
1350eff0f5 UX: Improve action menu styles in css/controls.css
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 14:40:45 +02:00
Michael Mayer
bf66a9e19a Config: Update import-allow description in flags.go #4929 #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 13:15:02 +02:00
Michael Mayer
5a1ca738f6 Config: Update options.go #4929 #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 13:04:14 +02:00
Michael Mayer
63d6902605 Config: Update upload-allow description in flags.go #4929 #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 12:53:55 +02:00
Michael Mayer
de89979e45 Upload: Add new config options to compose.yaml examples #4929 #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 12:49:32 +02:00
Michael Mayer
fe424d8966 Upload: Reject files that exceed the originals limit #4929 #4895 #2049
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 12:43:51 +02:00
Michael Mayer
b0e42bebf1 Upload: Add support for uploading zip archives #4929 #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 12:02:33 +02:00
Weblate
cf3b7f8d18 Weblate: Update frontend translations 2025-04-05 09:46:00 +02:00
Michael Mayer
83c30987eb Viewer: Improve $util.thumb() test in unit/common/util_test.js #4927
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 09:33:34 +02:00
Michael Mayer
1cf69e231f Viewer: Enhance thumbnail size selection for high aspect ratios #4927
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-05 09:31:28 +02:00
graciousgrey
6d776c8a97 Frontend: Tests set default timezone in karma.conf.js 2025-04-04 17:06:49 +02:00
Ömer Duran
974369966a UX: prevent duplicate folder selection in remote sync 2025-04-04 15:41:51 +02:00
Michael Mayer
cdc1866720 Viewer: Skip loading new image if no matching thumbnail size is set
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 13:02:04 +02:00
Michael Mayer
4915840035 Videos: Skip forward/back 10 seconds with right/left #1131 #3623 #4698
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 12:26:43 +02:00
raystlin
0ff942342f AI: Improve TensorFlow for C build images and scripts (#4922)
* Fixed create_archive.sh

The previous version followed symlinks on doing the copy to a temporary
folder, so the resulting size was 3 times what it should be. Also
*.param files have been excluded from the final tar.gz file.

* Migrated tensorflow image to jammy

So as to build against an older version of glibc and support more OS
versions.

* Extend new create_archive.sh to all build types

The changes on the main create_archive.sh are now on all the other
versions.
2025-04-04 11:36:36 +02:00
Michael Mayer
990a0a40ba Frontend: Update line numbers in translation *.po files #1131 #4916
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 11:29:52 +02:00
Michael Mayer
405c9e7650 UX: Refactor shortcut event handling to use common/view.js #1131 #4916
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 11:28:50 +02:00
Michael Mayer
dc2370ebf3 Viewer: Add tooltips to metadata in info sidebar #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 10:15:56 +02:00
Michael Mayer
439d683fdb Viewer: Update translation *.json files #4925
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 10:04:19 +02:00
Weblate
15e6ea0a4d Weblate: Update frontend translations 2025-04-04 10:03:38 +02:00
Michael Mayer
c9a8d8f89d Viewer: Shorten title of slideshow-toggle button #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 10:01:26 +02:00
Michael Mayer
e9a6973d16 Viewer: Update translation *.json files #4811 #4812 #4924
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 09:58:58 +02:00
Weblate
8a537755a0 Weblate: Update frontend translations 2025-04-04 09:57:22 +02:00
Michael Mayer
ff47ff7366 UX: Add title to information sidebar close button #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 09:55:09 +02:00
Michael Mayer
53feb26fa9 Frontend: Update dependencies in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 09:49:49 +02:00
Michael Mayer
f8e32d260e Viewer: Rename sidebar-button to info-button ("Information") #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-04 09:49:25 +02:00
Anastasiia
159d097383 Frontend: add new edit batch dialog logic 2025-04-03 17:37:27 +02:00
Michael Mayer
bb60ea028e UX: Increase background opacity for error and warning notifications
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 15:54:55 +02:00
Michael Mayer
fb040de538 UX: Improve notification snackbar styles and theme colors
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 15:40:32 +02:00
Michael Mayer
e76bf0c4da Viewer: Fix copying coordinates to clipboard #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 15:39:35 +02:00
Michael Mayer
db77ddce0f UX: Refactor notification snackbar component model and styles
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 14:45:35 +02:00
Michael Mayer
1ed65ba8f6 UX: Refactor action menu event handling #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 13:17:16 +02:00
Michael Mayer
0fc7aa3767 Viewer: Darken info sidebar colors #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 07:03:20 +02:00
Michael Mayer
f8d2cfd1f2 Viewer: Remove anchor attribute in lightbox/menu.vue #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 06:58:27 +02:00
Michael Mayer
252784c029 Viewer: Improve info sidebar colors #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 06:43:31 +02:00
Michael Mayer
e6fecc5020 Viewer: Prevent video controls from being selected #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 06:22:26 +02:00
Michael Mayer
c973d4edd6 Viewer: Fix action menu in Firefox and improve input focus #4811 #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 06:12:47 +02:00
Michael Mayer
2dc1baf2e8 Viewer: Improve styles for and refactor collapsible sidebar #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-03 03:51:30 +02:00
Michael Mayer
b0e3ff1231 UX: Add transparent busy overlay style and improve keyboard shortcuts
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 20:53:57 +02:00
Michael Mayer
17154e33d2 Frontend: Rename PPhotoUploadDialog to PUploadDialog
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 20:16:10 +02:00
Michael Mayer
37d609c2bd UX: Remove Ctrl+H key shortcut in lightbox.vue #1131 #3623 #4916
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 19:23:17 +02:00
Michael Mayer
e78414ac1e Frontend: Update *.json translation file #4918
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 18:57:48 +02:00
Weblate
f3dddef6a4 Weblate: Update frontend translations 2025-04-02 18:57:03 +02:00
Michael Mayer
3d66556acf UX: Add keyboard shortcuts & improve focus management #1131 #3623 #4916
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 18:55:50 +02:00
Michael Mayer
433d726d75 SQLite: Update database initialization for entity unit tests #47 #4831
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 13:53:11 +02:00
Michael Mayer
6596474389 SQLite: Refactor database initialization for unit tests #47 #4831
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 13:44:40 +02:00
Michael Mayer
7b5f295a9b TensorFlow: Improve install-tensorflow.sh script to detect AVX-VNNI #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 13:20:47 +02:00
Michael Mayer
5ff21ad589 TensorFlow: Enable oneDNN optimizations in Dockerfiles #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 12:48:29 +02:00
Michael Mayer
8cd1de6b64 TensorFlow: Improve install-tensorflow.sh script #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 12:44:09 +02:00
Michael Mayer
f4fa80a8cf Develop: Add clean-build target to Makefile #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 11:52:44 +02:00
Michael Mayer
00e12b8bd8 Develop: Don't install AVX/AVX2 version of TensorFlow by default #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 11:50:55 +02:00
Michael Mayer
083c59550a AI: Upgrade Go language bindings for the TensorFlow C API #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 04:16:27 +02:00
Michael Mayer
b5c1c6b974 Develop: Upgrade base image from 250329-oracular to 250402-oracular #222
The new image includes TensorFlow v2.18.0 and Go v1.24.2.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 04:06:23 +02:00
Michael Mayer
0dd2639d97 SQLite: Use file storage instead of memory for unit tests #47 #4831
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 04:05:08 +02:00
Michael Mayer
e2d74220d5 TensorFlow: Update install-tensorflow.sh to default to v2.18.0 #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 03:40:39 +02:00
Michael Mayer
f0959c2796 Dockerfiles: Add TF_ENABLE_ONEDNN_OPTS variable for TensorFlow 2 #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-02 00:03:10 +02:00
Michael Mayer
6b26974ce7 TensorFlow: Upgrade build scripts to v2.18.0 #222
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 23:43:22 +02:00
Michael Mayer
a6b4378533 UX: Reduce flickering when refreshing search results #4917
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 21:04:17 +02:00
Michael Mayer
512f044ec6 UX: Refactor keyboard event handler in lightbox.vue #1131 #4916
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 19:56:45 +02:00
Michael Mayer
67c99fb322 UX: Support meta (Cmd) key as alternative to Ctrl for macOS #1131 #4916
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 19:44:00 +02:00
Michael Mayer
57d0869e65 Frontend: Add "focus-trap" and update dependencies in package.json #4916
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 19:12:36 +02:00
Michael Mayer
64f051ece3 Docs: Update README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 14:11:07 +02:00
Michael Mayer
eba878dea1 Frontend: Update *.json translation files #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 12:40:58 +02:00
Weblate
a2825be165 Weblate: Update frontend translations 2025-04-01 12:40:26 +02:00
Michael Mayer
8f8d901787 Viewer: Rename PSidebarMetadata to PSidebarInfo #4812
Also allows to test the sidebar when experimental features are enabled.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 12:39:39 +02:00
Michael Mayer
80f93b471a Frontend: Update *.po translation files #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 12:36:36 +02:00
Michael Mayer
36a359eb6f Viewer: Add a lightbox theme to use for the info sidebar #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 10:35:06 +02:00
Michael Mayer
0dc3e1c8a4 Viewer: Add map marker example to sidebar metadata #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 08:45:47 +02:00
Michael Mayer
17dbe15dc2 Viewer: Set viewPortWidth during initialization #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 02:47:29 +02:00
Michael Mayer
72435cd0e8 Viewer: Remove dataSource option and add getNumItems() instead #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 02:22:40 +02:00
Michael Mayer
a12323cf2e Viewer: Make sidebar title and caption read only #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 02:22:07 +02:00
Michael Mayer
ecbcb8f63c Frontend: Update *.json translation files #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 01:54:18 +02:00
Weblate
ebc013a204 Weblate: Update frontend translations 2025-04-01 01:53:45 +02:00
Michael Mayer
f861bbece8 Frontend: Update *.po translation files #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 01:51:30 +02:00
Michael Mayer
86113d1429 Viewer: Preserve slide data while Viewer is open #383
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 01:48:32 +02:00
Michael Mayer
9f8c8b4c10 Viewer: Show "Remove from Album" action only for regular albums #383
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 01:27:29 +02:00
Michael Mayer
1ec6562799 Viewer: Implement proof-of-concept for info sidebar with metadata #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-04-01 00:34:40 +02:00
Michael Mayer
b729f53d9d Docs: Update README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 22:45:06 +02:00
Michael Mayer
cd630536e2 Docs: Update README.md
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 22:21:17 +02:00
Michael Mayer
cdbb4eefcc Viewer: Rename PActionLightbox to PLightboxMenu #4812
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 21:57:37 +02:00
Michael Mayer
b015abf85f Places: Update *.json translation files #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 21:44:18 +02:00
Weblate
a9e6874fe0 Weblate: Update frontend translations 2025-03-31 21:42:27 +02:00
Michael Mayer
47a5412eeb Places: Update *.po translation files #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 21:39:36 +02:00
Michael Mayer
70402ba46f Places: Update map title in /frontend/src/options/options.js #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 21:39:29 +02:00
Weblate
d3c8af196d Weblate: Update frontend translations 2025-03-31 21:38:02 +02:00
Michael Mayer
955fd1d247 Places: Update *.po translation files #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 21:33:45 +02:00
Michael Mayer
995da0f611 Places: Update map style options and terrain styles #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 21:31:24 +02:00
Michael Mayer
9c79f54994 Viewer: Add TimeZone to thumbnail model data #4812 #4905
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 20:51:26 +02:00
Michael Mayer
5a3aa9db18 Frontend: Remove unused code from component/album/toolbar.vue
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 20:48:20 +02:00
Michael Mayer
e637034a8c Places: Improve map initialization and add satellite map style #4762
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 20:47:48 +02:00
Michael Mayer
62987fbbe1 Viewer: Improve thumb model and thumb size calculation #4812 #4905
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 19:20:48 +02:00
Michael Mayer
5dbbf340a0 Search: Fix opening randomly sorted results in Viewer #4905
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 13:59:50 +02:00
Michael Mayer
31ae58435e Frontend: Update dependencies in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 13:37:11 +02:00
Michael Mayer
1ff381d0b7 Viewer: Refactor "Remove from Album" menu action #383 #3758 #3974 #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 13:36:54 +02:00
Michael Mayer
16777de1a9 Viewer: Update *.json translation files #383 #3758 #3974 #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 13:32:43 +02:00
Michael Mayer
24adfcb9f2 Viewer: Update *.po translation files #383 #3758 #3974 #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 13:31:51 +02:00
Weblate
9e036d259f Weblate: Update frontend translations 2025-03-31 13:29:55 +02:00
Michael Mayer
df5695a220 Viewer: Add "Remove from Album" menu action #383 #3758 #3974 #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 13:28:41 +02:00
Michael Mayer
aa687ade0b AI: Add Qdrant vector database for test & development #1090 #1287 #4669
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-31 12:35:28 +02:00
Michael Mayer
422256122d UX: Check permissions before opening upload dialog #1131
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-30 19:13:03 +02:00
Michael Mayer
2ebac920f2 UX: Show keyboard shortcuts in action menus #1131
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-30 18:40:35 +02:00
Michael Mayer
b678bf384c Viewer: Update *.json translation files #383 #3758 #3974 #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-30 15:04:30 +02:00
Weblate
9a4773610a Weblate: Update frontend translations 2025-03-30 15:03:22 +02:00
Michael Mayer
d895affffa Frontend: Update dependencies in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-30 14:34:40 +02:00
Michael Mayer
1a207e3543 Viewer: Update translations in src/locales/*.po #383 #3758 #3974 #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-30 14:34:18 +02:00
Michael Mayer
7bc4417eff Viewer: Add "Set as Album Cover" menu action #383 #3758 #3974 #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-30 14:26:03 +02:00
Michael Mayer
7afffe1809 Setup: Improve compose.yaml inline documentation #4051
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-29 04:24:47 +01:00
Michael Mayer
4080901576 Develop: Upgrade base image from 250326 to 250329-oracular #47 #4831
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-29 03:40:42 +01:00
Michael Mayer
deeb8b987a PostgreSQL: Install "postgresql-client" package in Dockerfiles #47 #4831
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-29 02:25:37 +01:00
Michael Mayer
f142a9d52c Frontend: Update hls.js in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 23:47:00 +01:00
Michael Mayer
7bc9347909 Backend: Update deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 23:43:19 +01:00
Michael Mayer
c6176d0b1e UX: Update counters and covers in the background #4323
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 23:20:28 +01:00
Michael Mayer
cef91e442a Import: Preserve hidden .keep and .gitkeep files #4092
This prevents directories from being deleted when using the "move"
import option, which would otherwise delete hidden files and empty
directories.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 22:20:03 +01:00
Michael Mayer
45e0504dab Config: Read OIDC client secret from file #2302
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 21:29:14 +01:00
Michael Mayer
ad5baf2823 Config: Read admin and database password from file #2302
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 21:00:56 +01:00
Michael Mayer
a89f186f40 UX: Immediately return focus when displaying notification snackbar
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 19:44:01 +01:00
Michael Mayer
0951720512 UX: Do not close notification snackbar on content click anymore
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 19:20:00 +01:00
Michael Mayer
0d251a9d43 UX: Use arrow keys to navigate in edit dialog #3623
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 18:37:05 +01:00
Michael Mayer
e025f22553 UX: Refactor notification snackbar and loading bar components
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 18:32:20 +01:00
Michael Mayer
a76bbba2a6 FFmpeg: Fix Intel Quick Sync Video (QSV) hardware transcoding #4382
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 16:31:20 +01:00
graciousgey
a24b385560 Tests: Adapt page model to changes 2025-03-28 16:22:19 +01:00
Michael Mayer
2934319591 UX: Close notification snackbar on content click
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-28 10:00:57 +01:00
Michael Mayer
ca708c3f56 Codespell: Fix invalid inline comments and broken test assertions #4506
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 16:57:56 +01:00
Yaroslav Halchenko
15668ee7b5 CI: Add codespell config and fix typos (#4506)
More about codespell: https://github.com/codespell-project/codespell
2025-03-27 16:42:24 +01:00
Michael Mayer
47e740fd88 Metadata: Use "github.com/ugjka/go-tz/v2" instead of custom fork
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 16:34:47 +01:00
Michael Mayer
ae0b63eb50 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 15:37:49 +01:00
Michael Mayer
9de641eb66 Backend: Remove unnecessary usage of fmt.Sprintf() #3846
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 15:12:03 +01:00
graciousgrey
9aff925c94 Tests: Add unit tests #4895 2025-03-27 14:42:59 +01:00
Michael Mayer
02bc6b6bce Faces: Remove check that is always true in ai/face/detector.go #4457
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 14:34:00 +01:00
Michael Mayer
5fe3c34167 Config: Improve parsing of boolean environment variables #4372
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 13:35:47 +01:00
Michael Mayer
4ea2ab0ddb Frontend: Update *.json translation files #4900
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 10:50:38 +01:00
Michael Mayer
ed06bbda9d Frontend: Update src/locales/*.po translation files #4900
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 10:48:07 +01:00
Cathie Integra
7c70c247b9 Weblate: Update frontend translations (#4900)
Co-authored-by: Weblate <noreply@weblate.org>
2025-03-27 10:46:42 +01:00
Michael Mayer
0761be3258 Videos: Improve transcoding and indexing logs #4549
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 10:36:15 +01:00
Michael Mayer
4329b43b76 Backend: Improve error handling and logging #4491
These changes are based on a pull request submitted by @songzhibin97.
Thank you very much!

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 09:51:38 +01:00
Michael Mayer
8836f90251 WebDAV: Refactor service discovery heuristic to add custom headers #4608
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-27 03:31:48 +01:00
Esteve Fernandez
a36e8b19f8 WebDAV: Add depth header to service discovery request for Hetzner compatibility (#4608)
Signed-off-by: Esteve Fernandez <esteve@apache.org>
2025-03-27 03:07:21 +01:00
Jacob D
0d487b6490 Faces: Improve performance when manual tagging (#4691)
This PR implements a strategy to improve Optimize() performance by returning the correct number of modified rows in PurgeOrphanFaces and treating the result 0 as an error condition in MergeFaces. Logging around this has been improved in faces.go and faces_optimize.go.

Related Comments:
- https://github.com/photoprism/photoprism/issues/3124#issuecomment-2566025503
- https://github.com/photoprism/photoprism/pull/4691#issuecomment-2566164179
2025-03-27 01:40:31 +01:00
Michael Mayer
4ab9b14bcb Backend: Update github.com/bytedance/sonic in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 22:15:30 +01:00
Michael Mayer
fc0aac9877 Backend: Update indirect Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 22:11:57 +01:00
Michael Mayer
3ec92af160 Frontend: Update license NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 21:38:29 +01:00
Michael Mayer
7fe8ad9b35 Frontend: Update dependencies in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 21:36:44 +01:00
Michael Mayer
58d55f820f Frontend: Reformat *.vue components with ESLint 9
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 21:24:47 +01:00
Michael Mayer
9927eb62eb Develop: Upgrade base image from 250317-oracular to 250326-oracular
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 21:23:03 +01:00
Michael Mayer
8b89c60418 Frontend: Reformat *.vue and *.js files with ESLint 9
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 21:08:50 +01:00
Michael Mayer
62eff7c4c3 Frontend: Upgrade ESLint from v8.57.0 to v9.23.0
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 21:07:45 +01:00
Michael Mayer
858130da9c Frontend: Update build deps in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 20:25:34 +01:00
Michael Mayer
a62d3d0e57 Frontend: Update "maplibre-gl" in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 20:20:39 +01:00
Michael Mayer
2df077df26 Frontend: Update dependencies in package.json and package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 20:17:16 +01:00
Michael Mayer
4176303d6f Timezones: Upgrade gopkg.in/photoprism/go-tz.v2 from v2.1.3 to v2.2.0
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 20:11:43 +01:00
Michael Mayer
dce754182e Logs: Refactor message formatting in event package
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 12:58:51 +01:00
Michael Mayer
a2186f3fa4 Frontend: Update *.json translation files #4694
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 12:56:04 +01:00
Weblate
dc15a4aabe Weblate: Update frontend translations 2025-03-26 12:55:20 +01:00
Michael Mayer
b0eb7aacdd UX: Rename "Videos" to "Media" in navigation and add audio type #4694
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-26 12:53:15 +01:00
Weblate
6f08d7f5b9 Weblate: Update frontend translations 2025-03-26 11:55:07 +01:00
graciousgey
4996c2db0d Tests: Add acceptance tests 2025-03-26 09:19:18 +01:00
Michael Mayer
9e95c7e71c Upload: Delete invalid files, improve type checks and import logs #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 11:58:59 +01:00
Michael Mayer
1f36d35d23 Upload: Report successful number of files in users_upload.go #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 08:48:00 +01:00
Michael Mayer
3acd41027b Viewer: Update menu styles in css/lightbox.css #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 08:35:21 +01:00
Michael Mayer
ff5135c2a3 Viewer: Improve menu styles and refactor close event handler #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 08:07:40 +01:00
Michael Mayer
7de72bd99a Upload: Allow to limit the types of files users can upload #4895
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 06:32:01 +01:00
Michael Mayer
b771e86f8d Viewer: Replace me-1 and ms-1 padding classes with custom button styles
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 04:09:22 +01:00
Michael Mayer
b25209f114 Settings: Refactor list of supported user interface locales
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 03:45:49 +01:00
Michael Mayer
0a58484d6d Viewer: Improve menu styles and move close button to the left #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 03:18:15 +01:00
Michael Mayer
c702699f45 Viewer: Regenerate frontend translation json files #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 00:23:32 +01:00
Weblate
99653613ee Weblate: Update frontend translations 2025-03-25 00:22:50 +01:00
Michael Mayer
4acba7de18 Viewer: Update frontend translation files #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 00:20:21 +01:00
Michael Mayer
8765cf4d3f Viewer: Add a three-dot menu to perform additional actions #4811
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-25 00:19:29 +01:00
Michael Mayer
c78b023675 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-24 23:11:21 +01:00
Michael Mayer
c9f0c5f475 Frontend: Regenerate src/locales/json/*.json #4893
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-24 21:22:20 +01:00
Weblate
33867d4d1f Weblate: Update frontend translations 2025-03-24 21:20:41 +01:00
Michael Mayer
6e07d42a1b UX: Reduce JS bundle size by dynamically loading MapLibre GL JS #4778
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-24 21:20:05 +01:00
Michael Mayer
67811d87fa Videos: Create fragmented MP4s when transcoding with FFmpeg #4892
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-24 20:47:57 +01:00
Michael Mayer
d9924010d4 UX: Reduce JS size by loading hls.light.min.js instead of hls.js #4778
hls.light.js is a smaller version of hls.js that does not include
support for alternate audio, subtitles, CMCD, EME (DRM), and variable
substitution.

Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-24 20:16:33 +01:00
Michael Mayer
0ddc179737 UX: Reduce JS bundle size by loading translation files on demand #4778
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-24 12:43:08 +01:00
Michael Mayer
a125219751 Update README.md 2025-03-24 07:43:30 +01:00
Michael Mayer
93b53214f6 Update README.md 2025-03-24 07:42:23 +01:00
Michael Mayer
50b0e8babf Update README.md 2025-03-24 06:35:14 +01:00
Michael Mayer
06d6a370b7 Frontend: Update src/locales/translations.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 14:49:28 +01:00
Weblate
4890447787 Weblate: Update frontend translations 2025-03-23 14:49:03 +01:00
Michael Mayer
0bf2c5c580 Frontend: Update deps in package-lock.json
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 14:44:11 +01:00
Michael Mayer
00359b1a4e Settings: Update labels in content.vue and regenerate translation files
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 14:43:48 +01:00
Michael Mayer
c6225f7117 Setup: Update inline docs in Docker Compose config examples #4888 #4889
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 14:14:22 +01:00
Michael Mayer
173fa526e9 Config: Improve --prod docs in flags.go #4888 #4889
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 14:00:22 +01:00
Michael Mayer
555d5cdbbe Config: Improve --prod docs in flags.go #4888 #4889
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 13:57:50 +01:00
Michael Mayer
4ed7c6c242 Config: Update --prod and --log-level docs in flags.go #4888 #4889
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 13:54:59 +01:00
Michael Mayer
9a01ace34d Config: Update --prod flag documentation in flags.go #4888 #4889
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 13:48:38 +01:00
Michael Mayer
6e20ad6edb Dependencies: Update NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 13:14:49 +01:00
Michael Mayer
68d1bbb359 Backend: Update Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 13:12:29 +01:00
Michael Mayer
c081155c4f Config: Improve log options documentation in flags.go #4888 #4889
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 13:11:55 +01:00
Michael Mayer
0b02c5d17c Database: Reduce log level for connection info to debug #4888 #4889
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-23 12:06:10 +01:00
Michael Mayer
cd577f5108 Update README.md 2025-03-23 11:10:17 +01:00
Michael Mayer
d3882edebc Update README.md 2025-03-23 11:08:20 +01:00
Michael Mayer
cf8fbf5870 Update README.md 2025-03-23 10:25:23 +01:00
Michael Mayer
3b6efc1786 Update README.md 2025-03-22 12:35:37 +01:00
Michael Mayer
cd427c66be Update README.md 2025-03-22 12:34:57 +01:00
Michael Mayer
9467dd89bf Update README.md 2025-03-21 18:31:22 +01:00
Michael Mayer
57590c48bb Docs: Update desktop and mobile screenshots in README.md 2025-03-21 05:44:29 +01:00
Michael Mayer
f4b3ed33a2 Dependencies: Update NOTICE file
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-20 22:11:23 +01:00
Michael Mayer
8af26827de Backend: Upgrade indirect Go deps in go.mod and go.sum
Signed-off-by: Michael Mayer <michael@photoprism.app>
2025-03-20 22:09:15 +01:00
1262 changed files with 98804 additions and 45076 deletions

9
.codespellrc Normal file
View File

@@ -0,0 +1,9 @@
[codespell]
# Ref: https://github.com/codespell-project/codespell#using-a-config-file
skip = .git*,*.svg,go.sum,package-lock.json,*.css,.codespellrc,locales,stopwords.*,shortwords.*,countries.*,keywords.json,smallwords.*
check-hidden = true
# ACRONYMS and generally mixed case/Capitalized words
# Also ignore some German
ignore-regex = ^(SMethod=shal|biuld: build)$|https://\S+|\b([A-Z][a-zA-Z]+|ist auf)\b|"(datin|alis|hel)"|\bfixe == false\b
# common variables or other tricky cases
ignore-words-list = renderd,nd,folde,crate,ue,fo,ist,alo,mot,te,admiraal

View File

@@ -1,4 +1,4 @@
# Local build files and directories
# Local build files and directories:
/photos/*
/frontend/node_modules/*
/node_modules
@@ -7,32 +7,61 @@
/assets/facenet
/assets/nasnet
/assets/nsfw
/assets/efficientnet
/assets/imagenet
/assets/resnet
/assets/vision
/assets/models
/storage
/build
/photoprism
/photoprism-*
/coverage.*
/frontend/tests/acceptance/screenshots
/test/
/specs/
# Custom config, database, log, and temporary files
/tmp/
.env
# Docker configuration files:
.dockerignore
*.log
*.jsonl
*.db
*.db-journal
Dockerfile
docker-compose*
compose.yaml
compose.*.yaml
*.override.yml
*.override.yaml
*.tmp.yml
*.tmp.yaml
# Automatically generated files, e.g. by editors and operating systems
# Customization, database, log, and temporary files:
*.socket
*.lock
*.sock
*.pid
*.log
*.jsonl
*.db
*.db-journal
*.sqlite
*.override.yml
*.tmp.yml
*.override.yaml
*.tmp.yaml
*.out
*.test
*.exe
*.exe~
*.dll
*.so
*.dylib
*.tmp
*.img
*.img.xz
*.img.gz
/*.zip
/coverage.*
__pycache__
venv
.venv
.env
.tmp
.nv
.eslintcache
.gocache
.DS_Store
.DS_Store?
._*
@@ -42,10 +71,12 @@ ehthumbs.db
Thumbs.db
.heartbeat
.idea
.glide
.codex
.local
*~
.goutputstream*
.c9revisions
.settings
.swp
.tmp
.glide
/tmp/

View File

@@ -1,18 +1,18 @@
---
name: Question
about: You have a general question or need assistance
title: 'STOP! DO NOT PROCEED, USE GITHUB DISCUSSIONS INSTEAD - THANK YOU'
labels: technical-support
title: 'PLEASE DO NOT OPEN AN ISSUE FOR YOUR QUESTION, AND USE GITHUB DISCUSSIONS OR OUR COMMUNITY CHAT INSTEAD'
labels: question
assignees: ''
---
FOR GENERAL QUESTIONS, TECHNICAL SUPPORT, AND TO GET TO KNOW OTHER COMMUNITY MEMBERS:
<https://github.com/photoprism/photoprism/discussions>
<https://github.com/photoprism/photoprism/discussions>
OUR TROUBLESHOOTING CHECKLISTS HELP YOU QUICKLY DIAGNOSE AND FIX COMMON PROBLEMS:
<https://docs.photoprism.app/getting-started/troubleshooting/>
<https://docs.photoprism.app/getting-started/troubleshooting/>
DO NOT PROCEED, THANK YOU!
PLEASE DO NOT OPEN AN ISSUE FOR YOUR QUESTION, AND USE GITHUB DISCUSSIONS OR OUR COMMUNITY CHAT INSTEAD. THANK YOU VERY MUCH!

View File

@@ -1,33 +1,34 @@
<!--
Thank you for your interest in contributing!
Because we want to create the best possible product for our users, we have a set of criteria to ensure that all submissions are acceptable, see https://docs.photoprism.app/developer-guide/pull-requests/ for details.
(1) Please provide a concise description of your pull request.
- What does it implement / fix / improve? Why?
- Are the changes related to an existing issue?
(2) After you submit your first pull request, you will be asked to accept our CLA, see https://www.photoprism.app/cla.
(3) Finally, please confirm that the following criteria are met by replacing "[ ]" with "[x]" (also possible at a later time).
-->
Acceptance Criteria:
- [ ] Features and enhancements must be fully implemented so that they can be released at any time without additional work
- [ ] Automated unit and/or acceptance tests are mandatory to ensure the changes work as expected and to reduce repetitive manual work
- [ ] Frontend components must be responsive to work and look properly on phones, tablets, and desktop computers; you must have tested them on all major browsers and different devices
- [ ] Documentation and translation updates should be provided if needed
- [ ] In case you submit database-related changes, they must be tested and compatible with SQLite 3 and MariaDB 10.5.12+
### Description
<!--
We appreciate your interest in contributing! Please provide a brief description of your changes so that we know what is included in this pull request, and confirm that it meets the acceptance criteria:
Since reviewing, testing and finally merging pull requests requires significant resources on our side, this can take several months if it's not just a small fix, especially if extensive testing is required to prevent bugs from getting into our stable version.
We thank you for your patience! :)
What does it aim to implement, fix or improve? Why?
-->
These changes implement/fix/improve...
#### Related Issues
- Links to issues that this PR fixes, implements, or is otherwise related to...
### Acceptance Criteria
<!-- You may add additional criteria and/or remove criteria that do not apply, e.g. because your PR does not include frontend changes: -->
- [ ] New features or enhancements are fully implemented and do not break existing functionality, so that they can be released at any time without requiring additional work
- [ ] Automated unit and/or acceptance tests are included to ensure that changes work as expected and to reduce repetitive manual work
- [ ] Documentation has been / will be updated, especially as it relates to new configuration options or potentially disruptive changes
- [ ] The user interface has been tested on Chrome, Safari, and Firefox and is fully responsive for use on phones, tablets, and desktop computers
- [ ] Database-related changes have been successfully tested with SQLite 3 and MariaDB 10.5.12+
<!--
Contribution Agreement:
After submitting your first pull request, you will be asked to confirm our contribution agreement. This allows us to safely use your Contribution in all our projects without risking unexpected legal disputes or having to repeatedly ask for permission.
The agreement is solely for our protection and that of our users. It does not grant us exclusive rights to your code.
PhotoPrism UG ("PhotoPrism", "we" or "us") hereby confirms to you that, to the fullest extent permitted by applicable law, this Contribution is provided "AS IS" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OR CONDITIONS OF NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. You have no obligation to provide support, maintenance, or other services for your Contribution.
Thank you very much! 🌈💎✨
-->

86
.github/copilot-instructions.md vendored Normal file
View File

@@ -0,0 +1,86 @@
# Instructions for GitHub Copilot
## Purpose
- Provide Copilot with the single sources of truth for building, testing, and contributing to PhotoPrism.
- Improve PR reviews and code suggestions by aligning them with our documented workflows and style.
## Single Sources of Truth (SOT)
- Makefile targets (always prefer existing targets): https://github.com/photoprism/photoprism/blob/develop/Makefile
- Developer Guide Setup: https://docs.photoprism.app/developer-guide/setup/
- Developer Guide Tests: https://docs.photoprism.app/developer-guide/tests/
- Contributing: https://github.com/photoprism/photoprism/blob/develop/CONTRIBUTING.md
- Security: https://github.com/photoprism/photoprism/blob/develop/SECURITY.md
- REST API (Swagger): https://docs.photoprism.dev/
- REST API Guide: https://docs.photoprism.app/developer-guide/api/
- Agents reference for tools/commands: https://github.com/photoprism/photoprism/blob/develop/AGENTS.md
## Build & Run (local dev; use Makefile first)
- Show tasks: `make help`
- Build local image: `make docker-build`
- Start dev env: `docker compose up` (add `-d` for detached)
- Logs: `docker compose logs -f --tail=100 photoprism`
- Open app: http://localhost:2342/ (HTTP) / https://app.localssl.dev/ (TLS via Traefik when enabled)
- From the dev container:
- Install deps: `make dep`
- Build frontend: `make build-js` (or `cd frontend && npm run build`)
- Build backend: `make build-go`
- Watch frontend: `make watch-js` (stop with Ctrl+C)
- Run server binary: `./photoprism start`
## Tests & Lint
- Full tests: `make test`
- Frontend tests (Vitest): `make test-js` (watch: `make vitest-watch`, coverage: `make vitest-coverage`)
- Backend tests: `make test-go`
- Formatting:
- Go: `go fmt`, `goimports` (see `make fmt`, `make fmt-go`)
- JS/Vue: use scripts in `frontend/package.json` (ESLint + Prettier)
## Project Structure & Languages
- Backend: Go (`internal/`, `pkg/`, `cmd/`) + MariaDB/SQLite
- Frontend: Vue 3 + Vuetify 3 (`frontend/`)
- Docker/compose for dev/CI; Traefik used for local TLS in dev profile when enabled.
## Code Review Instructions (for Copilot)
- Respect SOT above; do not invent flags, env vars, or Compose options. If a command/env var is not in the docs/Makefile/CLI help, say “not documented” and suggest checking the SOT.
- Prefer minimal, surgical diffs. Propose changes as concrete patches and reference the relevant Makefile target or doc section.
- Before suggesting refactors, check tests and build tasks exist and can pass with the change. If tests are missing, suggest specific Vitest/Go test snippets.
- Security: never suggest committing secrets; prefer env vars and `.env` in dev only. Point to SECURITY.md for disclosures.
- Data safety: never run or recommend destructive CLI operations in examples without explicit backups and `--yes`. Avoid `photoprism reset`, `photoprism users reset`, `photoprism auth reset`, or `photoprism audit reset` in PR comments unless the change is specifically about those commands; if unavoidable, add bold warnings and backup steps.
- Database/schema: if a change touches persistence, check for migrations and mention `photoprism migrate` / `migrations` commands.
- API changes: align with the REST API docs/spec; include curl examples only if they match current endpoints and auth notes.
- UX/i18n: keep UI strings concise, translatable, and consistent; avoid hard-coded language constructs; prefer existing patterns/components.
## Style & Patterns
- Go: idiomatic Go, clear error handling, small functions, packages with focused responsibilities. Keep public surface minimal. Add/adjust unit tests.
- Vue/JS: options API, store patterns as in existing code, avoid breaking translations. Keep ESLint/Prettier clean.
- Config & flags: suggest `photoprism --help`, `photoprism show config-options` or `photoprism show config-yaml` to verify names before using them.
## Performance & Reliability
- Prefer using existing caches, workers, and batching strategies referenced in code and Makefile. Consider memory/CPU impact; suggest benchmarks or profiling only when justified.
## When Unsure
- Ask for the exact Makefile target or doc link you need, then proceed. Defer to SOT if any conflict arises.
## References To Help Copilot Answer Questions
- Show supported formats/filters: run `photoprism show file-formats` and `photoprism show search-filters` (use results rather than guessing).
- For CI/dev containers, assume Linux/Unix shell by default; link Windows specifics in Developer Guide FAQ.
## Output Expectations
- Prefer short, actionable comments with code blocks that pass tests locally: `make test-js` (frontend) / `make test-go` (backend)
- If a suggestion requires additional context (e.g., DB access, external service), call it out explicitly.
## Safety Checklist Before Proposing a CLI Command
- Include a dry-run or non-destructive variant if possible.
- Recommend creating/using backups before any reset/migrate.

View File

@@ -0,0 +1,13 @@
---
applyTo:
- "internal/**"
- "pkg/**"
- "cmd/**"
---
For backend changes:
- Maintain Go style; keep functions small, errors wrapped with context.
- Add/update unit tests; ensure `make test-go` passes.
- Touching schema? Mention migrations and verify with `photoprism migrations ls`/`migrate`.
- For CLI/config, confirm flags/envs via `photoprism --help` / `photoprism show config-options` before suggesting.

View File

@@ -0,0 +1,12 @@
---
applyTo:
- "frontend/**"
---
For frontend changes:
- Keep Vue 3 idioms; prefer options API and existing components.
- Run `make build-js` and `make test-js`; fix ESLint/Prettier before proposing changes.
- Avoid introducing global state; follow existing store patterns.
- Keep strings translatable; dont hardcode locales.
- For performance, avoid unnecessary reactivity and re-renders; justify new deps.

22
.gitignore vendored
View File

@@ -18,6 +18,10 @@
*.dll
*.so
*.dylib
*.tmp
*.img
*.img.xz
*.img.gz
/*.zip
/coverage.*
__pycache__
@@ -25,7 +29,11 @@ venv
.venv
.env
.tmp
.nv
.eslintcache
.gocache
/pro
/plus
/tmp/
/test/
*-lock.json
@@ -37,6 +45,7 @@ venv
/frontend/src/locales/*.mo
/frontend/tests_output
frontend/coverage/
**/__screenshots__/
/photoprism
/photoprism-*
/photos/originals/*
@@ -48,8 +57,10 @@ frontend/coverage/
/assets/nasnet
/assets/nsfw
/assets/static/build/
/pro
/plus
/assets/static/maps/
/assets/*net
/assets/vision
/specs/
# Files created automatically by editors and/or operating systems:
.DS_Store
@@ -60,8 +71,13 @@ frontend/coverage/
ehthumbs.db
Thumbs.db
.heartbeat
.idea
.glide
.idea
.codex
.local
.project
.vscode
*.tmproj
*~
.goutputstream*
.c9revisions

335
.qdrant.yaml Normal file
View File

@@ -0,0 +1,335 @@
log_level: INFO
# Logging configuration
# Qdrant logs to stdout. You may configure to also write logs to a file on disk.
# Be aware that this file may grow indefinitely.
# logger:
# # Logging format, supports `text` and `json`
# format: text
# on_disk:
# enabled: true
# log_file: path/to/log/file.log
# log_level: INFO
# # Logging format, supports `text` and `json`
# format: text
storage:
# Where to store all the data
storage_path: ./storage
# Where to store snapshots
snapshots_path: ./snapshots
snapshots_config:
# "local" or "s3" - where to store snapshots
snapshots_storage: local
# s3_config:
# bucket: ""
# region: ""
# access_key: ""
# secret_key: ""
# Where to store temporary files
# If null, temporary snapshots are stored in: storage/snapshots_temp/
temp_path: null
# If true - point payloads will not be stored in memory.
# It will be read from the disk every time it is requested.
# This setting saves RAM by (slightly) increasing the response time.
# Note: those payload values that are involved in filtering and are indexed - remain in RAM.
#
# Default: true
on_disk_payload: true
# Maximum number of concurrent updates to shard replicas
# If `null` - maximum concurrency is used.
update_concurrency: null
# Write-ahead-log related configuration
wal:
# Size of a single WAL segment
wal_capacity_mb: 32
# Number of WAL segments to create ahead of actual data requirement
wal_segments_ahead: 0
# Normal node - receives all updates and answers all queries
node_type: "Normal"
# Listener node - receives all updates, but does not answer search/read queries
# Useful for setting up a dedicated backup node
# node_type: "Listener"
performance:
# Number of parallel threads used for search operations. If 0 - auto selection.
max_search_threads: 0
# Max number of threads (jobs) for running optimizations across all collections, each thread runs one job.
# If 0 - have no limit and choose dynamically to saturate CPU.
# Note: each optimization job will also use `max_indexing_threads` threads by itself for index building.
max_optimization_threads: 0
# CPU budget, how many CPUs (threads) to allocate for an optimization job.
# If 0 - auto selection, keep 1 or more CPUs unallocated depending on CPU size
# If negative - subtract this number of CPUs from the available CPUs.
# If positive - use this exact number of CPUs.
optimizer_cpu_budget: 0
# Prevent DDoS of too many concurrent updates in distributed mode.
# One external update usually triggers multiple internal updates, which breaks internal
# timings. For example, the health check timing and consensus timing.
# If null - auto selection.
update_rate_limit: null
# Limit for number of incoming automatic shard transfers per collection on this node, does not affect user-requested transfers.
# The same value should be used on all nodes in a cluster.
# Default is to allow 1 transfer.
# If null - allow unlimited transfers.
#incoming_shard_transfers_limit: 1
# Limit for number of outgoing automatic shard transfers per collection on this node, does not affect user-requested transfers.
# The same value should be used on all nodes in a cluster.
# Default is to allow 1 transfer.
# If null - allow unlimited transfers.
#outgoing_shard_transfers_limit: 1
# Enable async scorer which uses io_uring when rescoring.
# Only supported on Linux, must be enabled in your kernel.
# See: <https://qdrant.tech/articles/io_uring/#and-what-about-qdrant>
#async_scorer: false
optimizers:
# The minimal fraction of deleted vectors in a segment, required to perform segment optimization
deleted_threshold: 0.2
# The minimal number of vectors in a segment, required to perform segment optimization
vacuum_min_vector_number: 1000
# Target amount of segments optimizer will try to keep.
# Real amount of segments may vary depending on multiple parameters:
# - Amount of stored points
# - Current write RPS
#
# It is recommended to select default number of segments as a factor of the number of search threads,
# so that each segment would be handled evenly by one of the threads.
# If `default_segment_number = 0`, will be automatically selected by the number of available CPUs
default_segment_number: 0
# Do not create segments larger this size (in KiloBytes).
# Large segments might require disproportionately long indexation times,
# therefore it makes sense to limit the size of segments.
#
# If indexation speed have more priority for your - make this parameter lower.
# If search speed is more important - make this parameter higher.
# Note: 1Kb = 1 vector of size 256
# If not set, will be automatically selected considering the number of available CPUs.
max_segment_size_kb: null
# Maximum size (in KiloBytes) of vectors to store in-memory per segment.
# Segments larger than this threshold will be stored as read-only memmapped file.
# To enable memmap storage, lower the threshold
# Note: 1Kb = 1 vector of size 256
# To explicitly disable mmap optimization, set to `0`.
# If not set, will be disabled by default.
memmap_threshold_kb: null
# Maximum size (in KiloBytes) of vectors allowed for plain index.
# Default value based on https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md
# Note: 1Kb = 1 vector of size 256
# To explicitly disable vector indexing, set to `0`.
# If not set, the default value will be used.
indexing_threshold_kb: 20000
# Interval between forced flushes.
flush_interval_sec: 5
# Max number of threads (jobs) for running optimizations per shard.
# Note: each optimization job will also use `max_indexing_threads` threads by itself for index building.
# If null - have no limit and choose dynamically to saturate CPU.
# If 0 - no optimization threads, optimizations will be disabled.
max_optimization_threads: null
# This section has the same options as 'optimizers' above. All values specified here will overwrite the collections
# optimizers configs regardless of the config above and the options specified at collection creation.
#optimizers_overwrite:
# deleted_threshold: 0.2
# vacuum_min_vector_number: 1000
# default_segment_number: 0
# max_segment_size_kb: null
# memmap_threshold_kb: null
# indexing_threshold_kb: 20000
# flush_interval_sec: 5
# max_optimization_threads: null
# Default parameters of HNSW Index. Could be overridden for each collection or named vector individually
hnsw_index:
# Number of edges per node in the index graph. Larger the value - more accurate the search, more space required.
m: 16
# Number of neighbours to consider during the index building. Larger the value - more accurate the search, more time required to build index.
ef_construct: 100
# Minimal size (in KiloBytes) of vectors for additional payload-based indexing.
# If payload chunk is smaller than `full_scan_threshold_kb` additional indexing won't be used -
# in this case full-scan search should be preferred by query planner and additional indexing is not required.
# Note: 1Kb = 1 vector of size 256
full_scan_threshold_kb: 10000
# Number of parallel threads used for background index building.
# If 0 - automatically select.
# Best to keep between 8 and 16 to prevent likelihood of building broken/inefficient HNSW graphs.
# On small CPUs, less threads are used.
max_indexing_threads: 0
# Store HNSW index on disk. If set to false, index will be stored in RAM. Default: false
on_disk: false
# Custom M param for hnsw graph built for payload index. If not set, default M will be used.
payload_m: null
# Default shard transfer method to use if none is defined.
# If null - don't have a shard transfer preference, choose automatically.
# If stream_records, snapshot or wal_delta - prefer this specific method.
# More info: https://qdrant.tech/documentation/guides/distributed_deployment/#shard-transfer-method
shard_transfer_method: null
# Default parameters for collections
collection:
# Number of replicas of each shard that network tries to maintain
replication_factor: 1
# How many replicas should apply the operation for us to consider it successful
write_consistency_factor: 1
# Default parameters for vectors.
vectors:
# Whether vectors should be stored in memory or on disk.
on_disk: null
# shard_number_per_node: 1
# Default quantization configuration.
# More info: https://qdrant.tech/documentation/guides/quantization
quantization: null
# Default strict mode parameters for newly created collections.
strict_mode:
# Whether strict mode is enabled for a collection or not.
enabled: false
# Max allowed `limit` parameter for all APIs that don't have their own max limit.
max_query_limit: null
# Max allowed `timeout` parameter.
max_timeout: null
# Allow usage of unindexed fields in retrieval based (eg. search) filters.
unindexed_filtering_retrieve: null
# Allow usage of unindexed fields in filtered updates (eg. delete by payload).
unindexed_filtering_update: null
# Max HNSW value allowed in search parameters.
search_max_hnsw_ef: null
# Whether exact search is allowed or not.
search_allow_exact: null
# Max oversampling value allowed in search.
search_max_oversampling: null
service:
# Maximum size of POST data in a single request in megabytes
max_request_size_mb: 32
# Number of parallel workers used for serving the api. If 0 - equal to the number of available cores.
# If missing - Same as storage.max_search_threads
max_workers: 0
# Host to bind the service on
host: 0.0.0.0
# HTTP(S) port to bind the service on
http_port: 6333
# gRPC port to bind the service on.
# If `null` - gRPC is disabled. Default: null
# Comment to disable gRPC:
grpc_port: 6334
# Enable CORS headers in REST API.
# If enabled, browsers would be allowed to query REST endpoints regardless of query origin.
# More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
# Default: true
enable_cors: true
# Enable HTTPS for the REST and gRPC API
enable_tls: false
# Check user HTTPS client certificate against CA file specified in tls config
verify_https_client_certificate: false
# Set an api-key.
# If set, all requests must include a header with the api-key.
# example header: `api-key: <API-KEY>`
#
# If you enable this you should also enable TLS.
# (Either above or via an external service like nginx.)
# Sending an api-key over an unencrypted channel is insecure.
#
# Uncomment to enable.
# api_key: your_secret_api_key_here
# Set an api-key for read-only operations.
# If set, all requests must include a header with the api-key.
# example header: `api-key: <API-KEY>`
#
# If you enable this you should also enable TLS.
# (Either above or via an external service like nginx.)
# Sending an api-key over an unencrypted channel is insecure.
#
# Uncomment to enable.
# read_only_api_key: your_secret_read_only_api_key_here
# Uncomment to enable JWT Role Based Access Control (RBAC).
# If enabled, you can generate JWT tokens with fine-grained rules for access control.
# Use generated token instead of API key.
#
# jwt_rbac: true
# Hardware reporting adds information to the API responses with a
# hint on how many resources were used to execute the request.
#
# Uncomment to enable.
# hardware_reporting: true
cluster:
# Use `enabled: true` to run Qdrant in distributed deployment mode
enabled: false
# Configuration of the inter-cluster communication
p2p:
# Port for internal communication between peers
port: 6335
# Use TLS for communication between peers
enable_tls: false
# Configuration related to distributed consensus algorithm
consensus:
# How frequently peers should ping each other.
# Setting this parameter to lower value will allow consensus
# to detect disconnected nodes earlier, but too frequent
# tick period may create significant network and CPU overhead.
# We encourage you NOT to change this parameter unless you know what you are doing.
tick_period_ms: 100
# Compact consensus operations once we have this amount of applied
# operations. Allows peers to join quickly with a consensus snapshot without
# replaying a huge amount of operations.
# If 0 - disable compaction
compact_wal_entries: 128
# Set to true to prevent service from sending usage statistics to the developers.
# Read more: https://qdrant.tech/documentation/guides/telemetry
telemetry_disabled: true

355
AGENTS.md Normal file
View File

@@ -0,0 +1,355 @@
# PhotoPrism® Repository Guidelines
## Purpose
This file tells automated coding agents (and humans) where to find the single sources of truth for building, testing, and contributing to PhotoPrism.
Learn more: https://agents.md/
## Sources of Truth
- Makefile targets (always prefer existing targets): https://github.com/photoprism/photoprism/blob/develop/Makefile
- Developer Guide Setup: https://docs.photoprism.app/developer-guide/setup/
- Developer Guide Tests: https://docs.photoprism.app/developer-guide/tests/
- Contributing: https://github.com/photoprism/photoprism/blob/develop/CONTRIBUTING.md
- Security: https://github.com/photoprism/photoprism/blob/develop/SECURITY.md
- REST API: https://docs.photoprism.dev/ (Swagger), https://docs.photoprism.app/developer-guide/api/ (Docs)
- Backend CODEMAP: CODEMAP.md
- Frontend CODEMAP: frontend/CODEMAP.md
### Specifications (Versioning & Usage)
- Always use the latest spec version for a topic (highest `-vN`), as linked from `specs/README.md` and the portal cheatsheet (`specs/portal/README.md`).
- Older spec versions remain in the repo for historical reference but are not linked from the main TOC. Do not base new work on superseded files (e.g., `*-v1.md` when `*-v2.md` exists).
- When adding or updating specs, publish changes under a new file with an incremented version suffix (e.g., `*-v3.md`) instead of overwriting. Refer to the Change Management section of each document for specific instructions.
- Developer Cheatsheet Portal & Cluster: specs/portal/README.md
- Backend (Go) Testing Guide: specs/dev/backend-testing.md
## Project Structure & Languages
- Backend: Go (`internal/`, `pkg/`, `cmd/`) + MariaDB/SQLite
- Package boundaries: Code in `pkg/*` MUST NOT import from `internal/*`.
- If you need access to config/entity/DB, put new code in a package under `internal/` instead of `pkg/`.
- Frontend: Vue 3 + Vuetify 3 (`frontend/`)
- Docker/compose for dev/CI; Traefik is used for local TLS (`*.localssl.dev`)
## Agent Runtime (Host vs Container)
Agents MAY run either:
- **Inside the Development Environment container** (recommended for least privilege).
- **On the host** (outside Docker), in which case the agent MAY start/stop the Dev Environment as needed.
### Detecting the environment (agent logic)
Agents SHOULD detect the runtime and choose commands accordingly:
- **Inside container if** one of the following is true:
- File exists: `/.dockerenv`
- Project path equals (or is a direct child of): `/go/src/github.com/photoprism/photoprism`
#### Examples
Bash:
```bash
if [ -f "/.dockerenv" ] || [ -d "/go/src/github.com/photoprism/photoprism/.git" ]; then
echo "container"
else
echo "host"
fi
```
Node.js:
```js
const fs = require("fs");
const inContainer = fs.existsSync("/.dockerenv");
const inDevPath = fs.existsSync("/go/src/github.com/photoprism/photoprism/.git");
console.log(inContainer || inDevPath ? "container" : "host");
```
### Agent installation and invocation
- **Inside container**: Prefer running agents via `npm exec` (no global install), for example:
- `npm exec --yes <agent-binary> -- --help`
- Or use `npx <agent-binary> ...`
- If the agent is distributed via npm and must be global, install inside the container only:
- `npm install -g <agent-npm-package>`
- Replace `<agent-binary>` / `<agent-npm-package>` with the names from the agents official docs.
- **On host**: Use the vendors recommended install for your OS. Ensure your agent runs from the repository root so it can discover `AGENTS.md` and project files.
## Build & Run (local)
- Run `make help` to see common targets (or open the `Makefile`).
- **Host mode** (agent runs on the host; agent MAY manage Docker lifecycle):
- Build local dev image (once): `make docker-build`
- Start services: `docker compose up` (add `-d` to start in the background)
- Follow live app logs: `docker compose logs -f --tail=100 photoprism` (Ctrl+C to stop)
- All services: `docker compose logs -f --tail=100`
- Last 10 minutes only: `docker compose logs -f --since=10m photoprism`
- Plain output (easier to copy): `docker compose logs -f --no-log-prefix --no-color photoprism`
- Execute a single command in the app container: `docker compose exec photoprism <command>`
- Example: `docker compose exec photoprism ./photoprism help`
- Why `./photoprism`? It runs the locally built binary in the project directory.
- Run as non-root to avoid root-owned files on bind mounts:
`docker compose exec -u "$(id -u):$(id -g)" photoprism <command>`
- Durable alternative: set the service user or `PHOTOPRISM_UID`/`PHOTOPRISM_GID` in `compose.yaml`; if you hit issues, run `make fix-permissions`.
- Open a terminal session in the app container: `make terminal`
- Stop everything when done: `docker compose --profile=all down --remove-orphans` (`make down` does the same)
- **Container mode** (agent runs inside the app container):
- Install deps: `make dep`
- Build frontend/backend: `make build-js` and `make build-go`
- Watch frontend changes (auto-rebuild): `make watch-js`
- Or run directly: `cd frontend && npm run watch`
- Tips: refresh the browser to see changes; running the watcher outside the container can be faster on non-Linux hosts; stop with Ctrl+C
- Start the PhotoPrism server: `./photoprism start`
- Open http://localhost:2342/ (HTTP)
- Or https://app.localssl.dev/ (HTTPS via Traefik reverse proxy)
- Only if Traefik is running and the dev compose labels are active
- Labels for `*.localssl.dev` are defined in the dev compose files, e.g. https://github.com/photoprism/photoprism/blob/develop/compose.yaml
- Do not use the Docker CLI inside the container; starting/stopping services requires host Docker access.
Note: Across our public documentation, official images, and in production, the command-line interface (CLI) name is `photoprism`. Other PhotoPrism binary names are only used in development builds for side-by-side comparisons of the Community Edition (CE) with PhotoPrism Plus (`photoprism-plus`) and PhotoPrism Pro (`photoprism-pro`).
## Tests
- From within the Development Environment:
- Full unit test suite: `make test` (runs backend and frontend tests)
- Test frontend/backend: `make test-js` and `make test-go`
- Go packages: `go test` (all tests) or `go test -run <name>` (specific tests only)
- Frontend unit tests are driven by Vitest; see scripts in `frontend/package.json`
- Vitest watch/coverage: `make vitest-watch` and `make vitest-coverage`
- Acceptance tests: use the `acceptance-*` targets in the `Makefile`
### CLI Testing Gotchas (Go)
- Exit codes and `os.Exit`:
- `urfave/cli` calls `os.Exit(code)` when a command returns `cli.Exit(...)`, which will terminate `go test` abruptly (often after logs like `http 401:`).
- Use the test helper `RunWithTestContext` (in `internal/commands/commands_test.go`) which temporarily overrides `cli.OsExiter` so the process doesnt exit; you still receive the error to assert `ExitCoder`.
- If you only need to assert the exit code and dont need printed output, you can invoke `cmd.Action(ctx)` directly and check `err.(cli.ExitCoder).ExitCode()`.
- Noninteractive mode: set `PHOTOPRISM_CLI=noninteractive` and/or pass `--yes` to avoid prompts that block tests and CI.
- SQLite DSN in tests:
- `config.NewTestConfig("<pkg>")` defaults to SQLite with a persuite DSN like `.<pkg>.db`. Dont assert an empty DSN for SQLite.
- Clean up any persuite SQLite files in tests with `t.Cleanup(func(){ _ = os.Remove(dsn) })` if you capture the DSN.
## Code Style & Lint
- Go: run `make fmt-go swag-fmt` to reformat the backend code + Swagger annotations (see `Makefile` for additional targets)
- Doc comments for packages and exported identifiers must be complete sentences that begin with the name of the thing being described and end with a period.
- For short examples inside comments, indent code rather than using backticks; godoc treats indented blocks as preformatted.
- JS/Vue: use the lint/format scripts in `frontend/package.json` (ESLint + Prettier)
- All added code and tests **must** be formatted according to our standards.
## Safety & Data
- Never commit secrets, local configurations, or cache files. Use environment variables or a local `.env`.
- Ensure `.env` and `.local` are ignored in `.gitignore` and `.dockerignore`.
- Prefer using existing caches, workers, and batching strategies referenced in code and `Makefile`. Consider memory/CPU impact; suggest benchmarks or profiling only when justified.
- Do not run destructive commands against production data. Prefer ephemeral volumes and test fixtures when running acceptance tests.
- Examples assume a Linux/Unix shell. For Windows specifics, see the Developer Guide FAQ:
https://docs.photoprism.app/developer-guide/faq/#can-your-development-environment-be-used-under-windows
If anything in this file conflicts with the `Makefile` or the Developer Guide, the `Makefile` and the documentation win. When unsure, **ask** for clarification before proceeding.
## Agent Quick Tips (Do This)
### Testing
- Prefer targeted runs for speed:
- Unit/subpackage: `go test ./internal/<pkg> -run <Name> -count=1`
- Commands: `go test ./internal/commands -run <Name> -count=1`
- Avoid `./...` unless you intend to run the whole suite.
- Heavy tests (migrations/fixtures): internal/entity and internal/photoprism run DB migrations and load fixtures; expect 30120s on first run. Narrow with `-run` and keep iterations low.
- PhotoPrism config in tests: inside `internal/photoprism`, use the package global `photoprism.Config()` for runtimeaccurate behavior. Only construct a new config if you replace it via `photoprism.SetConfig`.
- CLI command tests: use `RunWithTestContext(cmd, args)` to capture output and avoid `os.Exit`; assert `cli.ExitCoder` codes when you need them.
- Reports are quoted: strings in CLI "show" output are rendered with quotes by the report helpers. Prefer `assert.Contains`/regex over strict, fully formatted equality when validating content.
#### Test Data & Fixtures (storage/testdata)
- Shared test files live under `storage/testdata`. The lifecycle is managed by `internal/config/test.go`.
- `NewTestConfig("<pkg>")` now calls `InitializeTestData()` so required directories exist (originals, import, cache, temp) before tests run.
- If you build a custom `*config.Config`, call `c.InitializeTestData()` (and optionally `c.AssertTestData(t)`) before asserting on filesystem paths.
- `InitializeTestData()` deletes existing testdata (`RemoveTestData()`), downloads/unzips fixtures if needed, and then calls `CreateDirectories()` to ensure required directories exist.
### Roles & ACL
- Always map roles via the central tables:
- Users: `acl.ParseRole(s)` or `acl.UserRoles[clean.Role(s)]`.
- Clients: `acl.ClientRoles[clean.Role(s)]`.
- Aliases: `RoleAliasNone` ("none") and the empty string both map to `RoleNone`; do not specialcase them in callers.
- Defaults:
- Client roles: if input is unknown, default to `RoleClient`.
- User roles: `acl.ParseRole` handles special tokens like `0/false/nil` as none.
- CLI usage strings: build flag help from `Roles.CliUsageString()` (e.g., `acl.ClientRoles.CliUsageString()`), not from hardcoded lists.
### Import/Index
- ImportWorker may skip files if an identical file already exists (duplicate detection). Use unique copies or assert DB rows after ensuring a nonduplicate destination.
- Mixed roots: when testing related files, keep `ExamplesPath()/ImportPath()/OriginalsPath()` consistent so `RelatedFiles` and `AllowExt` behave as expected.
### CLI Usage & Assertions
- Capture output with `RunWithTestContext`; usage and report values may be quoted and reordered (e.g., set semantics). Use substring checks or regex for the final ", or <last>" rule from `CliUsageString`.
- Prefer JSON output (`--json`) for stable machine assertions when commands offer it.
### API Development & Config Options
The following conventions summarize the insights gained when adding new configuration options, API endpoints, and related tests. Follow these conventions unless a maintainer requests an exception.
- Config precedence and new options
- Global precedence: If present, values in `options.yml` override CLI flags and environment variables; all override config defaults in `defaults.yml`. Dont specialcase a single option.
- Adding a new option:
- Add a field to `internal/config/options.go` with `yaml:"…"` and a `flag:"…"` tag.
- Register a CLI flag and env mapping in `internal/config/flags.go` (use `EnvVars(...)`).
- Expose a getter on `*config.Config` in the relevant file (e.g., cluster options in `config_cluster.go`).
- Add name/value to `rows` in `*config.Report()`, after the same option as in `internal/config/options.go` for `photoprism show config` to report it (obfuscate passwords with `*`).
- If the value must persist (e.g., a generated UUID), write it back to `options.yml` using a focused helper that merges keys.
- Tests: cover CLI/env/file precedence and persistence. When tests need a new flag, add it to `CliTestContext` in `internal/config/test.go`.
- Example: `ClusterUUID` precedence = `options.yml` → CLI/env (`--cluster-uuid` / `PHOTOPRISM_CLUSTER_UUID`) → generate UUIDv4 and persist.
- CLI flag precedence: when you need to favor an explicit CLI flag over defaults, check `c.cliCtx.IsSet("<flag>")` before applying additional precedence logic.
- Persisting generated options: when writing to `options.yml`, set `c.options.OptionsYaml = filepath.Join(c.ConfigPath(), "options.yml")` and reload the file to keep inmemory
- Database access
- The app uses GORM v1. Dont use `WithContext`; for executing raw SQL, prefer `db.Raw(stmt).Scan(&nop)`.
- When provisioning MariaDB/MySQL objects, quote identifiers with backticks and limit the character set; avoid building identifiers from untrusted input.
- Reuse `conf.Db()` and `conf.Database*()` getters; reject unsupported drivers early with a clear error.
- Rate limiting
- Reuse the existing limiter in `internal/server/limiter` (e.g., `limiter.Auth` / `limiter.Login`).
- For 429s, use `limiter.AbortJSON(c)` when applicable; avoid creating new limiter stacks.
- API handlers
- Use existing helpers: `api.ClientIP(c)`, `header.BearerToken(c)`, `Abort*` functions for errors.
- Compare secrets/tokens using constanttime compare; dont log secrets.
- Set `Cache-Control: no-store` on responses containing secrets.
- Register new routes in `internal/server/routes.go`. Dont edit `swagger.json` directly—run `make swag` to regenerate.
- Portal mode: set `PHOTOPRISM_NODE_ROLE=portal` and `PHOTOPRISM_JOIN_TOKEN`.
- Pagination defaults: for new list endpoints, prefer `count` default 100 (max 1000) and `offset` ≥ 0; document both in Swagger and validate bounds in handlers.
- Document parameters explicitly in Swagger annotations (path, query, and body) so `make swag` produces accurate docs.
- Swagger: `make fmt-go swag-fmt && make swag` after adding or changing API annotations.
- Focused tests: `go test ./internal/api -run Cluster -count=1` (or limit to the package you changed).
- Registry & secrets
- Store portal/node registry data under `conf.PortalConfigPath()/nodes/` as YAML with file mode `0600`.
- Keep node secrets out of logs and omit them from JSON responses unless explicitly returned on creation/rotation.
- Testing patterns
- Use `t.TempDir()` for isolated config paths and files. After changing `ConfigPath` postconstruction, reload `options.yml` into `c.options` if needed.
- Prefer small, focused unit tests; use existing test helpers (`NewConfig`, `CliTestContext`, etc.).
- API tests: use `NewApiTest()`, `PerformRequest*`, `AuthenticateAdmin` / `AuthenticateUser`, and `OAuthToken` for client-scope scenarios.
- Permissions: cover public=false (401), CDN headers (403), admin access (200), and client tokens with insufficient scope (403).
- Auth mode in tests: use `conf.SetAuthMode(config.AuthModePasswd)` (and defer restore) instead of flipping `Options().Public`; this toggles related internals used by tests.
- Fixtures caveat: user fixtures often have admin role; for negative permission tests, prefer OAuth client tokens with limited scope rather than relying on a nonadmin user.
### Formatting (Go)
- Go is formatted by `gofmt` and uses tabs. Do not hand-format indentation.
- Always run after edits: `make fmt-go` (gofmt + goimports).
### API Shape Checklist
- When renaming or adding fields:
- Update DTOs in `internal/service/cluster/response.go` and any mappers.
- Update handlers and regenerate Swagger: `make fmt-go swag-fmt swag`.
- Update tests (search/replace old field names) and examples in `specs/`.
- Quick grep: `rg -n 'oldField|newField' -S` across code, tests, and specs.
### Cluster Registry (Source of Truth)
- Use the clientbacked registry (`NewClientRegistryWithConfig`).
- The filebacked registry is historical; do not add new references to it.
- Migration “done” checklist: swap callsites → build → API tests → CLI tests → remove legacy references.
### API/CLI Tests: Known Pitfalls
- Gin routes: Register `CreateSession(router)` once per test router; reusing it twice panics on duplicate route.
- CLI commands: Some commands defer `conf.Shutdown()` or emit signals that close the DB. The harness reopens DB before each run, but avoid invoking `start` or emitting signals in unit tests.
- Signals: `internal/commands/start.go` waits on `process.Signal`; calling `process.Shutdown()/Restart()` can close DB. Prefer not to trigger signals in tests.
### Download CLI Workbench (yt-dlp, remux, importer)
- Code anchors
- CLI flags and examples: `internal/commands/download.go`
- Core implementation (testable): `internal/commands/download_impl.go`
- yt-dlp helpers and arg wiring: `internal/photoprism/dl/*` (`options.go`, `info.go`, `file.go`, `meta.go`)
- Importer entry point: `internal/photoprism/get/import.go`; options: `internal/photoprism/import_options.go`
- Quick test runs (fast feedback)
- yt-dlp package: `go test ./internal/photoprism/dl -run 'Options|Created|PostprocessorArgs' -count=1`
- CLI command: `go test ./internal/commands -run 'DownloadImpl|HelpFlags' -count=1`
- FFmpeg-less tests
- In tests: set `c.Options().FFmpegBin = "/bin/false"` and `c.Settings().Index.Convert = false` to avoid ffmpeg dependencies when not validating remux.
- Stubbing yt-dlp (no network)
- Use a tiny shell script that:
- prints minimal JSON for `--dump-single-json`
- creates a file and prints its path when `--print` is requested
- Harness env vars (supported by our tests):
- `YTDLP_ARGS_LOG` — append final args for assertion
- `YTDLP_OUTPUT_FILE` — absolute file path to create for `--print`
- `YTDLP_DUMMY_CONTENT` — file contents to avoid importer duplicate detection between tests
- Remux policy and metadata
- Pipe method: PhotoPrism remux (ffmpeg) always embeds title/description/created.
- File method: ytdlp writes files; we pass `--postprocessor-args 'ffmpeg:-metadata creation_time=<RFC3339>'` so imports get `Created` even without local remux (fallback from `upload_date`/`release_date`).
- Default remux policy: `auto`; use `always` for the most complete metadata (chapters, extended tags).
- Testing
- Prefer targeted runs before the full suite:
- `go test ./internal/<pkg> -run <Name> -count=1`
- Avoid `./...` unless you intend to run everything.
- Importer duplicates: When reusing names/paths across tests, the importer may dedupe; vary file bytes via `YTDLP_DUMMY_CONTENT` or adjust `dest` to ensure assertions see the new file.
- Long-running packages: `internal/photoprism` is heavy; validate CLI/dl changes first in their packages, then run broader suites.
### Sessions & Redaction (building sessions in tests)
- Admin session (full view): `AuthenticateAdmin(app, router)`.
- User session: Create a nonadmin test user (role=guest), set a password, then `AuthenticateUser`.
- Client session (redacted internal fields; `siteUrl` visible):
```go
s, _ := entity.AddClientSession("test-client", conf.SessionMaxAge(), "cluster", authn.GrantClientCredentials, nil)
token := s.AuthToken()
r := AuthenticatedRequest(app, http.MethodGet, "/api/v1/cluster/nodes", token)
```
Admins see `advertiseUrl` and `database`; client/user sessions dont. `siteUrl` is safe to show to all roles.
### Preflight Checklist
- `go build ./...`
- `make fmt-go swag-fmt swag`
- `go test ./internal/service/cluster/registry -count=1`
- `go test ./internal/api -run 'Cluster' -count=1`
- `go test ./internal/commands -run 'ClusterRegister|ClusterNodesRotate' -count=1`
- Known tooling constraints
- Python may not be available in the dev container; prefer `apply_patch`, Go, or Make targets over adhoc scripts.
- `make swag` may fetch modules; ensure network availability in CI before running.
### Cluster Config & Bootstrap
- Import rules (avoid cycles):
- Do not import `internal/service/cluster/instance/*` from `internal/config` or the cluster root package.
- Instance/service bootstraps talk to the Portal via HTTP(S); do not import Portal internals such as `internal/api` or `internal/service/cluster/registry`/`provisioner`.
- Prefer constants from `internal/service/cluster/const.go` (e.g., `cluster.RoleInstance`, `cluster.RolePortal`) over string literals.
- Early extension lifecycle (config.Init sequence):
1) Load `options.yml` and settings (`c.initSettings()`)
2) Run early hooks: `EarlyExt().InitEarly(c)` (may adjust DB settings)
3) Connect DB: `connectDb()` and `RegisterDb()`
4) Run regular extensions: `Ext().Init(c)`
- Theme endpoint usage:
- Server: `GET /api/v1/cluster/theme` generates a zip from `conf.ThemePath()`; returns 200 with a valid (possibly empty) zip or 404 if missing.
- Client/CLI: install only if `ThemePath()` is missing or lacks `app.js`; do not overwrite unless explicitly allowed.
- Use header helpers/constants from `pkg/service/http/header` (e.g., `header.Accept`, `header.ContentTypeZip`, `header.SetAuthorization`).
- Registration (instance bootstrap):
- Send `rotate=true` only if driver is MySQL/MariaDB and no DSN/name/user/password is configured (including *_FILE for password); never for SQLite.
- Treat 401/403/404 as terminal; apply bounded retries with delay for transient/network/429.
- Persist only missing `NodeSecret` and DB settings when rotation was requested.
- Testing patterns:
- Use `httptest` for Portal endpoints and `pkg/fs.Unzip` with size caps for extraction tests.

190
CODEMAP.md Normal file
View File

@@ -0,0 +1,190 @@
PhotoPrism — Backend CODEMAP
Purpose
- Give agents and contributors a fast, reliable map of where things live and how they fit together, so you can add features, fix bugs, and write tests without spelunking.
- Sources of truth: prefer Makefile targets and the Developer Guide linked in AGENTS.md.
Quick Start
- Inside dev container (recommended):
- Install deps: `make dep`
- Build backend: `make build-go`
- Run server: `./photoprism start`
- Open: http://localhost:2342/ or https://app.localssl.dev/ (Traefik required)
- On host (manages Docker):
- Build image: `make docker-build`
- Start services: `docker compose up -d`
- Logs: `docker compose logs -f --tail=100 photoprism`
Executables & Entry Points
- CLI app (binary name across docs/images is `photoprism`):
- Main: `cmd/photoprism/photoprism.go`
- Commands registry: `internal/commands/commands.go` (array `commands.PhotoPrism`)
- Web server:
- Startup: `internal/commands/start.go``server.Start` (starts HTTP(S), workers, session cleanup)
- HTTP server: `internal/server/start.go` (compression, security, healthz, readiness, TLS/AutoTLS/unix socket)
- Routes: `internal/server/routes.go` (registers all v1 API groups + UI, WebDAV, sharing, .well-known)
- API group: `APIv1 = router.Group(conf.BaseUri("/api/v1"), Api(conf))`
High-Level Package Map (Go)
- `internal/api` — Gin handlers and Swagger annotations; only glue, no business logic
- `internal/server` — HTTP server, middleware, routing, static/ui/webdav
- `internal/config` — configuration, flags/env/options, client config, DB init/migrate
- `internal/entity` — GORM v1 models, queries, search helpers, migrations
- `internal/photoprism` — core domain logic (indexing, import, faces, thumbnails, cleanup)
- `internal/workers` — background schedulers (index, vision, sync, meta, backup)
- `internal/auth` — ACL, sessions, OIDC
- `internal/service` — cluster/portal, maps, hub, webdav
- `internal/event` — logging, pub/sub, audit
- `internal/ffmpeg`, `internal/thumb`, `internal/meta`, `internal/form`, `internal/mutex` — media, thumbs, metadata, forms, coordination
- `pkg/*` — reusable utilities (must never import from `internal/*`), e.g. `pkg/fs`, `pkg/log`, `pkg/service/http/header`
HTTP API
- Handlers live in `internal/api/*.go` and are registered in `internal/server/routes.go`.
- Annotate new endpoints in handler files; generate docs with: `make fmt-go swag-fmt && make swag`.
- Do not edit `internal/api/swagger.json` by hand.
- Common groups in `routes.go`: sessions, OAuth/OIDC, config, users, services, thumbnails, video, downloads/zip, index/import, photos/files/labels/subjects/faces, batch ops, cluster, technical (metrics, status, echo).
Configuration & Flags
- Options struct: `internal/config/options.go` with `yaml:"…"` (for `defaults.yml`/`options.yml`), `json:"…"` (clients/API), and `flag:"…"` (CLI flags/env) tags.
- For secrets/internals: `json:"-"` disables JSON processing to prevent values from being exposed through the API (see `internal/api/config_options.go`).
- If needed: `yaml:"-"` disables YAML processing; `flag:"-"` prevents `ApplyCliContext()` from assigning CLI values (flags/env variables) to a field, without affecting the flags in `internal/config/flags.go`.
- Annotations may include edition tags like `tags:"plus,pro"` to control visibility (see `internal/config/options_report.go` logic).
- Global flags/env: `internal/config/flags.go` (`EnvVars(...)`)
- Available flags/env: `internal/config/cli_flags_report.go` + `internal/config/report_sections.go` → surfaced by `photoprism show config-options --md`
- YAML options mapping: `internal/config/options_report.go` + `internal/config/report_sections.go` → surfaced by `photoprism show config-yaml --md`
- Report current values: `internal/config/report.go` → surfaced by `photoprism show config` (alias `photoprism config --md`).
- Precedence: `defaults.yml` < CLI/env < `options.yml` (global options rule). See Agent Tips in `AGENTS.md`.
- Getters are grouped by topic, e.g. DB in `internal/config/config_db.go`, server in `config_server.go`, TLS in `config_tls.go`, etc.
- Client Config (read-only)
- Endpoint: GET `/api/v1/config` (see `internal/api/api_client_config.go`).
- Assembly: Built from `internal/config/client_config.go` (not a direct serialization of Options) plus extension values registered via `config.Register` in `internal/config/extensions.go`.
- Updates: Back-end calls `UpdateClientConfig()` to publish "config.updated" over websockets after changes (see `internal/api/config_options.go` and `internal/api/config_settings.go`).
- ACL/mode aware: Values are filtered by user/session and may differ for public vs. authenticated users.
- Dont expose secrets: Treat it as client-visible; avoid sensitive data. To add fields, extend client values via `config.Register` rather than exposing Options directly.
- Refresh cadence: The web UI (nonmobile) also polls for updates every 10 minutes via `$config.update()` in `frontend/src/app.js`, complementing the websocket push.
Database & Migrations
- Driver: GORM v1 (`github.com/jinzhu/gorm`). No `WithContext`. Use `db.Raw(stmt).Scan(&nop)` for raw SQL.
- Entities and helpers: `internal/entity/*.go` and subpackages (`query`, `search`, `sortby`).
- Migrations engine: `internal/entity/migrate/*` run via `config.MigrateDb()`; CLI: `photoprism migrate` / `photoprism migrations`.
- DB init/migrate flow: `internal/config/config_db.go` chooses driver/DSN, sets `gorm:table_options`, then `entity.InitDb(migrate.Opt(...))`.
AuthN/Z & Sessions
- Session model and cache: `internal/entity/auth_session*` and `internal/auth/session/*` (cleanup worker).
- ACL: `internal/auth/acl/*` roles, grants, scopes; use constants; avoid logging secrets, compare tokens constanttime.
- OIDC: `internal/auth/oidc/*`.
Media Processing
- Thumbnails: `internal/thumb/*` and helpers in `internal/photoprism/mediafile_thumbs.go`.
- Metadata: `internal/meta/*`.
- FFmpeg integration: `internal/ffmpeg/*`.
Background Workers
- Scheduler and workers: `internal/workers/*.go` (index, vision, meta, sync, backup, share); started from `internal/commands/start.go`.
- Auto indexer: `internal/workers/auto/*`.
Cluster / Portal
- Node types: `internal/service/cluster/const.go` (`cluster.RoleInstance`, `cluster.RolePortal`, `cluster.RoleService`).
- Instance bootstrap & registration: `internal/service/cluster/instance/*` (HTTP to Portal; do not import Portal internals).
- Registry/provisioner: `internal/service/cluster/registry/*`, `internal/service/cluster/provisioner/*`.
- Theme endpoint (server): GET `/api/v1/cluster/theme`; client/CLI installs theme only if missing or no `app.js`.
- See specs cheat sheet: `specs/portal/README.md`.
Logging & Events
- Logger and event hub: `internal/event/*`; `event.Log` is the shared logger.
- HTTP headers/constants: `pkg/service/http/header/*` always prefer these in handlers and tests.
Server Startup Flow (happy path)
1) `photoprism start` (CLI) `internal/commands/start.go`
2) Config init, DB init/migrate, session cleanup worker
3) `internal/server/start.go` builds Gin engine, middleware, API group, templates
4) `internal/server/routes.go` registers UI, WebDAV, sharing, wellknown, and all `/api/v1/*` routes
5) Workers and autoindex start; health endpoints `/livez`, `/readyz` available
Common HowTos
- Add a CLI command
- Create `internal/commands/<name>.go` with a `*cli.Command`
- Add it to `PhotoPrism` in `internal/commands/commands.go`
- Tests: prefer `RunWithTestContext` from `internal/commands/commands_test.go` to avoid `os.Exit`
- Add a REST endpoint
- Create handler in `internal/api/<area>.go` with Swagger annotations
- Register it in `internal/server/routes.go`
- Use helpers: `api.ClientIP(c)`, `header.BearerToken(c)`, `Abort*` functions
- Validate pagination bounds (default `count=100`, max `1000`, `offset>=0`) for list endpoints
- Run `make fmt-go swag-fmt && make swag`; keep docs accurate
- Tests: `go test ./internal/api -run <Name>` and focused helpers (`NewApiTest()`, `PerformRequest*`)
- Add a config option
- Add field with tags to `internal/config/options.go`
- Register CLI flag/env in `internal/config/flags.go` via `EnvVars(...)`
- Expose a getter (e.g., in `config_server.go` or topic file)
- Append to `rows` in `*config.Report()` after the same option as in `options.go`
- If value must persist, write back to `options.yml` and reload into memory
- Tests: cover CLI/env/file precedence (see `internal/config/test.go` helpers)
- Touch the DB schema
- Use GORM auto-migration, or add a custom migration in `internal/entity/migrate/<dialect>/...` and run `go generate` or `make generate` (runs `go generate` for all packages)
- Bump/review version gates in `migrate.Version` usage via `config_db.go`
- Tests: run against SQLite by default; for MySQL cases, gate appropriately
Testing
- Full suite: `make test` (frontend + backend). Backend only: `make test-go`.
- Focused packages: `go test ./internal/<pkg> -run <Name>`.
- CLI tests: `PHOTOPRISM_CLI=noninteractive` or pass `--yes` to avoid prompts; use `RunWithTestContext` to prevent `os.Exit`.
- SQLite DSN in tests is persuite (not empty). Clean up files if you capture the DSN.
- Frontend unit tests via Vitest are separate; see `frontend/CODEMAP.md`.
Performance & Limits
- Prefer existing caches/workers/batching as per Makefile and code.
- When adding list endpoints, default `count=100` (max `1000`); set `Cache-Control: no-store` for secrets.
Conventions & Rules of Thumb
- Respect package boundaries: code in `pkg/*` must not import `internal/*`.
- Prefer constants/helpers from `pkg/service/http/header` over string literals.
- Never log secrets; compare tokens constanttime.
- Dont import Portal internals from cluster instance/service bootstraps; use HTTP.
- Prefer small, hermetic unit tests; isolate filesystem paths with `t.TempDir()` and env like `PHOTOPRISM_STORAGE_PATH`.
Frequently Touched Files (by topic)
- CLI wiring: `cmd/photoprism/photoprism.go`, `internal/commands/commands.go`
- Server: `internal/server/start.go`, `internal/server/routes.go`, middleware in `internal/server/*.go`
- API handlers: `internal/api/*.go` (plus `docs.go` for package docs)
- Config: `internal/config/*` (`flags.go`, `config_db.go`, `config_server.go`, `options.go`)
- Entities & queries: `internal/entity/*.go`, `internal/entity/query/*`
- Migrations: `internal/entity/migrate/*`
- Workers: `internal/workers/*`
- Cluster: `internal/service/cluster/*`
- Headers: `pkg/service/http/header/*`
Downloads (CLI) & yt-dlp helpers
- CLI command & core:
- `internal/commands/download.go` (flags, defaults, examples)
- `internal/commands/download_impl.go` (testable implementation used by CLI)
- yt-dlp wrappers:
- `internal/photoprism/dl/options.go` (arg wiring; `FFmpegPostArgs` hook for `--postprocessor-args`)
- `internal/photoprism/dl/info.go` (metadata discovery)
- `internal/photoprism/dl/file.go` (file method with `--output`/`--print`)
- `internal/photoprism/dl/meta.go` (`CreatedFromInfo` fallback; `RemuxOptionsFromInfo`)
- Importer:
- `internal/photoprism/get/import.go` (work pool)
- `internal/photoprism/import_options.go` (`ImportOptionsMove/Copy`)
- Testing hints:
- Fast loops: `go test ./internal/photoprism/dl -run 'Options|Created|PostprocessorArgs' -count=1`
- CLI only: `go test ./internal/commands -run 'DownloadImpl|HelpFlags' -count=1`
- Disable ffmpeg when not needed: set `FFmpegBin = "/bin/false"`, `Settings.Index.Convert=false` in tests.
- Stub yt-dlp: shell script that prints JSON for `--dump-single-json`, creates a file and prints path for `--print`.
- Avoid importer dedup: vary file bytes (e.g., `YTDLP_DUMMY_CONTENT`) or dest.
Useful Make Targets (selection)
- `make help` list targets
- `make dep` install Go/JS deps in container
- `make build-go` build backend
- `make test-go` backend tests (SQLite)
- `make swag` generate Swagger JSON in `internal/api/swagger.json`
- `make fmt-go swag-fmt` format Go code and Swagger annotations
See Also
- AGENTS.md (repository rules and tips for agents)
- Developer Guide (Setup/Tests/API) links in AGENTS.md Sources of Truth
- Specs: `specs/dev/backend-testing.md`, `specs/portal/README.md`

View File

@@ -1,8 +1,12 @@
# Ubuntu 24.10 (Oracular Oriole)
FROM photoprism/develop:250317-oracular
# Ubuntu 25.04 (Plucky Puffin)
FROM photoprism/develop:250912-plucky
# Harden npm usage by default (applies to npm ci / install in dev container)
ENV NPM_CONFIG_IGNORE_SCRIPTS=true
## Alternative Environments:
# FROM photoprism/develop:armv7 # ARMv7 (32bit)
# FROM photoprism/develop:plucky # Ubuntu 25.04 (Plucky Puffin)
# FROM photoprism/develop:oracular # Ubuntu 24.10 (Oracular Oriole)
# FROM photoprism/develop:noble # Ubuntu 24.04 LTS (Noble Numbat)
# FROM photoprism/develop:mantic # Ubuntu 23.10 (Mantic Minotaur)
@@ -19,3 +23,5 @@ WORKDIR "/go/src/github.com/photoprism/photoprism"
# Copy source to image.
COPY . .
COPY --chown=root:root /scripts/dist/ /scripts/
RUN sudo /scripts/install-yt-dlp.sh

215
Makefile
View File

@@ -4,20 +4,23 @@
# more about our team, products and services: https://www.photoprism.app/
export GO111MODULE=on
export NPM_CONFIG_IGNORE_SCRIPTS ?= true
-include .semver
-include .env
export
# Binary file names.
BINARY_NAME=photoprism
GOIMPORTS=goimports
# Build version.
SEMVER_MAJOR ?= 0
# Build version string.
SEMVER_MAJOR ?= 1
export SEMVER_MAJOR
SEMVER_MINOR ?= $(shell date -u +%y%m)
export SEMVER_MINOR
SEMVER_PATCH ?= $(shell date -u +%d)
SEMVER_VERSION ?= $(SEMVER_MAJOR).$(SEMVER_MINOR).$(SEMVER_PATCH)
export SEMVER_VERSION
# Build parameters.
BUILD_PATH ?= $(shell realpath "./build")
@@ -25,9 +28,12 @@ BUILD_DATE ?= $(shell date -u +%y%m%d)
REPORT_DATE ?= $(shell date -u +%Y-%m-%d)
BUILD_VERSION ?= $(shell git describe --always)
BUILD_TAG ?= $(BUILD_DATE)-$(BUILD_VERSION)
export BUILD_TAG
BUILD_OS ?= $(shell uname -s)
BUILD_ARCH ?= $(shell scripts/dist/arch.sh)
BUILD_ARCH ?= $(shell ./scripts/dist/arch.sh)
export BUILD_ARCH
JS_BUILD_PATH ?= $(shell realpath "./assets/static/build")
TF_VERSION ?= 2.18.0
# Install parameters.
INSTALL_PATH ?= $(BUILD_PATH)/photoprism-ce_$(BUILD_TAG)-$(shell echo $(BUILD_OS) | tr '[:upper:]' '[:lower:]')-$(BUILD_ARCH)
@@ -68,7 +74,9 @@ pull: docker-pull
test: test-js test-go
test-go: reset-sqlite run-test-go
test-pkg: reset-sqlite run-test-pkg
test-ai: reset-sqlite run-test-ai
test-api: reset-sqlite run-test-api
test-video: reset-sqlite run-test-video
test-entity: reset-sqlite run-test-entity
test-commands: reset-sqlite run-test-commands
test-photoprism: reset-sqlite run-test-photoprism
@@ -78,6 +86,9 @@ acceptance-run-chromium: storage/acceptance acceptance-auth-sqlite-restart wait
acceptance-run-chromium-short: storage/acceptance acceptance-auth-sqlite-restart wait acceptance-auth-short acceptance-auth-sqlite-stop acceptance-sqlite-restart wait-2 acceptance-short acceptance-sqlite-stop
acceptance-auth-run-chromium: storage/acceptance acceptance-auth-sqlite-restart wait acceptance-auth acceptance-auth-sqlite-stop
acceptance-public-run-chromium: storage/acceptance acceptance-sqlite-restart wait acceptance acceptance-sqlite-stop
help: list
list:
@awk '/^[[:alnum:]]+[^[:space:]]+:/ {printf "%s",substr($$1,1,length($$1)-1); if (match($$0,/#/)) {desc=substr($$0,RSTART+1); sub(/^[[:space:]]+/,"",desc); printf " - %s\n",desc} else printf "\n" }' "$(firstword $(MAKEFILE_LIST))"
wait:
sleep 20
wait-2:
@@ -94,8 +105,11 @@ devtools: install-go dep-npm
.SILENT: help;
logs:
$(DOCKER_COMPOSE) logs -f
help:
@echo "For build instructions, visit <https://docs.photoprism.app/developer-guide/>."
down:
$(DOCKER_COMPOSE) --profile=all down --remove-orphans
codex: dep-codex codex-version
codex-version:
codex --version
docs: swag
swag: swag-json
swag-json:
@@ -146,10 +160,12 @@ clean:
[ ! -d "frontend/node_modules" ] || rm -rf frontend/node_modules
[ ! -d "$(BUILD_PATH)" ] || rm -rf --preserve-root $(BUILD_PATH)
[ ! -d "$(JS_BUILD_PATH)" ] || rm -rf --preserve-root $(JS_BUILD_PATH)
clean-build:
[ ! -d "$(BUILD_PATH)" ] || rm -rf --preserve-root $(BUILD_PATH)
tar.gz:
$(info Creating tar.gz archives from the directories in "$(BUILD_PATH)"...)
find "$(BUILD_PATH)" -maxdepth 1 -mindepth 1 -type d -name "photoprism*" -exec tar --exclude='.[^/]*' -C {} -czf {}.tar.gz . \;
pkg: pkg-amd64 pkg-arm64 pkg-armv7
pkg: pkg-amd64 pkg-arm64
pkg-amd64:
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" photoprism/develop:jammy make all install tar.gz
pkg-arm64:
@@ -188,15 +204,15 @@ acceptance-sqlite-restart:
rm -rf storage/acceptance/originals/2011
rm -rf storage/acceptance/originals/2013
rm -rf storage/acceptance/originals/2017
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" --test start -d
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" start -d
acceptance-sqlite-stop:
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" --test stop
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" stop
acceptance-auth-sqlite-restart:
cp -f storage/acceptance/backup.db storage/acceptance/index.db
cp -f storage/acceptance/config-sqlite/settingsBackup.yml storage/acceptance/config-sqlite/settings.yml
./photoprism --auth-mode="password" -c "./storage/acceptance/config-sqlite" --test start -d
./photoprism --auth-mode="password" -c "./storage/acceptance/config-sqlite" start -d
acceptance-auth-sqlite-stop:
./photoprism --auth-mode="password" -c "./storage/acceptance/config-sqlite" --test stop
./photoprism --auth-mode="password" -c "./storage/acceptance/config-sqlite" stop
start:
./photoprism start -d
stop:
@@ -231,13 +247,24 @@ dep-list:
dep-npm:
sudo npm install -g npm
dep-js:
(cd frontend && npm ci --no-update-notifier --no-audit)
(cd frontend && npm ci --ignore-scripts --no-update-notifier --no-audit)
# TODO: If in the future we want to test in a real browser environment, add this (Playwright)
# (cd frontend && npx playwright install chromium)
dep-codex:
@echo "Installing latest Codex CLI..."
@[ -n "$(CODEX_HOME)" ] && [ "$(CODEX_HOME)" != "/" ] && install -d -m 700 -- "$(CODEX_HOME)" || true
@if command -v sudo >/dev/null 2>&1; then \
sudo npm install -g --location=global --no-fund --no-audit "@openai/codex@latest"; \
else \
npm install -g --location=global --no-fund --no-audit "@openai/codex@latest"; \
fi
dep-go:
go build -v ./...
dep-upgrade:
go get -u -t ./...
dep-upgrade-js:
(cd frontend && npm update --legacy-peer-deps)
frontend-update:
make -C frontend update
dep-upgrade-js: frontend-update
dep-tensorflow:
scripts/download-facenet.sh
scripts/download-nasnet.sh
@@ -271,41 +298,56 @@ build-static:
scripts/build.sh static $(BINARY_NAME)
build-libheif: build-libheif-amd64 build-libheif-arm64 build-libheif-armv7
build-libheif-amd64:
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:oracular ./scripts/dist/build-libheif.sh v1.19.5
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:noble ./scripts/dist/build-libheif.sh v1.19.5
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.19.5
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:bookworm ./scripts/dist/build-libheif.sh v1.19.5
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:plucky ./scripts/dist/build-libheif.sh v1.19.7
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:oracular ./scripts/dist/build-libheif.sh v1.19.7
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:noble ./scripts/dist/build-libheif.sh v1.19.7
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.19.7
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:bookworm ./scripts/dist/build-libheif.sh v1.19.7
build-libheif-arm64:
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:oracular ./scripts/dist/build-libheif.sh v1.19.5
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:noble ./scripts/dist/build-libheif.sh v1.19.5
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.19.5
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:bookworm ./scripts/dist/build-libheif.sh v1.19.5
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:plucky ./scripts/dist/build-libheif.sh v1.19.7
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:oracular ./scripts/dist/build-libheif.sh v1.19.7
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:noble ./scripts/dist/build-libheif.sh v1.19.7
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.19.7
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:bookworm ./scripts/dist/build-libheif.sh v1.19.7
build-libheif-armv7:
docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm -e SYSTEM_ARCH=arm photoprism/develop:armv7 ./scripts/dist/build-libheif.sh v1.19.5
docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm -e SYSTEM_ARCH=arm photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.19.5
docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm -e SYSTEM_ARCH=arm photoprism/develop:armv7 ./scripts/dist/build-libheif.sh v1.19.7
docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm -e SYSTEM_ARCH=arm photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.19.7
build-libheif-latest: build-libheif-amd64-latest build-libheif-arm64-latest build-libheif-armv7-latest
build-libheif-amd64-latest:
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:plucky ./scripts/dist/build-libheif.sh
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:oracular ./scripts/dist/build-libheif.sh
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:noble ./scripts/dist/build-libheif.sh
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh
build-libheif-arm64-latest:
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:plucky ./scripts/dist/build-libheif.sh
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:oracular ./scripts/dist/build-libheif.sh
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:noble ./scripts/dist/build-libheif.sh
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh
build-libheif-armv7-latest:
docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm -e SYSTEM_ARCH=arm photoprism/develop:armv7 ./scripts/dist/build-libheif.sh
docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm -e SYSTEM_ARCH=arm photoprism/develop:jammy ./scripts/dist/build-libheif.sh
build-tensorflow:
docker build -t photoprism/tensorflow:build docker/tensorflow
docker run -ti photoprism/tensorflow:build bash
build-tensorflow-arm64:
docker build -t photoprism/tensorflow:arm64 docker/tensorflow/arm64
docker run -ti photoprism/tensorflow:arm64 bash
build-tensorflow: docker-tensorflow-amd64
docker-tensorflow: docker-tensorflow-amd64
docker-tensorflow-amd64:
docker build --pull --no-cache -t photoprism/tensorflow:latest -t photoprism/tensorflow:amd64 -t photoprism/tensorflow:$(TF_VERSION)-amd64 --build-arg TF_VERSION=$(TF_VERSION) docker/tensorflow
terminal-tensorflow: terminal-tensorflow-amd64
terminal-tensorflow-amd64:
mkdir -p ./build
docker run --rm --pull missing -ti --platform=amd64 -v "./build:/build" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/tensorflow:amd64 bash
build-tensorflow-arm64: docker-tensorflow-arm64
docker-tensorflow-arm64:
docker build --pull --no-cache -t photoprism/tensorflow:arm64 -t photoprism/tensorflow:$(TF_VERSION)-arm64 --build-arg TF_VERSION=$(TF_VERSION) docker/tensorflow/arm64
terminal-tensorflow-arm64:
mkdir -p ./build
docker run --rm --pull missing -ti --platform=arm64 -v "./build:/build" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/tensorflow:arm64 bash
build-setup: build-setup-nas-raspberry-pi
build-setup-nas-raspberry-pi:
./scripts/setup/nas/raspberry-pi/build.sh
watch-js:
(cd frontend && env BUILD_ENV=development NODE_ENV=production npm run watch)
test-js:
$(info Running JS unit tests...)
(cd frontend && env TZ=UTC BUILD_ENV=development NODE_ENV=development BABEL_ENV=test npm run test)
(cd frontend && npm run test)
acceptance:
$(info Running public-mode tests in Chrome...)
(cd frontend && npm run testcafe -- "chrome --headless=new" --test-grep "^(Multi-Window)\:*" --test-meta mode=public --config-file ./testcaferc.json --experimental-multiple-windows "tests/acceptance" && npm run testcafe -- "chrome --headless=new" --test-grep "^(Common|Core)\:*" --test-meta mode=public --config-file ./testcaferc.json "tests/acceptance")
@@ -324,6 +366,15 @@ acceptance-auth-short:
acceptance-auth-firefox:
$(info Running JS acceptance-auth tests in Firefox...)
(cd frontend && npm run testcafe -- firefox:headless --test-grep "^(Common|Core)\:*" --test-meta mode=auth --config-file ./testcaferc.json --disable-native-automation "tests/acceptance")
vitest-watch:
$(info Running Vitest unit tests in watch mode...)
(cd frontend && npm run test-watch)
vitest-coverage:
$(info Running Vitest unit tests with coverage...)
(cd frontend && npm run test-coverage)
vitest-component:
$(info Running Vitest component tests...)
(cd frontend && npm run test-component)
reset-mariadb:
$(info Resetting photoprism database...)
mysql < scripts/sql/reset-photoprism.sql
@@ -354,9 +405,15 @@ run-test-mariadb:
run-test-pkg:
$(info Running all Go tests in "/pkg"...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./pkg/...
run-test-ai:
$(info Running all AI tests...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./internal/ai/...
run-test-api:
$(info Running all API tests...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./internal/api/...
run-test-video:
$(info Running all video tests...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./internal/ffmpeg/... ./internal/photoprism/dl/... ./pkg/media/...
run-test-entity:
$(info Running all Entity tests...)
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./internal/entity/...
@@ -380,31 +437,57 @@ test-coverage:
go test -parallel 1 -count 1 -cpu 1 -failfast -tags="slow,develop" -timeout 30m -coverprofile coverage.txt -covermode atomic ./pkg/... ./internal/...
go tool cover -html=coverage.txt -o coverage.html
go tool cover -func coverage.txt | grep total:
git-pull:
@echo "Pulling changes from remote repositories..."; \
if [ -d .git ]; then \
echo "Updating photoprism"; \
git pull --ff-only || echo "Warning: git pull failed in root"; \
else \
echo "Skipping: current directory is not a Git repo"; \
fi; \
for d in */ ; do \
[ -d "$$d" ] || continue; \
[ -d "$$d/.git" ] || continue; \
echo "Updating photoprism/$$d"; \
git -C "$$d" pull --ff-only || echo "Warning: git pull failed in $$d"; \
done;
docker-pull:
$(DOCKER_COMPOSE) --profile=all pull --ignore-pull-failures
$(DOCKER_COMPOSE) -f compose.latest.yaml pull --ignore-pull-failures
docker-build:
$(DOCKER_COMPOSE) --profile=all pull --ignore-pull-failures
$(DOCKER_COMPOSE) down --remove-orphans
$(DOCKER_COMPOSE) build --pull
docker-nvidia: docker-nvidia-up
docker-nvidia-up:
docker compose -f compose.nvidia.yaml up
docker-local-up:
$(DOCKER_COMPOSE) -f compose.local.yaml up --force-recreate
docker-local-down:
$(DOCKER_COMPOSE) -f compose.local.yaml down -V
nvidia: nvidia-up
nvidia-build:
$(DOCKER_COMPOSE) --profile=qdrant -f compose.nvidia.yaml pull --ignore-pull-failures
$(DOCKER_COMPOSE) --profile=qdrant -f compose.nvidia.yaml build
nvidia-up:
$(DOCKER_COMPOSE) --profile=qdrant -f compose.nvidia.yaml pull --ignore-pull-failures
$(DOCKER_COMPOSE) --profile=qdrant -f compose.nvidia.yaml up --remove-orphans
nvidia-down:
$(DOCKER_COMPOSE) --profile=qdrant -f compose.nvidia.yaml down --remove-orphans
intel: intel-up
intel-build:
$(DOCKER_COMPOSE) -f compose.intel.yaml pull --ignore-pull-failures
$(DOCKER_COMPOSE) -f compose.intel.yaml build
intel-up:
$(DOCKER_COMPOSE) -f compose.intel.yaml pull --ignore-pull-failures
$(DOCKER_COMPOSE) -f compose.intel.yaml up --remove-orphans
intel-down:
$(DOCKER_COMPOSE) -f compose.intel.yaml down --remove-orphans
develop: docker-develop
docker-develop: docker-develop-latest
docker-develop-all: docker-develop-latest docker-develop-other
docker-develop-latest: docker-develop-ubuntu
docker-develop-debian: docker-develop-bookworm docker-develop-bookworm-slim
docker-develop-ubuntu: docker-develop-oracular docker-develop-oracular-slim
docker-develop-ubuntu: docker-develop-plucky docker-develop-plucky-slim
docker-develop-other: docker-develop-debian docker-develop-bullseye docker-develop-bullseye-slim docker-develop-buster
docker-develop-bookworm:
docker pull --platform=amd64 debian:bookworm-slim
docker pull --platform=arm64 debian:bookworm-slim
docker pull --platform=arm debian:bookworm-slim
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64,linux/arm bookworm /bookworm "-t photoprism/develop:debian"
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 bookworm /bookworm "-t photoprism/develop:debian"
docker-develop-bookworm-slim:
docker pull --platform=amd64 debian:bookworm-slim
docker pull --platform=arm64 debian:bookworm-slim
@@ -413,7 +496,7 @@ docker-develop-bullseye:
docker pull --platform=amd64 golang:1-bullseye
docker pull --platform=arm64 golang:1-bullseye
docker pull --platform=arm golang:1-bullseye
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64,linux/arm bullseye /bullseye
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 bullseye /bullseye
docker-develop-bullseye-slim:
docker pull --platform=amd64 debian:bullseye-slim
docker pull --platform=arm64 debian:bullseye-slim
@@ -433,8 +516,7 @@ docker-develop-impish:
docker-develop-jammy:
docker pull --platform=amd64 ubuntu:jammy
docker pull --platform=arm64 ubuntu:jammy
docker pull --platform=arm ubuntu:jammy
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64,linux/arm jammy /jammy
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 jammy /jammy
docker-develop-jammy-slim:
docker pull --platform=amd64 ubuntu:jammy
docker pull --platform=arm64 ubuntu:jammy
@@ -466,11 +548,19 @@ docker-develop-noble-slim:
docker-develop-oracular:
docker pull --platform=amd64 ubuntu:oracular
docker pull --platform=arm64 ubuntu:oracular
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 oracular /oracular "-t photoprism/develop:latest -t photoprism/develop:ubuntu"
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 oracular /oracular
docker-develop-oracular-slim:
docker pull --platform=amd64 ubuntu:oracular
docker pull --platform=arm64 ubuntu:oracular
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 oracular-slim /oracular-slim
docker-develop-plucky:
docker pull --platform=amd64 ubuntu:plucky
docker pull --platform=arm64 ubuntu:plucky
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 plucky /plucky "-t photoprism/develop:latest -t photoprism/develop:ubuntu"
docker-develop-plucky-slim:
docker pull --platform=amd64 ubuntu:plucky
docker pull --platform=arm64 ubuntu:plucky
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 plucky-slim /plucky-slim
unstable: docker-unstable
docker-unstable: docker-unstable-mantic
docker-unstable-jammy:
@@ -488,10 +578,10 @@ docker-unstable-mantic:
preview: docker-preview-ce
docker-preview: docker-preview-ce
docker-preview-all: docker-preview-latest docker-preview-other
docker-preview-ce: docker-preview-oracular
docker-preview-ce: docker-preview-plucky
docker-preview-latest: docker-preview-ubuntu
docker-preview-debian: docker-preview-bookworm
docker-preview-ubuntu: docker-preview-oracular
docker-preview-ubuntu: docker-preview-plucky
docker-preview-other: docker-preview-debian docker-preview-bullseye
docker-preview-arm: docker-preview-arm64 docker-preview-armv7
docker-preview-bookworm:
@@ -556,12 +646,18 @@ docker-preview-oracular:
docker pull --platform=arm64 photoprism/develop:oracular
docker pull --platform=arm64 photoprism/develop:oracular-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-ce /oracular
docker-preview-plucky:
docker pull --platform=amd64 photoprism/develop:plucky
docker pull --platform=amd64 photoprism/develop:plucky-slim
docker pull --platform=arm64 photoprism/develop:plucky
docker pull --platform=arm64 photoprism/develop:plucky-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-ce /plucky
release: docker-release
docker-release: docker-release-latest
docker-release-all: docker-release-latest docker-release-other
docker-release-latest: docker-release-ubuntu
docker-release-debian: docker-release-bookworm
docker-release-ubuntu: docker-release-oracular
docker-release-ubuntu: docker-release-plucky
docker-release-other: docker-release-debian docker-release-bullseye
docker-release-arm: docker-release-arm64 docker-release-armv7
docker-release-bookworm:
@@ -626,6 +722,16 @@ docker-release-oracular:
docker pull --platform=arm64 photoprism/develop:oracular
docker pull --platform=arm64 photoprism/develop:oracular-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce /oracular
docker-release-plucky:
docker pull --platform=amd64 photoprism/develop:plucky
docker pull --platform=amd64 photoprism/develop:plucky-slim
docker pull --platform=arm64 photoprism/develop:plucky
docker pull --platform=arm64 photoprism/develop:plucky-slim
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce /plucky
start-traefik:
$(DOCKER_COMPOSE) up -d --wait traefik
stop-traefik:
$(DOCKER_COMPOSE) down traefik
start-local:
$(DOCKER_COMPOSE) -f compose.local.yaml up -d --wait
stop-local:
@@ -668,8 +774,12 @@ terminal-preview:
$(DOCKER_COMPOSE) -f compose.preview.yaml exec photoprism-preview bash
logs-preview:
$(DOCKER_COMPOSE) -f compose.preview.yaml logs -f photoprism-preview
docker-local: docker-local-oracular
docker-local-all: docker-local-oracular docker-local-noble docker-local-mantic docker-local-lunar docker-local-jammy docker-local-bookworm docker-local-bullseye docker-local-buster
docker-local: docker-local-plucky
docker-local-up:
$(DOCKER_COMPOSE) -f compose.local.yaml up --force-recreate
docker-local-down:
$(DOCKER_COMPOSE) -f compose.local.yaml down --remove-orphans
docker-local-all: docker-local-plucky docker-local-oracular docker-local-noble docker-local-mantic docker-local-lunar docker-local-jammy docker-local-bookworm docker-local-bullseye docker-local-buster
docker-local-bookworm:
docker pull photoprism/develop:bookworm
docker pull photoprism/develop:bookworm-slim
@@ -706,6 +816,10 @@ docker-local-oracular:
docker pull photoprism/develop:oracular
docker pull ubuntu:oracular
scripts/docker/build.sh photoprism ce-oracular /oracular "-t photoprism/photoprism:local"
docker-local-plucky:
docker pull photoprism/develop:plucky
docker pull ubuntu:plucky
scripts/docker/build.sh photoprism ce-plucky /plucky "-t photoprism/photoprism:local"
local-develop: docker-local-develop
docker-local-develop: docker-local-develop-oracular
docker-local-develop-all: docker-local-develop-oracular docker-local-develop-noble docker-local-develop-mantic docker-local-develop-lunar docker-local-develop-jammy docker-local-develop-bookworm docker-local-develop-bullseye docker-local-develop-buster docker-local-develop-impish
@@ -736,6 +850,9 @@ docker-local-develop-noble:
docker-local-develop-oracular:
docker pull ubuntu:oracular
scripts/docker/build.sh develop oracular /oracular
docker-local-develop-plucky:
docker pull ubuntu:plucky
scripts/docker/build.sh develop plucky /plucky
docker-ddns:
docker pull golang:alpine
scripts/docker/buildx-multi.sh ddns linux/amd64,linux/arm64 $(BUILD_DATE)

1461
NOTICE

File diff suppressed because it is too large Load Diff

View File

@@ -12,7 +12,7 @@ PhotoPrism® is an AI-Powered Photos App for the [Decentralized Web](https://en.
It makes use of the latest technologies to tag and find pictures automatically without getting in your way.
You can run it at home, on a private server, or in the cloud.
![](https://dl.photoprism.app/img/ui/search-cards-view.jpg)
![](https://dl.photoprism.app/img/ui/2025/desktop-search.jpg)
To get a first impression, you are welcome to play with our [public demo](https://try.photoprism.app/). Please be careful not to upload any private, unlawful or offensive pictures.
@@ -20,23 +20,21 @@ To get a first impression, you are welcome to play with our [public demo](https:
**Our mission is to provide the most user- and privacy-friendly solution to keep your pictures organized and accessible.** That's why PhotoPrism was built from the ground up to run wherever you need it, without compromising freedom, privacy, or functionality:
* Browse [all your photos](https://docs.photoprism.app/user-guide/organize/browse/) and [videos](https://try.photoprism.app/library/videos) without worrying about [RAW conversion, duplicates or video formats](https://docs.photoprism.app/user-guide/settings/library/)
* Easily find specific pictures using [powerful search filters](https://try.photoprism.app/library/browse?view=cards&q=flower%20color%3Ared)
* Recognizes [the faces of your family and friends](https://try.photoprism.app/library/people)
* [Automatic classification](https://try.photoprism.app/library/labels) of pictures based on their content and location
* [Play Live Photos](https://try.photoprism.app/library/live) by hovering over them in [albums](https://try.photoprism.app/library/albums) and [search results](https://try.photoprism.app/library/browse?view=cards&q=type%3Alive)
* Since the [User Interface](https://try.photoprism.app/) is a [Progressive Web App](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps),
it provides a native app-like experience, and you can conveniently install it on the home screen of all major operating systems and mobile devices
* Includes four high-resolution [World Maps](https://try.photoprism.app/library/places) to bring back the memories of your favorite trips
* Metadata is extracted and merged from Exif, XMP, and other sources such as Google Photos
* Many more image properties like [Colors](https://try.photoprism.app/library/browse?view=cards&q=color:red), [Chroma](https://try.photoprism.app/library/browse?view=cards&q=mono%3Atrue), and [Quality](https://try.photoprism.app/library/review) can be searched as well
* Use [PhotoSync](https://link.photoprism.app/photosync) to securely backup iOS and Android phones in the background
* WebDAV clients such as Microsoft's Windows Explorer and Apple's Finder [can connect directly](https://docs.photoprism.app/user-guide/sync/webdav/) to PhotoPrism, allowing you to open, edit, and delete files from your computer as if they were local
<img align="right" height="270" src="https://dl.photoprism.app/img/ui/2025/iphone-crocus-540px.png">
* Browse [all your pictures](https://docs.photoprism.app/user-guide/organize/browse/) without worrying about [RAW images](https://www.photoprism.app/kb/file-formats) or [video formats](https://docs.photoprism.app/user-guide/organize/video/)
* Whether you're using a phone, tablet, or desktop computer, our [intuitive PWA](https://try.photoprism.app/) provides a native app-like experience and can be [easily installed](https://docs.photoprism.app/user-guide/pwa/) on your home screen
* Quickly find specific photos and videos with [powerful search filters](https://docs.photoprism.app/user-guide/search/filters/) that can be combined and are available for [many different properties](https://docs.photoprism.app/user-guide/search/filters/#filter-reference), including [labels](https://try.photoprism.app/library/labels), [location](https://try.photoprism.app/library/places?q=s2:47a85a63f764), [resolution](https://try.photoprism.app/library/browse?view=cards&q=mp:4), [color](https://try.photoprism.app/library/browse?view=cards&q=color:red), [chroma](https://try.photoprism.app/library/browse?view=cards&q=mono%3Atrue), and [quality](https://try.photoprism.app/library/review)
* [Automatically labels your pictures](https://try.photoprism.app/library/labels) based on content and location, and recognizes the faces of [your family and friends](https://try.photoprism.app/library/people/new)
* [Live Photos](https://try.photoprism.app/library/live) start playing when you [hover over them](https://try.photoprism.app/library/browse?view=cards&q=type%3Alive) and when viewing a slideshow
* Six high-resolution [World Maps](https://try.photoprism.app/library/places) and our [privacy-preserving geocoding service](https://docs.photoprism.app/getting-started/#maps-places) help bring back memories of your favorite trips and let you explore the world
* Metadata can be extracted and merged from Exif, XMP, and other sources like Google Photos
* [Use compatible apps](https://docs.photoprism.app/user-guide/native-apps/) like [PhotoSync](https://link.photoprism.app/photosync) to back up iOS and Android phones in the background
* WebDAV clients such as [Microsoft's Windows Explorer](https://docs.photoprism.app/user-guide/sync/webdav/#__tabbed_1_2) and [Apple's Finder](https://docs.photoprism.app/user-guide/sync/webdav/#connect-to-a-webdav-server) can [connect directly to PhotoPrism](https://docs.photoprism.app/user-guide/sync/webdav/), allowing you to open, edit, and delete files from your computer as if they were local
Being completely [**self-funded and independent**](https://link.photoprism.app/membership), we can promise you that we will [never sell your data](https://www.photoprism.app/privacy) and that we will [always be transparent](https://www.photoprism.app/terms) about our software and services. Your data will never be shared with Google, Amazon, Microsoft or Apple unless you intentionally upload files to one of their services. 🔒
## Getting Started ##
<img align="right" width="25%" src="https://www.photoprism.app/user/pages/01.home/03._screenshots/iphone-maps-hybrid-540px.png">
Step-by-step [installation instructions](https://docs.photoprism.app/getting-started/) for our self-hosted [community edition](https://link.photoprism.app/personal-editions) can be found on [docs.photoprism.app](https://docs.photoprism.app/getting-started/) - all you need is a Web browser and [Docker](https://docs.docker.com/get-docker/) to run the server. It is available for Mac, Linux, and Windows.
@@ -79,11 +77,15 @@ Common problems can be quickly diagnosed and solved using our [Troubleshooting C
## Upcoming Features and Enhancements ##
<a href="https://github.com/orgs/photoprism/projects/5"><img align="right" height="240" src="https://dl.photoprism.app/img/ui/2025/upcoming-features-240px.png"></a>
Our [Project Roadmap](https://link.photoprism.app/roadmap) shows what tasks are in progress and what features will be implemented next. You are invited to give ideas you like a thumbs-up, so we know what's most popular.
Be aware that we have a zero-bug policy and do our best to help users when they need support or have other questions. This comes at a price though, as we can't give exact release dates for new features. Our team receives many more requests than can be implemented, so we want to emphasize that we are in no way obligated to implement the features, enhancements, or other changes you request. We do, however, appreciate your feedback and carefully consider all requests.
**Because sustained funding is key to quickly releasing new features, we encourage you to support our mission by [signing up as a sponsor](https://link.photoprism.app/sponsor) or purchasing a [commercial license](https://www.photoprism.app/teams). Ultimately, that's what's best for the product and the community.**
**Because sustained funding is key to quickly releasing new features, we encourage you to support our mission by [signing up for a personal membership](https://link.photoprism.app/membership) or [purchasing a commercial license](https://www.photoprism.app/teams#compare).**
[Become a Member ](https://link.photoprism.app/membership)
## GitHub Issues ⚠️ ##
@@ -96,6 +98,8 @@ We kindly ask you not to report bugs via GitHub Issues **unless you are certain
## Connect with the Community ##
<a href="https://link.photoprism.app/chat"><img align="right" width="144" height="144" src="https://dl.photoprism.app/img/brands/element-logo.svg"></a>
Follow us on [Mastodon](https://floss.social/@photoprism), [Bluesky](https://bsky.app/profile/photoprism.app), or join the [Community Chat](https://link.photoprism.app/chat) to get regular updates, connect with other users, and discuss your ideas. Our [Code of Conduct](https://www.photoprism.app/code-of-conduct) explains the "dos and donts" when interacting with other community members.
As a [contributor](CONTRIBUTING.md), you are also welcome to [contact us directly](https://www.photoprism.app/contact) if you have something on your mind that you don't want to discuss publicly. Please note, however, that due to the high volume of emails we receive, our team may be unable to get back to you immediately. We do our best to respond within five business days or less.

View File

@@ -30,6 +30,8 @@ You are [welcome to contact us](https://www.photoprism.app/contact) for change r
**[Andreas Krizek](https://github.com/Cosmic314)** (January 2025)
**[Jason Grim](https://github.com/jgrim)** (June 2025)
## Gold Sponsors ##
[**Simen Eriksen**](https://github.com/dennorske) (GitHub Sponsors, December 2019)

View File

@@ -1,4 +1,5 @@
examples
README.md
docs
.*
.*
_*

BIN
assets/examples/bear.m2ts Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

BIN
assets/examples/example.zip Normal file

Binary file not shown.

BIN
assets/examples/green.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
assets/examples/m2ts.mp4 Normal file

Binary file not shown.

View File

@@ -2,10 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
"translate@weblate.org>\n"
"POT-Creation-Date: 2025-03-15 12:54+0000\n"
"PO-Revision-Date: 2025-07-21 11:32+0000\n"
"Last-Translator: NoufAM <Nouf.almashghouni@deg.shj.ae>\n"
"Language-Team: none\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
@@ -13,11 +12,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Weblate 5.9.2\n"
"X-Generator: Weblate 5.12.2\n"
#: messages.go:103
msgid "Something went wrong, try again"
msgstr "حدث خطأ ما حاول مرة أخرى"
msgstr "حدث خطأ ما، حاول مرة أخرى"
#: messages.go:104
msgid "Unable to do that"
@@ -38,7 +37,7 @@ msgstr "%s موجود بالفعل"
#: messages.go:108
msgid "Not found"
msgstr "لم يتم العثور على"
msgstr "لم يتم العثور"
#: messages.go:109
msgid "File not found"
@@ -118,23 +117,23 @@ msgstr "طلب الاذن مرفوض"
#: messages.go:128
msgid "Upload might be offensive"
msgstr "تحميل قد يكون مسيئا"
msgstr "المحتوى المرفوع قد يكون مسيئا"
#: messages.go:129
msgid "Upload failed"
msgstr "التحميل فشل"
msgstr "فشل التحميل"
#: messages.go:130
msgid "No items selected"
msgstr "لم يتم تحديد الاختيار"
msgstr "لم يتم اختيار المحتوى"
#: messages.go:131
msgid "Failed creating file, please check permissions"
msgstr "فشل إنشاء الملف ، يرجى التحقق من الأذونات"
msgstr "فشل إنشاء الملف ، يرجى التحقق من الصلاحيات"
#: messages.go:132
msgid "Failed creating folder, please check permissions"
msgstr "فشل إنشاء المجلد ، يرجى التحقق من الأذونات"
msgstr "لم يتم إنشاء المجلد ، يرجى التحقق من الصلاحيات"
#: messages.go:133
msgid "Could not connect, please try again"
@@ -150,15 +149,15 @@ msgstr "رمز التحقق غير صالح، يرجى المحاولة مرة
#: messages.go:136
msgid "Invalid password, please try again"
msgstr "كلمة السر غير مطابقة، برجاء حاول مرة أخرى"
msgstr "كلمة السر غير مطابقة، يرجى المحاولة مرة أخرى"
#: messages.go:137
msgid "Feature disabled"
msgstr "الخاصية معطلة"
msgstr "الخاصية غير مفعلة"
#: messages.go:138
msgid "No labels selected"
msgstr "لم يتم تحديد تسميات"
msgstr "لم يتم تحديد المعرفات"
#: messages.go:139
msgid "No albums selected"
@@ -170,7 +169,7 @@ msgstr "لا توجد ملفات متاحة للتنزيل"
#: messages.go:141
msgid "Failed to create zip file"
msgstr "فشل إنشاء ملف مضغوط"
msgstr "فشل في إنشاء ملف مضغوط"
#: messages.go:142
msgid "Invalid credentials"
@@ -178,7 +177,7 @@ msgstr "بيانات الاعتماد غير صالحة"
#: messages.go:143
msgid "Invalid link"
msgstr "ارتباط غير صالح"
msgstr "رابط غير صالح"
#: messages.go:144
msgid "Invalid name"
@@ -186,7 +185,7 @@ msgstr "اسم غير صحيح"
#: messages.go:145
msgid "Busy, please try again later"
msgstr "مشغول ، يرجى المحاولة مرة أخرى في وقت لاحق"
msgstr "مشغول، يرجى المحاولة مرة أخرى في وقت لاحق"
#: messages.go:146
#, c-format
@@ -207,7 +206,7 @@ msgstr "مساحة تخزين غير كافية"
#: messages.go:150
msgid "Quota exceeded"
msgstr "تم تجاوز الحصة"
msgstr "تم تجاوز المساحة المخصصة"
#: messages.go:153
msgid "Changes successfully saved"
@@ -376,7 +375,7 @@ msgstr "تمت أرشفة الاختيار"
#: messages.go:191
msgid "Selection restored"
msgstr "تمت استعادة التحديد"
msgstr "تم استعادة المحتوى المحدد"
#: messages.go:192
msgid "Selection marked as private"
@@ -389,7 +388,7 @@ msgstr "تم حذف الألبومات"
#: messages.go:194
#, c-format
msgid "Zip created in %d s"
msgstr "إنشاء الملف المضغوط خلال %d ثوانٍ"
msgstr "تم إنشاء الملف المضغوط خلال %d ثوانٍ"
#: messages.go:195
msgid "Permanently deleted"
@@ -406,7 +405,7 @@ msgstr "تم التحقق بنجاح"
#: messages.go:198
msgid "Successfully activated"
msgstr "تم التنشيط بنجاح"
msgstr "تم التفعيل بنجاح"
#~ msgid "Storage is full"
#~ msgstr "التخزين ممتلئ"

View File

@@ -294,7 +294,7 @@ msgstr "Importación cancelada"
#: messages.go:172
#, c-format
msgid "Indexing completed in %d s"
msgstr "Indexación completada em %d"
msgstr "Indexación completada en %d"
#: messages.go:173
msgid "Indexing originals..."

View File

@@ -2,25 +2,25 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
"POT-Creation-Date: 2025-03-15 12:54+0000\n"
"PO-Revision-Date: 2025-05-12 23:50+0000\n"
"Last-Translator: Admin <hello@photoprism.app>\n"
"Language-Team: Japanese <https://translate.photoprism.app/projects/"
"photoprism/backend/ja/>\n"
"Language: ja_JP\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.9.2\n"
"X-Generator: Weblate 5.11.1\n"
#: messages.go:103
msgid "Something went wrong, try again"
msgstr "問題が発生しました。もう一度やり直してください"
msgstr "何かが間違っています。もう一度やり直してください"
#: messages.go:104
msgid "Unable to do that"
msgstr "実行できませんでした"
msgstr "その操作はできません"
#: messages.go:105
msgid "Changes could not be saved"
@@ -45,7 +45,7 @@ msgstr "ファイルが見つかりませんでした"
#: messages.go:110
msgid "File too large"
msgstr "ファイルサイズが大きすぎます"
msgstr "ファイルが大きすぎます"
#: messages.go:111
msgid "Unsupported"
@@ -53,7 +53,7 @@ msgstr "サポートされていません"
#: messages.go:112
msgid "Unsupported type"
msgstr "サポートされていないタイプ"
msgstr "サポートされていない形式です"
#: messages.go:113
msgid "Unsupported format"
@@ -61,7 +61,7 @@ msgstr "非対応のフォーマットです"
#: messages.go:114
msgid "Originals folder is empty"
msgstr "Originalsフォルダー空です"
msgstr "Originals フォルダー空です"
#: messages.go:115
msgid "Selection not found"
@@ -73,19 +73,19 @@ msgstr "エンティティが見つかりません"
#: messages.go:117
msgid "Account not found"
msgstr "アカウント存在しません"
msgstr "アカウント存在しません"
#: messages.go:118
msgid "User not found"
msgstr "ユーザ存在しません"
msgstr "ユーザーが存在しません"
#: messages.go:119
msgid "Label not found"
msgstr "ラベル存在しません"
msgstr "ラベル存在しません"
#: messages.go:120
msgid "Album not found"
msgstr "アルバム存在しません"
msgstr "アルバム存在しません"
#: messages.go:121
msgid "Subject not found"
@@ -113,7 +113,7 @@ msgstr "アカウントにログインしてください"
#: messages.go:127
msgid "Permission denied"
msgstr "アクセス拒否"
msgstr "アクセス拒否されました"
#: messages.go:128
msgid "Upload might be offensive"
@@ -121,7 +121,7 @@ msgstr "アップロードされた項目に過激なものが含まれている
#: messages.go:129
msgid "Upload failed"
msgstr "アップロード失敗"
msgstr "アップロード失敗しました"
#: messages.go:130
msgid "No items selected"
@@ -129,15 +129,15 @@ msgstr "項目が選択されていません"
#: messages.go:131
msgid "Failed creating file, please check permissions"
msgstr "ファイルの作成に失敗しました権限を確認してください"
msgstr "ファイルの作成に失敗しました権限を確認してください"
#: messages.go:132
msgid "Failed creating folder, please check permissions"
msgstr "フォルダの作成に失敗しました権限を確認してください"
msgstr "フォルダの作成に失敗しました権限を確認してください"
#: messages.go:133
msgid "Could not connect, please try again"
msgstr "接続できませんでした、再度試してみてください"
msgstr "接続できませんでした。もう一度お試しください"
#: messages.go:134
msgid "Enter verification code"
@@ -149,7 +149,7 @@ msgstr "認証コードが無効です。もう一度お試しください"
#: messages.go:136
msgid "Invalid password, please try again"
msgstr "不正なパスワードです、再度試してみてください"
msgstr "不正なパスワードです。もう一度お試しください"
#: messages.go:137
msgid "Feature disabled"
@@ -173,28 +173,28 @@ msgstr "zip ファイルの作成に失敗しました"
#: messages.go:142
msgid "Invalid credentials"
msgstr "不正な認証情報"
msgstr "正しくない認証情報です"
#: messages.go:143
msgid "Invalid link"
msgstr "不正なリンク"
msgstr "正しくないリンクです"
#: messages.go:144
msgid "Invalid name"
msgstr "無効なバケット名"
msgstr "無効な名前です"
#: messages.go:145
msgid "Busy, please try again later"
msgstr "混雑しています、後で再試行してください"
msgstr "他の処理中です。後で再試行してください"
#: messages.go:146
#, c-format
msgid "The wakeup interval is %s, but must be 1h or less"
msgstr "ウェイクアップ間隔は%sであるが、1h以下でなければならない"
msgstr "ウェイクアップ間隔は %s ですが、1時間以内で指定する必要があります"
#: messages.go:147
msgid "Your account could not be connected"
msgstr "お客様のアカウントに接続できませんでした"
msgstr "アカウントに接続できませんでした"
#: messages.go:148
msgid "Too many requests"
@@ -202,7 +202,7 @@ msgstr "リクエストが多すぎます"
#: messages.go:149
msgid "Insufficient storage"
msgstr "ストレージ不足"
msgstr "ストレージ不足しています"
#: messages.go:150
msgid "Quota exceeded"
@@ -214,16 +214,16 @@ msgstr "変更が正常に保存されました"
#: messages.go:154
msgid "Album created"
msgstr "アルバム作成ました"
msgstr "アルバム作成されました"
#: messages.go:155
msgid "Album saved"
msgstr "アルバム保存ました"
msgstr "アルバム保存されました"
#: messages.go:156
#, c-format
msgid "Album %s deleted"
msgstr "アルバム %s 削除ました"
msgstr "アルバム %s 削除されました"
#: messages.go:157
msgid "Album contents cloned"
@@ -298,7 +298,7 @@ msgstr "インデックスが %d 秒で完了しました"
#: messages.go:173
msgid "Indexing originals..."
msgstr "オリジナルの項目をインデックスしています..."
msgstr "originals をインデックスしています..."
#: messages.go:174
#, c-format
@@ -338,7 +338,7 @@ msgstr "保存対象"
#: messages.go:182
msgid "Subject deleted"
msgstr "件名 削除"
msgstr "件名削除しました"
#: messages.go:183
msgid "Person saved"
@@ -346,11 +346,11 @@ msgstr "保存された人"
#: messages.go:184
msgid "Person deleted"
msgstr "削除された人"
msgstr "人を削除しました"
#: messages.go:185
msgid "File uploaded"
msgstr "アップロードされたファイル"
msgstr "ファイルがアップロードされました"
#: messages.go:186
#, c-format
@@ -363,7 +363,7 @@ msgstr "アップロードの処理..."
#: messages.go:188
msgid "Upload has been processed"
msgstr "アップロードが処理されました"
msgstr "アップロードが完了しました"
#: messages.go:189
msgid "Selection approved"
@@ -379,7 +379,7 @@ msgstr "選択した項目が復元されました"
#: messages.go:192
msgid "Selection marked as private"
msgstr "選択した項目プライベートにました"
msgstr "選択した項目プライベートに設定されました"
#: messages.go:193
msgid "Albums deleted"
@@ -392,7 +392,7 @@ msgstr "%d 秒で zip ファイルを作成しました"
#: messages.go:195
msgid "Permanently deleted"
msgstr "永久に削除"
msgstr "完全に削除されました"
#: messages.go:196
#, c-format

2
assets/models/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -28,8 +28,8 @@
<div class="splash-logo">
{{template "logo.gohtml" .}}
</div>
<progress id="progress" class="html-progress" max="100"></progress>
<progress id="progress" class="html-progress" role="progressbar" max="100"></progress>
</div>
</div>
</div>
<div id="busy-overlay"><div class="splash-center"><progress id="busy-progress" class="html-progress" max="100"></progress></div></div>
<div id="busy-overlay"><div class="splash-center"><progress id="busy-progress" class="html-progress" role="progressbar" max="100"></progress></div></div>

View File

@@ -55,6 +55,8 @@ services:
PHOTOPRISM_DISABLE_TENSORFLOW: "false" # Don't use TensorFlow for image classification
PHOTOPRISM_DETECT_NSFW: "false" # Flag photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # Allows uploads that may be offensive
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_DARKTABLE_PRESETS: "false" # Enables Darktable presets and disables concurrent RAW conversion
PHOTOPRISM_THUMB_FILTER: "lanczos" # Resample filter, best to worst: blackman, lanczos, cubic, linear
PHOTOPRISM_THUMB_UNCACHED: "true" # Enables on-demand thumbnail rendering (high memory and cpu usage)
@@ -62,12 +64,12 @@ services:
# PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # On-demand rendering size limit (default 7680, min 720, max 7680)
PHOTOPRISM_JPEG_SIZE: 7680 # Size limit for converted image files in pixels (720-30000)
TF_CPP_MIN_LOG_LEVEL: 0 # Show TensorFlow log messages for development
TF_CPP_MIN_LOG_LEVEL: 1 # Show TensorFlow log messages for development
## Enable TensorFlow AVX2 support for modern Intel CPUs (requires starting the container as root):
# PHOTOPRISM_INIT: "tensorflow-amd64-avx2"
## Hardware video transcoding config (optional):
# PHOTOPRISM_FFMPEG_BUFFERS: "64" # FFmpeg capture buffers (default: 32)
# PHOTOPRISM_FFMPEG_BITRATE: "32" # FFmpeg encoding bitrate limit in Mbit/s (default: 50)
# PHOTOPRISM_FFMPEG_BITRATE: "32" # FFmpeg encoding bitrate limit in Mbps (default: 60)
# PHOTOPRISM_FFMPEG_ENCODER: "h264_v4l2m2m" # Use Video4Linux for AVC transcoding (default: libx264)
# PHOTOPRISM_FFMPEG_ENCODER: "h264_qsv" # Use Intel Quick Sync Video for AVC transcoding (default: libx264)
# PHOTOPRISM_INIT: "intel-graphics tensorflow-amd64-avx2" # Enable TensorFlow AVX2 & Intel Graphics support
@@ -120,8 +122,8 @@ volumes:
go-mod:
driver: local
## Create shared "photoprism-develop" network for connecting with services in other compose.yaml files
## Create shared "photoprism" network for connecting with services in other compose.yaml files
networks:
default:
name: shared
name: photoprism
driver: bridge

190
compose.intel.yaml Normal file
View File

@@ -0,0 +1,190 @@
services:
## PhotoPrism (Development Environment for Intel QSV hardware transcoding)
photoprism:
build: .
image: photoprism/photoprism:develop
depends_on:
- mariadb
- dummy-webdav
- dummy-oidc
stop_grace_period: 15s
privileged: true
security_opt:
- seccomp:unconfined
- apparmor:unconfined
## Expose HTTP and debug ports
ports:
- "2342:2342" # Default HTTP port (host:container)
- "2443:2443" # Default TLS port (host:container)
- "2343:2343" # Acceptance Test HTTP port (host:container)
- "40000:40000" # Go Debugger (host:container)
shm_size: "2gb"
## Set links and labels for use with Traefik reverse proxy
links:
- "traefik:localssl.dev"
- "traefik:app.localssl.dev"
- "traefik:keycloak.localssl.dev"
- "traefik:dummy-oidc.localssl.dev"
- "traefik:dummy-webdav.localssl.dev"
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.photoprism.loadbalancer.server.port=2342"
- "traefik.http.services.photoprism.loadbalancer.server.scheme=http"
- "traefik.http.routers.photoprism.entrypoints=websecure"
- "traefik.http.routers.photoprism.rule=Host(`localssl.dev`) || HostRegexp(`^.+\\.localssl\\.dev`)"
- "traefik.http.routers.photoprism.priority=2"
- "traefik.http.routers.photoprism.tls.domains[0].main=localssl.dev"
- "traefik.http.routers.photoprism.tls.domains[0].sans=*.localssl.dev"
- "traefik.http.routers.photoprism.tls=true"
## Configure development environment
environment:
## Run as a non-root user after initialization (supported: 0, 33, 50-99, 500-600, and 900-1200):
PHOTOPRISM_UID: ${UID:-1000} # user id, should match your host user id
PHOTOPRISM_GID: ${GID:-1000} # group id
## Access Management:
PHOTOPRISM_ADMIN_USER: "admin" # admin login username
PHOTOPRISM_ADMIN_PASSWORD: "photoprism" # initial admin password (8-72 characters)
PHOTOPRISM_AUTH_MODE: "password" # authentication mode (public, password)
PHOTOPRISM_REGISTER_URI: "https://keycloak.localssl.dev/admin/"
PHOTOPRISM_PASSWORD_RESET_URI: "https://keycloak.localssl.dev/realms/master/login-actions/reset-credentials"
PHOTOPRISM_USAGE_INFO: "true"
PHOTOPRISM_FILES_QUOTA: "100"
## Customization:
PHOTOPRISM_DEFAULT_LOCALE: "en" # default user interface language, e.g. "en" or "de"
PHOTOPRISM_PLACES_LOCALE: "local" # location details language, e.g. "local", "en", or
## OpenID Connect (pre-configured for local tests):
## see https://keycloak.localssl.dev/realms/master/.well-known/openid-configuration
PHOTOPRISM_OIDC_URI: "https://keycloak.localssl.dev/realms/master"
PHOTOPRISM_OIDC_CLIENT: "photoprism-develop"
PHOTOPRISM_OIDC_SECRET: "9d8351a0-ca01-4556-9c37-85eb634869b9"
PHOTOPRISM_OIDC_PROVIDER: "Keycloak"
PHOTOPRISM_OIDC_REGISTER: "true"
PHOTOPRISM_OIDC_WEBDAV: "true"
PHOTOPRISM_DISABLE_OIDC: "false"
## LDAP Authentication (pre-configured for local tests):
PHOTOPRISM_LDAP_URI: "ldap://dummy-ldap:389"
PHOTOPRISM_LDAP_INSECURE: "true"
PHOTOPRISM_LDAP_SYNC: "true"
PHOTOPRISM_LDAP_BIND: "simple"
PHOTOPRISM_LDAP_BIND_DN: "cn"
PHOTOPRISM_LDAP_BASE_DN: "dc=localssl,dc=dev"
PHOTOPRISM_LDAP_ROLE: ""
PHOTOPRISM_LDAP_ROLE_DN: "ou=photoprism-*,ou=groups,dc=localssl,dc=dev"
PHOTOPRISM_LDAP_WEBDAV_DN: "ou=photoprism-webdav,ou=groups,dc=localssl,dc=dev"
## HTTPS/TLS Options:
## see https://docs.photoprism.app/getting-started/using-https/
PHOTOPRISM_DISABLE_TLS: "true"
PHOTOPRISM_DEFAULT_TLS: "true"
## Site Information:
PHOTOPRISM_SITE_URL: "https://app.localssl.dev/" # server URL in the format "http(s)://domain.name(:port)/(path)"
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: "Tags and finds pictures without getting in your way!"
PHOTOPRISM_SITE_AUTHOR: "@photoprism_app"
PHOTOPRISM_DEBUG: "true"
PHOTOPRISM_READONLY: "false"
PHOTOPRISM_EXPERIMENTAL: "true"
PHOTOPRISM_HTTP_MODE: "debug"
PHOTOPRISM_HTTP_HOST: "0.0.0.0"
PHOTOPRISM_HTTP_PORT: 2342
PHOTOPRISM_HTTP_COMPRESSION: "gzip" # improves transfer speed and bandwidth utilization (none or gzip)
PHOTOPRISM_DATABASE_DRIVER: "mysql"
PHOTOPRISM_DATABASE_SERVER: "mariadb:4001"
PHOTOPRISM_DATABASE_NAME: "photoprism"
PHOTOPRISM_DATABASE_USER: "root"
PHOTOPRISM_DATABASE_PASSWORD: "photoprism"
PHOTOPRISM_TEST_DRIVER: "sqlite"
# PHOTOPRISM_TEST_DSN_MYSQL8: "root:photoprism@tcp(mysql:4001)/photoprism?charset=utf8mb4,utf8&collation=utf8mb4_unicode_ci&parseTime=true&timeout=15s"
PHOTOPRISM_ASSETS_PATH: "/go/src/github.com/photoprism/photoprism/assets"
PHOTOPRISM_STORAGE_PATH: "/go/src/github.com/photoprism/photoprism/storage"
PHOTOPRISM_ORIGINALS_PATH: "/go/src/github.com/photoprism/photoprism/storage/originals"
PHOTOPRISM_ORIGINALS_LIMIT: 128000 # sets originals file size limit to 128 GB
PHOTOPRISM_IMPORT_PATH: "/go/src/github.com/photoprism/photoprism/storage/import"
PHOTOPRISM_DISABLE_CHOWN: "false" # disables updating storage permissions via chmod and chown on startup
PHOTOPRISM_DISABLE_BACKUPS: "false" # disables backing up albums and photo metadata to YAML files
PHOTOPRISM_DISABLE_WEBDAV: "false" # disables built-in WebDAV server
PHOTOPRISM_DISABLE_SETTINGS: "false" # disables settings UI and API
PHOTOPRISM_DISABLE_PLACES: "false" # disables reverse geocoding and maps
PHOTOPRISM_DISABLE_EXIFTOOL: "false" # disables creating JSON metadata sidecar files with ExifTool
PHOTOPRISM_DISABLE_TENSORFLOW: "false" # disables all features depending on TensorFlow
PHOTOPRISM_DISABLE_RAW: "false" # disables indexing and conversion of RAW images
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # allows uploads that MAY be offensive (no effect without TensorFlow)
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_THUMB_LIBRARY: "auto" # image processing library to be used for generating thumbnails (auto, imaging, vips)
PHOTOPRISM_THUMB_FILTER: "auto" # downscaling filter (imaging best to worst: blackman, lanczos, cubic, linear, nearest)
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
## Intel Quick Sync Video (QSV) (https://docs.photoprism.app/getting-started/advanced/transcoding/#intel-quick-sync):
PHOTOPRISM_FFMPEG_ENCODER: "intel" # H.264/AVC encoder (software, intel, nvidia, apple, raspberry, or vaapi)
PHOTOPRISM_FFMPEG_SIZE: "1920" # video size limit in pixels (720-7680) (default: 3840)
# PHOTOPRISM_FFMPEG_BITRATE: "64" # video bitrate limit in Mbps (default: 60)
## Run/install on first startup (options: update tensorflow https intel gpu davfs yt-dlp):
PHOTOPRISM_INIT: "https intel tensorflow"
## External dependencies and tools:
TF_CPP_MIN_LOG_LEVEL: 1
GOCACHE: "/go/src/github.com/photoprism/photoprism/.local/gocache"
CODEX_HOME: "/go/src/github.com/photoprism/photoprism/.local/codex"
## Share hardware devices with FFmpeg for hardware video transcoding:
devices:
- "/dev/dri:/dev/dri"
working_dir: "/go/src/github.com/photoprism/photoprism"
volumes:
- ".:/go/src/github.com/photoprism/photoprism"
- "./storage:/photoprism"
- "go-mod:/go/pkg/mod"
mariadb:
extends:
file: ./compose.yaml
service: mariadb
qdrant:
extends:
file: ./compose.yaml
service: qdrant
photoprism-vision:
extends:
file: ./compose.yaml
service: photoprism-vision
ollama:
extends:
file: ./compose.yaml
service: ollama
traefik:
extends:
file: ./compose.yaml
service: traefik
dummy-webdav:
extends:
file: ./compose.yaml
service: dummy-webdav
dummy-oidc:
extends:
file: ./compose.yaml
service: dummy-oidc
dummy-ldap:
extends:
file: ./compose.yaml
service: dummy-ldap
keycloak:
extends:
file: ./compose.yaml
service: keycloak
prometheus:
extends:
file: ./compose.yaml
service: prometheus
## Create named volume for Go module cache
volumes:
go-mod:
driver: local
mariadb:
driver: local
## Create shared "photoprism" network for connecting with services in other compose.yaml files
networks:
default:
name: photoprism
driver: bridge

View File

@@ -12,6 +12,7 @@ services:
- "2344:2342" # HTTP port (host:container)
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.latest.loadbalancer.server.port=2342"
- "traefik.http.routers.latest.entrypoints=websecure"
- "traefik.http.routers.latest.rule=Host(`latest.localssl.dev`)"
@@ -50,6 +51,8 @@ services:
PHOTOPRISM_DISABLE_TENSORFLOW: "false" # disables all features depending on TensorFlow
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # allows uploads that MAY be offensive (no effect without TensorFlow)
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
PHOTOPRISM_THUMB_FILTER: "lanczos" # resample filter, best to worst: blackman, lanczos, cubic, linear
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
@@ -57,13 +60,13 @@ services:
# PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # on-demand rendering size limit (default 7680, min 720, max 7680)
PHOTOPRISM_JPEG_SIZE: 7680 # size limit for converted image files in pixels (720-30000)
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
TF_CPP_MIN_LOG_LEVEL: 1 # show TensorFlow log messages for development
working_dir: "/photoprism"
volumes:
- "./storage:/photoprism/storage"
- "./storage/originals:/photoprism/originals"
## Join shared "photoprism-develop" network
## Join shared "photoprism" network
networks:
default:
name: photoprism

View File

@@ -6,7 +6,7 @@ services:
## Docs: https://docs.photoprism.org/
photoprism-local:
image: photoprism/photoprism:local
stop_grace_period: 10s
stop_grace_period: 15s
security_opt:
- seccomp:unconfined
- apparmor:unconfined
@@ -14,6 +14,7 @@ services:
- "2345:2342" # HTTP port (host:container)
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.latest.loadbalancer.server.port=2342"
- "traefik.http.routers.latest.entrypoints=websecure"
- "traefik.http.routers.latest.rule=Host(`local.localssl.dev`)"
@@ -51,6 +52,8 @@ services:
PHOTOPRISM_DISABLE_TENSORFLOW: "false" # disables all features depending on TensorFlow
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # allows uploads that MAY be offensive (no effect without TensorFlow)
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
PHOTOPRISM_THUMB_FILTER: "lanczos" # resample filter, best to worst: blackman, lanczos, cubic, linear
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
@@ -58,8 +61,8 @@ services:
# PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # on-demand rendering size limit (default 7680, min 720, max 7680)
PHOTOPRISM_JPEG_SIZE: 7680 # size limit for converted image files in pixels (720-30000)
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
# PHOTOPRISM_INIT: "http gpu tensorflow" # Options: "update https gpu tensorflow davfs clitools clean"
TF_CPP_MIN_LOG_LEVEL: 1 # show TensorFlow log messages for development
# PHOTOPRISM_INIT: "http gpu tensorflow yt-dlp" # Options: "update https gpu tensorflow davfs clitools clean"
PHOTOPRISM_FFMPEG_ENCODER: "nvidia" # Options: "software", "intel", "nvidia", "apple", "raspberry"
PHOTOPRISM_STORAGE_PATH: "/photoprism/storage"
PHOTOPRISM_ORIGINALS_PATH: "/photoprism/storage/originals"
@@ -70,7 +73,7 @@ services:
volumes:
- "./storage:/photoprism/storage"
## Join shared "photoprism-develop" network
## Join shared "photoprism" network
networks:
default:
name: photoprism

View File

@@ -145,7 +145,7 @@ services:
MYSQL_PASSWORD: "photoprism"
MYSQL_ROOT_PASSWORD: "photoprism"
## Join shared "photoprism-develop" network
## Join shared "photoprism" network
networks:
default:
name: photoprism

View File

@@ -15,7 +15,7 @@ services:
MYSQL_PASSWORD: "photoprism"
MYSQL_ROOT_PASSWORD: "photoprism"
## Join shared "photoprism-develop" network
## Join shared "photoprism" network
networks:
default:
name: photoprism

View File

@@ -3,11 +3,13 @@ services:
photoprism:
build: .
image: photoprism/photoprism:develop
runtime: nvidia
depends_on:
- mariadb
- dummy-webdav
- dummy-oidc
stop_grace_period: 10s
stop_grace_period: 15s
privileged: true
security_opt:
- seccomp:unconfined
- apparmor:unconfined
@@ -22,11 +24,14 @@ services:
links:
- "traefik:localssl.dev"
- "traefik:app.localssl.dev"
- "traefik:vision.localssl.dev"
- "traefik:qdrant.localssl.dev"
- "traefik:keycloak.localssl.dev"
- "traefik:dummy-oidc.localssl.dev"
- "traefik:dummy-webdav.localssl.dev"
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.photoprism.loadbalancer.server.port=2342"
- "traefik.http.services.photoprism.loadbalancer.server.scheme=http"
- "traefik.http.routers.photoprism.entrypoints=websecure"
@@ -48,6 +53,9 @@ services:
PHOTOPRISM_PASSWORD_RESET_URI: "https://keycloak.localssl.dev/realms/master/login-actions/reset-credentials"
PHOTOPRISM_USAGE_INFO: "true"
PHOTOPRISM_FILES_QUOTA: "100"
## Customization:
PHOTOPRISM_DEFAULT_LOCALE: "en" # default user interface language, e.g. "en" or "de"
PHOTOPRISM_PLACES_LOCALE: "local" # location details language, e.g. "local", "en", or
## OpenID Connect (pre-configured for local tests):
## see https://keycloak.localssl.dev/realms/master/.well-known/openid-configuration
PHOTOPRISM_OIDC_URI: "https://keycloak.localssl.dev/realms/master"
@@ -106,44 +114,116 @@ services:
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # allows uploads that MAY be offensive (no effect without TensorFlow)
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_THUMB_LIBRARY: "auto" # image processing library to be used for generating thumbnails (auto, imaging, vips)
PHOTOPRISM_THUMB_FILTER: "auto" # downscaling filter (imaging best to worst: blackman, lanczos, cubic, linear, nearest)
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
## Nvidia Video Transcoding (https://docs.photoprism.app/getting-started/advanced/transcoding/#nvidia-container-toolkit):
## Run/install on first startup (options: update tensorflow https intel gpu davfs yt-dlp):
PHOTOPRISM_INIT: "https tensorflow-gpu"
## Computer Vision API (https://docs.photoprism.app/getting-started/config-options/#computer-vision):
PHOTOPRISM_VISION_API: "true" # server: enables service API endpoints under /api/v1/vision (requires access token)
PHOTOPRISM_VISION_URI: "" # client: service URI, e.g. http://hostname/api/v1/vision (leave blank to disable)
PHOTOPRISM_VISION_KEY: "" # client: service access token (for authentication)
## NVIDIA GPU Hardware Acceleration (see https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html):
NVIDIA_VISIBLE_DEVICES: "all"
NVIDIA_DRIVER_CAPABILITIES: "compute,video,utility"
NVIDIA_DRIVER_CAPABILITIES: "all"
PHOTOPRISM_FFMPEG_ENCODER: "nvidia" # H.264/AVC encoder (software, intel, nvidia, apple, raspberry, or vaapi)
PHOTOPRISM_FFMPEG_SIZE: "1920" # video size limit in pixels (720-7680) (default: 3840)
PHOTOPRISM_FFMPEG_BITRATE: "50" # video bitrate limit in Mbit/s (default: 50)
## Run/install on first startup (options: update https gpu ffmpeg tensorflow davfs clitools clean):
PHOTOPRISM_INIT: "https tensorflow"
## Share hardware devices with FFmpeg and TensorFlow (optional):
PHOTOPRISM_FFMPEG_BITRATE: "64" # video bitrate limit in Mbps (default: 60)
## External dependencies and tools:
TF_CPP_MIN_LOG_LEVEL: 1
GOCACHE: "/go/src/github.com/photoprism/photoprism/.local/gocache"
CODEX_HOME: "/go/src/github.com/photoprism/photoprism/.local/codex"
## Shared devices for video hardware transcoding (optional):
# devices:
# - "/dev/dri:/dev/dri" # Intel QSV (Broadwell and later) or VAAPI (Haswell and earlier)
# - "/dev/nvidia0:/dev/nvidia0" # Nvidia CUDA
# - "/dev/nvidiactl:/dev/nvidiactl"
# - "/dev/nvidia-modeset:/dev/nvidia-modeset"
# - "/dev/nvidia-nvswitchctl:/dev/nvidia-nvswitchctl"
# - "/dev/nvidia-uvm:/dev/nvidia-uvm"
# - "/dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools"
# - "/dev/dri:/dev/dri" # Required Intel QSV or VAAPI hardware transcoding
# - "/dev/video11:/dev/video11" # Video4Linux Video Encode Device (h264_v4l2m2m)
working_dir: "/go/src/github.com/photoprism/photoprism"
volumes:
- ".:/go/src/github.com/photoprism/photoprism"
- "./storage:/photoprism"
- "go-mod:/go/pkg/mod"
## NVIDIA GPU Hardware Acceleration (see https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html):
deploy:
resources:
reservations:
devices:
- driver: "nvidia"
capabilities: [gpu]
count: "all"
## Ollama Large-Language Model Runner
## run "ollama pull [name]:[version]" to download a vision model
## listed at <https://ollama.com/search?c=vision>, for example:
## docker compose exec ollama ollama pull gemma3:latest
ollama:
image: ollama/ollama:latest
restart: unless-stopped
stop_grace_period: 15s
## Only starts this service if the "all", "ollama", or "vision" profile is specified::
## docker compose --profile ollama up -d
profiles: ["all", "ollama", "vision"]
## Insecurely exposes the Ollama service on port 11434
## without authentication (for private networks only):
# ports:
# - "11434:11434"
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.ollama.loadbalancer.server.port=11434"
- "traefik.http.routers.ollama.rule=Host(`ollama.localssl.dev`)"
- "traefik.http.routers.ollama.entrypoints=websecure"
- "traefik.http.routers.ollama.tls=true"
environment:
## Ollama Configuration Options:
OLLAMA_HOST: "0.0.0.0:11434"
OLLAMA_MODELS: "/root/.ollama" # model storage path (see volumes section below)
OLLAMA_MAX_QUEUE: "100" # maximum number of queued requests
OLLAMA_NUM_PARALLEL: "1" # maximum number of parallel requests
OLLAMA_MAX_LOADED_MODELS: "1" # maximum number of loaded models per GPU
OLLAMA_LOAD_TIMEOUT: "5m" # maximum time for loading models (default "5m")
OLLAMA_KEEP_ALIVE: "5m" # duration that models stay loaded in memory (default "5m")
OLLAMA_CONTEXT_LENGTH: "4096" # maximum input context length
OLLAMA_MULTIUSER_CACHE: "false" # optimize prompt caching for multi-user scenarios
OLLAMA_NOPRUNE: "false" # disables pruning of model blobs at startup
OLLAMA_NOHISTORY: "true" # disables readline history
OLLAMA_FLASH_ATTENTION: "false" # enables the experimental flash attention feature
OLLAMA_KV_CACHE_TYPE: "f16" # cache quantization (f16, q8_0, or q4_0)
OLLAMA_SCHED_SPREAD: "false" # allows scheduling models across all GPUs.
OLLAMA_NEW_ENGINE: "true" # enables the new Ollama engine
# OLLAMA_DEBUG: "true" # shows additional debug information
# OLLAMA_INTEL_GPU: "true" # enables experimental Intel GPU detection
## NVIDIA GPU Hardware Acceleration (see https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html):
NVIDIA_VISIBLE_DEVICES: "all"
NVIDIA_DRIVER_CAPABILITIES: "compute,utility"
volumes:
- "./storage/services/ollama:/root/.ollama"
## NVIDIA GPU Hardware Acceleration (see https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html):
deploy:
resources:
reservations:
devices:
- driver: "nvidia"
count: 1
capabilities: [ gpu ]
count: "all"
mariadb:
extends:
file: ./compose.yaml
service: mariadb
qdrant:
extends:
file: ./compose.yaml
service: qdrant
open-webui:
extends:
file: ./compose.yaml
service: open-webui
photoprism-vision:
extends:
file: ./compose.yaml
service: photoprism-vision
traefik:
extends:
file: ./compose.yaml
@@ -176,7 +256,7 @@ volumes:
mariadb:
driver: local
## Create shared "photoprism-develop" network for connecting with services in other compose.yaml files
## Create shared "photoprism" network for connecting with services in other compose.yaml files
networks:
default:
name: photoprism

View File

@@ -24,7 +24,6 @@ services:
- "go-mod:/go/pkg/mod"
shm_size: "2gb"
environment:
PHOTOPRISM_INIT: "https"
PHOTOPRISM_ADMIN_USER: "admin" # admin login username
PHOTOPRISM_ADMIN_PASSWORD: "photoprism" # initial admin password (8-72 characters)
PHOTOPRISM_AUTH_MODE: "password" # authentication mode (public, password)
@@ -58,6 +57,8 @@ services:
PHOTOPRISM_DISABLE_TENSORFLOW: "false" # disables all features depending on TensorFlow
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # allows uploads that MAY be offensive (no effect without TensorFlow)
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
PHOTOPRISM_THUMB_FILTER: "lanczos" # resample filter, best to worst: blackman, lanczos, cubic, linear
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
@@ -65,8 +66,12 @@ services:
# PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # on-demand rendering size limit (default 7680, min 720, max 7680)
PHOTOPRISM_JPEG_SIZE: 7680 # size limit for converted image files in pixels (720-30000)
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
## Run/install on first startup (options: update tensorflow https intel gpu davfs yt-dlp):
PHOTOPRISM_INIT: "https"
## External dependencies and tools:
TF_CPP_MIN_LOG_LEVEL: 1
GOCACHE: "/go/src/github.com/photoprism/photoprism/.local/gocache"
CODEX_HOME: "/go/src/github.com/photoprism/photoprism/.local/codex"
## PostgreSQL Database Server
## Docs: https://www.postgresql.org/docs/
postgres:

View File

@@ -12,6 +12,7 @@ services:
- "2344:2342" # HTTP port (host:container)
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.preview.loadbalancer.server.port=2342"
- "traefik.http.routers.preview.entrypoints=websecure"
- "traefik.http.routers.preview.rule=Host(`preview.localssl.dev`)"
@@ -50,6 +51,8 @@ services:
PHOTOPRISM_DISABLE_TENSORFLOW: "false" # disables all features depending on TensorFlow
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # allows uploads that MAY be offensive (no effect without TensorFlow)
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
PHOTOPRISM_THUMB_FILTER: "lanczos" # resample filter, best to worst: blackman, lanczos, cubic, linear
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
@@ -57,13 +60,13 @@ services:
# PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # on-demand rendering size limit (default 7680, min 720, max 7680)
PHOTOPRISM_JPEG_SIZE: 7680 # size limit for converted image files in pixels (720-30000)
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
TF_CPP_MIN_LOG_LEVEL: 1 # show TensorFlow log messages for development
working_dir: "/photoprism"
volumes:
- "./storage:/photoprism/storage"
- "./storage/originals:/photoprism/originals"
## Join shared "photoprism-develop" network
## Join shared "photoprism" network
networks:
default:
name: photoprism

View File

@@ -10,7 +10,7 @@ services:
- mariadb
- dummy-webdav
- dummy-oidc
stop_grace_period: 10s
stop_grace_period: 15s
security_opt:
- seccomp:unconfined
- apparmor:unconfined
@@ -25,11 +25,14 @@ services:
links:
- "traefik:localssl.dev"
- "traefik:app.localssl.dev"
- "traefik:vision.localssl.dev"
- "traefik:qdrant.localssl.dev"
- "traefik:keycloak.localssl.dev"
- "traefik:dummy-oidc.localssl.dev"
- "traefik:dummy-webdav.localssl.dev"
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.photoprism.loadbalancer.server.port=2342"
- "traefik.http.services.photoprism.loadbalancer.server.scheme=http"
- "traefik.http.routers.photoprism.entrypoints=websecure"
@@ -55,6 +58,9 @@ services:
PHOTOPRISM_PASSWORD_RESET_URI: "https://keycloak.localssl.dev/realms/master/login-actions/reset-credentials"
PHOTOPRISM_USAGE_INFO: "true"
PHOTOPRISM_FILES_QUOTA: "100"
## Customization:
PHOTOPRISM_DEFAULT_LOCALE: "en" # default user interface language, e.g. "en" or "de"
PHOTOPRISM_PLACES_LOCALE: "local" # location details language, e.g. "local", "en", or "de"
## OpenID Connect (pre-configured for local tests):
## see https://keycloak.localssl.dev/realms/master/.well-known/openid-configuration
PHOTOPRISM_OIDC_URI: "https://keycloak.localssl.dev/realms/master"
@@ -113,26 +119,29 @@ services:
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "false" # allows uploads that MAY be offensive (no effect without TensorFlow)
PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
PHOTOPRISM_UPLOAD_ARCHIVES: "true" # allows upload of zip archives (will be extracted before import)
PHOTOPRISM_THUMB_LIBRARY: "auto" # image processing library to be used for generating thumbnails (auto, imaging, vips)
PHOTOPRISM_THUMB_FILTER: "auto" # downscaling filter (imaging best to worst: blackman, lanczos, cubic, linear, nearest)
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
## Video Transcoding (https://docs.photoprism.app/getting-started/advanced/transcoding/):
# PHOTOPRISM_FFMPEG_ENCODER: "software" # H.264/AVC encoder (software, intel, nvidia, apple, raspberry, or vaapi)
# PHOTOPRISM_FFMPEG_SIZE: "1920" # video size limit in pixels (720-7680) (default: 3840)
# PHOTOPRISM_FFMPEG_BITRATE: "32" # video bitrate limit in Mbit/s (default: 50)
# LIBVA_DRIVER_NAME: "i965" # For Intel architectures Haswell and older which do not support QSV yet but use VAAPI instead
## Run/install on first startup (options: update https gpu ffmpeg tensorflow davfs clitools clean):
PHOTOPRISM_INIT: "https tensorflow"
## Share hardware devices with FFmpeg and TensorFlow (optional):
PHOTOPRISM_FFMPEG_SIZE: "1920" # video size limit in pixels (720-7680) (default: 3840)
# PHOTOPRISM_FFMPEG_BITRATE: "64" # video bitrate limit in Mbps (default: 60)
## Run/install on first startup (options: update tensorflow https intel gpu davfs yt-dlp):
PHOTOPRISM_INIT: "https"
## Computer Vision API (https://docs.photoprism.app/getting-started/config-options/#computer-vision):
PHOTOPRISM_VISION_API: "true" # server: enables service API endpoints under /api/v1/vision (requires access token)
PHOTOPRISM_VISION_URI: "" # client: service URI, e.g. http://hostname/api/v1/vision (leave blank to disable)
PHOTOPRISM_VISION_KEY: "" # client: service access token (for authentication)
## External dependencies and tools:
TF_CPP_MIN_LOG_LEVEL: 1
GOCACHE: "/go/src/github.com/photoprism/photoprism/.local/gocache"
CODEX_HOME: "/go/src/github.com/photoprism/photoprism/.local/codex"
## Shared devices for video hardware transcoding (optional):
# devices:
# - "/dev/dri:/dev/dri" # Intel QSV (Broadwell and later) or VAAPI (Haswell and earlier)
# - "/dev/nvidia0:/dev/nvidia0" # Nvidia CUDA
# - "/dev/nvidiactl:/dev/nvidiactl"
# - "/dev/nvidia-modeset:/dev/nvidia-modeset"
# - "/dev/nvidia-nvswitchctl:/dev/nvidia-nvswitchctl"
# - "/dev/nvidia-uvm:/dev/nvidia-uvm"
# - "/dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools"
# - "/dev/dri:/dev/dri" # Required Intel QSV or VAAPI hardware transcoding
# - "/dev/video11:/dev/video11" # Video4Linux Video Encode Device (h264_v4l2m2m)
working_dir: "/go/src/github.com/photoprism/photoprism"
volumes:
@@ -164,6 +173,150 @@ services:
MARIADB_PASSWORD: "photoprism"
MARIADB_ROOT_PASSWORD: "photoprism"
## Qdrant (Vector Database)
## Docs: https://qdrant.tech/documentation/guides/installation/#docker-compose
## Release Notes: https://github.com/qdrant/qdrant/releases
## Web UI: https://qdrant.localssl.dev/dashboard
qdrant:
image: qdrant/qdrant:latest
profiles: [ "all", "qdrant" ]
links:
- "traefik:localssl.dev"
- "traefik:app.localssl.dev"
- "traefik:vision.localssl.dev"
labels:
- "traefik.enable=true"
- "traefik.http.services.qdrant.loadbalancer.server.port=6333"
- "traefik.http.services.qdrant.loadbalancer.server.scheme=http"
- "traefik.http.routers.qdrant.entrypoints=websecure"
- "traefik.http.routers.qdrant.rule=Host(`qdrant.localssl.dev`)"
- "traefik.http.routers.qdrant.priority=3"
- "traefik.http.routers.qdrant.tls.domains[0].main=localssl.dev"
- "traefik.http.routers.qdrant.tls.domains[0].sans=*.localssl.dev"
- "traefik.http.routers.qdrant.tls=true"
expose:
- 6333
- 6334
- 6335
volumes:
- "./.qdrant.yaml:/qdrant/config/production.yaml"
- "./storage/services/qdrant:/qdrant/storage"
## Ollama Large-Language Model Runner
## run "ollama pull [name]:[version]" to download a vision model
## listed at <https://ollama.com/search?c=vision>, for example:
## docker compose exec ollama ollama pull gemma3:latest
ollama:
image: ollama/ollama:latest
restart: unless-stopped
stop_grace_period: 10s
## Only starts this service if the "all", "ollama", or "vision" profile is specified::
## docker compose --profile ollama up -d
profiles: [ "all", "ollama", "vision" ]
## Insecurely exposes the Ollama service on port 11434
## without authentication (for private networks only):
# ports:
# - "11434:11434"
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.ollama.loadbalancer.server.port=11434"
- "traefik.http.routers.ollama.rule=Host(`ollama.localssl.dev`)"
- "traefik.http.routers.ollama.entrypoints=websecure"
- "traefik.http.routers.ollama.tls=true"
environment:
## Ollama Configuration Options:
OLLAMA_HOST: "0.0.0.0:11434"
OLLAMA_MODELS: "/root/.ollama" # model storage path (see volumes section below)
OLLAMA_MAX_QUEUE: "100" # maximum number of queued requests
OLLAMA_NUM_PARALLEL: "1" # maximum number of parallel requests
OLLAMA_MAX_LOADED_MODELS: "1" # maximum number of loaded models per GPU
OLLAMA_LOAD_TIMEOUT: "5m" # maximum time for loading models (default "5m")
OLLAMA_KEEP_ALIVE: "5m" # duration that models stay loaded in memory (default "5m")
OLLAMA_CONTEXT_LENGTH: "4096" # maximum input context length
OLLAMA_MULTIUSER_CACHE: "false" # optimize prompt caching for multi-user scenarios
OLLAMA_NOPRUNE: "false" # disables pruning of model blobs at startup
OLLAMA_NOHISTORY: "true" # disables readline history
OLLAMA_FLASH_ATTENTION: "false" # enables the experimental flash attention feature
OLLAMA_KV_CACHE_TYPE: "f16" # cache quantization (f16, q8_0, or q4_0)
OLLAMA_SCHED_SPREAD: "false" # allows scheduling models across all GPUs.
OLLAMA_NEW_ENGINE: "true" # enables the new Ollama engine
# OLLAMA_DEBUG: "true" # shows additional debug information
# OLLAMA_INTEL_GPU: "true" # enables experimental Intel GPU detection
## NVIDIA GPU Hardware Acceleration (optional):
# NVIDIA_VISIBLE_DEVICES: "all"
# NVIDIA_DRIVER_CAPABILITIES: "compute,utility"
volumes:
- "./storage/services/ollama:/root/.ollama"
## NVIDIA GPU Hardware Acceleration (optional):
# deploy:
# resources:
# reservations:
# devices:
# - driver: "nvidia"
# capabilities: [ gpu ]
# count: "all"
## Open WebUI, a Web Interface for Ollama
## see https://github.com/open-webui/open-webui
open-webui:
image: ghcr.io/open-webui/open-webui:main
restart: unless-stopped
stop_grace_period: 5s
## Only starts this service if the "all", "ollama", "open-webui", or "vision" profile is specified::
## docker compose --profile ollama up -d
profiles: [ "all", "ollama", "open-webui", "vision" ]
## Exposes Open WebUI at http://localhost:8080 (use https://chat.localssl.dev/ to access it through Traefik):
ports:
- "127.0.0.1:8080:8080"
labels:
- "traefik.enable=true"
- "traefik.docker.network=photoprism"
- "traefik.http.services.open-webui.loadbalancer.server.port=8080"
- "traefik.http.routers.open-webui.rule=Host(`chat.localssl.dev`) || Host(`open-webui.localssl.dev`) || Host(`ollama-ui.localssl.dev`)"
- "traefik.http.routers.open-webui.entrypoints=websecure"
- "traefik.http.routers.open-webui.tls=true"
environment:
WEBUI_URL: "https://chat.localssl.dev"
# WEBUI_SECRET_KEY: ""
OLLAMA_BASE_URL: "http://ollama:11434"
ANONYMIZED_TELEMETRY: "false" # disable Chroma telemetry
HF_HUB_DISABLE_TELEMETRY: "1" # disable Hugging Face telemetry
# HUGGING_FACE_HUB_TOKEN: "" # see https://huggingface.co/docs/hub/en/security-tokens
volumes:
- "./storage/services/open-webui:/app/backend/data"
## PhotoPrism® Computer Vision API
## see https://github.com/photoprism/photoprism-vision
photoprism-vision:
image: photoprism/vision:latest
## Only starts this service if the "all" or "vision" profile is specified::
## docker compose --profile vision up -d
profiles: [ "all", "vision" ]
stop_grace_period: 15s
working_dir: "/app"
links:
- "traefik:localssl.dev"
- "traefik:app.localssl.dev"
- "traefik:qdrant.localssl.dev"
labels:
- "traefik.enable=true"
- "traefik.http.services.qdrant.loadbalancer.server.port=5000"
- "traefik.http.services.qdrant.loadbalancer.server.scheme=http"
- "traefik.http.routers.qdrant.entrypoints=websecure"
- "traefik.http.routers.qdrant.rule=Host(`vision.localssl.dev`)"
- "traefik.http.routers.qdrant.priority=3"
- "traefik.http.routers.qdrant.tls.domains[0].main=localssl.dev"
- "traefik.http.routers.qdrant.tls.domains[0].sans=*.localssl.dev"
- "traefik.http.routers.qdrant.tls=true"
expose:
- 5000
environment:
TF_CPP_MIN_LOG_LEVEL: 2
## Ollama client configuration (for the service, see below):
OLLAMA_ENABLED: "true"
OLLAMA_HOST: "http://ollama:11434"
## Traefik v3 (Reverse Proxy)
## includes "*.localssl.dev" SSL certificate for test environments
## Docs: https://doc.traefik.io/traefik/
@@ -262,7 +415,7 @@ services:
## ./photoprism client add --id=cs5cpu17n6gj2qo5 --secret=xcCbOrw6I0vcoXzhnOmXhjpVSyFq0l0e -s metrics -n Prometheus -e 60 -t 1
prometheus:
image: prom/prometheus:latest
profiles: ["all", "auth", "prometheus"]
profiles: [ "all", "auth", "prometheus" ]
labels:
- "traefik.enable=true"
- "traefik.http.services.prometheus.loadbalancer.server.port=9090"
@@ -282,7 +435,7 @@ volumes:
mariadb:
driver: local
## Create shared "photoprism-develop" network for connecting with services in other compose.yaml files
## Create shared "photoprism" network for connecting with services in other compose.yaml files
networks:
default:
name: photoprism

View File

@@ -1,8 +1,9 @@
FROM photoprism/photoprism:preview-ce AS build
# Set environment variables
ENV TF_CPP_MIN_LOG_LEVEL=2 \
MALLOC_ARENA_MAX="4" \
ENV TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PHOTOPRISM_STORAGE_PATH="/photoprism/storage" \
PHOTOPRISM_DEBUG="false" \
PHOTOPRISM_READONLY="false" \

View File

@@ -1,7 +1,6 @@
services:
demo:
restart: always
command: photoprism --public start
image: photoprism/demo:latest
container_name: demo
depends_on:
@@ -14,6 +13,8 @@ services:
volumes:
- "./config:/photoprism/storage/config"
environment:
PHOTOPRISM_DEMO: "true"
PHOTOPRISM_PUBLIC: "true"
PHOTOPRISM_SITE_URL: "https://demo.yourdomain.com/"
# PHOTOPRISM_CDN_URL: "https://demo-cdn.yourdomain.com/"
PHOTOPRISM_SITE_TITLE: "PhotoPrism"
@@ -26,7 +27,7 @@ services:
traefik:
restart: always
image: traefik:v3.1
image: traefik:v3.5
container_name: traefik
ports:
- "80:80"

View File

@@ -1,8 +1,9 @@
FROM photoprism/photoprism:preview-ce-debian AS build
# Set environment variables
ENV TF_CPP_MIN_LOG_LEVEL=2 \
MALLOC_ARENA_MAX="4" \
ENV TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PHOTOPRISM_STORAGE_PATH="/photoprism/storage" \
PHOTOPRISM_DEBUG="false" \
PHOTOPRISM_READONLY="false" \

View File

@@ -6,7 +6,7 @@ serversTransport:
# Required to proxy services with self-signed HTTPS certificates:
insecureSkipVerify: true
# Open ports ond protocols (HTTP will be redirected to HTTPS):
# Open ports and protocols (HTTP will be redirected to HTTPS):
entryPoints:
web:
address: ":80"

View File

@@ -1,8 +1,9 @@
FROM photoprism/photoprism:preview-ce-ubuntu AS build
# Set environment variables
ENV TF_CPP_MIN_LOG_LEVEL=2 \
MALLOC_ARENA_MAX="4" \
ENV TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PHOTOPRISM_STORAGE_PATH="/photoprism/storage" \
PHOTOPRISM_DEBUG="false" \
PHOTOPRISM_READONLY="false" \

View File

@@ -1,8 +1,9 @@
FROM photoprism/photoprism:unstable-ce AS build
# Set environment variables
ENV TF_CPP_MIN_LOG_LEVEL=2 \
MALLOC_ARENA_MAX="4" \
ENV TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PHOTOPRISM_STORAGE_PATH="/photoprism/storage" \
PHOTOPRISM_DEBUG="false" \
PHOTOPRISM_READONLY="false" \

View File

@@ -30,14 +30,16 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
NODE_ENV="production" \
DEBIAN_FRONTEND="noninteractive" \
TMPDIR="/tmp" \
TF_CPP_MIN_LOG_LEVEL="0" \
MALLOC_ARENA_MAX="4" \
TF_VERSION=1.15.2 \
TF_CPP_MIN_LOG_LEVEL=1 \
MALLOC_ARENA_MAX=2 \
GOPATH="/go" \
GOBIN="/usr/local/bin" \
GO111MODULE="on" \
CGO_CFLAGS="-g -O2 -Wno-return-local-addr" \
PROG="photoprism" \
S6_KEEP_ENV=1 \
S6_VERBOSITY=0 \
S6_LOGGING=0
# Copy scripts and package sources config.
@@ -62,6 +64,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
iputils-ping dnsutils \
&& \
/scripts/install-nodejs.sh && \
/scripts/install-yt-dlp.sh && \
/scripts/install-libheif.sh && \
/scripts/install-tensorflow.sh && \
echo "ALL ALL=(ALL) NOPASSWD:SETENV: ALL" >> /etc/sudoers.d/all && \

View File

@@ -29,8 +29,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism"
# Copy scripts and package sources config.

View File

@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
DEBIAN_FRONTEND="noninteractive" \
TMPDIR="/tmp" \
TF_CPP_MIN_LOG_LEVEL="0" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=1 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
GOPATH="/go" \
GOBIN="/usr/local/bin" \
GO111MODULE="on" \

View File

@@ -29,8 +29,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism"
# copy scripts and debian backports sources list

View File

@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
DEBIAN_FRONTEND="noninteractive" \
TMPDIR="/tmp" \
TF_CPP_MIN_LOG_LEVEL="0" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=1 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
GOPATH="/go" \
GOBIN="/usr/local/bin" \
GO111MODULE="on" \
@@ -53,6 +54,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
apt-get update && apt-get -qq dist-upgrade && \
apt-get -qq install \
apt-utils \
ripgrep \
gpg \
pkg-config \
software-properties-common \

View File

@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
NODE_ENV="production" \
DEBIAN_FRONTEND="noninteractive" \
TMPDIR="/tmp" \
TF_CPP_MIN_LOG_LEVEL="0" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=1 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
GOPATH="/go" \
GOBIN="/usr/local/bin" \
GO111MODULE="on" \
@@ -52,6 +53,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
echo 'force-confold' > /etc/dpkg/dpkg.cfg.d/force-confold && \
apt-get update && apt-get -qq dist-upgrade && apt-get -qq install --no-install-recommends \
apt-utils \
ripgrep \
gpg \
pkg-config \
software-properties-common \

View File

@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
NODE_ENV="production" \
DEBIAN_FRONTEND="noninteractive" \
TMPDIR="/tmp" \
TF_CPP_MIN_LOG_LEVEL="0" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=1 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
GOPATH="/go" \
GOBIN="/usr/local/bin" \
GO111MODULE="on" \
@@ -51,6 +52,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
echo 'force-confold' > /etc/dpkg/dpkg.cfg.d/force-confold && \
apt-get update && apt-get -qq dist-upgrade && apt-get -qq install --no-install-recommends \
apt-utils \
ripgrep \
gpg \
gpg-agent \
pkg-config \

View File

@@ -29,10 +29,12 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism" \
S6_KEEP_ENV=1 \
S6_KEEP_ENV=0 \
S6_VERBOSITY=0 \
S6_LOGGING=0
# Copy scripts and package sources config.
@@ -48,13 +50,14 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
apt-get update && apt-get -qq dist-upgrade && \
apt-get -qq install \
libc6 ca-certificates bash sudo nano avahi-utils jq lsof lshw \
xz-utils exiftool sqlite3 tzdata gpg make zip unzip wget curl rsync \
xz-utils exiftool sqlite3 postgresql-client tzdata gpg make zip unzip wget curl rsync \
imagemagick libvips-dev rawtherapee ffmpeg libavcodec-extra x264 x265 libde265-dev \
libaom-dev libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libebml5 libgav1-bin libatomic1 \
iputils-ping dnsutils \
va-driver-all libva2 iputils-ping dnsutils libmagic-mgc \
&& \
/scripts/install-mariadb.sh mariadb-client && \
/scripts/install-darktable.sh && \
/scripts/install-yt-dlp.sh && \
/scripts/install-libheif.sh && \
echo 'alias ll="ls -alh"' >> /etc/skel/.bashrc && \
echo 'export PS1="\u@$DOCKER_TAG:\w\$ "' >> /etc/skel/.bashrc && \
@@ -72,6 +75,8 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
/photoprism/storage/config \
/photoprism/storage/cache && \
/scripts/install-s6.sh && \
ln -sf /scripts/services/photoprism /etc/s6-overlay/s6-rc.d/photoprism && \
touch /etc/s6-overlay/s6-rc.d/user/contents.d/photoprism && \
/scripts/cleanup.sh
# Set default working directory.
@@ -82,4 +87,3 @@ EXPOSE 2342 2442 2443
# Set default entrypoint and command.
ENTRYPOINT ["/init"]
CMD ["/scripts/cmd.sh", "tail", "-f", "/dev/null"]

View File

@@ -30,14 +30,16 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
DEBIAN_FRONTEND="noninteractive" \
TMPDIR="/tmp" \
TF_CPP_MIN_LOG_LEVEL="0" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=1 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
GOPATH="/go" \
GOBIN="/usr/local/bin" \
GO111MODULE="on" \
CGO_CFLAGS="-g -O2 -Wno-return-local-addr" \
PROG="photoprism" \
S6_KEEP_ENV=1 \
S6_VERBOSITY=0 \
S6_LOGGING=0
# Copy scripts and package sources config.
@@ -54,24 +56,28 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
apt-get update && apt-get -qq dist-upgrade && \
apt-get -qq install \
libc6 ca-certificates bash sudo nano avahi-utils jq lsof lshw \
xz-utils exiftool sqlite3 tzdata gpg make zip unzip wget curl rsync \
xz-utils exiftool sqlite3 postgresql-client tzdata gpg make zip unzip wget curl rsync \
imagemagick libvips-dev rawtherapee ffmpeg libavcodec-extra x264 x265 libde265-dev \
libaom-dev libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libebml5 libgav1-bin libatomic1 \
iputils-ping dnsutils \
va-driver-all libva2 iputils-ping dnsutils libmagic-mgc \
&& \
apt-get -qq install \
apt-utils pkg-config software-properties-common \
build-essential gcc g++ git gettext davfs2 chrpath apache2-utils \
autoconf automake cmake libtool libjpeg-dev libpng-dev libwebp-dev libavcodec-dev \
build-essential software-properties-common pkg-config apt-utils \
gcc g++ git autoconf automake cmake gettext apache2-utils davfs2 \
chrpath tree ripgrep fd-find bat shellcheck shfmt fzf \
libtool libjpeg-dev libpng-dev libwebp-dev libavcodec-dev \
libx264-dev libx265-dev libaom-dev libvpx-dev libwebm-dev libxft-dev \
libc6-dev libhdf5-serial-dev libzmq3-dev libssl-dev libnss3 \
libfreetype6 libfreetype6-dev libfontconfig1 libfontconfig1-dev fonts-roboto \
librsvg2-bin ghostscript gsfonts pdf2svg ps2eps \
&& \
ln -sf /usr/bin/fdfind /usr/local/bin/fd && \
ln -sf /usr/bin/batcat /usr/local/bin/bat && \
/scripts/install-nodejs.sh && \
/scripts/install-mariadb.sh mariadb-client && \
/scripts/install-tensorflow.sh && \
/scripts/install-darktable.sh && \
/scripts/install-yt-dlp.sh && \
/scripts/install-libheif.sh && \
/scripts/install-chrome.sh && \
echo "ALL ALL=(ALL) NOPASSWD:SETENV: ALL" >> /etc/sudoers.d/all && \

View File

@@ -29,8 +29,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism"
# Copy scripts and package sources config.

View File

@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
DEBIAN_FRONTEND="noninteractive" \
TMPDIR="/tmp" \
TF_CPP_MIN_LOG_LEVEL="0" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=1 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
GOPATH="/go" \
GOBIN="/usr/local/bin" \
GO111MODULE="on" \
@@ -57,7 +58,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
x264 x265 libde265-dev libaom-dev libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev \
&& \
apt-get -qq install \
apt-utils pkg-config software-properties-common \
software-properties-common pkg-config apt-utils ripgrep fd-find bat eza \
build-essential gcc g++ git gettext davfs2 chrpath apache2-utils \
autoconf automake cmake libtool libjpeg-dev libpng-dev libwebp-dev \
libx264-dev libx265-dev libaom-dev libvpx-dev libwebm-dev libxft-dev \
@@ -65,6 +66,8 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
libfreetype6 libfreetype6-dev libfontconfig1 libfontconfig1-dev fonts-roboto \
librsvg2-bin ghostscript gsfonts pdf2svg ps2eps \
&& \
ln -sf /usr/bin/fdfind /usr/local/bin/fd && \
ln -sf /usr/bin/batcat /usr/local/bin/bat && \
/scripts/install-nodejs.sh && \
/scripts/install-mariadb.sh mariadb-client && \
/scripts/install-tensorflow.sh && \

View File

@@ -29,8 +29,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism"
# Copy scripts and package sources config.

View File

@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
DEBIAN_FRONTEND="noninteractive" \
TMPDIR="/tmp" \
TF_CPP_MIN_LOG_LEVEL="0" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=1 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
GOPATH="/go" \
GOBIN="/usr/local/bin" \
GO111MODULE="on" \
@@ -57,7 +58,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
x264 x265 libde265-dev libaom-dev libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev \
&& \
apt-get -qq install \
apt-utils pkg-config software-properties-common \
software-properties-common pkg-config apt-utils ripgrep fd-find bat eza \
build-essential gcc g++ git gettext davfs2 chrpath apache2-utils \
autoconf automake cmake libtool libjpeg-dev libpng-dev libwebp-dev \
libx264-dev libx265-dev libaom-dev libvpx-dev libwebm-dev libxft-dev \
@@ -65,6 +66,8 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
libfreetype6 libfreetype6-dev libfontconfig1 libfontconfig1-dev fonts-roboto \
librsvg2-bin ghostscript gsfonts pdf2svg ps2eps \
&& \
ln -sf /usr/bin/fdfind /usr/local/bin/fd && \
ln -sf /usr/bin/batcat /usr/local/bin/bat && \
/scripts/install-nodejs.sh && \
/scripts/install-mariadb.sh mariadb-client && \
/scripts/install-tensorflow.sh && \

View File

@@ -29,8 +29,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism"
# Copy scripts and package sources config.
@@ -46,7 +47,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
apt-get update && apt-get -qq dist-upgrade && \
apt-get -qq install \
libc6 ca-certificates bash sudo nano tzdata gpg make zip unzip wget curl rsync \
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 \
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 postgresql-client \
ffmpeg imagemagick libvips-dev rawtherapee libjxl-dev libjxl-tools libffmpeg-nvenc-dev librav1e-dev \
libswscale-dev libavfilter-extra libavformat-extra libavcodec-extra x264 x265 libde265-dev libaom-dev \
libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libdav1d-dev libsharpyuv0 \

View File

@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
DEBIAN_FRONTEND="noninteractive" \
TMPDIR="/tmp" \
TF_CPP_MIN_LOG_LEVEL="0" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=1 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
GOPATH="/go" \
GOBIN="/usr/local/bin" \
GO111MODULE="on" \
@@ -52,14 +53,14 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
apt-get update && apt-get -qq dist-upgrade && \
apt-get -qq install \
libc6 libbsd-dev ca-certificates bash sudo nano tzdata gpg make zip unzip wget curl rsync \
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 \
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 postgresql-client \
ffmpeg imagemagick libvips-dev rawtherapee libjxl-dev libjxl-tools libffmpeg-nvenc-dev librav1e-dev \
libswscale-dev libavfilter-extra libavformat-extra libavcodec-extra x264 x265 libde265-dev libaom-dev \
libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libdav1d-dev libsharpyuv0 \
iputils-ping dnsutils \
&& \
apt-get -qq install \
software-properties-common pkg-config apt-utils \
software-properties-common pkg-config apt-utils ripgrep fd-find bat eza \
build-essential gcc g++ git gettext davfs2 chrpath apache2-utils \
autoconf automake cmake libtool libjpeg-dev libpng-dev libwebp-dev libavcodec-dev \
libx264-dev libx265-dev libaom-dev libvpx-dev libwebm-dev libxft-dev \
@@ -67,6 +68,8 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
libfreetype6 libfreetype6-dev libfontconfig1 libfontconfig1-dev fonts-roboto \
librsvg2-bin ghostscript gsfonts pdf2svg ps2eps libsharpyuv-dev \
&& \
ln -sf /usr/bin/fdfind /usr/local/bin/fd && \
ln -sf /usr/bin/batcat /usr/local/bin/bat && \
/scripts/install-nodejs.sh && \
/scripts/install-mariadb.sh mariadb-client && \
/scripts/install-tensorflow.sh && \

View File

@@ -29,10 +29,12 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism" \
S6_KEEP_ENV=1 \
S6_KEEP_ENV=0 \
S6_VERBOSITY=0 \
S6_LOGGING=0
# Copy scripts and package sources config.
@@ -48,7 +50,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
apt-get update && apt-get -qq dist-upgrade && \
apt-get -qq install \
libc6 ca-certificates bash sudo nano tzdata gpg make zip unzip wget curl rsync \
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 \
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 postgresql-client \
ffmpeg imagemagick libvips-dev rawtherapee libjxl-dev libjxl-tools libffmpeg-nvenc-dev librav1e-dev \
libswscale-dev libavfilter-extra libavformat-extra libavcodec-extra x264 x265 libde265-dev libaom-dev \
libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libdav1d-dev libsharpyuv0 \
@@ -73,6 +75,8 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
/photoprism/storage/config \
/photoprism/storage/cache && \
/scripts/install-s6.sh && \
ln -sf /scripts/services/photoprism /etc/s6-overlay/s6-rc.d/photoprism && \
touch /etc/s6-overlay/s6-rc.d/user/contents.d/photoprism && \
/scripts/cleanup.sh
# Set default working directory.
@@ -83,4 +87,3 @@ EXPOSE 2342 2442 2443
# Set default entrypoint and command.
ENTRYPOINT ["/init"]
CMD ["/scripts/cmd.sh", "tail", "-f", "/dev/null"]

View File

@@ -30,14 +30,16 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
DEBIAN_FRONTEND="noninteractive" \
TMPDIR="/tmp" \
TF_CPP_MIN_LOG_LEVEL="0" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=1 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
GOPATH="/go" \
GOBIN="/usr/local/bin" \
GO111MODULE="on" \
CGO_CFLAGS="-g -O2 -Wno-return-local-addr" \
PROG="photoprism" \
S6_KEEP_ENV=1 \
S6_VERBOSITY=0 \
S6_LOGGING=0
# Copy scripts and package sources config.
@@ -54,14 +56,14 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
apt-get update && apt-get -qq dist-upgrade && \
apt-get -qq install \
libc6 libbsd-dev ca-certificates bash sudo nano tzdata gpg make zip unzip wget curl rsync \
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 \
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 postgresql-client \
ffmpeg imagemagick libvips-dev rawtherapee libjxl-dev libjxl-tools libffmpeg-nvenc-dev librav1e-dev \
libswscale-dev libavfilter-extra libavformat-extra libavcodec-extra x264 x265 libde265-dev libaom-dev \
libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libdav1d-dev libsharpyuv0 \
iputils-ping dnsutils \
&& \
apt-get -qq install \
software-properties-common pkg-config apt-utils \
software-properties-common pkg-config apt-utils ripgrep fd-find bat eza \
build-essential gcc g++ git gettext davfs2 chrpath apache2-utils \
autoconf automake cmake libtool libjpeg-dev libpng-dev libwebp-dev libavcodec-dev \
libx264-dev libx265-dev libaom-dev libvpx-dev libwebm-dev libxft-dev \
@@ -69,6 +71,8 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
libfreetype6 libfreetype6-dev libfontconfig1 libfontconfig1-dev fonts-roboto \
librsvg2-bin ghostscript gsfonts pdf2svg ps2eps libsharpyuv-dev \
&& \
ln -sf /usr/bin/fdfind /usr/local/bin/fd && \
ln -sf /usr/bin/batcat /usr/local/bin/bat && \
/scripts/install-nodejs.sh && \
/scripts/install-mariadb.sh mariadb-client && \
/scripts/install-tensorflow.sh && \

View File

@@ -0,0 +1,91 @@
#### Base Image: Ubuntu 25.04 (Plucky Puffin)
FROM ubuntu:plucky
# Copyright © 2018 - 2025 PhotoPrism UG. All rights reserved.
#
# Questions? Email us at hello@photoprism.app or visit our website to learn
# more about our team, products and services: https://www.photoprism.app/
# Add Open Container Initiative (OCI) annotations.
# See: https://github.com/opencontainers/image-spec/blob/main/annotations.md
LABEL org.opencontainers.image.title="PhotoPrism® Base Image (Ubuntu 25.04)"
LABEL org.opencontainers.image.description="Ubuntu 25.04 (Plucky Puffin)"
LABEL org.opencontainers.image.url="https://hub.docker.com/repository/docker/photoprism/develop"
LABEL org.opencontainers.image.source="https://github.com/photoprism/photoprism"
LABEL org.opencontainers.image.documentation="https://docs.photoprism.app/developer-guide/setup/"
LABEL org.opencontainers.image.authors="PhotoPrism UG <hello@photoprism.app>"
LABEL org.opencontainers.image.vendor="PhotoPrism UG"
# Declare build parameters.
ARG TARGETARCH
ARG BUILD_TAG
# Set environment variables, see https://docs.photoprism.app/getting-started/config-options/.
ENV PHOTOPRISM_ARCH=$TARGETARCH \
DOCKER_TAG=$BUILD_TAG \
DOCKER_ENV="prod" \
PS1="\u@$BUILD_TAG:\w\$ " \
PATH="/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/scripts:/opt/photoprism/bin" \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism" \
S6_KEEP_ENV=0 \
S6_VERBOSITY=0 \
S6_LOGGING=0
# Copy scripts and package sources config.
COPY --chown=root:root --chmod=755 /scripts/dist/ /scripts/
# Update base image and add dependencies.
RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
echo 'APT::Install-Recommends "false";' > /etc/apt/apt.conf.d/80recommends && \
echo 'APT::Install-Suggests "false";' > /etc/apt/apt.conf.d/80suggests && \
echo 'APT::Get::Assume-Yes "true";' > /etc/apt/apt.conf.d/80forceyes && \
echo 'APT::Get::Fix-Missing "true";' > /etc/apt/apt.conf.d/80fixmissing && \
echo 'force-confold' > /etc/dpkg/dpkg.cfg.d/force-confold && \
apt-get update && apt-get -qq dist-upgrade && \
apt-get -qq install \
libc6 ca-certificates bash sudo nano tzdata gpg make zip unzip wget curl rsync \
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 postgresql-client \
ffmpeg imagemagick libvips-dev rawtherapee libjxl-dev libjxl-tools libffmpeg-nvenc-dev librav1e-dev \
libswscale-dev libavfilter-extra libavformat-extra libavcodec-extra x264 x265 libde265-dev libaom-dev \
libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libdav1d-dev libsharpyuv0 \
va-driver-all libva2 iputils-ping dnsutils libmagic-mgc \
&& \
/scripts/install-mariadb.sh mariadb-client && \
/scripts/install-darktable.sh && \
/scripts/install-yt-dlp.sh && \
/scripts/install-libheif.sh && \
echo 'alias ll="ls -alh"' >> /etc/skel/.bashrc && \
echo 'export PS1="\u@$DOCKER_TAG:\w\$ "' >> /etc/skel/.bashrc && \
echo "ALL ALL=(ALL) NOPASSWD:SETENV: /scripts/entrypoint-init.sh" >> /etc/sudoers.d/init && \
/scripts/install-dircolors.sh && \
cp /etc/skel/.bashrc /root/.bashrc && \
/scripts/create-users.sh && \
install -d -m 0777 -o 1000 -g 1000 \
/photoprism/originals \
/photoprism/import \
/photoprism/storage \
/photoprism/storage/sidecar \
/photoprism/storage/albums \
/photoprism/storage/backups \
/photoprism/storage/config \
/photoprism/storage/cache && \
/scripts/install-s6.sh && \
ln -sf /scripts/services/photoprism /etc/s6-overlay/s6-rc.d/photoprism && \
touch /etc/s6-overlay/s6-rc.d/user/contents.d/photoprism && \
apt modernize-sources && \
/scripts/cleanup.sh
# Set default working directory.
WORKDIR /photoprism
# Expose default HTTP and HTTPS ports.
EXPOSE 2342 2442 2443
# Set default entrypoint and command.
ENTRYPOINT ["/init"]

View File

@@ -0,0 +1,130 @@
#### Base Image: Ubuntu 25.04 (Plucky Puffin)
FROM ubuntu:plucky
# Copyright © 2018 - 2025 PhotoPrism UG. All rights reserved.
#
# Questions? Email us at hello@photoprism.app or visit our website to learn
# more about our team, products and services: https://www.photoprism.app/
# Add Open Container Initiative (OCI) annotations.
# See: https://github.com/opencontainers/image-spec/blob/main/annotations.md
LABEL org.opencontainers.image.title="PhotoPrism® Build Image (Ubuntu 25.04)"
LABEL org.opencontainers.image.description="Ubuntu 25.04 (Plucky Puffin)"
LABEL org.opencontainers.image.url="https://hub.docker.com/repository/docker/photoprism/develop"
LABEL org.opencontainers.image.source="https://github.com/photoprism/photoprism"
LABEL org.opencontainers.image.documentation="https://docs.photoprism.app/developer-guide/setup/"
LABEL org.opencontainers.image.authors="PhotoPrism UG <hello@photoprism.app>"
LABEL org.opencontainers.image.vendor="PhotoPrism UG"
# Declare build parameters.
ARG TARGETARCH
ARG BUILD_TAG
# Set environment variables, see https://docs.photoprism.app/getting-started/config-options/.
ENV PHOTOPRISM_ARCH=$TARGETARCH \
DOCKER_TAG=$BUILD_TAG \
DOCKER_ENV="develop" \
NODE_ENV="production" \
PS1="\u@$BUILD_TAG:\w\$ " \
PATH="/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/scripts:/usr/local/go/bin:/go/bin:/opt/photoprism/bin" \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
DEBIAN_FRONTEND="noninteractive" \
TMPDIR="/tmp" \
TF_CPP_MIN_LOG_LEVEL=1 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
GOPATH="/go" \
GOBIN="/usr/local/bin" \
GO111MODULE="on" \
CGO_CFLAGS="-g -O2 -Wno-return-local-addr" \
PROG="photoprism" \
S6_KEEP_ENV=1 \
S6_VERBOSITY=0 \
S6_LOGGING=0
# Copy scripts and package sources config.
COPY --chown=root:root --chmod=755 /scripts/dist/ /scripts/
COPY --chown=root:root --chmod=644 /.my.cnf /etc/my.cnf
# Update base image and add dependencies.
RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
echo 'APT::Install-Recommends "false";' > /etc/apt/apt.conf.d/80recommends && \
echo 'APT::Install-Suggests "false";' > /etc/apt/apt.conf.d/80suggests && \
echo 'APT::Get::Assume-Yes "true";' > /etc/apt/apt.conf.d/80forceyes && \
echo 'APT::Get::Fix-Missing "true";' > /etc/apt/apt.conf.d/80fixmissing && \
echo 'force-confold' > /etc/dpkg/dpkg.cfg.d/force-confold && \
apt-get update && apt-get -qq dist-upgrade && \
apt-get -qq install \
libc6 libbsd-dev ca-certificates bash sudo nano tzdata gpg make zip unzip wget curl rsync \
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 postgresql-client \
ffmpeg imagemagick libvips-dev rawtherapee libjxl-dev libjxl-tools libffmpeg-nvenc-dev librav1e-dev \
libswscale-dev libavfilter-extra libavformat-extra libavcodec-extra x264 x265 libde265-dev libaom-dev \
libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libdav1d-dev libsharpyuv0 \
va-driver-all libva2 iputils-ping dnsutils libmagic-mgc \
&& \
apt-get -qq install \
build-essential software-properties-common pkg-config apt-utils \
gcc g++ git autoconf automake cmake gettext apache2-utils davfs2 \
chrpath tree ripgrep fd-find bat eza git-delta shellcheck shfmt fzf \
libtool libjpeg-dev libpng-dev libwebp-dev libavcodec-dev \
libx264-dev libx265-dev libaom-dev libvpx-dev libwebm-dev libxft-dev \
libc6-dev libhdf5-serial-dev libzmq3-dev libssl-dev libnss3 \
libfreetype6 libfreetype6-dev libfontconfig1 libfontconfig1-dev fonts-roboto \
librsvg2-bin ghostscript gsfonts pdf2svg ps2eps libsharpyuv-dev \
&& \
ln -sf /usr/bin/fdfind /usr/local/bin/fd && \
ln -sf /usr/bin/batcat /usr/local/bin/bat && \
/scripts/install-nodejs.sh && \
/scripts/install-mariadb.sh mariadb-client && \
/scripts/install-tensorflow.sh && \
/scripts/install-darktable.sh && \
/scripts/install-yt-dlp.sh && \
/scripts/install-libheif.sh && \
/scripts/install-chrome.sh && \
echo "ALL ALL=(ALL) NOPASSWD:SETENV: ALL" >> /etc/sudoers.d/all && \
mkdir -p /etc/skel/.config/go/telemetry && \
echo 'off 2025-01-03' > '/etc/skel/.config/go/telemetry/mode' && \
cp -r /etc/skel/.config /root/.config && \
/scripts/install-go.sh && \
/scripts/install-go-tools.sh && \
echo 'alias go=richgo ll="ls -alh"' >> /etc/skel/.bashrc && \
echo 'export PS1="\u@$DOCKER_TAG:\w\$ "' >> /etc/skel/.bashrc && \
/scripts/install-dircolors.sh && \
cp /etc/skel/.bashrc /root/.bashrc && \
cp /scripts/convert/policy.xml /etc/ImageMagick-7/policy.xml && \
/scripts/create-users.sh && \
install -d -m 0777 -o 1000 -g 1000 \
/photoprism/originals \
/photoprism/import \
/photoprism/storage \
/photoprism/storage/sidecar \
/photoprism/storage/albums \
/photoprism/storage/backups \
/photoprism/storage/config \
/photoprism/storage/cache && \
/scripts/install-s6.sh && \
apt modernize-sources && \
/scripts/cleanup.sh
# Download machine learning models and test data.
RUN mkdir /tmp/photoprism && \
wget "https://dl.photoprism.app/tensorflow/nsfw.zip?${BUILD_TAG}" -O /tmp/photoprism/nsfw.zip && \
wget "https://dl.photoprism.app/tensorflow/nasnet.zip?${BUILD_TAG}" -O /tmp/photoprism/nasnet.zip && \
wget "https://dl.photoprism.app/tensorflow/facenet.zip?${BUILD_TAG}" -O /tmp/photoprism/facenet.zip && \
wget "https://dl.photoprism.app/qa/testdata.zip?${BUILD_TAG}" -O /tmp/photoprism/testdata.zip
# Set default working directory.
WORKDIR "/go/src/github.com/photoprism/photoprism"
# Expose the following container ports:
# - 2342 (HTTP)
# - 2343 (Acceptance Tests)
# - 2442 (HTTP)
# - 2443 (HTTPS)
# - 9515 (Chromedriver)
# - 40000 (Go Debugger)
EXPOSE 2342 2343 2442 2443 9515 40000
# Set default entrypoint and command.
ENTRYPOINT ["/init"]
CMD ["/scripts/cmd.sh", "tail", "-f", "/dev/null"]

View File

@@ -46,8 +46,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_VERSION=1.15.2 \
TF_CPP_MIN_LOG_LEVEL=4 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism" \
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \
@@ -91,7 +92,8 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
PHOTOPRISM_AUTO_INDEX="300" \
PHOTOPRISM_AUTO_IMPORT="-1" \
PHOTOPRISM_INIT="https" \
S6_KEEP_ENV=1 \
S6_KEEP_ENV=0 \
S6_VERBOSITY=0 \
S6_LOGGING=0
# Copy dist files, scripts, and debian backports sources list.
@@ -114,6 +116,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libdav1d-dev libsharpyuv0 \
iputils-ping dnsutils \
&& \
/scripts/install-yt-dlp.sh && \
/scripts/install-libheif.sh && \
echo 'alias ll="ls -alh"' >> /etc/skel/.bashrc && \
echo 'export PS1="\u@$DOCKER_TAG:\w\$ "' >> /etc/skel/.bashrc && \
@@ -131,6 +134,8 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
/photoprism/storage/config \
/photoprism/storage/cache && \
/scripts/install-s6.sh && \
ln -sf /scripts/services/photoprism /etc/s6-overlay/s6-rc.d/photoprism && \
touch /etc/s6-overlay/s6-rc.d/user/contents.d/photoprism && \
/scripts/cleanup.sh
# Set default working directory.
@@ -141,4 +146,3 @@ EXPOSE 2342 2443
# Set default entrypoint and command.
ENTRYPOINT ["/init"]
CMD ["/scripts/cmd.sh", "/opt/photoprism/bin/photoprism", "start"]

View File

@@ -41,8 +41,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
DOCKER_ENV="prod" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism" \
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \

View File

@@ -41,8 +41,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
DOCKER_ENV="prod" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism" \
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \

View File

@@ -44,8 +44,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism" \
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \

View File

@@ -44,8 +44,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism" \
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \

View File

@@ -42,8 +42,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
DOCKER_ENV="prod" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism" \
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \
@@ -90,6 +91,7 @@ COPY --chown=root:root --chmod=755 /scripts/dist/ /scripts/
# Update pre-installed packages.
RUN apt-get update && \
apt-get -qq dist-upgrade && \
yt-dlp -U && \
/scripts/cleanup.sh
# Set default working directory.
@@ -100,6 +102,3 @@ EXPOSE 2342 2443
# Copy app files.
COPY --from=build --chown=root:root --chmod=755 /opt/photoprism/ /opt/photoprism
# Start app.
CMD ["/scripts/cmd.sh", "/opt/photoprism/bin/photoprism", "start"]

View File

@@ -42,8 +42,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
DOCKER_ENV="prod" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism" \
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \

View File

@@ -42,8 +42,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
DOCKER_ENV="prod" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism" \
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \

View File

@@ -42,8 +42,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
DOCKER_ENV="prod" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism" \
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \

View File

@@ -42,8 +42,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
DOCKER_ENV="prod" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL="2" \
MALLOC_ARENA_MAX="4" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism" \
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \
@@ -100,6 +101,3 @@ EXPOSE 2342 2443
# Copy app files.
COPY --from=build --chown=root:root --chmod=755 /opt/photoprism/ /opt/photoprism
# Start app.
CMD ["/scripts/cmd.sh", "/opt/photoprism/bin/photoprism", "start"]

View File

@@ -0,0 +1,104 @@
##################################################### BUILD STAGE ######################################################
FROM photoprism/develop:plucky AS build
# Copyright © 2018 - 2025 PhotoPrism UG. All rights reserved.
#
# Questions? Email us at hello@photoprism.app or visit our website to learn
# more about our team, products and services: https://www.photoprism.app/
# Declare build parameters.
ARG TARGETARCH
ARG TARGETPLATFORM
ARG BUILD_TAG
# Copy source to image.
WORKDIR "/go/src/github.com/photoprism/photoprism"
COPY . .
# Build app.
RUN make all install DESTDIR=/opt/photoprism
################################################## PRODUCTION STAGE ####################################################
#### Base Image: Ubuntu 25.04 (Plucky Puffin)
FROM photoprism/develop:plucky-slim
# Add Open Container Initiative (OCI) annotations.
# See: https://github.com/opencontainers/image-spec/blob/main/annotations.md
LABEL org.opencontainers.image.title="PhotoPrism® (Ubuntu 25.04)"
LABEL org.opencontainers.image.description="Ubuntu 25.04 (Plucky Puffin)"
LABEL org.opencontainers.image.url="https://hub.docker.com/r/photoprism/photoprism"
LABEL org.opencontainers.image.source="https://github.com/photoprism/photoprism"
LABEL org.opencontainers.image.documentation="https://docs.photoprism.app/getting-started/"
LABEL org.opencontainers.image.authors="PhotoPrism UG <hello@photoprism.app>"
LABEL org.opencontainers.image.vendor="PhotoPrism UG"
# Declare build parameters.
ARG TARGETARCH
ARG BUILD_TAG
# Set environment variables, see https://docs.photoprism.app/getting-started/config-options/.
ENV PHOTOPRISM_ARCH=$TARGETARCH \
DOCKER_TAG=$BUILD_TAG \
DOCKER_ENV="prod" \
TMPDIR="/tmp" \
DEBIAN_FRONTEND="noninteractive" \
TF_CPP_MIN_LOG_LEVEL=4 \
TF_ENABLE_ONEDNN_OPTS=1 \
MALLOC_ARENA_MAX=2 \
PROG="photoprism" \
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \
PHOTOPRISM_ORIGINALS_PATH="/photoprism/originals" \
PHOTOPRISM_STORAGE_PATH="/photoprism/storage" \
PHOTOPRISM_BACKUP_PATH="/photoprism/storage/backups" \
PHOTOPRISM_LOG_FILENAME="/photoprism/storage/photoprism.log" \
PHOTOPRISM_PID_FILENAME="/photoprism/storage/photoprism.pid" \
PHOTOPRISM_DEBUG="false" \
PHOTOPRISM_PUBLIC="false" \
PHOTOPRISM_READONLY="false" \
PHOTOPRISM_UPLOAD_NSFW="true" \
PHOTOPRISM_DETECT_NSFW="false" \
PHOTOPRISM_EXPERIMENTAL="false" \
PHOTOPRISM_SITE_URL="http://localhost:2342/" \
PHOTOPRISM_SITE_CAPTION="AI-Powered Photos App" \
PHOTOPRISM_SITE_DESCRIPTION="" \
PHOTOPRISM_SITE_AUTHOR="" \
PHOTOPRISM_HTTP_HOST="0.0.0.0" \
PHOTOPRISM_HTTP_PORT=2342 \
PHOTOPRISM_DATABASE_DRIVER="sqlite" \
PHOTOPRISM_DATABASE_SERVER="" \
PHOTOPRISM_DATABASE_NAME="photoprism" \
PHOTOPRISM_DATABASE_USER="photoprism" \
PHOTOPRISM_DATABASE_PASSWORD="" \
PHOTOPRISM_DISABLE_CHOWN="false" \
PHOTOPRISM_DISABLE_WEBDAV="false" \
PHOTOPRISM_DISABLE_SETTINGS="false" \
PHOTOPRISM_DISABLE_BACKUPS="false" \
PHOTOPRISM_DISABLE_EXIFTOOL="false" \
PHOTOPRISM_DISABLE_PLACES="false" \
PHOTOPRISM_DISABLE_TENSORFLOW="false" \
PHOTOPRISM_DISABLE_FACES="false" \
PHOTOPRISM_DISABLE_CLASSIFICATION="false" \
PHOTOPRISM_RAW_PRESETS="false" \
PHOTOPRISM_THUMB_UNCACHED="false" \
PHOTOPRISM_AUTO_INDEX="300" \
PHOTOPRISM_AUTO_IMPORT="-1" \
PHOTOPRISM_INIT="https"
# Copy scripts.
COPY --chown=root:root --chmod=755 /scripts/dist/ /scripts/
# Update pre-installed packages.
RUN apt-get update && \
apt-get -qq dist-upgrade && \
yt-dlp -U && \
/scripts/cleanup.sh
# Set default working directory.
WORKDIR /photoprism
# Expose HTTP(S) ports.
EXPOSE 2342 2443
# Copy app files.
COPY --from=build --chown=root:root --chmod=755 /opt/photoprism/ /opt/photoprism

View File

@@ -1,27 +0,0 @@
build --action_env PYTHON_BIN_PATH="/usr/bin/python3"
build --action_env PYTHON_LIB_PATH="/usr/lib/python3/dist-packages"
build --python_path="/usr/bin/python3"
build --action_env TF_NEED_OPENCL_SYCL="0"
build --action_env TF_NEED_ROCM="0"
build --action_env TF_NEED_CUDA="0"
build --action_env TF_NEED_TENSORRT="0"
build --action_env CUDA_TOOLKIT_PATH="/usr/local/cuda"
build --action_env TF_CUDA_COMPUTE_CAPABILITIES="5.3"
build --action_env TF_CUDA_CLANG="0"
build --action_env TF_CUDA_VERSION="10"
build --action_env GCC_HOST_COMPILER_PATH="/usr/bin/gcc-4.8"
build --verbose_failures
build:opt --copt=-Wno-sign-compare
build:opt --conlyopt=-std=c11
build:opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
build:opt --host_conlyopt=-std=c11
build:opt --host_cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
build:opt --host_copt=-Wno-sign-compare
build:opt --define with_default_optimizations=true
build:v2 --define=tf_api_version=2
build:xla --define with_xla_support=true
test --flaky_test_attempts=3
test --test_size_filters=small,medium
test --test_tag_filters=-benchmark-test,-no_oss,-oss_serial
test --build_tag_filters=-benchmark-test,-no_oss
build --action_env TF_CONFIGURE_IOS="0"

View File

@@ -1,10 +1,13 @@
FROM ubuntu:18.04
FROM ubuntu:22.04
LABEL maintainer="PhotoPrism UG <hello@photoprism.app>"
ENV DEBIAN_FRONTEND noninteractive
ENV TMP /tmp
ENV EXTRA_BAZEL_ARGS "--host_javabase=@local_jdk//:jdk"
ENV DEBIAN_FRONTEND=noninteractive
ENV TMP=/tmp
# see https://docs.docker.com/build/building/variables/#env-usage-example
ARG TF_VERSION=2.18.0
ENV TF_VERSION=$TF_VERSION
# apt default settings
RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
@@ -17,47 +20,32 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
# Install dev / build dependencies
RUN apt-get update && apt-get upgrade && \
apt-get install \
ca-certificates \
build-essential \
autoconf \
automake \
libtool \
g++-4.8 \
gcc-4.8 \
libc6-dev \
zlib1g-dev \
libssl-dev \
python3 \
ca-certificates \
curl \
chrpath \
pkg-config \
unzip \
zip \
make \
nano \
wget \
git \
libtool \
python3 \
python3-git \
openjdk-8-jdk
lsb-release \
software-properties-common \
gnupg \
jq \
nano
# Use GCC 4.8 and Python 3 as default
# See https://www.tensorflow.org/install/source#tested_build_configurations
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 10 && \
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 10 && \
update-alternatives --install /usr/bin/python python /usr/bin/python3.6 10
# Install bazelisk and llvm
RUN wget https://apt.llvm.org/llvm.sh && chmod u+x llvm.sh && \
./llvm.sh 17 && rm llvm.sh && \
ln -s /usr/bin/python3 /usr/bin/python && \
ln -s /usr/bin/clang-17 /usr/bin/clang && \
ln -s /usr/bin/clang++-17 /usr/bin/clang++ && \
ln -s /usr/bin/clang-cpp /usr/bin/clang-cpp && \
export BAZELISK_VERSION=$(curl -L https://api.github.com/repos/bazelbuild/bazelisk/releases/latest | jq -r .tag_name) && \
curl -L https://github.com/bazelbuild/bazelisk/releases/download/${BAZELISK_VERSION}/bazelisk-linux-amd64 -o /usr/bin/bazel && \
chmod +x /usr/bin/bazel && \
mkdir -p /home/tensorflow
# Download Bazel & TensorFlow
WORKDIR "/home/tensorflow"
RUN wget https://github.com/tensorflow/tensorflow/archive/v1.15.2.tar.gz
RUN tar -xzf v1.15.2.tar.gz
# Install Bazel
RUN wget https://github.com/bazelbuild/bazel/releases/download/0.24.1/bazel-0.24.1-linux-x86_64
RUN mv bazel-0.24.1-linux-x86_64 /usr/local/bin/bazel && chmod 755 /usr/local/bin/bazel
# Configure TensorFlow
WORKDIR "/home/tensorflow/tensorflow-1.15.2"
COPY ./*.sh ./
COPY ./.tf_configure.bazelrc .tf_configure.bazelrc
COPY ./Makefile Makefile

View File

@@ -1,20 +1,26 @@
TF_VERSION=1.15.2
# -march see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/i386-and-x86-64-Options.html
all: libtensorflow libtensorflow-avx libtensorflow-avx2
patch:
git apply tensorflow-$(TF_VERSION).diff
all: libtensorflow libtensorflow-ssse3 libtensorflow-avx libtensorflow-avx2 libtensorflow-vnni libtensorflow-avx512
# Downloads the TensorFlow source code from GitHub and extracts it to a subdirectory:
download:
wget https://github.com/tensorflow/tensorflow/archive/v$(TF_VERSION).tar.gz
tar -xzf v$(TF_VERSION).tar.gz
cp .tf_configure.bazelrc Makefile *.sh tensorflow-$(TF_VERSION)
cp Makefile *.sh tensorflow-$(TF_VERSION)
# Clang command line argument reference:
# https://clang.llvm.org/docs/ClangCommandLineReference.html#x86
libtensorflow:
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so
./create_archive.sh linux-cpu $(TF_VERSION)
bazel build -c opt //tensorflow:libtensorflow.so --copt=-O2 --copt=-mno-avx --copt=-mno-avx2 --copt=-mno-fma --copt=-march=x86-64
./create_archive.sh amd64 $(TF_VERSION)
libtensorflow-ssse3:
bazel build -c opt //tensorflow:libtensorflow.so --copt=-O2 --copt=-mno-avx --copt=-mno-avx2 --copt=-mno-fma --copt=-march=core2
./create_archive.sh amd64-ssse3 $(TF_VERSION)
libtensorflow-avx:
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so --copt=-march=core-avx-i --host_copt=-march=core-avx-i
./create_archive.sh linux-avx $(TF_VERSION)
bazel build -c opt //tensorflow:libtensorflow.so --copt=-O2 --copt=-mavx
./create_archive.sh amd64-avx $(TF_VERSION)
libtensorflow-avx2:
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so --copt=-march=core-avx2 --host_copt=-march=core-avx2
./create_archive.sh linux-avx2 $(TF_VERSION)
bazel build -c opt //tensorflow:libtensorflow.so --copt=-O2 --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2
./create_archive.sh amd64-avx2 $(TF_VERSION)
libtensorflow-vnni:
bazel build -c opt //tensorflow:libtensorflow.so --copt=-O2 --copt=-mavx2 --copt=-mavxvnni --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2
./create_archive.sh amd64-vnni $(TF_VERSION)
libtensorflow-avx512:
bazel build -c opt //tensorflow:libtensorflow.so --copt=-O2 --copt=-mavx2 --copt=-mavx512f --copt=-mavx512vnni --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2
./create_archive.sh amd64-avx512 $(TF_VERSION)

View File

@@ -1,31 +0,0 @@
build --action_env PYTHON_BIN_PATH="/usr/bin/python3"
build --action_env PYTHON_LIB_PATH="/usr/lib/python3/dist-packages"
build --python_path="/usr/bin/python3"
build --action_env TF_NEED_OPENCL_SYCL="0"
build --action_env TF_NEED_ROCM="0"
build --action_env TF_NEED_CUDA="0"
build --action_env TF_NEED_TENSORRT="0"
build --action_env CUDA_TOOLKIT_PATH="/usr/local/cuda"
build --action_env TF_CUDA_COMPUTE_CAPABILITIES="5.3"
build --action_env TF_CUDA_CLANG="0"
build --action_env TF_CUDA_VERSION="10"
build --action_env GCC_HOST_COMPILER_PATH="/usr/bin/gcc-4.8"
build --verbose_failures
build:opt --copt=-march=armv8-a
build:opt --copt=-Wno-sign-compare
build:opt --conlyopt=-std=c11
build:opt --conlyopt=-D_XOPEN_SOURCE=600
build:opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
build:opt --host_copt=-march=armv8-a
build:opt --host_conlyopt=-std=c11
build:opt --host_conlyopt=-D_XOPEN_SOURCE=600
build:opt --host_cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
build:opt --host_copt=-Wno-sign-compare
build:opt --define with_default_optimizations=true
build:v2 --define=tf_api_version=2
build:xla --define with_xla_support=true
test --flaky_test_attempts=3
test --test_size_filters=small,medium
test --test_tag_filters=-benchmark-test,-no_oss,-oss_serial
test --build_tag_filters=-benchmark-test,-no_oss
build --action_env TF_CONFIGURE_IOS="0"

View File

@@ -1,10 +1,13 @@
FROM ubuntu:18.04
FROM ubuntu:22.04
LABEL maintainer="PhotoPrism UG <hello@photoprism.app>"
ENV DEBIAN_FRONTEND noninteractive
ENV TMP /tmp
ENV EXTRA_BAZEL_ARGS "--host_javabase=@local_jdk//:jdk"
ENV DEBIAN_FRONTEND=noninteractive
ENV TMP=/tmp
# see https://docs.docker.com/build/building/variables/#env-usage-example
ARG TF_VERSION=2.18.0
ENV TF_VERSION=$TF_VERSION
# apt default settings
RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
@@ -17,48 +20,32 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
# Install dev / build dependencies
RUN apt-get update && apt-get upgrade && \
apt-get install \
ca-certificates \
build-essential \
autoconf \
automake \
libtool \
g++-4.8 \
gcc-4.8 \
libc6-dev \
zlib1g-dev \
libssl-dev \
python3 \
ca-certificates \
curl \
chrpath \
pkg-config \
unzip \
zip \
make \
nano \
wget \
git \
libtool \
python3 \
python3-git \
openjdk-8-jdk
lsb-release \
software-properties-common \
gnupg \
jq \
nano
# Use GCC 4.8 and Python 3 as default
# See https://www.tensorflow.org/install/source#tested_build_configurations
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 10 && \
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 10 && \
update-alternatives --install /usr/bin/python python /usr/bin/python3.6 10
# Install bazelisk and llvm
RUN wget https://apt.llvm.org/llvm.sh && chmod u+x llvm.sh && \
./llvm.sh 17 && rm llvm.sh && \
ln -s /usr/bin/python3 /usr/bin/python && \
ln -s /usr/bin/clang-17 /usr/bin/clang && \
ln -s /usr/bin/clang++-17 /usr/bin/clang++ && \
ln -s /usr/bin/clang-cpp /usr/bin/clang-cpp && \
export BAZELISK_VERSION=$(curl -L https://api.github.com/repos/bazelbuild/bazelisk/releases/latest | jq -r .tag_name) && \
curl -L https://github.com/bazelbuild/bazelisk/releases/download/${BAZELISK_VERSION}/bazelisk-linux-arm64 -o /usr/bin/bazel && \
chmod +x /usr/bin/bazel && \
mkdir -p /home/tensorflow
# Download Bazel & TensorFlow
WORKDIR "/home/tensorflow"
RUN wget https://github.com/tensorflow/tensorflow/archive/v1.15.2.tar.gz
RUN tar -xzf v1.15.2.tar.gz
# Install Bazel
# RUN wget https://github.com/bazelbuild/bazel/releases/download/0.24.1/bazel-0.24.1-linux-x86_64
RUN wget https://github.com/guysoft/bazel-bin/raw/master/bazel-0.24.1-aarch64
RUN mv bazel-0.24.1-aarch64 /usr/local/bin/bazel && chmod 755 /usr/local/bin/bazel
# Configure TensorFlow
WORKDIR "/home/tensorflow/tensorflow-1.15.2"
COPY ./*.sh ./
COPY ./.tf_configure.bazelrc .tf_configure.bazelrc
COPY ./Makefile Makefile
COPY ./Makefile Makefile

View File

@@ -1,10 +1,11 @@
TF_VERSION=1.15.2
# -march see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/i386-and-x86-64-Options.html
all: libtensorflow
patch:
git apply tensorflow-$(TF_VERSION).diff
# Downloads the TensorFlow source code from GitHub and extracts it to a subdirectory:
download:
wget https://github.com/tensorflow/tensorflow/archive/v$(TF_VERSION).tar.gz
tar -xzf v$(TF_VERSION).tar.gz
cp Makefile *.sh tensorflow-$(TF_VERSION)
# Clang command line argument reference:
# https://clang.llvm.org/docs/ClangCommandLineReference.html#aarch64
libtensorflow:
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so --copt=-march=armv8-a --host_copt=-march=armv8-a
bazel build -c opt //tensorflow:libtensorflow.so --copt=-O2 --copt=-march=armv8-a
./create_archive.sh arm64 $(TF_VERSION)

View File

@@ -10,11 +10,17 @@ echo "Creating 'libtensorflow-$1-$2.tar.gz'...";
rm -rf tmp
mkdir -p tmp/lib/
mkdir -p tmp/include/tensorflow/c/eager/
cp bazel-bin/tensorflow/libtensorflow.so.$2 tmp/lib/libtensorflow.so
cp bazel-bin/tensorflow/libtensorflow_framework.so.$2 tmp/lib/libtensorflow_framework.so
cp tensorflow/c/eager/c_api.h tmp/include/tensorflow/c/eager/
cp tensorflow/c/c_api.h tensorflow/c/c_api_experimental.h LICENSE tmp/include/tensorflow/c/
(cd tmp && tar -czf ../libtensorflow-$1-$2.tar.gz .)
du -h libtensorflow-$1-$2.tar.gz
mkdir -p tmp/include/tensorflow/core/platform
mkdir -p tmp/include/tsl/platform
mkdir -p tmp/include/xla/tsl/c
echo "Done"
cp -av bazel-bin/tensorflow/libtensorflow* tmp/lib/
cp tensorflow/c/eager/*.h tmp/include/tensorflow/c/eager/
cp tensorflow/c/*.h LICENSE tmp/include/tensorflow/c/
cp tensorflow/core/platform/*.h tmp/include/tensorflow/core/platform
cp third_party/xla/third_party/tsl/tsl/platform/*.h tmp/include/tsl/platform
cp third_party/xla/xla/tsl/c/*.h tmp/include/xla/tsl/c
(cd tmp && tar --exclude=*.params -czf /build/libtensorflow-$1-$2.tar.gz .)
du -h /build/libtensorflow-$1-$2.tar.gz
echo "Done."

View File

@@ -10,11 +10,17 @@ echo "Creating 'libtensorflow-$1-$2.tar.gz'...";
rm -rf tmp
mkdir -p tmp/lib/
mkdir -p tmp/include/tensorflow/c/eager/
cp bazel-bin/tensorflow/libtensorflow.so.$2 tmp/lib/libtensorflow.so
cp bazel-bin/tensorflow/libtensorflow_framework.so.$2 tmp/lib/libtensorflow_framework.so
cp tensorflow/c/eager/c_api.h tmp/include/tensorflow/c/eager/
cp tensorflow/c/c_api.h tensorflow/c/c_api_experimental.h LICENSE tmp/include/tensorflow/c/
(cd tmp && tar -czf ../libtensorflow-$1-$2.tar.gz .)
du -h libtensorflow-$1-$2.tar.gz
mkdir -p tmp/include/tensorflow/core/platform
mkdir -p tmp/include/tsl/platform
mkdir -p tmp/include/xla/tsl/c
echo "Done"
cp -av bazel-bin/tensorflow/libtensorflow* tmp/lib/
cp tensorflow/c/eager/*.h tmp/include/tensorflow/c/eager/
cp tensorflow/c/*.h LICENSE tmp/include/tensorflow/c/
cp tensorflow/core/platform/*.h tmp/include/tensorflow/core/platform
cp third_party/xla/third_party/tsl/tsl/platform/*.h tmp/include/tsl/platform
cp third_party/xla/xla/tsl/c/*.h tmp/include/xla/tsl/c
(cd tmp && tar --exclude=*.params -czf /build/libtensorflow-$1-$2.tar.gz .)
du -h /build/libtensorflow-$1-$2.tar.gz
echo "Done."

View File

@@ -0,0 +1,9 @@
ARG BUILDER_SHA2=06040763c500bd2ebaaa4585d4729c88d2c8ccec94baa7fbe9bbe3dc2827d79d
FROM gcr.io/tensorflow-testing/ml-devinfra-linux-aarch64-cross-compile:infrastructure-public-image-${BUILDER_SHA2}
# see https://docs.docker.com/build/building/variables/#env-usage-example
ARG TF_VERSION=2.18.0
ENV TF_VERSION=$TF_VERSION
COPY ./create_archive.sh .
COPY ./Makefile Makefile

View File

@@ -0,0 +1,10 @@
# -march see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/i386-and-x86-64-Options.html
all: libtensorflow
download:
wget https://github.com/tensorflow/tensorflow/archive/v$(TF_VERSION).tar.gz
tar -xzf v$(TF_VERSION).tar.gz
cp Makefile *.sh tensorflow-$(TF_VERSION)
libtensorflow:
bazel build -c opt --config cross_compile_linux_arm64 //tensorflow:libtensorflow.so
./create_archive.sh arm64 $(TF_VERSION)

View File

@@ -0,0 +1,14 @@
#!/bin/bash
DEFAULT_TF_VERSION=2.18.0
if [[ "$#" -ge 1 ]]; then
TF_VERSION=$1
elif [[ -z "$TF_VERSION" ]]; then
TF_VERSION=$DEFAULT_TF_VERSION
fi
SHA2_VERSION=$(curl -L https://raw.githubusercontent.com/tensorflow/tensorflow/refs/tags/v${TF_VERSION}/tensorflow/tools/toolchains/cross_compile/config/BUILD | \
grep container-image | awk -F'@' '{ print $2 }' | awk -F':' '{ print $2 }' | tr -d '",')
docker build --build-arg BUILDER_SHA2=$SHA2_VERSION --build-arg TF_VERSION=$TF_VERSION -t photoprism/tensorflow:$TF_VERSION-cross .

View File

@@ -0,0 +1,26 @@
#!/usr/bin/env bash
if [[ -z $1 ]] || [[ -z $2 ]]; then
echo "Usage: $0 [platform] [tf-version]" 1>&2
exit 1
fi
echo "Creating 'libtensorflow-$1-$2.tar.gz'...";
rm -rf tmp
mkdir -p tmp/lib/
mkdir -p tmp/include/tensorflow/c/eager/
mkdir -p tmp/include/tensorflow/core/platform
mkdir -p tmp/include/tsl/platform
mkdir -p tmp/include/xla/tsl/c
cp -av bazel-bin/tensorflow/libtensorflow* tmp/lib/
cp tensorflow/c/eager/*.h tmp/include/tensorflow/c/eager/
cp tensorflow/c/*.h LICENSE tmp/include/tensorflow/c/
cp tensorflow/core/platform/*.h tmp/include/tensorflow/core/platform
cp third_party/xla/third_party/tsl/tsl/platform/*.h tmp/include/tsl/platform
cp third_party/xla/xla/tsl/c/*.h tmp/include/xla/tsl/c
(cd tmp && tar --exclude=*.params -czf /build/libtensorflow-$1-$2.tar.gz .)
du -h /build/libtensorflow-$1-$2.tar.gz
echo "Done."

View File

@@ -1,36 +0,0 @@
build --action_env PYTHON_BIN_PATH="/usr/bin/python"
build --action_env PYTHON_LIB_PATH="/usr/lib/python2.7/dist-packages"
build --python_path="/usr/bin/python"
build --action_env TF_NEED_OPENCL_SYCL="0"
build --action_env TF_NEED_ROCM="0"
build --action_env TF_NEED_CUDA="1"
build --action_env TF_NEED_TENSORRT="1"
build --action_env CUDA_TOOLKIT_PATH="/usr/local/cuda"
build --action_env TF_CUDA_COMPUTE_CAPABILITIES="5.3"
build --action_env TF_CUDA_CLANG="0"
build --action_env TF_CUDA_VERSION="10"
build --action_env GCC_HOST_COMPILER_PATH="/usr/bin/gcc"
build --config=cuda
build --config=nonccl
build --verbose_failures
build --jobs 2
build:opt --copt=-march=armv8-a
build:opt --copt=-Wno-sign-compare
build:opt --conlyopt=-std=c11
build:opt --conlyopt=-D_XOPEN_SOURCE=600
build:opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
build:opt --host_copt=-march=armv8-a
build:opt --host_conlyopt=-std=c11
build:opt --host_conlyopt=-D_XOPEN_SOURCE=600
build:opt --host_cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
build:opt --host_copt=-Wno-sign-compare
build:opt --define with_default_optimizations=true
build:v2 --define=tf_api_version=2
build:xla --define with_xla_support=true
test --flaky_test_attempts=3
test --test_size_filters=small,medium
test --test_tag_filters=-benchmark-test,-no_oss,-oss_serial
test --build_tag_filters=-benchmark-test,-no_oss
test --test_tag_filters=-gpu
test --build_tag_filters=-gpu
build --action_env TF_CONFIGURE_IOS="0"

View File

@@ -1,14 +1,10 @@
TF_VERSION=1.15.2
# -march see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/i386-and-x86-64-Options.html
all: libtensorflow
patch:
git apply tensorflow-$(TF_VERSION).diff
download:
wget https://github.com/tensorflow/tensorflow/archive/v$(TF_VERSION).tar.gz
tar -xzf v$(TF_VERSION).tar.gz
cp .tf_configure.bazelrc Makefile ../*.sh tensorflow-$(TF_VERSION)
cp Makefile *.sh tensorflow-$(TF_VERSION)
libtensorflow:
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so
bazel build -c opt //tensorflow:libtensorflow.so --copt=-march=armv8-a
./create_archive.sh jetson-nano $(TF_VERSION)

View File

@@ -0,0 +1,26 @@
#!/usr/bin/env bash
if [[ -z $1 ]] || [[ -z $2 ]]; then
echo "Usage: $0 [platform] [tf-version]" 1>&2
exit 1
fi
echo "Creating 'libtensorflow-$1-$2.tar.gz'...";
rm -rf tmp
mkdir -p tmp/lib/
mkdir -p tmp/include/tensorflow/c/eager/
mkdir -p tmp/include/tensorflow/core/platform
mkdir -p tmp/include/tsl/platform
mkdir -p tmp/include/xla/tsl/c
cp -av bazel-bin/tensorflow/libtensorflow* tmp/lib/
cp tensorflow/c/eager/*.h tmp/include/tensorflow/c/eager/
cp tensorflow/c/*.h LICENSE tmp/include/tensorflow/c/
cp tensorflow/core/platform/*.h tmp/include/tensorflow/core/platform
cp third_party/xla/third_party/tsl/tsl/platform/*.h tmp/include/tsl/platform
cp third_party/xla/xla/tsl/c/*.h tmp/include/xla/tsl/c
(cd tmp && tar --exclude=*.params -czf /build/libtensorflow-$1-$2.tar.gz .)
du -h /build/libtensorflow-$1-$2.tar.gz
echo "Done."

View File

@@ -1,27 +0,0 @@
build --action_env PYTHON_BIN_PATH="/usr/local/bin/python3"
build --action_env PYTHON_LIB_PATH="/usr/local/lib/python3.7/site-packages"
build --python_path="/usr/local/bin/python3"
build --action_env TF_NEED_OPENCL_SYCL="0"
build --action_env TF_NEED_ROCM="0"
build --action_env TF_NEED_CUDA="0"
build --action_env TF_NEED_TENSORRT="0"
build --action_env CUDA_TOOLKIT_PATH="/usr/local/cuda"
build --action_env TF_CUDA_COMPUTE_CAPABILITIES="5.3"
build --action_env TF_CUDA_CLANG="0"
build --action_env TF_CUDA_VERSION="10"
build --action_env GCC_HOST_COMPILER_PATH="/usr/bin/gcc"
build --verbose_failures
build:opt --copt=-Wno-sign-compare
build:opt --conlyopt=-std=c11
build:opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
build:opt --host_conlyopt=-std=c11
build:opt --host_cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
build:opt --host_copt=-Wno-sign-compare
build:opt --define with_default_optimizations=true
build:v2 --define=tf_api_version=2
build:xla --define with_xla_support=true
test --flaky_test_attempts=3
test --test_size_filters=small,medium
test --test_tag_filters=-benchmark-test,-no_oss,-oss_serial
test --build_tag_filters=-benchmark-test,-no_oss
build --action_env TF_CONFIGURE_IOS="0"

View File

@@ -1,20 +1,16 @@
TF_VERSION=1.15.2
# -march see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/i386-and-x86-64-Options.html
all: libtensorflow libtensorflow-avx libtensorflow-avx2
patch:
git apply tensorflow-$(TF_VERSION).diff
download:
wget https://github.com/tensorflow/tensorflow/archive/v$(TF_VERSION).tar.gz
tar -xzf v$(TF_VERSION).tar.gz
cp .tf_configure.bazelrc Makefile ../*.sh tensorflow-$(TF_VERSION)
cp Makefile *.sh tensorflow-$(TF_VERSION)
libtensorflow:
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so
bazel build -c opt //tensorflow:libtensorflow.so
./create_archive.sh osx-cpu $(TF_VERSION)
libtensorflow-avx:
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so --copt=-march=core-avx-i --host_copt=-march=core-avx-i
bazel build -c opt //tensorflow:libtensorflow.so --copt=-mavx
./create_archive.sh osx-avx $(TF_VERSION)
libtensorflow-avx2:
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so --copt=-march=core-avx2 --host_copt=-march=core-avx2
./create_archive.sh osx-avx2 $(TF_VERSION)
bazel build -c opt //tensorflow:libtensorflow.so --copt=-mavx2
./create_archive.sh osx-avx2 $(TF_VERSION)

View File

@@ -1,14 +0,0 @@
coverage/
node_modules/
tests/screenshots/
tests/acceptance/screenshots/
tests/upload-files/
*.html
.idea
.github
.tmp
.local
.cache
.var
!**/.eslintrc.js

View File

@@ -1,108 +0,0 @@
module.exports = {
env: {
browser: true,
commonjs: true,
es2021: true,
node: true,
mocha: true,
},
extends: [
"eslint:recommended",
"plugin:vue/recommended",
"plugin:prettier/recommended",
"plugin:vue/base",
"plugin:vuetify/base",
],
settings: {
"prettier/prettier": {
// Settings for how to process Vue SFC Blocks
SFCBlocks: {
template: false,
script: false,
style: false,
},
// Use prettierrc for prettier options or not (default: `true`)
usePrettierrc: true,
// Set the options for `prettier.getFileInfo`.
// @see https://prettier.io/docs/en/api.html#prettiergetfileinfofilepath-options
fileInfoOptions: {
// Path to ignore file (default: `'.prettierignore'`)
// Notice that the ignore file is only used for this plugin
ignorePath: ".testignore",
// Process the files in `node_modules` or not (default: `false`)
withNodeModules: false,
},
},
},
parserOptions: {
ecmaVersion: "latest",
sourceType: "module",
},
rules: {
// 'comma-dangle': ['error', 'always-multiline'],
"indent": ["error", 2, { SwitchCase: 1 }],
"linebreak-style": ["error", "unix"],
"quotes": [
"off",
"double",
{
avoidEscape: true,
allowTemplateLiterals: true,
},
],
"semi": ["error", "always"],
"no-unused-vars": ["warn"],
"no-console": 0,
"no-case-declarations": 0,
"no-prototype-builtins": 0,
"vue/no-v-text-v-html-on-component": 0,
"vue/no-v-model-argument": 0,
"vue/valid-model-definition": 0,
"vue/valid-attribute-name": 0,
"vue/singleline-html-element-content-newline": [
"off",
{
ignoreWhenNoAttributes: true,
ignoreWhenEmpty: true,
ignores: [
"pre",
"textarea",
"span",
"translate",
"a",
"v-icon",
"v-text-field",
"v-input",
"v-select",
"v-switch",
"v-checkbox",
"v-img",
],
externalIgnores: [],
},
],
"vue/first-attribute-linebreak": [
"error",
{
singleline: "ignore",
multiline: "ignore",
},
],
"prettier/prettier": [
"warn",
{
printWidth: 120,
semi: true,
singleQuote: false,
bracketSpacing: true,
trailingComma: "es5",
htmlWhitespaceSensitivity: "css",
quoteProps: "consistent",
proseWrap: "never",
},
],
},
};

View File

@@ -5,8 +5,10 @@ tests/acceptance/screenshots/
tests/upload-files/
*.html
.idea
.codex
.github
.tmp
.local
.cache
.gocache
.var

106
frontend/CODEMAP.md Normal file
View File

@@ -0,0 +1,106 @@
PhotoPrism — Frontend CODEMAP
Purpose
- Help agents and contributors navigate the Vue 3 + Vuetify 3 app quickly and make safe changes.
- Use Makefile targets and scripts in `frontend/package.json` as sources of truth.
Quick Start
- Build once: `make -C frontend build`
- Watch for changes (inside dev container is fine):
- `make watch-js` from repo root, or
- `cd frontend && npm run watch`
- Unit tests (Vitest): `make vitest-watch` / `make vitest-coverage` or `cd frontend && npm run test`
Directory Map (src)
- `src/app.vue` — root component; UI shell
- `src/app.js` — app bootstrap: creates Vue app, installs Vuetify + plugins, configures router, mounts to `#app`
- `src/app/routes.js` — all route definitions (guards, titles, meta)
- `src/app/session.js``$config` and `$session` singletons wired from server-provided `window.__CONFIG__` and storage
- `src/common/*` — framework-agnostic helpers: `$api` (Axios), `$notify`, `$view`, `$event` (PubSub), i18n (`gettext`), util, fullscreen, map utils, websocket
- `src/component/*` — Vue components; `src/component/components.js` registers global components
- `src/page/*` — route views (Albums, Photos, Places, Settings, Admin, Discover, Help, Login, etc.)
- `src/model/*` — REST models; base `Rest` class (`model/rest.js`) wraps Axios CRUD for collections and entities
- `src/options/*` — UI/theme options, formats, auth options
- `src/css/*` — styles loaded by Webpack
- `src/locales/*` — gettext catalogs; extraction/compile scripts in `package.json`
Runtime & Plugins
- Vue 3 + Vuetify 3 (`createVuetify`) with MDI icons; themes from `src/options/themes.js`
- Router: Vue Router 4, history base at `$config.baseUri + "/library/"`
- I18n: `vue3-gettext` via `common/gettext.js`; extraction with `npm run gettext-extract`, compile with `npm run gettext-compile`
- HTML sanitization: `vue-3-sanitize` + `vue-sanitize-directive`
- Tooltips: `floating-vue`
- Video: HLS.js assigned to `window.Hls`
- PWA: `@lcdp/offline-plugin/runtime` installs when `baseUri === ""`
- WebSocket: `src/common/websocket.js` publishes `websocket.*` events, used by `$session` for client info
HTTP Client
- Axios instance: `src/common/api.js`
- Base URL: `window.__CONFIG__.apiUri` (or `/api/v1` in tests)
- Adds `X-Auth-Token`, `X-Client-Uri`, `X-Client-Version`
- Interceptors drive global progress notifications and token refresh via headers `X-Preview-Token`/`X-Download-Token`
Auth, Session, and Config
- `$session`: `src/common/session.js` — stores `X-Auth-Token` and `session.id` in storage; provides guards and default routes
- `$config`: `src/common/config.js` — reactive view of server config and user settings; sets theme, language, limits; exposes `deny()` for feature flags
- Route guards live in `src/app.js` (router `beforeEach`/`afterEach`) and use `$session` + `$config`
Models (REST)
- Base class: `src/model/rest.js` provides `search`, `find`, `save`, `update`, `remove` for concrete models (`photo`, `album`, `label`, `subject`, etc.)
- Pagination headers used: `X-Count`, `X-Limit`, `X-Offset`
Routing Conventions
- Add pages under `src/page/<area>/...` and import them in `src/app/routes.js`
- Set `meta.requiresAuth`, `meta.admin`, and `meta.settings` as needed
- Use `meta.title` for translated titles; `router.afterEach` updates `document.title`
Theming & UI
- Themes: `src/options/themes.js` registered in Vuetify; default comes from `$config.values.settings.ui.theme`
- Global components: register in `src/component/components.js` when they are broadly reused
Testing
- Vitest config: `frontend/vitest.config.js` (Vue plugin, alias map to `src/*`), `tests/vitest/**/*`
- Run: `cd frontend && npm run test` (or `make test-js` from repo root)
- Acceptance: TestCafe configs in `frontend/tests/acceptance`; run against a live server
Build & Tooling
- Webpack is used for bundling; scripts in `frontend/package.json`:
- `npm run build` (prod), `npm run build-dev` (dev), `npm run watch`
- Lint/format: `npm run lint`, `npm run fmt`
- Security scan: `npm run security:scan` (checks `--ignore-scripts` and forbids `v-html`)
- Make targets (from repo root): `make build-js`, `make watch-js`, `make test-js`
Common HowTos
- Add a page
- Create `src/page/<name>.vue` (or nested directory)
- Add route in `src/app/routes.js` with `name`, `path`, `component`, and `meta`
- Use `$api` for data, `$notify` for UX, `$session` for guards
- Add a REST model
- Create `src/model/<thing>.js` extending `Rest` and implement `static getCollectionResource()` + `static getModelName()`
- Use in pages/components for CRUD
- Call a backend endpoint
- Use `$api.get/post/put/delete` from `src/common/api.js`
- For auth: `$session.setAuthToken(token)` sets header; router guards redirect to `login` when needed
- Add translations
- Wrap strings with `$gettext(...)` / `$pgettext(...)`
- Extract: `npm run gettext-extract`; compile: `npm run gettext-compile`
Conventions & Safety
- Avoid `v-html`; use `v-sanitize` or `$util.sanitizeHtml()` (build enforces this)
- Keep big components lazy if needed; split views logically under `src/page`
- Respect aliases in `vitest.config.js` when importing (`app`, `common`, `component`, `model`, `options`, `page`)
Frequently Touched Files
- Bootstrap: `src/app.js`, `src/app.vue`
- Router: `src/app/routes.js`
- HTTP: `src/common/api.js`
- Session/Config: `src/common/session.js`, `src/common/config.js`
- Models: `src/model/rest.js` and concrete models (`photo.js`, `album.js`, ...)
- Global components: `src/component/components.js`
See Also
- Backend CODEMAP at repo root (`CODEMAP.md`) for API and server internals
- AGENTS.md for repo-wide rules and test tips

View File

@@ -3,24 +3,58 @@
# Questions? Email us at hello@photoprism.app or visit our website to learn
# more about our team, products and services: https://www.photoprism.app/
UID := $(shell id -u)
GID := $(shell id -g)
PWD := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
NODE_IMAGE ?= node:lts
define DOCKER_NPM
docker run --rm -it \
-v "$(PWD)":/app \
-w /app \
--user "$(UID):$(GID)" \
--read-only --tmpfs /tmp \
-v ~/.cache/npm:/npm-cache \
-e NPM_CONFIG_CACHE=/npm-cache \
-e NPM_CONFIG_AUDIT=false \
-e NPM_CONFIG_FUND=false \
-e NO_UPDATE_NOTIFIER=true \
--cap-drop ALL --security-opt no-new-privileges --pids-limit 256 \
$(NODE_IMAGE) sh -lc
endef
# Declare "make" targets.
all: install build
dep: install-npm install-testcafe install
dep-list:
npx npm-check-updates
help: list
list:
@awk '/^[[:alnum:]]+[^[:space:]]+:/ {printf "%s",substr($$1,1,length($$1)-1); if (match($$0,/#/)) {desc=substr($$0,RSTART+1); sub(/^[[:space:]]+/,"",desc); printf " - %s\n",desc} else printf "\n" }' "$(firstword $(MAKEFILE_LIST))"
notice:
@echo "Creating license report for frontend dependencies..."
license-report --only=prod --config=.report.json > NOTICE
install-npm:
sudo npm install --unsafe-perm=true --allow-root -g npm@latest npm-check-updates@latest license-report@latest
# Keep scripts enabled for npm itself; split other globals and disable scripts for safety
sudo npm install -g npm@latest
sudo npm install -g --ignore-scripts --no-fund --no-audit --no-update-notifier npm-check-updates@latest license-report@latest
install-testcafe:
npm install -g testcafe@latest
npm install -g --ignore-scripts --no-fund --no-audit --no-update-notifier testcafe@latest
install-eslint:
npm install -g eslint@8 eslint-config-prettier eslint-config-standard eslint-formatter-pretty eslint-plugin-html eslint-plugin-import eslint-plugin-node eslint-plugin-prettier eslint-plugin-promise eslint-plugin-vue eslint-webpack-plugin vue-eslint-parser prettier
install:
npm install --no-update-notifier --no-audit
update:
npm update
npm install -g --ignore-scripts --no-fund --no-audit --no-update-notifier eslint globals @eslint/eslintrc @eslint/js eslint-config-prettier eslint-formatter-pretty eslint-plugin-html eslint-plugin-import eslint-plugin-node eslint-plugin-prettier eslint-plugin-promise eslint-plugin-vue eslint-webpack-plugin vue-eslint-parser prettier
upgrade:
$(info Securely upgrading NPM dependencies...)
$(DOCKER_NPM) 'npx -y npm@latest update --save --package-lock --ignore-scripts --no-fund --no-audit --no-update-notifier && npx -y npm@latest install --ignore-scripts --no-audit --no-fund --no-update-notifier'
npm-install:
$(info Installing NPM dependencies...)
npm install --ignore-scripts --no-fund --no-audit --no-update-notifier
install: npm-install
npm-update:
$(info Updating NPM dependencies in package.lock and package-lock.json...)
npm update --save --package-lock --ignore-scripts --no-fund --no-audit --no-update-notifier
update: npm-update npm-install
security-check: # Scan for missing --ignore-scripts and unsafe v-html
npm run -s security:scan
watch:
npm run watch
build:
@@ -31,8 +65,6 @@ fmt:
npm run fmt
test:
npm run test
upgrade:
npm run upgrade
testcafe:
npm run testcafe
acceptance-local:

View File

@@ -1,97 +1,102 @@
Package License Copyright
------- ------- ---------
@babel/cli MIT The Babel Team (https://babel.dev/team)
@babel/core MIT The Babel Team (https://babel.dev/team)
@babel/plugin-transform-runtime MIT The Babel Team (https://babel.dev/team)
@babel/preset-env MIT The Babel Team (https://babel.dev/team)
@babel/register MIT The Babel Team (https://babel.dev/team)
@babel/runtime MIT The Babel Team (https://babel.dev/team)
@lcdp/offline-plugin MIT Le Comptoir Des Pharmacies <webmaster@lecomptoirdespharmacies.fr>
@mdi/font Apache-2.0 Austin Andrews
@vue/compiler-sfc MIT Evan You
@vvo/tzdb MIT Vincent Voyer <vincent@codeagain.com>
axios MIT Matt Zabriskie
axios-mock-adapter MIT Colin Timmermans <colintimmermans@gmail.com>
babel-loader MIT Luis Couto <hello@luiscouto.pt>
babel-plugin-istanbul BSD-3-Clause Thai Pangsakulyanont @dtinth
browserslist MIT Andrey Sitnik <andrey@sitnik.ru>
chai MIT Jake Luer <jake@alogicalparadox.com>
cheerio MIT Matt Mueller <mattmuelle@gmail.com>
chrome-finder ISC gwuhaolin
core-js MIT Denis Pushkarev zloirock@zloirock.ru http://zloirock.ru
cross-env MIT Kent C. Dodds <me@kentcdodds.com> (https://kentcdodds.com)
css-loader MIT Tobias Koppers @sokra
cssnano MIT Ben Briggs beneb.info@gmail.com http://beneb.info
easygettext MIT Polyconseil
eslint MIT Nicholas C. Zakas <nicholas+npm@nczconsulting.com>
eslint-config-prettier MIT Simon Lydell
eslint-formatter-pretty MIT Sindre Sorhus sindresorhus@gmail.com https://sindresorhus.com
eslint-plugin-html ISC n/a
eslint-plugin-import MIT Ben Mosher <me@benmosher.com>
eslint-plugin-node MIT Toru Nagashima
eslint-plugin-prettier MIT Teddy Katz
eslint-plugin-promise ISC jden <jason@denizac.org>
eslint-plugin-vue MIT Toru Nagashima (https://github.com/mysticatea)
eslint-plugin-vuetify MIT Kael Watts-Deuchar <kaelwd@gmail.com>
eslint-webpack-plugin MIT Ricardo Gobbo de Souza <ricardogobbosouza@yahoo.com.br>
eventsource-polyfill MIT amvtek <devel@amvtek.com>
file-loader MIT Tobias Koppers @sokra
file-saver MIT Eli Grey <me@eligrey.com>
floating-vue MIT Guillaume Chau <guillaume.b.chau@gmail.com>
hls.js Apache-2.0 n/a
i MIT Pavan Kumar Sunkara <pavan.sss1991@gmail.com> (pksunkara.github.com)
karma MIT Vojta Jína <vojta.jina@gmail.com>
karma-chrome-launcher MIT Vojta Jina <vojta.jina@gmail.com>
karma-coverage-istanbul-reporter MIT Matt Lewis
karma-htmlfile-reporter MIT Matthias Schuetz MatthiasSchuetz@gmx.de
karma-mocha MIT Vojta Jina <vojta.jina@gmail.com>
karma-verbose-reporter MIT Pier Fumagalli pier@usrz.com
karma-webpack MIT Tobias Koppers @sokra
luxon MIT Isaac Cambron
maplibre-gl BSD-3-Clause n/a
memoize-one MIT Alex Reardon <alexreardon@gmail.com>
mini-css-extract-plugin MIT Tobias Koppers @sokra
minimist MIT James Halliday mail@substack.net http://substack.net
mocha MIT TJ Holowaychuk <tj@vision-media.ca>
node-storage-shim ISC Michael Nahkies
passive-events-support MIT Ignas Damunskis <ignas3run@gmail.com>
photoswipe MIT Dmytro Semenov (https://dimsemenov.com)
postcss MIT Andrey Sitnik <andrey@sitnik.ru>
postcss-import MIT Maxime Thirouin
postcss-loader MIT Andrey Sitnik <andrey@sitnik.ru>
postcss-preset-env MIT-0 n/a
postcss-reporter MIT David Clark david.dave.clark@gmail.com https://davidtheclark.com
postcss-url MIT Maxime Thirouin
prettier MIT James Long
pubsub-js MIT Morgan Roderick morgan@roderick.dk http://roderick.dk
regenerator-runtime MIT Ben Newman <bn@cs.stanford.edu>
resolve-url-loader MIT bholloway
sanitize-html MIT Apostrophe Technologies, Inc.
sass MIT Natalie Weizenbaum nweiz@google.com https://github.com/nex3
sass-loader MIT J. Tangelder
server MIT Francisco Presencia <public@francisco.io> (https://francisco.io/)
sockette MIT Luke Edwards luke.edwards05@gmail.com lukeed.com
standard MIT Feross Aboukhadijeh feross@feross.org https://feross.org
style-loader MIT Tobias Koppers @sokra
svg-url-loader MIT Hovhannes Babayan
tar ISC Isaac Z. Schlueter
url-loader MIT Tobias Koppers @sokra
util MIT Joyent http://www.joyent.com
vue MIT Evan You
vue-3-sanitize MIT Vannsl, Vanessa Otto <mail@vannsl.io>
vue-loader MIT Evan You
vue-loader-plugin ISC Ivan liu
vue-luxon MIT Cas Bloem
vue-router MIT Eduardo San Martin Morote posva13@gmail.com
vue-sanitize-directive MIT Leonardo Piccioni de Almeida leopiccionia@gmail.com
vue-style-loader MIT Evan You
vue3-gettext MIT Leo Zurbriggen
vuetify MIT John Leider john@vuetifyjs.com
webpack MIT Tobias Koppers @sokra
webpack-bundle-analyzer MIT Yury Grunin <grunin.ya@ya.ru>
webpack-cli MIT n/a
webpack-hot-middleware MIT Glen Mailer <glen@stainlessed.co.uk>
webpack-manifest-plugin MIT Dane Thurber <dane.thurber@gmail.com>
webpack-md5-hash MIT Kirill Ermolov
webpack-merge MIT Juho Vepsalainen <bebraw@gmail.com>
webpack-plugin-vuetify MIT Kael Watts-Deuchar
Package License Copyright
------- ------- ---------
@babel/cli MIT The Babel Team (https://babel.dev/team)
@babel/core MIT The Babel Team (https://babel.dev/team)
@babel/plugin-transform-runtime MIT The Babel Team (https://babel.dev/team)
@babel/preset-env MIT The Babel Team (https://babel.dev/team)
@babel/register MIT The Babel Team (https://babel.dev/team)
@babel/runtime MIT The Babel Team (https://babel.dev/team)
@eslint/eslintrc MIT Nicholas C. Zakas
@eslint/js MIT n/a
@lcdp/offline-plugin MIT Le Comptoir Des Pharmacies <webmaster@lecomptoirdespharmacies.fr>
@mdi/font Apache-2.0 Austin Andrews
@testing-library/jest-dom MIT Ernesto Garcia <gnapse@gmail.com> (http://gnapse.github.io)
@testing-library/react MIT Kent C. Dodds <me@kentcdodds.com> (https://kentcdodds.com)
@vitejs/plugin-react MIT Evan You
@vitejs/plugin-vue MIT Evan You
@vitest/browser MIT n/a
@vitest/coverage-v8 MIT Anthony Fu <anthonyfu117@hotmail.com>
@vitest/ui MIT n/a
@vue/compiler-sfc MIT Evan You
@vue/language-server MIT n/a
@vue/test-utils MIT Lachlan Miller lachlan.miller.1990@outlook.com
@vvo/tzdb MIT Vincent Voyer <vincent@codeagain.com>
axios MIT Matt Zabriskie
axios-mock-adapter MIT Colin Timmermans <colintimmermans@gmail.com>
babel-loader MIT Luis Couto <hello@luiscouto.pt>
babel-plugin-istanbul BSD-3-Clause Thai Pangsakulyanont @dtinth
babel-plugin-polyfill-corejs3 MIT n/a
browserslist MIT Andrey Sitnik <andrey@sitnik.ru>
cheerio MIT Matt Mueller <mattmuelle@gmail.com>
core-js MIT Denis Pushkarev zloirock@zloirock.ru http://zloirock.ru
cross-env MIT Kent C. Dodds <me@kentcdodds.com> (https://kentcdodds.com)
css-loader MIT Tobias Koppers @sokra
cssnano MIT Ben Briggs beneb.info@gmail.com http://beneb.info
easygettext MIT Polyconseil
eslint MIT Nicholas C. Zakas <nicholas+npm@nczconsulting.com>
eslint-config-prettier MIT Simon Lydell
eslint-formatter-pretty MIT Sindre Sorhus sindresorhus@gmail.com https://sindresorhus.com
eslint-plugin-html ISC n/a
eslint-plugin-import MIT Ben Mosher <me@benmosher.com>
eslint-plugin-node MIT Toru Nagashima
eslint-plugin-prettier MIT Teddy Katz
eslint-plugin-vue MIT Toru Nagashima (https://github.com/mysticatea)
eslint-plugin-vuetify MIT Kael Watts-Deuchar <kaelwd@gmail.com>
eslint-webpack-plugin MIT Ricardo Gobbo de Souza <ricardogobbosouza@yahoo.com.br>
eventsource-polyfill MIT amvtek <devel@amvtek.com>
file-loader MIT Tobias Koppers @sokra
file-saver MIT Eli Grey <me@eligrey.com>
floating-vue MIT Guillaume Chau <guillaume.b.chau@gmail.com>
globals MIT Sindre Sorhus sindresorhus@gmail.com https://sindresorhus.com
hls.js Apache-2.0 n/a
i MIT Pavan Kumar Sunkara <pavan.sss1991@gmail.com> (pksunkara.github.com)
jsdom MIT n/a
luxon MIT Isaac Cambron
maplibre-gl BSD-3-Clause n/a
memoize-one MIT Alex Reardon <alexreardon@gmail.com>
mini-css-extract-plugin MIT Tobias Koppers @sokra
minimist MIT James Halliday mail@substack.net http://substack.net
node-storage-shim ISC Michael Nahkies
passive-events-support MIT Ignas Damunskis <ignas3run@gmail.com>
photoswipe MIT Dmytro Semenov (https://dimsemenov.com)
playwright Apache-2.0 Microsoft Corporation
postcss MIT Andrey Sitnik <andrey@sitnik.ru>
postcss-import MIT Maxime Thirouin
postcss-loader MIT Andrey Sitnik <andrey@sitnik.ru>
postcss-preset-env MIT-0 n/a
postcss-reporter MIT David Clark david.dave.clark@gmail.com https://davidtheclark.com
postcss-url MIT Maxime Thirouin
prettier MIT James Long
pubsub-js MIT Morgan Roderick morgan@roderick.dk http://roderick.dk
regenerator-runtime MIT Ben Newman <bn@cs.stanford.edu>
resolve-url-loader MIT bholloway
sanitize-html MIT Apostrophe Technologies, Inc.
sass MIT Natalie Weizenbaum nweiz@google.com https://github.com/nex3
sass-loader MIT J. Tangelder
server MIT Francisco Presencia <public@francisco.io> (https://francisco.io/)
sockette MIT Luke Edwards luke.edwards05@gmail.com lukeed.com
style-loader MIT Tobias Koppers @sokra
svg-url-loader MIT Hovhannes Babayan
tar ISC Isaac Z. Schlueter
url-loader MIT Tobias Koppers @sokra
util MIT Joyent http://www.joyent.com
vite-tsconfig-paths MIT aleclarson
vitest MIT Anthony Fu <anthonyfu117@hotmail.com>
vue MIT Evan You
vue-3-sanitize MIT Vannsl, Vanessa Otto <mail@vannsl.io>
vue-loader MIT Evan You
vue-loader-plugin ISC Ivan liu
vue-luxon MIT Cas Bloem
vue-router MIT Eduardo San Martin Morote posva13@gmail.com
vue-sanitize-directive MIT Leonardo Piccioni de Almeida leopiccionia@gmail.com
vue-style-loader MIT Evan You
vue3-gettext MIT Leo Zurbriggen
vuetify MIT John Leider john@vuetifyjs.com
webpack MIT Tobias Koppers @sokra
webpack-bundle-analyzer MIT Yury Grunin <grunin.ya@ya.ru>
webpack-cli MIT n/a
webpack-hot-middleware MIT Glen Mailer <glen@stainlessed.co.uk>
webpack-manifest-plugin MIT Dane Thurber <dane.thurber@gmail.com>
webpack-md5-hash MIT Kirill Ermolov
webpack-merge MIT Juho Vepsalainen <bebraw@gmail.com>
webpack-plugin-vuetify MIT Kael Watts-Deuchar

142
frontend/eslint.config.mjs Normal file
View File

@@ -0,0 +1,142 @@
import { defineConfig, globalIgnores } from "eslint/config";
import globals from "globals";
import path from "node:path";
import { fileURLToPath } from "node:url";
import js from "@eslint/js";
import { FlatCompat } from "@eslint/eslintrc";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all,
});
export default defineConfig([
globalIgnores([
"**/coverage/",
"**/node_modules/",
"tests/screenshots/",
"tests/acceptance/screenshots/",
"tests/upload-files/",
"**/*.html",
"**/.idea",
"**/.codex",
"**/.env",
"**/.venv",
"**/.github",
"**/.tmp",
"**/.local",
"**/.cache",
"**/.gocache",
"**/.var",
]),
{
extends: compat.extends(
"eslint:recommended",
"plugin:vue/recommended",
"plugin:prettier/recommended",
"plugin:vue/base",
"plugin:vuetify/base"
),
languageOptions: {
globals: {
...globals.browser,
...globals.commonjs,
...globals.node,
...globals.mocha,
},
ecmaVersion: "latest",
sourceType: "module",
},
settings: {
"prettier/prettier": {
// Settings for how to process Vue SFC Blocks
SFCBlocks: {
template: false,
script: false,
style: false,
},
// Use prettierrc for prettier options or not (default: `true`)
usePrettierrc: true,
// Set the options for `prettier.getFileInfo`.
// @see https://prettier.io/docs/en/api.html#prettiergetfileinfofilepath-options
fileInfoOptions: {
// Path to ignore file (default: `'.prettierignore'`)
// Notice that the ignore file is only used for this plugin
ignorePath: ".testignore",
// Process the files in `node_modules` or not (default: `false`)
withNodeModules: false,
},
},
},
rules: {
"indent": ["error", 2, { SwitchCase: 1 }],
"linebreak-style": ["error", "unix"],
"quotes": [
"off",
"double",
{
avoidEscape: true,
allowTemplateLiterals: true,
},
],
"semi": ["error", "always"],
"no-unused-vars": ["warn"],
"no-console": 0,
"no-case-declarations": 0,
"no-prototype-builtins": 0,
"vue/no-v-text-v-html-on-component": 0,
"vue/no-v-model-argument": 0,
"vue/valid-model-definition": 0,
"vue/valid-attribute-name": 0,
"vue/singleline-html-element-content-newline": [
"off",
{
ignoreWhenNoAttributes: true,
ignoreWhenEmpty: true,
ignores: [
"pre",
"textarea",
"span",
"translate",
"a",
"v-icon",
"v-text-field",
"v-input",
"v-select",
"v-switch",
"v-checkbox",
"v-img",
],
externalIgnores: [],
},
],
"vue/first-attribute-linebreak": [
"error",
{
singleline: "ignore",
multiline: "ignore",
},
],
"prettier/prettier": [
"warn",
{
printWidth: 120,
semi: true,
singleQuote: false,
bracketSpacing: true,
trailingComma: "es5",
htmlWhitespaceSensitivity: "css",
quoteProps: "consistent",
proseWrap: "never",
},
],
},
},
]);

View File

@@ -0,0 +1,21 @@
const glob = require("glob");
const path = require("path");
const poPath = path.resolve(__dirname, "src/locales");
// Generates a list of existing locales based on the files in src/locales.
const languageCodes = glob.sync(poPath + "/*.po").map((filePath) => {
const fileName = path.basename(filePath);
return fileName.replace(".po", "");
});
// Generates one JSON file per locale from the gettext *.po files located in src/locales.
module.exports = {
output: {
path: path.resolve(__dirname, "src/locales"),
potPath: "src/locales/translations.pot",
jsonPath: "json",
locales: languageCodes,
splitJson: true,
flat: true,
},
};

View File

@@ -168,4 +168,7 @@ module.exports = (config) => {
singleRun: true,
});
// Set default timezone.
process.env.TZ = "UTC";
};

Some files were not shown because too many files have changed in this diff Show More