diff --git a/web/package-lock.json b/web/package-lock.json
index cfa2ea14ce..77a875e517 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -10,58 +10,58 @@
       "license": "GNU Affero General Public License version 3",
       "dependencies": {
         "@immich/sdk": "file:../open-api/typescript-sdk",
-        "@mdi/js": "^7.3.67",
-        "@photo-sphere-viewer/core": "^5.7.0",
-        "@zoom-image/svelte": "^0.2.0",
+        "@mdi/js": "^7.4.47",
+        "@photo-sphere-viewer/core": "^5.7.1",
+        "@zoom-image/svelte": "^0.2.6",
         "axios": "^1.6.7",
         "buffer": "^6.0.3",
         "copy-image-clipboard": "^2.1.2",
         "dom-to-image": "^2.6.0",
-        "handlebars": "^4.7.7",
+        "handlebars": "^4.7.8",
         "justified-layout": "^4.1.0",
         "lodash-es": "^4.17.21",
-        "luxon": "^3.2.1",
-        "socket.io-client": "^4.6.1",
-        "svelte-local-storage-store": "^0.6.0",
-        "svelte-maplibre": "^0.8.0",
+        "luxon": "^3.4.4",
+        "socket.io-client": "^4.7.4",
+        "svelte-local-storage-store": "^0.6.4",
+        "svelte-maplibre": "^0.8.1",
         "thumbhash": "^0.1.1"
       },
       "devDependencies": {
-        "@faker-js/faker": "^8.0.0",
-        "@floating-ui/dom": "^1.5.1",
+        "@faker-js/faker": "^8.4.1",
+        "@floating-ui/dom": "^1.6.3",
         "@socket.io/component-emitter": "^3.1.0",
         "@sveltejs/adapter-static": "^3.0.1",
         "@sveltejs/enhanced-img": "^0.1.8",
         "@sveltejs/kit": "^2.5.2",
         "@sveltejs/vite-plugin-svelte": "^3.0.2",
-        "@testing-library/jest-dom": "^6.1.5",
-        "@testing-library/svelte": "^4.0.3",
-        "@types/dom-to-image": "^2.6.4",
-        "@types/justified-layout": "^4.1.0",
-        "@types/lodash-es": "^4.17.6",
-        "@types/luxon": "^3.2.0",
-        "@typescript-eslint/eslint-plugin": "^7.0.0",
-        "@typescript-eslint/parser": "^7.0.0",
-        "@vitest/coverage-v8": "^1.0.4",
-        "autoprefixer": "^10.4.13",
-        "eslint": "^8.34.0",
+        "@testing-library/jest-dom": "^6.4.2",
+        "@testing-library/svelte": "^4.1.0",
+        "@types/dom-to-image": "^2.6.7",
+        "@types/justified-layout": "^4.1.4",
+        "@types/lodash-es": "^4.17.12",
+        "@types/luxon": "^3.4.2",
+        "@typescript-eslint/eslint-plugin": "^7.1.0",
+        "@typescript-eslint/parser": "^7.1.0",
+        "@vitest/coverage-v8": "^1.3.1",
+        "autoprefixer": "^10.4.17",
+        "eslint": "^8.57.0",
         "eslint-config-prettier": "^9.1.0",
-        "eslint-plugin-svelte": "^2.30.0",
-        "eslint-plugin-unicorn": "^51.0.0",
-        "factory.ts": "^1.3.0",
+        "eslint-plugin-svelte": "^2.35.1",
+        "eslint-plugin-unicorn": "^51.0.1",
+        "factory.ts": "^1.4.1",
         "identity-obj-proxy": "^3.0.0",
-        "postcss": "^8.4.21",
-        "prettier": "^3.1.0",
+        "postcss": "^8.4.35",
+        "prettier": "^3.2.5",
         "prettier-plugin-organize-imports": "^3.2.4",
-        "prettier-plugin-svelte": "^3.1.2",
+        "prettier-plugin-svelte": "^3.2.1",
         "rollup-plugin-visualizer": "^5.12.0",
-        "svelte": "^4.2.11",
-        "svelte-check": "^3.6.4",
-        "tailwindcss": "^3.2.7",
-        "tslib": "^2.5.0",
+        "svelte": "^4.2.12",
+        "svelte-check": "^3.6.5",
+        "tailwindcss": "^3.4.1",
+        "tslib": "^2.6.2",
         "typescript": "^5.3.3",
-        "vite": "^5.1.1",
-        "vitest": "^1.0.4"
+        "vite": "^5.1.4",
+        "vitest": "^1.3.1"
       }
     },
     "../open-api/typescript-sdk": {
@@ -898,9 +898,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "8.56.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
-      "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+      "version": "8.57.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+      "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -948,13 +948,13 @@
       "dev": true
     },
     "node_modules/@humanwhocodes/config-array": {
-      "version": "0.11.13",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
-      "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
+      "version": "0.11.14",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+      "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
       "dev": true,
       "dependencies": {
-        "@humanwhocodes/object-schema": "^2.0.1",
-        "debug": "^4.1.1",
+        "@humanwhocodes/object-schema": "^2.0.2",
+        "debug": "^4.3.1",
         "minimatch": "^3.0.5"
       },
       "engines": {
@@ -975,9 +975,9 @@
       }
     },
     "node_modules/@humanwhocodes/object-schema": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
