diff --git a/assets/static/img/wallpaper/kashmir.jpg b/assets/static/img/wallpaper/kashmir.jpg
new file mode 100644
index 000000000..65061c775
Binary files /dev/null and b/assets/static/img/wallpaper/kashmir.jpg differ
diff --git a/assets/templates/index.tmpl b/assets/templates/index.tmpl
index 4557bb8ce..a6d4e9948 100644
--- a/assets/templates/index.tmpl
+++ b/assets/templates/index.tmpl
@@ -4,7 +4,7 @@
-
{{ .config.SiteTitle }}
+ {{if and .config.SiteCaption .config.Sponsor }}{{ .config.SiteCaption }}{{else}}{{ .config.Name }}{{end}}
diff --git a/cmd/photoprism/photoprism.go b/cmd/photoprism/photoprism.go
index 634daf57b..433aa25d2 100644
--- a/cmd/photoprism/photoprism.go
+++ b/cmd/photoprism/photoprism.go
@@ -28,10 +28,11 @@ import (
"os"
"path/filepath"
+ "github.com/urfave/cli"
+
"github.com/photoprism/photoprism/internal/commands"
"github.com/photoprism/photoprism/internal/config"
"github.com/photoprism/photoprism/internal/event"
- "github.com/urfave/cli"
)
var version = "development"
@@ -55,7 +56,7 @@ func main() {
app.Version = version
app.Copyright = appCopyright
app.EnableBashCompletion = true
- app.Flags = config.GlobalFlags
+ app.Flags = config.Flags.Cli()
app.Commands = commands.PhotoPrism
if err := app.Run(os.Args); err != nil {
diff --git a/docker-compose.ci.yml b/docker-compose.ci.yml
index 4a2c20ada..6d041876d 100644
--- a/docker-compose.ci.yml
+++ b/docker-compose.ci.yml
@@ -17,7 +17,6 @@ services:
- "~/.cache/go-mod:/go/pkg/mod"
environment:
PHOTOPRISM_SITE_URL: "http://localhost:2342/"
- PHOTOPRISM_SITE_TITLE: "PhotoPrism"
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: "Open-Source Photo Management"
PHOTOPRISM_SITE_AUTHOR: "@photoprism_app"
diff --git a/docker-compose.latest.yml b/docker-compose.latest.yml
index 6ef38a0b5..4969e1be6 100644
--- a/docker-compose.latest.yml
+++ b/docker-compose.latest.yml
@@ -24,7 +24,6 @@ services:
PHOTOPRISM_ADMIN_PASSWORD: "photoprism" # initial "admin" password (minimum 8 characters)
## Public server URL incl http:// or https:// and /path, :port is optional
PHOTOPRISM_SITE_URL: "https://latest.localssl.dev/"
- PHOTOPRISM_SITE_TITLE: "PhotoPrism"
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: "Open-Source Photo Management"
PHOTOPRISM_SITE_AUTHOR: "@photoprism_app"
diff --git a/docker-compose.local.yml b/docker-compose.local.yml
index 8e9e1d430..0ea49d34d 100644
--- a/docker-compose.local.yml
+++ b/docker-compose.local.yml
@@ -24,7 +24,6 @@ services:
PHOTOPRISM_ADMIN_PASSWORD: "photoprism" # initial "admin" password (minimum 8 characters)
## Public server URL incl http:// or https:// and /path, :port is optional
PHOTOPRISM_SITE_URL: "https://latest.localssl.dev/"
- PHOTOPRISM_SITE_TITLE: "PhotoPrism"
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: "Open-Source Photo Management"
PHOTOPRISM_SITE_AUTHOR: "@photoprism_app"
diff --git a/docker-compose.postgres.yml b/docker-compose.postgres.yml
index dc7d9ed44..8c2e4ac28 100644
--- a/docker-compose.postgres.yml
+++ b/docker-compose.postgres.yml
@@ -26,7 +26,6 @@ services:
shm_size: "2gb"
environment:
PHOTOPRISM_SITE_URL: "http://localhost:2342/"
- PHOTOPRISM_SITE_TITLE: "PhotoPrism"
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: "Open-Source Photo Management"
PHOTOPRISM_SITE_AUTHOR: "@photoprism_app"
diff --git a/docker-compose.yml b/docker-compose.yml
index f02a521c2..d68032e82 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -36,7 +36,6 @@ services:
PHOTOPRISM_ADMIN_PASSWORD: "photoprism" # initial "admin" password (minimum 8 characters)
## External development server URL incl http:// or https:// and /path, :port is optional
PHOTOPRISM_SITE_URL: "https://app.localssl.dev/"
- PHOTOPRISM_SITE_TITLE: "PhotoPrism"
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: "Tags and finds pictures without getting in your way!"
PHOTOPRISM_SITE_AUTHOR: "@photoprism_app"
diff --git a/docker/examples/arm64/docker-compose.yml b/docker/examples/arm64/docker-compose.yml
index 869de7a49..13b242eb3 100644
--- a/docker/examples/arm64/docker-compose.yml
+++ b/docker/examples/arm64/docker-compose.yml
@@ -86,7 +86,6 @@ services:
PHOTOPRISM_DATABASE_NAME: "photoprism" # MariaDB or MySQL database schema name
PHOTOPRISM_DATABASE_USER: "photoprism" # MariaDB or MySQL database user name
PHOTOPRISM_DATABASE_PASSWORD: "insecure" # MariaDB or MySQL database user password
- PHOTOPRISM_SITE_TITLE: "PhotoPrism"
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: ""
PHOTOPRISM_SITE_AUTHOR: ""
diff --git a/docker/examples/armv7/docker-compose.yml b/docker/examples/armv7/docker-compose.yml
index c4ecf038e..7357dadb5 100644
--- a/docker/examples/armv7/docker-compose.yml
+++ b/docker/examples/armv7/docker-compose.yml
@@ -81,7 +81,6 @@ services:
PHOTOPRISM_DATABASE_NAME: "photoprism" # MariaDB or MySQL database schema name
PHOTOPRISM_DATABASE_USER: "photoprism" # MariaDB or MySQL database user name
PHOTOPRISM_DATABASE_PASSWORD: "insecure" # MariaDB or MySQL database user password
- PHOTOPRISM_SITE_TITLE: "PhotoPrism"
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: ""
PHOTOPRISM_SITE_AUTHOR: ""
diff --git a/docker/examples/cloud/docker-compose.yml b/docker/examples/cloud/docker-compose.yml
index 6893aefa8..a220eaeb5 100644
--- a/docker/examples/cloud/docker-compose.yml
+++ b/docker/examples/cloud/docker-compose.yml
@@ -129,7 +129,6 @@ services:
environment:
## !! CHANGE site url if your server has a public domain name e.g. "https://photos.yourdomain.com/" !!
PHOTOPRISM_SITE_URL: "https://_public_ip_/"
- PHOTOPRISM_SITE_TITLE: "PhotoPrism"
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: ""
PHOTOPRISM_SITE_AUTHOR: ""
diff --git a/docker/examples/docker-compose.yml b/docker/examples/docker-compose.yml
index 6d2dc2caf..155d6d0be 100644
--- a/docker/examples/docker-compose.yml
+++ b/docker/examples/docker-compose.yml
@@ -77,7 +77,6 @@ services:
PHOTOPRISM_DATABASE_NAME: "photoprism" # MariaDB or MySQL database schema name
PHOTOPRISM_DATABASE_USER: "photoprism" # MariaDB or MySQL database user name
PHOTOPRISM_DATABASE_PASSWORD: "insecure" # MariaDB or MySQL database user password
- PHOTOPRISM_SITE_TITLE: "PhotoPrism"
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: ""
PHOTOPRISM_SITE_AUTHOR: ""
diff --git a/docker/examples/macos/docker-compose.yml b/docker/examples/macos/docker-compose.yml
index a37ee4ecc..b51c72518 100644
--- a/docker/examples/macos/docker-compose.yml
+++ b/docker/examples/macos/docker-compose.yml
@@ -73,7 +73,6 @@ services:
PHOTOPRISM_DATABASE_NAME: "photoprism" # MariaDB or MySQL database schema name
PHOTOPRISM_DATABASE_USER: "photoprism" # MariaDB or MySQL database user name
PHOTOPRISM_DATABASE_PASSWORD: "insecure" # MariaDB or MySQL database user password
- PHOTOPRISM_SITE_TITLE: "PhotoPrism"
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: ""
PHOTOPRISM_SITE_AUTHOR: ""
diff --git a/docker/examples/scheduler/docker-compose.yml b/docker/examples/scheduler/docker-compose.yml
index ec0aef5df..f7901ade1 100644
--- a/docker/examples/scheduler/docker-compose.yml
+++ b/docker/examples/scheduler/docker-compose.yml
@@ -79,7 +79,6 @@ services:
PHOTOPRISM_DATABASE_NAME: "photoprism" # MariaDB or MySQL database schema name
PHOTOPRISM_DATABASE_USER: "photoprism" # MariaDB or MySQL database user name
PHOTOPRISM_DATABASE_PASSWORD: "insecure" # MariaDB or MySQL database user password
- PHOTOPRISM_SITE_TITLE: "PhotoPrism"
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: ""
PHOTOPRISM_SITE_AUTHOR: ""
diff --git a/docker/examples/sqlite/docker-compose.yml b/docker/examples/sqlite/docker-compose.yml
index 356fa68ae..b01960ee1 100644
--- a/docker/examples/sqlite/docker-compose.yml
+++ b/docker/examples/sqlite/docker-compose.yml
@@ -72,7 +72,6 @@ services:
PHOTOPRISM_DETECT_NSFW: "false" # flag photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "true" # allows uploads that MAY be offensive
PHOTOPRISM_DATABASE_DRIVER: "sqlite" # SQLite is an embedded database that doesn't require a server
- PHOTOPRISM_SITE_TITLE: "PhotoPrism"
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: ""
PHOTOPRISM_SITE_AUTHOR: ""
diff --git a/docker/examples/windows/docker-compose.yml b/docker/examples/windows/docker-compose.yml
index e6938f8e9..a3950d7fb 100644
--- a/docker/examples/windows/docker-compose.yml
+++ b/docker/examples/windows/docker-compose.yml
@@ -78,7 +78,6 @@ services:
PHOTOPRISM_DATABASE_NAME: "photoprism" # MariaDB or MySQL database schema name
PHOTOPRISM_DATABASE_USER: "photoprism" # MariaDB or MySQL database user name
PHOTOPRISM_DATABASE_PASSWORD: "insecure" # MariaDB or MySQL database user password
- PHOTOPRISM_SITE_TITLE: "PhotoPrism"
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: ""
PHOTOPRISM_SITE_AUTHOR: ""
diff --git a/docker/photoprism/armv7/Dockerfile b/docker/photoprism/armv7/Dockerfile
index fbc855c56..f01bf75c1 100644
--- a/docker/photoprism/armv7/Dockerfile
+++ b/docker/photoprism/armv7/Dockerfile
@@ -44,7 +44,6 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
PHOTOPRISM_DETECT_NSFW="false" \
PHOTOPRISM_EXPERIMENTAL="false" \
PHOTOPRISM_SITE_URL="http://localhost:2342/" \
- PHOTOPRISM_SITE_TITLE="PhotoPrism" \
PHOTOPRISM_SITE_CAPTION="AI-Powered Photos App" \
PHOTOPRISM_SITE_DESCRIPTION="" \
PHOTOPRISM_SITE_AUTHOR="" \
diff --git a/docker/photoprism/bookworm/Dockerfile b/docker/photoprism/bookworm/Dockerfile
index 5632058f3..b86619987 100644
--- a/docker/photoprism/bookworm/Dockerfile
+++ b/docker/photoprism/bookworm/Dockerfile
@@ -39,7 +39,6 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
PHOTOPRISM_DETECT_NSFW="false" \
PHOTOPRISM_EXPERIMENTAL="false" \
PHOTOPRISM_SITE_URL="http://localhost:2342/" \
- PHOTOPRISM_SITE_TITLE="PhotoPrism" \
PHOTOPRISM_SITE_CAPTION="AI-Powered Photos App" \
PHOTOPRISM_SITE_DESCRIPTION="" \
PHOTOPRISM_SITE_AUTHOR="" \
diff --git a/docker/photoprism/bullseye/Dockerfile b/docker/photoprism/bullseye/Dockerfile
index 70d835aa0..662709743 100644
--- a/docker/photoprism/bullseye/Dockerfile
+++ b/docker/photoprism/bullseye/Dockerfile
@@ -39,7 +39,6 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
PHOTOPRISM_DETECT_NSFW="false" \
PHOTOPRISM_EXPERIMENTAL="false" \
PHOTOPRISM_SITE_URL="http://localhost:2342/" \
- PHOTOPRISM_SITE_TITLE="PhotoPrism" \
PHOTOPRISM_SITE_CAPTION="AI-Powered Photos App" \
PHOTOPRISM_SITE_DESCRIPTION="" \
PHOTOPRISM_SITE_AUTHOR="" \
diff --git a/docker/photoprism/buster/Dockerfile b/docker/photoprism/buster/Dockerfile
index 49793c128..78ba4daf4 100644
--- a/docker/photoprism/buster/Dockerfile
+++ b/docker/photoprism/buster/Dockerfile
@@ -44,7 +44,6 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
PHOTOPRISM_DETECT_NSFW="false" \
PHOTOPRISM_EXPERIMENTAL="false" \
PHOTOPRISM_SITE_URL="http://localhost:2342/" \
- PHOTOPRISM_SITE_TITLE="PhotoPrism" \
PHOTOPRISM_SITE_CAPTION="AI-Powered Photos App" \
PHOTOPRISM_SITE_DESCRIPTION="" \
PHOTOPRISM_SITE_AUTHOR="" \
diff --git a/docker/photoprism/impish/Dockerfile b/docker/photoprism/impish/Dockerfile
index 87b6fdc72..eac96d24d 100644
--- a/docker/photoprism/impish/Dockerfile
+++ b/docker/photoprism/impish/Dockerfile
@@ -44,7 +44,6 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
PHOTOPRISM_DETECT_NSFW="false" \
PHOTOPRISM_EXPERIMENTAL="false" \
PHOTOPRISM_SITE_URL="http://localhost:2342/" \
- PHOTOPRISM_SITE_TITLE="PhotoPrism" \
PHOTOPRISM_SITE_CAPTION="AI-Powered Photos App" \
PHOTOPRISM_SITE_DESCRIPTION="" \
PHOTOPRISM_SITE_AUTHOR="" \
diff --git a/docker/photoprism/jammy/Dockerfile b/docker/photoprism/jammy/Dockerfile
index e7c781768..d9c3a39c2 100644
--- a/docker/photoprism/jammy/Dockerfile
+++ b/docker/photoprism/jammy/Dockerfile
@@ -44,7 +44,6 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
PHOTOPRISM_DETECT_NSFW="false" \
PHOTOPRISM_EXPERIMENTAL="false" \
PHOTOPRISM_SITE_URL="http://localhost:2342/" \
- PHOTOPRISM_SITE_TITLE="PhotoPrism" \
PHOTOPRISM_SITE_CAPTION="AI-Powered Photos App" \
PHOTOPRISM_SITE_DESCRIPTION="" \
PHOTOPRISM_SITE_AUTHOR="" \
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 691daab18..09ea7f75e 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -4402,9 +4402,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.4.117",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.117.tgz",
- "integrity": "sha512-ypZHxY+Sf/PXu7LVN+xoeanyisnJeSOy8Ki439L/oLueZb4c72FI45zXcK3gPpmTwyufh9m6NnbMLXnJh/0Fxg=="
+ "version": "1.4.118",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.118.tgz",
+ "integrity": "sha512-maZIKjnYDvF7Fs35nvVcyr44UcKNwybr93Oba2n3HkKDFAtk0svERkLN/HyczJDS3Fo4wU9th9fUQd09ZLtj1w=="
},
"node_modules/emoji-regex": {
"version": "8.0.0",
@@ -11753,9 +11753,9 @@
}
},
"node_modules/tslib": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
},
"node_modules/tsscmp": {
"version": "1.0.6",
@@ -16059,9 +16059,9 @@
}
},
"electron-to-chromium": {
- "version": "1.4.117",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.117.tgz",
- "integrity": "sha512-ypZHxY+Sf/PXu7LVN+xoeanyisnJeSOy8Ki439L/oLueZb4c72FI45zXcK3gPpmTwyufh9m6NnbMLXnJh/0Fxg=="
+ "version": "1.4.118",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.118.tgz",
+ "integrity": "sha512-maZIKjnYDvF7Fs35nvVcyr44UcKNwybr93Oba2n3HkKDFAtk0svERkLN/HyczJDS3Fo4wU9th9fUQd09ZLtj1w=="
},
"emoji-regex": {
"version": "8.0.0",
@@ -21324,9 +21324,9 @@
}
},
"tslib": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
},
"tsscmp": {
"version": "1.0.6",
diff --git a/frontend/src/app.js b/frontend/src/app.js
index 336431200..1787ca488 100644
--- a/frontend/src/app.js
+++ b/frontend/src/app.js
@@ -165,12 +165,22 @@ router.beforeEach((to, from, next) => {
});
router.afterEach((to) => {
- if (to.meta.title && config.values.siteTitle !== to.meta.title) {
- config.page.title = $gettext(to.meta.title);
- window.document.title = config.values.siteTitle + ": " + config.page.title;
+ const t = to.meta["title"] ? to.meta["title"] : "";
+
+ if (t !== "" && config.values.siteTitle !== t && config.values.name !== t) {
+ config.page.title = $gettext(t);
+ if (config.page.title === "") {
+ window.document.title = config.values.siteTitle;
+ } else {
+ window.document.title = config.page.title + " – " + config.values.siteTitle;
+ }
} else {
- config.page.title = config.values.siteTitle;
- window.document.title = config.values.siteTitle + ": " + config.values.siteCaption;
+ config.page.title = config.values.name;
+ if (config.values.siteCaption === "" || !config.values.sponsor) {
+ window.document.title = config.values.siteTitle;
+ } else {
+ window.document.title = config.values.siteCaption;
+ }
}
});
diff --git a/frontend/src/component/footer.vue b/frontend/src/component/footer.vue
index 9f49bd8c5..58c8397f4 100644
--- a/frontend/src/component/footer.vue
+++ b/frontend/src/component/footer.vue
@@ -2,16 +2,18 @@