-      "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
+      "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
       "dev": true
     },
     "node_modules/@img/sharp-darwin-arm64": {
@@ -2298,16 +2298,16 @@
       }
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.2.tgz",
-      "integrity": "sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz",
+      "integrity": "sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==",
       "dev": true,
       "dependencies": {
         "@eslint-community/regexpp": "^4.5.1",
-        "@typescript-eslint/scope-manager": "7.0.2",
-        "@typescript-eslint/type-utils": "7.0.2",
-        "@typescript-eslint/utils": "7.0.2",
-        "@typescript-eslint/visitor-keys": "7.0.2",
+        "@typescript-eslint/scope-manager": "7.1.0",
+        "@typescript-eslint/type-utils": "7.1.0",
+        "@typescript-eslint/utils": "7.1.0",
+        "@typescript-eslint/visitor-keys": "7.1.0",
         "debug": "^4.3.4",
         "graphemer": "^1.4.0",
         "ignore": "^5.2.4",
@@ -2366,15 +2366,15 @@
       "dev": true
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.0.2.tgz",
-      "integrity": "sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.0.tgz",
+      "integrity": "sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "7.0.2",
-        "@typescript-eslint/types": "7.0.2",
-        "@typescript-eslint/typescript-estree": "7.0.2",
-        "@typescript-eslint/visitor-keys": "7.0.2",
+        "@typescript-eslint/scope-manager": "7.1.0",
+        "@typescript-eslint/types": "7.1.0",
+        "@typescript-eslint/typescript-estree": "7.1.0",
+        "@typescript-eslint/visitor-keys": "7.1.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -2394,13 +2394,13 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.0.2.tgz",
-      "integrity": "sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz",
+      "integrity": "sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "7.0.2",
-        "@typescript-eslint/visitor-keys": "7.0.2"
+        "@typescript-eslint/types": "7.1.0",
+        "@typescript-eslint/visitor-keys": "7.1.0"
       },
       "engines": {
         "node": "^16.0.0 || >=18.0.0"
@@ -2411,13 +2411,13 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.0.2.tgz",
-      "integrity": "sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz",
+      "integrity": "sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "7.0.2",
-        "@typescript-eslint/utils": "7.0.2",
+        "@typescript-eslint/typescript-estree": "7.1.0",
+        "@typescript-eslint/utils": "7.1.0",
         "debug": "^4.3.4",
         "ts-api-utils": "^1.0.1"
       },
@@ -2438,9 +2438,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.0.2.tgz",
-      "integrity": "sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.0.tgz",
+      "integrity": "sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==",
       "dev": true,
       "engines": {
         "node": "^16.0.0 || >=18.0.0"
@@ -2451,13 +2451,13 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.2.tgz",
-      "integrity": "sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz",
+      "integrity": "sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "7.0.2",
-        "@typescript-eslint/visitor-keys": "7.0.2",
+        "@typescript-eslint/types": "7.1.0",
+        "@typescript-eslint/visitor-keys": "7.1.0",
         "debug": "^4.3.4",
         "globby": "^11.1.0",
         "is-glob": "^4.0.3",
@@ -2536,17 +2536,17 @@
       "dev": true
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.0.2.tgz",
-      "integrity": "sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.0.tgz",
+      "integrity": "sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
         "@types/json-schema": "^7.0.12",
         "@types/semver": "^7.5.0",
-        "@typescript-eslint/scope-manager": "7.0.2",
-        "@typescript-eslint/types": "7.0.2",
-        "@typescript-eslint/typescript-estree": "7.0.2",
+        "@typescript-eslint/scope-manager": "7.1.0",
+        "@typescript-eslint/types": "7.1.0",
+        "@typescript-eslint/typescript-estree": "7.1.0",
         "semver": "^7.5.4"
       },
       "engines": {
@@ -2594,12 +2594,12 @@
       "dev": true
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.2.tgz",
-      "integrity": "sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz",
+      "integrity": "sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "7.0.2",
+        "@typescript-eslint/types": "7.1.0",
         "eslint-visitor-keys": "^3.4.1"
       },
       "engines": {
@@ -4054,16 +4054,16 @@
       }
     },
     "node_modules/eslint": {
-      "version": "8.56.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
-      "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+      "version": "8.57.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+      "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.6.1",
         "@eslint/eslintrc": "^2.1.4",
-        "@eslint/js": "8.56.0",
-        "@humanwhocodes/config-array": "^0.11.13",
+        "@eslint/js": "8.57.0",
+        "@humanwhocodes/config-array": "^0.11.14",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
         "@ungap/structured-clone": "^1.2.0",
@@ -8082,9 +8082,9 @@
       }
     },
     "node_modules/svelte": {
-      "version": "4.2.11",
-      "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.11.tgz",
-      "integrity": "sha512-YIQk3J4X89wOLhjsqIW8tqY3JHPuBdtdOIkASP2PZeAMcSW9RsIjQzMesCrxOF3gdWYC0mKknlKF7OqmLM+Zqg==",
+      "version": "4.2.12",
+      "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.12.tgz",
+      "integrity": "sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==",
       "dependencies": {
         "@ampproject/remapping": "^2.2.1",
         "@jridgewell/sourcemap-codec": "^1.4.15",
@@ -8106,9 +8106,9 @@
       }
     },
     "node_modules/svelte-check": {
-      "version": "3.6.4",
-      "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.4.tgz",
-      "integrity": "sha512-mY/dqucqm46p72M8yZmn81WPZx9mN6uuw8UVfR3ZKQeLxQg5HDGO3HHm5AZuWZPYNMLJ+TRMn+TeN53HfQ/vsw==",
+      "version": "3.6.5",
+      "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.5.tgz",
+      "integrity": "sha512-5aLgoQEdadvp8ypvKQ2avhnQ+V9YPQQaWrTFlXFw5g/v8xIQBvo+X/WqxTyD+V/ItDqXg3+abUA53rdDHgUjCA==",
       "dev": true,
       "dependencies": {
         "@jridgewell/trace-mapping": "^0.3.17",
diff --git a/web/package.json b/web/package.json
index e91f2c68d7..51f07dded0 100644
--- a/web/package.json
+++ b/web/package.json
@@ -22,59 +22,59 @@
     "prepare": "svelte-kit sync"
   },
   "devDependencies": {
-    "@faker-js/faker": "^8.0.0",
-    "@floating-ui/dom": "^1.5.1",
+    "@faker-js/faker": "^8.4.1",
+    "@floating-ui/dom": "^1.6.3",
     "@socket.io/component-emitter": "^3.1.0",
     "@sveltejs/adapter-static": "^3.0.1",
     "@sveltejs/enhanced-img": "^0.1.8",
     "@sveltejs/kit": "^2.5.2",
     "@sveltejs/vite-plugin-svelte": "^3.0.2",
-    "@testing-library/jest-dom": "^6.1.5",
-    "@testing-library/svelte": "^4.0.3",
-    "@types/dom-to-image": "^2.6.4",
-    "@types/justified-layout": "^4.1.0",
-    "@types/lodash-es": "^4.17.6",
-    "@types/luxon": "^3.2.0",
-    "@typescript-eslint/eslint-plugin": "^7.0.0",
-    "@typescript-eslint/parser": "^7.0.0",
-    "@vitest/coverage-v8": "^1.0.4",
-    "autoprefixer": "^10.4.13",
-    "eslint": "^8.34.0",
+    "@testing-library/jest-dom": "^6.4.2",
+    "@testing-library/svelte": "^4.1.0",
+    "@types/dom-to-image": "^2.6.7",
+    "@types/justified-layout": "^4.1.4",
+    "@types/lodash-es": "^4.17.12",
+    "@types/luxon": "^3.4.2",
+    "@typescript-eslint/eslint-plugin": "^7.1.0",
+    "@typescript-eslint/parser": "^7.1.0",
+    "@vitest/coverage-v8": "^1.3.1",
+    "autoprefixer": "^10.4.17",
+    "eslint": "^8.57.0",
     "eslint-config-prettier": "^9.1.0",
-    "eslint-plugin-svelte": "^2.30.0",
-    "eslint-plugin-unicorn": "^51.0.0",
-    "factory.ts": "^1.3.0",
+    "eslint-plugin-svelte": "^2.35.1",
+    "eslint-plugin-unicorn": "^51.0.1",
+    "factory.ts": "^1.4.1",
     "identity-obj-proxy": "^3.0.0",
-    "postcss": "^8.4.21",
-    "prettier": "^3.1.0",
+    "postcss": "^8.4.35",
+    "prettier": "^3.2.5",
     "prettier-plugin-organize-imports": "^3.2.4",
-    "prettier-plugin-svelte": "^3.1.2",
+    "prettier-plugin-svelte": "^3.2.1",
     "rollup-plugin-visualizer": "^5.12.0",
-    "svelte": "^4.2.11",
-    "svelte-check": "^3.6.4",
-    "tailwindcss": "^3.2.7",
-    "tslib": "^2.5.0",
+    "svelte": "^4.2.12",
+    "svelte-check": "^3.6.5",
+    "tailwindcss": "^3.4.1",
+    "tslib": "^2.6.2",
     "typescript": "^5.3.3",
-    "vite": "^5.1.1",
-    "vitest": "^1.0.4"
+    "vite": "^5.1.4",
+    "vitest": "^1.3.1"
   },
   "type": "module",
   "dependencies": {
     "@immich/sdk": "file:../open-api/typescript-sdk",
-    "@mdi/js": "^7.3.67",
-    "@photo-sphere-viewer/core": "^5.7.0",
-    "@zoom-image/svelte": "^0.2.0",
+    "@mdi/js": "^7.4.47",
+    "@photo-sphere-viewer/core": "^5.7.1",
+    "@zoom-image/svelte": "^0.2.6",
     "axios": "^1.6.7",
     "buffer": "^6.0.3",
     "copy-image-clipboard": "^2.1.2",
     "dom-to-image": "^2.6.0",
-    "handlebars": "^4.7.7",
+    "handlebars": "^4.7.8",
     "justified-layout": "^4.1.0",
     "lodash-es": "^4.17.21",
-    "luxon": "^3.2.1",
-    "socket.io-client": "^4.6.1",
-    "svelte-local-storage-store": "^0.6.0",
-    "svelte-maplibre": "^0.8.0",
+    "luxon": "^3.4.4",
+    "socket.io-client": "^4.7.4",
+    "svelte-local-storage-store": "^0.6.4",
+    "svelte-maplibre": "^0.8.1",
     "thumbhash": "^0.1.1"
   }
 }
diff --git a/web/src/lib/components/faces-page/person-side-panel.svelte b/web/src/lib/components/faces-page/person-side-panel.svelte
index 087301ea1e..4baa646bb4 100644
--- a/web/src/lib/components/faces-page/person-side-panel.svelte
+++ b/web/src/lib/components/faces-page/person-side-panel.svelte
@@ -46,8 +46,8 @@
   let allPeople: PersonResponseDto[] = [];
 
   // timers
-  let loaderLoadingDoneTimeout: NodeJS.Timeout;
-  let automaticRefreshTimeout: NodeJS.Timeout;
+  let loaderLoadingDoneTimeout: ReturnType<typeof setTimeout>;
+  let automaticRefreshTimeout: ReturnType<typeof setTimeout>;
 
   const dispatch = createEventDispatcher<{
     close: void;
diff --git a/web/src/lib/components/shared-components/notification/notification-card.svelte b/web/src/lib/components/shared-components/notification/notification-card.svelte
index a031b76810..ef855c90a2 100644
--- a/web/src/lib/components/shared-components/notification/notification-card.svelte
+++ b/web/src/lib/components/shared-components/notification/notification-card.svelte
@@ -59,7 +59,7 @@
     }
   };
 
-  let removeNotificationTimeout: NodeJS.Timeout | undefined;
+  let removeNotificationTimeout: ReturnType<typeof setTimeout> | undefined;
 
   onMount(() => {
     removeNotificationTimeout = setTimeout(discard, notificationInfo.timeout);