You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iggy.apache.org by pi...@apache.org on 2026/10/10 14:03:07 UTC

(iggy) branch master updated: chore(deps): Bump the web group across 1 directory with 8 updates (#4468)

This is an automated email from the ASF dual-hosted git repository.

spetz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iggy.git


The following commit(s) were added to refs/heads/master by this push:
     new b4e357cc9 chore(deps): Bump the web group across 1 directory with 8 updates (#4468)
b4e357cc9 is described below

commit b4e357cc93586836bd38e6971833e585c0096f18
Author: dependabot[bot] <49...@users.noreply.github.com>
AuthorDate: Sat Oct 10 16:03:02 2026 +0200

    chore(deps): Bump the web group across 1 directory with 8 updates (#4468)
---
 web/README.md                                      |    2 +-
 web/eslint.config.js                               |    4 +-
 web/package-lock.json                              | 1036 ++++----------------
 web/package.json                                   |   23 +-
 web/src/ambient.d.ts                               |    2 +-
 web/src/{hooks.client.ts => env.ts}                |    7 +-
 web/src/hooks.client.ts                            |    2 +-
 web/src/lib/api/ApiSchema.ts                       |    4 +-
 web/src/lib/api/clientApi.ts                       |   18 +-
 web/src/lib/api/fetchApi.ts                        |    8 +-
 web/src/lib/api/fetchRouteApi.ts                   |    6 +-
 web/src/lib/api/handleFetchErrors.ts               |   18 +-
 web/src/lib/auth/authStore.svelte.ts               |    8 +-
 web/src/lib/components/Breadcrumbs.svelte          |   12 +-
 web/src/lib/components/Button.svelte               |    2 +-
 web/src/lib/components/Combobox.svelte             |    2 +-
 .../components/DeleteButtonWithConfirmation.svelte |    2 +-
 .../components/DropdownMenu/DropdownMenu.svelte    |    2 +-
 web/src/lib/components/DurationInput.svelte        |    2 +-
 web/src/lib/components/Header.svelte               |    6 +-
 .../lib/components/Layouts/SettingsLayout.svelte   |   12 +-
 web/src/lib/components/LoadingIndicator.svelte     |    4 +-
 web/src/lib/components/Logo/Logo.svelte            |   10 +-
 .../MessageDecoder/MessageDecoder.svelte           |    2 +-
 .../decoders/BuiltInDecoders/jsonDecoder.ts        |    2 +-
 web/src/lib/components/ModalConfirmation.svelte    |    2 +-
 .../components/Modals/AddPartitionsModal.svelte    |    6 +-
 .../lib/components/Modals/AddStreamModal.svelte    |    4 +-
 web/src/lib/components/Modals/AddTopicModal.svelte |    8 +-
 web/src/lib/components/Modals/AddUserModal.svelte  |    6 +-
 web/src/lib/components/Modals/AppModals.svelte     |    4 +-
 .../components/Modals/DeletePartitionsModal.svelte |    8 +-
 .../lib/components/Modals/DeleteUserModal.svelte   |    2 +-
 web/src/lib/components/Modals/EditUserModal.svelte |    2 +-
 .../Modals/EditUserPermissionsModal.svelte         |    2 +-
 .../lib/components/Modals/InspectMessage.svelte    |    8 +-
 web/src/lib/components/Modals/ModalBase.svelte     |    2 +-
 .../components/Modals/StreamSettingsModal.svelte   |   14 +-
 .../components/Modals/TopicSettingsModal.svelte    |   12 +-
 web/src/lib/components/Navbar.svelte               |   23 +-
 web/src/lib/components/Paginator.svelte            |    4 +-
 web/src/lib/components/PasswordInput.svelte        |    2 +-
 web/src/lib/components/PeriodicInvalidator.svelte  |    6 +-
 web/src/lib/components/PermissionsManager.svelte   |   12 +-
 .../RouteComponents/Settings/UsersTab.svelte       |   16 +-
 .../Settings/UsersTabActions.svelte                |    4 +-
 web/src/lib/components/SlimSortableList.svelte     |    2 +-
 web/src/lib/components/SortableList.svelte         |    9 +-
 web/src/lib/components/StopPropagation.svelte      |    2 +-
 web/src/lib/components/ThemeController.svelte      |    4 +-
 web/src/lib/domain/Message.ts                      |    2 +-
 web/src/lib/domain/Partition.ts                    |    2 +-
 web/src/lib/domain/Stats.ts                        |    2 +-
 web/src/lib/domain/Topic.ts                        |    6 +-
 web/src/lib/domain/User.ts                         |    2 +-
 web/src/lib/hooks/useGoPrev.ts                     |   10 +-
 web/src/lib/types/appRoutes.ts                     |    4 +-
 web/{vite.config.ts => src/params.test.mjs}        |   31 +-
 web/src/{params/i32.ts => params.ts}               |    8 +-
 web/src/routes/+layout.svelte                      |    4 +-
 web/src/routes/+layout.ts                          |   27 +-
 web/src/routes/auth/+layout.svelte                 |    2 +-
 web/src/routes/auth/logout/+page.svelte            |    6 +-
 web/src/routes/auth/sign-in/+page.svelte           |   22 +-
 web/src/routes/auth/sign-in/+page.ts               |    8 +-
 web/src/routes/dashboard/+layout.svelte            |    8 +-
 web/src/routes/dashboard/+layout.ts                |   12 +-
 web/src/routes/dashboard/overview/+page.ts         |    4 +-
 .../routes/dashboard/settings/server/+page.svelte  |    8 +-
 web/src/routes/dashboard/settings/server/+page.ts  |    4 +-
 .../dashboard/settings/terminal/+page.svelte       |    2 +-
 .../routes/dashboard/settings/users/+page.svelte   |   18 +-
 web/src/routes/dashboard/settings/users/+page.ts   |    8 +-
 .../routes/dashboard/settings/webUI/+page.svelte   |   10 +-
 web/src/routes/dashboard/streams/+layout.svelte    |   17 +-
 web/src/routes/dashboard/streams/+layout.ts        |    4 +-
 .../dashboard/streams/[streamId=i32]/+page.svelte  |   14 +-
 .../dashboard/streams/[streamId=i32]/+page.ts      |    4 +-
 .../streams/[streamId=i32]/topics/+page.svelte     |    4 +-
 .../topics/[topicId=i32]/+page.svelte              |   18 +-
 .../[streamId=i32]/topics/[topicId=i32]/+page.ts   |    4 +-
 .../partitions/[partitionId=i32]/+page.svelte      |    4 +-
 .../[partitionId=i32]/messages/+page.svelte        |   25 +-
 .../partitions/[partitionId=i32]/messages/+page.ts |    6 +-
 web/svelte.config.js                               |   46 -
 web/tsconfig.json                                  |   15 +-
 web/vite.config.ts                                 |   31 +-
 87 files changed, 547 insertions(+), 1215 deletions(-)

diff --git a/web/README.md b/web/README.md
index ef213b7d7..c3751d0f2 100644
--- a/web/README.md
+++ b/web/README.md
@@ -12,7 +12,7 @@ The [docker image](https://hub.docker.com/r/apache/iggy-web-ui) is available, an
 
 ## Tooling
 
-- Node.js: use a version supported by the current frontend toolchain, `^20.19.0 || ^22.13.0 || >=24`.
+- Node.js: use a version supported by the current frontend toolchain, `^22.17.0 || >=24`.
 - Package manager: `npm`
 - `pnpm` and `yarn` are not part of the supported workflow for this package. CI, Docker builds, and the committed lockfile use `npm`.
 
diff --git a/web/eslint.config.js b/web/eslint.config.js
index d2fb13dc0..e430f8c1f 100644
--- a/web/eslint.config.js
+++ b/web/eslint.config.js
@@ -23,7 +23,9 @@ import svelte from 'eslint-plugin-svelte';
 import { defineConfig } from 'eslint/config';
 import globals from 'globals';
 import ts from 'typescript-eslint';
-import svelteConfig from './svelte.config.js';
+import { loadConfig } from '@sveltejs/load-config';
+
+const svelteConfig = (await loadConfig('./', { traverse: false }))?.config;
 
 const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url));
 
diff --git a/web/package-lock.json b/web/package-lock.json
index 9681e5c5d..ebcc489e8 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -23,32 +23,33 @@
       "devDependencies": {
         "@eslint/compat": "^2.1.1",
         "@eslint/js": "^10.0.1",
-        "@sveltejs/adapter-node": "^5.5.7",
-        "@sveltejs/adapter-static": "^3.0.10",
-        "@sveltejs/kit": "^2.70.3",
+        "@sveltejs/adapter-node": "^6.0.0",
+        "@sveltejs/adapter-static": "^4.0.0",
+        "@sveltejs/kit": "^3.0.0",
+        "@sveltejs/load-config": "^0.2.2",
         "@sveltejs/vite-plugin-svelte": "^7.3.1",
         "@types/d3-interpolate": "^3.0.4",
         "@types/json-bigint": "^1.0.4",
-        "@types/node": "^26.6.2",
+        "@types/node": "^26.6.3",
         "autoprefixer": "^10.6.1",
         "esbuild": "^0.28.2",
         "eslint": "^10.11.0",
         "eslint-config-prettier": "^10.1.8",
         "eslint-plugin-svelte": "^3.23.0",
-        "globals": "^17.12.0",
+        "globals": "^17.13.0",
         "jwt-decode": "^4.0.0",
         "postcss": "^8.5.28",
         "prettier": "^3.9.9",
         "prettier-plugin-svelte": "^4.1.1",
         "svelte": "^5.57.1",
         "svelte-check": "^4.7.6",
-        "sveltekit-superforms": "^2.30.2",
+        "sveltekit-superforms": "^3.0.0",
         "tailwindcss": "^4.2.4",
         "ts-toolbelt": "^9.6.0",
         "tslib": "^2.8.1",
         "typescript": "^6.0.3",
-        "typescript-eslint": "^8.70.1",
-        "vite": "^8.3.1",
+        "typescript-eslint": "^8.71.0",
+        "vite": "^8.3.2",
         "zod": "^4.6.5"
       }
     },
@@ -65,20 +66,20 @@
       }
     },
     "node_modules/@ark/schema": {
-      "version": "0.56.2",
-      "resolved": "https://registry.npmjs.org/@ark/schema/-/schema-0.56.2.tgz",
-      "integrity": "sha512-Qx4D2JFbBWpntiHZaTv7bGG4H/M2rigiknezKg/WVyDSaLdE4YCcWAOoFB7pjjDqHbbV2OqRfntm1nnXvwMexg==",
+      "version": "0.56.7",
+      "resolved": "https://registry.npmjs.org/@ark/schema/-/schema-0.56.7.tgz",
+      "integrity": "sha512-jmoOJlYIc4k1uv8oYBDNOFnAsKk2a2D9t/D6npF2JUfW4ecPB0v6ce6lruKg7lkBxIBA8Z7UtxfmvephYbhUGQ==",
       "dev": true,
       "license": "MIT",
       "optional": true,
       "dependencies": {
-        "@ark/util": "0.56.2"
+        "@ark/util": "0.56.7"
       }
     },
     "node_modules/@ark/util": {
-      "version": "0.56.2",
-      "resolved": "https://registry.npmjs.org/@ark/util/-/util-0.56.2.tgz",
-      "integrity": "sha512-9kU2sUE38FZEGG7l3hamYMBieLYEJh2L1mrYD2eXpT+78EnQSV1bhjxJhnxGBMSTbtwpBSDNSK+K60WvaI/DTQ==",
+      "version": "0.56.7",
+      "resolved": "https://registry.npmjs.org/@ark/util/-/util-0.56.7.tgz",
+      "integrity": "sha512-z8pVnrPk/x9GC18yOp5wCe8rR2+Z6us4CTSg7dvxdsDLuA2xXYq+QETD1fO6f3fMuXe+PCjpvtCnhTW9RHLgEw==",
       "dev": true,
       "license": "MIT",
       "optional": true
@@ -932,6 +933,14 @@
       "license": "MIT",
       "optional": true
     },
+    "node_modules/@poppinss/types": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@poppinss/types/-/types-1.2.1.tgz",
+      "integrity": "sha512-qUYnzl0m9HJTWsXtr8Xo7CwDx6wcjrvo14bOVbIMIlKJCzKrm3LX55dRTDr1/x4PpSvKVgmxvC6Ly2YiqXKOvQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true
+    },
     "node_modules/@rolldown/binding-android-arm-eabi": {
       "version": "1.2.11",
       "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.11.tgz",
@@ -1212,474 +1221,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/@rollup/plugin-commonjs": {
-      "version": "29.0.2",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-29.0.2.tgz",
-      "integrity": "sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@rollup/pluginutils": "^5.0.1",
-        "commondir": "^1.0.1",
-        "estree-walker": "^2.0.2",
-        "fdir": "^6.2.0",
-        "is-reference": "1.2.1",
-        "magic-string": "^0.30.3",
-        "picomatch": "^4.0.2"
-      },
-      "engines": {
-        "node": ">=16.0.0 || 14 >= 14.17"
-      },
-      "peerDependencies": {
-        "rollup": "^2.68.0||^3.0.0||^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/plugin-json": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz",
-      "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@rollup/pluginutils": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/plugin-node-resolve": {
-      "version": "16.0.3",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz",
-      "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@rollup/pluginutils": "^5.0.1",
-        "@types/resolve": "1.20.2",
-        "deepmerge": "^4.2.2",
-        "is-module": "^1.0.0",
-        "resolve": "^1.22.1"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^2.78.0||^3.0.0||^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/plugin-replace": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.3.tgz",
-      "integrity": "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@rollup/pluginutils": "^5.0.1",
-        "magic-string": "^0.30.3"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/pluginutils": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz",
-      "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/estree": "^1.0.0",
-        "estree-walker": "^2.0.2",
-        "picomatch": "^4.0.2"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.0.tgz",
-      "integrity": "sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ]
-    },
-    "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.0.tgz",
-      "integrity": "sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ]
-    },
-    "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.0.tgz",
-      "integrity": "sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.0.tgz",
-      "integrity": "sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.0.tgz",
-      "integrity": "sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ]
-    },
-    "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.0.tgz",
-      "integrity": "sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.0.tgz",
-      "integrity": "sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.0.tgz",
-      "integrity": "sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.0.tgz",
-      "integrity": "sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.0.tgz",
-      "integrity": "sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-loong64-gnu": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.0.tgz",
-      "integrity": "sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==",
-      "cpu": [
-        "loong64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-loong64-musl": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.0.tgz",
-      "integrity": "sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==",
-      "cpu": [
-        "loong64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-ppc64-gnu": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.0.tgz",
-      "integrity": "sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-ppc64-musl": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.0.tgz",
-      "integrity": "sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.0.tgz",
-      "integrity": "sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==",
-      "cpu": [
-        "riscv64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-riscv64-musl": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.0.tgz",
-      "integrity": "sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==",
-      "cpu": [
-        "riscv64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.0.tgz",
-      "integrity": "sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==",
-      "cpu": [
-        "s390x"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.0.tgz",
-      "integrity": "sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.0.tgz",
-      "integrity": "sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-openbsd-x64": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.0.tgz",
-      "integrity": "sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openbsd"
-      ]
-    },
-    "node_modules/@rollup/rollup-openharmony-arm64": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.0.tgz",
-      "integrity": "sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openharmony"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.0.tgz",
-      "integrity": "sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.0.tgz",
-      "integrity": "sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-x64-gnu": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.0.tgz",
-      "integrity": "sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.0.tgz",
-      "integrity": "sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
     "node_modules/@sideway/address": {
       "version": "4.1.5",
       "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
@@ -1724,64 +1265,53 @@
       }
     },
     "node_modules/@sveltejs/adapter-node": {
-      "version": "5.5.7",
-      "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-5.5.7.tgz",
-      "integrity": "sha512-uOfc9eVlI3A37RRSaKcgrheBYPrfJwC9VMqDp8x/O6tlKdcLLvHThSWD0KNIbjQ/d+7bwLGx3vx6aowAcRfd2g==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-6.0.0.tgz",
+      "integrity": "sha512-s7muM4JmJ75OZ8o0G4VRhrEKdi8twuEm3t2o/qQsdlm12hKaX7S/CuUBuw3n983wB/IFBSpzG2ugX0xdGzbKwg==",
       "dev": true,
       "license": "MIT",
-      "dependencies": {
-        "@rollup/plugin-commonjs": "^29.0.0",
-        "@rollup/plugin-json": "^6.1.0",
-        "@rollup/plugin-node-resolve": "^16.0.0",
-        "@rollup/plugin-replace": "^6.0.3",
-        "rollup": "^4.59.0"
-      },
       "peerDependencies": {
-        "@sveltejs/kit": "^2.4.0"
+        "@sveltejs/kit": "^3.0.0-next.0"
       }
     },
     "node_modules/@sveltejs/adapter-static": {
-      "version": "3.0.10",
-      "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz",
-      "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-4.0.0.tgz",
+      "integrity": "sha512-aF1J23R1ebKqUxQ4/qLr/Lxu63NFmLAtg8UZl3HFLxaoA1D/nhTVGcD9lTqx65iUbjNR2iOL0TgOxSX82x6Paw==",
       "dev": true,
       "license": "MIT",
       "peerDependencies": {
-        "@sveltejs/kit": "^2.0.0"
+        "@sveltejs/kit": "^3.0.0-next.0"
       }
     },
     "node_modules/@sveltejs/kit": {
-      "version": "2.70.3",
-      "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.70.3.tgz",
-      "integrity": "sha512-UDvEYuZqAMbfB/oXIoqKvbKcb7YczK5zYrzmsGV1zRJk03jntwp8dXiYoIJotxAndsKvcPFtx9H1GRSKFdSHgg==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-3.0.0.tgz",
+      "integrity": "sha512-dmP6gjz41DAT7erONGW8FdTWjmsmOJ/SaWVEsuEc1MXDcpH6YV+Pt98biZFPuinH4LldJPmScxDqiHwCDLRCrg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@standard-schema/spec": "^1.0.0",
-        "@sveltejs/acorn-typescript": "^1.0.9",
-        "@types/cookie": "^0.6.0",
-        "acorn": "^8.16.0",
-        "cookie": "^0.6.0",
-        "devalue": "^5.8.1",
+        "@rolldown/pluginutils": "^1.0.1",
+        "@standard-schema/spec": "^1.1.0",
+        "cookie": "^2.0.1",
+        "devalue": "^5.9.4",
         "esm-env": "^1.2.2",
-        "kleur": "^4.1.5",
-        "magic-string": "^0.30.5",
-        "mrmime": "^2.0.0",
-        "set-cookie-parser": "^3.0.0",
-        "sirv": "^3.0.0"
+        "magic-string": "^1.2.3",
+        "mrmime": "^2.0.1",
+        "sirv": "^3.0.2"
       },
       "bin": {
         "svelte-kit": "svelte-kit.js"
       },
       "engines": {
-        "node": ">=18.13"
+        "node": ">=22.17"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.0.0",
-        "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0",
-        "svelte": "^4.0.0 || ^5.0.0-next.0",
-        "typescript": "^5.3.3 || ^6.0.0",
-        "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0"
+        "@sveltejs/vite-plugin-svelte": "^7.0.0",
+        "svelte": "^5.57.1",
+        "typescript": "^6.0.0",
+        "vite": "^8.0.12"
       },
       "peerDependenciesMeta": {
         "@opentelemetry/api": {
@@ -1792,6 +1322,16 @@
         }
       }
     },
+    "node_modules/@sveltejs/kit/node_modules/magic-string": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.2.tgz",
+      "integrity": "sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.6.0"
+      }
+    },
     "node_modules/@sveltejs/load-config": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/@sveltejs/load-config/-/load-config-0.2.3.tgz",
@@ -2160,13 +1700,6 @@
         "tailwindcss": "4.3.3"
       }
     },
-    "node_modules/@types/cookie": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
-      "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/@types/d3-color": {
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
@@ -2213,22 +1746,15 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.2.tgz",
-      "integrity": "sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==",
+      "version": "26.6.3",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.3.tgz",
+      "integrity": "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "undici-types": "~8.9.0"
       }
     },
-    "node_modules/@types/resolve": {
-      "version": "1.20.2",
-      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
-      "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/@types/validator": {
       "version": "13.15.10",
       "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz",
@@ -2273,17 +1799,17 @@
       }
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.70.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.70.1.tgz",
-      "integrity": "sha512-nDNrUQ/4ruSNYbu749TRY7cfrzPtoLHEXSNBI8aaNY32LlZCajixqRf3FqcKC4p5Cam4VOHYx/t+i5+nKXvrqA==",
+      "version": "8.71.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.71.0.tgz",
+      "integrity": "sha512-pqcS9c1HxZTHt7End4nXqd0s5lJrrFzrgCkKFJrsbUnaL6M3+6oBFZaslg6Gjsl3argl2DDRFROnXARaZ2e4Nw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.12.2",
-        "@typescript-eslint/scope-manager": "8.70.1",
-        "@typescript-eslint/type-utils": "8.70.1",
-        "@typescript-eslint/utils": "8.70.1",
-        "@typescript-eslint/visitor-keys": "8.70.1",
+        "@typescript-eslint/scope-manager": "8.71.0",
+        "@typescript-eslint/type-utils": "8.71.0",
+        "@typescript-eslint/utils": "8.71.0",
+        "@typescript-eslint/visitor-keys": "8.71.0",
         "ignore": "^7.0.5",
         "natural-compare": "^1.4.0",
         "ts-api-utils": "^2.5.0"
@@ -2296,15 +1822,15 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "@typescript-eslint/parser": "^8.70.1",
+        "@typescript-eslint/parser": "^8.71.0",
         "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
         "typescript": ">=4.8.4 <6.1.0"
       }
     },
     "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
-      "version": "7.0.10",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.10.tgz",
-      "integrity": "sha512-HpbUakT7xp5miBUywCHf36ZEuAJNklBJDDsGpUIjMzOSmM8ELSfA9Sa/QDPeNeqeoN31u+UTCkL4klCOVvRm4Q==",
+      "version": "7.0.11",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.11.tgz",
+      "integrity": "sha512-YChdK5txDjwGUvgR7oCJcLGkwi3LDh8Zx8tS7ndYciLEg/oOCL26VUBSUEtgS7EjiybcBqFxh5j0rAdDX7/bbg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2312,16 +1838,16 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.70.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.70.1.tgz",
-      "integrity": "sha512-nO974WLllwhSFWQXnMLj6nDGa8f0khKEz1JzpPJ1u7Vm/4X1X6ZHajpoknU4bb41vJyMB0HHVyS2GqdhWfIXZw==",
+      "version": "8.71.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.71.0.tgz",
+      "integrity": "sha512-CG4nPk1f2zc8yw4pALqHsFYH2hdo+h1T9daSp21+Hnxi9LOE3GT9hAfTKJCBXVNM2GmYs1eMEP615wPoeOgk3A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.70.1",
-        "@typescript-eslint/types": "8.70.1",
-        "@typescript-eslint/typescript-estree": "8.70.1",
-        "@typescript-eslint/visitor-keys": "8.70.1",
+        "@typescript-eslint/scope-manager": "8.71.0",
+        "@typescript-eslint/types": "8.71.0",
+        "@typescript-eslint/typescript-estree": "8.71.0",
+        "@typescript-eslint/visitor-keys": "8.71.0",
         "debug": "^4.4.3"
       },
       "engines": {
@@ -2337,14 +1863,14 @@
       }
     },
     "node_modules/@typescript-eslint/project-service": {
-      "version": "8.70.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.70.1.tgz",
-      "integrity": "sha512-62xOgboPfwc3/IgPSX/W6oQR3ZbF04194FPGUGH8HL8iLFHbt/456/8Ph1wLNUgVF+s94FlHoipBsz+v7+LMnA==",
+      "version": "8.71.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.71.0.tgz",
+      "integrity": "sha512-aABjw5rjBacYONVPaPiWOCjJu0vEF4a25iQuodlmQYL1trtLZ0X/y+2Vzl3BKI1odM4LnwLE1oUDXYp1wzx1TQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/tsconfig-utils": "^8.70.1",
-        "@typescript-eslint/types": "^8.70.1",
+        "@typescript-eslint/tsconfig-utils": "^8.71.0",
+        "@typescript-eslint/types": "^8.71.0",
         "debug": "^4.4.3"
       },
       "engines": {
@@ -2359,14 +1885,14 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.70.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.70.1.tgz",
-      "integrity": "sha512-Pa0EeSeAusQc1WbjQMac+YfenewYTBu0KjgYvkUKwhXaHUKbFog23Dm/rp0DX/6tyYOQ3Xl1a+3EcFNZynGHCw==",
+      "version": "8.71.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.71.0.tgz",
+      "integrity": "sha512-gWF0BhUcnjZxSpLE8ngS/59n2SB0J3YqRxvX1+2aoRJk9hNtHSLOV+TcarFiOr5ipXm3yc1QrI4c9YZc8zyCxw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.70.1",
-        "@typescript-eslint/visitor-keys": "8.70.1"
+        "@typescript-eslint/types": "8.71.0",
+        "@typescript-eslint/visitor-keys": "8.71.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2377,9 +1903,9 @@
       }
     },
     "node_modules/@typescript-eslint/tsconfig-utils": {
-      "version": "8.70.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.70.1.tgz",
-      "integrity": "sha512-jumze1fPI+sDOaM2TWGQdn39PDxTr7TZGeuyLkAbNyx2vtMT3uRnVKChN0hfht5V2TugphJzF6bYXvBcE09qqg==",
+      "version": "8.71.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.71.0.tgz",
+      "integrity": "sha512-Z1UlWHADEK2Mlb9NpWfDeSjqoZ5EyrOv4R3eQpbkzqn/EwaIdOpXXupEA1+0ZIOSJSZZDBHG0BrQyN8zUG6Pwg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2394,15 +1920,15 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.70.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.70.1.tgz",
-      "integrity": "sha512-7zKTnyvaVWqzLZHPFQtX1hVHqgkMC+WebPWakNCSyrQVbIP1AM0L0TlBZtACldIRb6PptI8Odk+jyZ5kP3B1VA==",
+      "version": "8.71.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.71.0.tgz",
+      "integrity": "sha512-i8uO1qbdxeKgRnS5sCRt6On3/nfo2d2DwQe3Yvjx543zLy7r8ySqRuPPiIIXAhS03U0v5NfAFx+rUgxFzKKwNw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.70.1",
-        "@typescript-eslint/typescript-estree": "8.70.1",
-        "@typescript-eslint/utils": "8.70.1",
+        "@typescript-eslint/types": "8.71.0",
+        "@typescript-eslint/typescript-estree": "8.71.0",
+        "@typescript-eslint/utils": "8.71.0",
         "debug": "^4.4.3",
         "ts-api-utils": "^2.5.0"
       },
@@ -2419,9 +1945,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.70.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.70.1.tgz",
-      "integrity": "sha512-Dm1ypdhhrGCTyyehxElhgJ6kgk8MVCv5qXdoOVqPr1uqk42jX8KjrZqhROvdShczA8qrDoYiOWn1ykWlx2k81Q==",
+      "version": "8.71.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.71.0.tgz",
+      "integrity": "sha512-cJ4OoxPGWvFnBTnSZyaU+qJzGTqPTGJY+gDchj6cRyLRdmIdt4rcsE4twj+zPfrNiWuVi38wijHzShL++Z9atQ==",
       "devOptional": true,
       "license": "MIT",
       "engines": {
@@ -2433,16 +1959,16 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.70.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.70.1.tgz",
-      "integrity": "sha512-TU8PwyGN0PQJUcE96mw8eCQ44SmxGdQlJmlWakHaHQ15eIuuvye5yNtmh/i6oS88jzXVQB71xdNkbkB/fMwL0g==",
+      "version": "8.71.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.71.0.tgz",
+      "integrity": "sha512-PEEF4G5sLLWAS5BpPrUvms4ySZkiBQQZM4z+3ReI46axK5Vqr/vXBQatJQIZZOYdGyPUAKTtsrWzpqKuU+3DEw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/project-service": "8.70.1",
-        "@typescript-eslint/tsconfig-utils": "8.70.1",
-        "@typescript-eslint/types": "8.70.1",
-        "@typescript-eslint/visitor-keys": "8.70.1",
+        "@typescript-eslint/project-service": "8.71.0",
+        "@typescript-eslint/tsconfig-utils": "8.71.0",
+        "@typescript-eslint/types": "8.71.0",
+        "@typescript-eslint/visitor-keys": "8.71.0",
         "debug": "^4.4.3",
         "minimatch": "^10.2.2",
         "semver": "^7.7.3",
@@ -2461,16 +1987,16 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.70.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.70.1.tgz",
-      "integrity": "sha512-Esgul8MsnKnRLdYU2Eb2cRV9bS5HJYtKj1ByJnOzzG2M58DGdSUQ1jUuILxipqcpB2h9WLrbD5GijIWUjX/Tqw==",
+      "version": "8.71.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.71.0.tgz",
+      "integrity": "sha512-pKR/tEMVrXZG23UFKUn5BQf3zfmfk7KQceI2cGzywZ5nxM5Eu3hEJU1utjWzydtzBbcJAQhHN8iPCxobHpPcZQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.9.1",
-        "@typescript-eslint/scope-manager": "8.70.1",
-        "@typescript-eslint/types": "8.70.1",
-        "@typescript-eslint/typescript-estree": "8.70.1"
+        "@typescript-eslint/scope-manager": "8.71.0",
+        "@typescript-eslint/types": "8.71.0",
+        "@typescript-eslint/typescript-estree": "8.71.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2485,13 +2011,13 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.70.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.70.1.tgz",
-      "integrity": "sha512-Vwj9lUIW5Xq3wQ9w6gv3R86g1hMK8f2zNOdGTAgeXUMMXFK78G9ruCjjqutHMNJc0+CH7LYRnHeUB9IT8wFmcw==",
+      "version": "8.71.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.71.0.tgz",
+      "integrity": "sha512-8eQ9R218XORK+KLosnf4bu/QsUXvUyVwTbArg7/0NMB1Pu87OJKvj4nhFblkYE8gQV73mW1dx1ptlPCkwRGa7A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.70.1",
+        "@typescript-eslint/types": "8.71.0",
         "eslint-visitor-keys": "^5.0.0"
       },
       "engines": {
@@ -2503,20 +2029,20 @@
       }
     },
     "node_modules/@valibot/to-json-schema": {
-      "version": "1.7.1",
-      "resolved": "https://registry.npmjs.org/@valibot/to-json-schema/-/to-json-schema-1.7.1.tgz",
-      "integrity": "sha512-3qkmU6KXWh8GIThEAW3kuRHPQBMjWkKy+Ppz3WkUucx53DTpOa6siMn4xDGSOhlVyMrDaJTCTMLYPZVAIk1P0A==",
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/@valibot/to-json-schema/-/to-json-schema-1.8.0.tgz",
+      "integrity": "sha512-a0M+uwCuQZEPAo65NYkFSJ14O5c213KoSZmPdoCfuFvUhfULi4T2Z6Tpjv6lTVMW9RoLm74RpRAjNEa43KcN+g==",
       "dev": true,
       "license": "MIT",
       "optional": true,
       "peerDependencies": {
-        "valibot": "^1.4.0"
+        "valibot": "^1.5.0"
       }
     },
     "node_modules/@vinejs/compiler": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@vinejs/compiler/-/compiler-3.0.0.tgz",
-      "integrity": "sha512-v9Lsv59nR56+bmy2p0+czjZxsLHwaibJ+SV5iK9JJfehlJMa501jUJQqqz4X/OqKXrxtE3uTQmSqjUqzF3B2mw==",
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/@vinejs/compiler/-/compiler-4.1.3.tgz",
+      "integrity": "sha512-UyH7Zn8dkTMLeU+PF2WjCnWkFb2qYaOxAcvp/uXW0njtKNcJOnVJaPsnWYwqewkTcHN47yvOdzosj3kj3RAP5w==",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -2525,21 +2051,23 @@
       }
     },
     "node_modules/@vinejs/vine": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@vinejs/vine/-/vine-3.0.1.tgz",
-      "integrity": "sha512-ZtvYkYpZOYdvbws3uaOAvTFuvFXoQGAtmzeiXu+XSMGxi5GVsODpoI9Xu9TplEMuD/5fmAtBbKb9cQHkWkLXDQ==",
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/@vinejs/vine/-/vine-4.4.0.tgz",
+      "integrity": "sha512-cfnNXjs9+f+22d3Eb8koyg2qlCbaT394XBlL4AeEr1WM+NH1omFcXwe1zrkW4hHwPDSfUd4lFUdNO6E+YnTeWQ==",
       "dev": true,
       "license": "MIT",
       "optional": true,
       "dependencies": {
-        "@poppinss/macroable": "^1.0.4",
-        "@types/validator": "^13.12.2",
-        "@vinejs/compiler": "^3.0.0",
-        "camelcase": "^8.0.0",
-        "dayjs": "^1.11.13",
+        "@poppinss/macroable": "^1.1.0",
+        "@poppinss/types": "^1.2.1",
+        "@standard-schema/spec": "^1.1.0",
+        "@types/validator": "^13.15.10",
+        "@vinejs/compiler": "^4.1.3",
+        "camelcase": "^9.0.0",
+        "dayjs": "^1.11.19",
         "dlv": "^1.1.3",
-        "normalize-url": "^8.0.1",
-        "validator": "^13.12.0"
+        "normalize-url": "^8.1.1",
+        "validator": "^13.15.26"
       },
       "engines": {
         "node": ">=18.16.0"
@@ -2594,27 +2122,27 @@
       }
     },
     "node_modules/arkregex": {
-      "version": "0.0.8",
-      "resolved": "https://registry.npmjs.org/arkregex/-/arkregex-0.0.8.tgz",
-      "integrity": "sha512-PJcx6G1kQTgLKPUbeYlYecDRaKq15AMSGVajlKFYWlPeJRQL+j3dKE6tyMs40HZ99djS1l9Vhl3ezAHy9JBIqQ==",
+      "version": "0.0.13",
+      "resolved": "https://registry.npmjs.org/arkregex/-/arkregex-0.0.13.tgz",
+      "integrity": "sha512-c17sqCqiiZauxyoU1KZ2zbzCgeghGmc8dR2CrdQnlEtpq3bLhRLoLrxTL52M/8yQD8e/i1/IBRpRCNAuqJa7xQ==",
       "dev": true,
       "license": "MIT",
       "optional": true,
       "dependencies": {
-        "@ark/util": "0.56.2"
+        "@ark/util": "0.56.7"
       }
     },
     "node_modules/arktype": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/arktype/-/arktype-2.2.3.tgz",
-      "integrity": "sha512-7W+0RLTUNJiBFIIZXwOQxSR8Z273IAd6IvqBeG9+gHnQKFsIx2C0iOtGTmMrPnlX4qLXyc5+ll7A0BIj9WrbTg==",
+      "version": "2.2.8",
+      "resolved": "https://registry.npmjs.org/arktype/-/arktype-2.2.8.tgz",
+      "integrity": "sha512-tZyLza7kO2vN8BXBKcj4t43IVMe8/ZyqlITH0chZv7FfEw+edLovpY922tqcK4mCjTpf4oNo2xV6np7tquP1ww==",
       "dev": true,
       "license": "MIT",
       "optional": true,
       "dependencies": {
-        "@ark/schema": "0.56.2",
-        "@ark/util": "0.56.2",
-        "arkregex": "0.0.8"
+        "@ark/schema": "0.56.7",
+        "@ark/util": "0.56.7",
+        "arkregex": "0.0.13"
       }
     },
     "node_modules/autoprefixer": {
@@ -2757,14 +2285,14 @@
       }
     },
     "node_modules/camelcase": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz",
-      "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==",
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-9.0.0.tgz",
+      "integrity": "sha512-TO9xmyXTZ9HUHI8M1OnvExxYB0eYVS/1e5s7IDMTAoIcwUd+aNcFODs6Xk83mobk0velyHFQgA1yIrvYc6wclw==",
       "dev": true,
       "license": "MIT",
       "optional": true,
       "engines": {
-        "node": ">=16"
+        "node": ">=20"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -2829,21 +2357,18 @@
         "node": ">=6"
       }
     },
-    "node_modules/commondir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-      "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/cookie": {
-      "version": "0.7.2",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
-      "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz",
+      "integrity": "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==",
       "dev": true,
       "license": "MIT",
       "engines": {
-        "node": ">= 0.6"
+        "node": ">=22"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
       }
     },
     "node_modules/cross-spawn": {
@@ -2906,9 +2431,9 @@
       }
     },
     "node_modules/dayjs": {
-      "version": "1.11.20",
-      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz",
-      "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==",
+      "version": "1.11.23",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz",
+      "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==",
       "dev": true,
       "license": "MIT",
       "optional": true
@@ -3299,13 +2824,6 @@
         "node": ">=4.0"
       }
     },
-    "node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/esutils": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
@@ -3454,16 +2972,6 @@
         "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
       }
     },
-    "node_modules/function-bind": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
-      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
-      "dev": true,
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/glob-parent": {
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
@@ -3478,9 +2986,9 @@
       }
     },
     "node_modules/globals": {
-      "version": "17.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-17.12.0.tgz",
-      "integrity": "sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==",
+      "version": "17.13.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-17.13.0.tgz",
+      "integrity": "sha512-RwMTC61u7hrG3ZJMkZQOK4JLJrKS8QtoTii63EmWvFXHqycY9FObBJQCbsLxSO8kjKhWE5kV1GC+Vb1g3RI0Zg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3509,19 +3017,6 @@
         "node": ">=20"
       }
     },
-    "node_modules/hasown": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
-      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "function-bind": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
     "node_modules/hookified": {
       "version": "1.15.1",
       "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz",
@@ -3549,22 +3044,6 @@
         "node": ">=0.8.19"
       }
     },
-    "node_modules/is-core-module": {
-      "version": "2.16.1",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
-      "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "hasown": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/is-extglob": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -3588,23 +3067,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/is-module": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
-      "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/is-reference": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
-      "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/estree": "*"
-      }
-    },
     "node_modules/isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -3694,16 +3156,6 @@
         "@keyv/serialize": "^1.1.1"
       }
     },
-    "node_modules/kleur": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
-      "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/known-css-properties": {
       "version": "0.37.0",
       "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz",
@@ -4212,13 +3664,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/picocolors": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -4491,27 +3936,6 @@
         "url": "https://paulmillr.com/funding/"
       }
     },
-    "node_modules/resolve": {
-      "version": "1.22.11",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
-      "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-core-module": "^2.16.1",
-        "path-parse": "^1.0.7",
-        "supports-preserve-symlinks-flag": "^1.0.0"
-      },
-      "bin": {
-        "resolve": "bin/resolve"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/rolldown": {
       "version": "1.2.11",
       "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.11.tgz",
@@ -4546,51 +3970,6 @@
         "@rolldown/binding-win32-x64-msvc": "1.2.11"
       }
     },
-    "node_modules/rollup": {
-      "version": "4.60.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.0.tgz",
-      "integrity": "sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/estree": "1.0.8"
-      },
-      "bin": {
-        "rollup": "dist/bin/rollup"
-      },
-      "engines": {
-        "node": ">=18.0.0",
-        "npm": ">=8.0.0"
-      },
-      "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.60.0",
-        "@rollup/rollup-android-arm64": "4.60.0",
-        "@rollup/rollup-darwin-arm64": "4.60.0",
-        "@rollup/rollup-darwin-x64": "4.60.0",
-        "@rollup/rollup-freebsd-arm64": "4.60.0",
-        "@rollup/rollup-freebsd-x64": "4.60.0",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.60.0",
-        "@rollup/rollup-linux-arm-musleabihf": "4.60.0",
-        "@rollup/rollup-linux-arm64-gnu": "4.60.0",
-        "@rollup/rollup-linux-arm64-musl": "4.60.0",
-        "@rollup/rollup-linux-loong64-gnu": "4.60.0",
-        "@rollup/rollup-linux-loong64-musl": "4.60.0",
-        "@rollup/rollup-linux-ppc64-gnu": "4.60.0",
-        "@rollup/rollup-linux-ppc64-musl": "4.60.0",
-        "@rollup/rollup-linux-riscv64-gnu": "4.60.0",
-        "@rollup/rollup-linux-riscv64-musl": "4.60.0",
-        "@rollup/rollup-linux-s390x-gnu": "4.60.0",
-        "@rollup/rollup-linux-x64-gnu": "4.60.0",
-        "@rollup/rollup-linux-x64-musl": "4.60.0",
-        "@rollup/rollup-openbsd-x64": "4.60.0",
-        "@rollup/rollup-openharmony-arm64": "4.60.0",
-        "@rollup/rollup-win32-arm64-msvc": "4.60.0",
-        "@rollup/rollup-win32-ia32-msvc": "4.60.0",
-        "@rollup/rollup-win32-x64-gnu": "4.60.0",
-        "@rollup/rollup-win32-x64-msvc": "4.60.0",
-        "fsevents": "~2.3.2"
-      }
-    },
     "node_modules/sade": {
       "version": "1.8.1",
       "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
@@ -4617,13 +3996,6 @@
         "node": ">=10"
       }
     },
-    "node_modules/set-cookie-parser": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.0.tgz",
-      "integrity": "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -4682,19 +4054,6 @@
         "node": ">=14.0.0"
       }
     },
-    "node_modules/supports-preserve-symlinks-flag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
-      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/svelte": {
       "version": "5.57.1",
       "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.57.1.tgz",
@@ -4868,9 +4227,9 @@
       }
     },
     "node_modules/sveltekit-superforms": {
-      "version": "2.30.2",
-      "resolved": "https://registry.npmjs.org/sveltekit-superforms/-/sveltekit-superforms-2.30.2.tgz",
-      "integrity": "sha512-6sR70ZfjFMAfdNure/Bu26o1rY32+WGxebko1L8jUFS+qZw5fxIHBPkUaTpNBkOIlJZ/UJwoNCYCm5xK2Z7Kqw==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/sveltekit-superforms/-/sveltekit-superforms-3.0.0.tgz",
+      "integrity": "sha512-fnMV7pb96yYDD8jgoOZshob3c2jgcgtsNhYAYv9atBbkYQJRINOqptRGTK/iYdLaCnzvUqJDPSYHUVAtbmeXbA==",
       "dev": true,
       "funding": [
         {
@@ -4888,7 +4247,8 @@
       ],
       "license": "MIT",
       "dependencies": {
-        "devalue": "^5.8.1",
+        "devalue": "^5.9.4",
+        "esm-env": "^1.2.2",
         "memoize-weak": "^1.0.2",
         "ts-deepmerge": "^8.0.0"
       },
@@ -4896,31 +4256,31 @@
         "@exodus/schemasafe": "^1.3.0",
         "@standard-schema/spec": "^1.1.0",
         "@typeschema/class-validator": "^0.3.0",
-        "@valibot/to-json-schema": "^1.7.1",
-        "@vinejs/vine": "^3.0.1",
-        "arktype": "^2.2.2",
+        "@valibot/to-json-schema": "^1.8.0",
+        "@vinejs/vine": "^4.0.0",
+        "arktype": "^2.2.7",
         "class-validator": "^0.14.4",
-        "effect": "^3.21.4",
-        "joi": "^17.13.4",
+        "effect": "^3.22.2",
+        "joi": "^17.13.8",
         "json-schema-to-ts": "^3.1.1",
         "superstruct": "^2.0.2",
-        "typebox": "^1.3.3",
-        "valibot": "^1.4.2",
+        "typebox": "^1.3.34",
+        "valibot": "^1.5.0",
         "yup": "^1.7.1",
-        "zod": "^4.4.3",
+        "zod": "^4.6.5",
         "zod-v3-to-json-schema": "^4.0.0"
       },
       "peerDependencies": {
         "@exodus/schemasafe": "^1.3.0",
-        "@sveltejs/kit": "1.x || 2.x",
+        "@sveltejs/kit": "^2.12.0 || ^3.0.0",
         "@typeschema/class-validator": "^0.3.0",
-        "@vinejs/vine": "^1.8.0 || ^2.0.0 || ^3.0.0",
-        "arktype": ">=2.0.0-rc.23",
+        "@vinejs/vine": "^1.8.0 || ^2.0.0 || ^3.0.0 || ^4.0.0",
+        "arktype": "^2.0.0",
         "class-validator": "^0.14.1",
         "effect": "^3.21.0",
         "joi": "^17.13.1",
         "superstruct": "^2.0.2",
-        "svelte": "3.x || 4.x || >=5.0.0-next.51",
+        "svelte": "^5.56.4",
         "typebox": "^1.0.36",
         "valibot": "^1.2.0",
         "yup": "^1.4.0",
@@ -5110,9 +4470,9 @@
       }
     },
     "node_modules/typebox": {
-      "version": "1.3.6",
-      "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.3.6.tgz",
-      "integrity": "sha512-Sc8RA0NCMEFmApHNU9ZMzqcpQj46She44J8ffpLM/bdhLNUZKq7DJumcLcsFx1gRmDfQPgCgOmFFJ7rcnfWNyA==",
+      "version": "1.3.36",
+      "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.3.36.tgz",
+      "integrity": "sha512-bu2Ec2Ti9B4IFSFj1FcZbtLNB/W7igQwxocMGJLAG2NTv1nI+ImtIA34YgHW4CVyGVlJqNXR1GJyLmdWgV3DuA==",
       "dev": true,
       "license": "MIT",
       "optional": true
@@ -5132,16 +4492,16 @@
       }
     },
     "node_modules/typescript-eslint": {
-      "version": "8.70.1",
-      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.70.1.tgz",
-      "integrity": "sha512-AcWG7KDjZ2THNXsgwttMaGmzVi0VFRlFYfqFHYQRbDpF3owuYbuiL8c7UUrd2k8s3PoSfIQrWfrGXfcElrWLYA==",
+      "version": "8.71.0",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.71.0.tgz",
+      "integrity": "sha512-fBdHYiqQ14RW6mOMXD14Svn82ZsCYAoQSzGRzyEjR59S5A2Krh/l7fGTOQ7iCr8gGy/mHVXtEF7s5fgjEdV0Pw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/eslint-plugin": "8.70.1",
-        "@typescript-eslint/parser": "8.70.1",
-        "@typescript-eslint/typescript-estree": "8.70.1",
-        "@typescript-eslint/utils": "8.70.1"
+        "@typescript-eslint/eslint-plugin": "8.71.0",
+        "@typescript-eslint/parser": "8.71.0",
+        "@typescript-eslint/typescript-estree": "8.71.0",
+        "@typescript-eslint/utils": "8.71.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5224,9 +4584,9 @@
       }
     },
     "node_modules/valibot": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.4.2.tgz",
-      "integrity": "sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg==",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.5.0.tgz",
+      "integrity": "sha512-nil6AkP2TChWL43Z5uJ6GTxX01CUA+g8LWUM+N/rB9NBbkUMaUsi9PUNzlUPgoKASgmx9f7eGOYpJ04/fSa6FQ==",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -5251,16 +4611,16 @@
       }
     },
     "node_modules/vite": {
-      "version": "8.3.1",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.1.tgz",
-      "integrity": "sha512-/bvH9E9tmCXRGp2uXY3WbOldqpTwFkbha/8ANaEQ6VkxhH60KyqLwgZq6lG2y+4uT55x9+9eUHMpQ7uGnOCKjA==",
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.2.tgz",
+      "integrity": "sha512-SQr1x6W5vVSbROg7vsyXIaxK9b0G7zsT68acdWWRmnBUsgDieLCRG+Rep9WdZgcposvv/GSnr4GUUBqB3vXq6w==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "lightningcss": "^1.33.0",
         "picomatch": "^4.0.7",
         "postcss": "^8.5.28",
-        "rolldown": "~1.2.9",
+        "rolldown": "~1.2.11",
         "tinyglobby": "^0.2.17"
       },
       "bin": {
diff --git a/web/package.json b/web/package.json
index f0efb2de8..f4920f8b7 100644
--- a/web/package.json
+++ b/web/package.json
@@ -17,32 +17,33 @@
   "devDependencies": {
     "@eslint/compat": "^2.1.1",
     "@eslint/js": "^10.0.1",
-    "@sveltejs/adapter-node": "^5.5.7",
-    "@sveltejs/adapter-static": "^3.0.10",
-    "@sveltejs/kit": "^2.70.3",
+    "@sveltejs/adapter-node": "^6.0.0",
+    "@sveltejs/adapter-static": "^4.0.0",
+    "@sveltejs/kit": "^3.0.0",
+    "@sveltejs/load-config": "^0.2.2",
     "@sveltejs/vite-plugin-svelte": "^7.3.1",
     "@types/d3-interpolate": "^3.0.4",
     "@types/json-bigint": "^1.0.4",
-    "@types/node": "^26.6.2",
+    "@types/node": "^26.6.3",
     "autoprefixer": "^10.6.1",
     "esbuild": "^0.28.2",
     "eslint": "^10.11.0",
     "eslint-config-prettier": "^10.1.8",
     "eslint-plugin-svelte": "^3.23.0",
-    "globals": "^17.12.0",
+    "globals": "^17.13.0",
     "jwt-decode": "^4.0.0",
     "postcss": "^8.5.28",
     "prettier": "^3.9.9",
     "prettier-plugin-svelte": "^4.1.1",
     "svelte": "^5.57.1",
     "svelte-check": "^4.7.6",
-    "sveltekit-superforms": "^2.30.2",
+    "sveltekit-superforms": "^3.0.0",
     "tailwindcss": "^4.2.4",
     "ts-toolbelt": "^9.6.0",
     "tslib": "^2.8.1",
     "typescript": "^6.0.3",
-    "typescript-eslint": "^8.70.1",
-    "vite": "^8.3.1",
+    "typescript-eslint": "^8.71.0",
+    "vite": "^8.3.2",
     "zod": "^4.6.5"
   },
   "dependencies": {
@@ -59,12 +60,14 @@
     "uuid": "^14.0.2"
   },
   "overrides": {
-    "cookie": "^0.7.0",
     "valibot": "^1.2.0",
     "devalue": "^5.9.4",
     "flatted": "^3.4.2",
     "effect": "^3.20.0",
     "picomatch": "^4.0.4"
   },
-  "type": "module"
+  "type": "module",
+  "imports": {
+    "#lib/*": "./src/lib/*"
+  }
 }
diff --git a/web/src/ambient.d.ts b/web/src/ambient.d.ts
index a1766066b..5643179dd 100644
--- a/web/src/ambient.d.ts
+++ b/web/src/ambient.d.ts
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import type { Entries, ObjectKeys } from '$lib/types/utilTypes';
+import type { Entries, ObjectKeys } from '#lib/types/utilTypes.js';
 
 declare global {
   interface ObjectConstructor {
diff --git a/web/src/hooks.client.ts b/web/src/env.ts
similarity index 82%
copy from web/src/hooks.client.ts
copy to web/src/env.ts
index 319b5ef87..239864227 100644
--- a/web/src/hooks.client.ts
+++ b/web/src/env.ts
@@ -15,7 +15,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { authStore } from '$lib/auth/authStore.svelte';
+import { defineEnvVars } from '@sveltejs/kit/env';
 
-// Initialize auth store when the app loads
-authStore.initialize();
+export const variables = defineEnvVars({
+  PUBLIC_IGGY_API_URL: { public: true, schema: (input) => input ?? '' }
+});
diff --git a/web/src/hooks.client.ts b/web/src/hooks.client.ts
index 319b5ef87..1548ad5df 100644
--- a/web/src/hooks.client.ts
+++ b/web/src/hooks.client.ts
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { authStore } from '$lib/auth/authStore.svelte';
+import { authStore } from '#lib/auth/authStore.svelte.js';
 
 // Initialize auth store when the app loads
 authStore.initialize();
diff --git a/web/src/lib/api/ApiSchema.ts b/web/src/lib/api/ApiSchema.ts
index 8af315340..ac0b66d64 100644
--- a/web/src/lib/api/ApiSchema.ts
+++ b/web/src/lib/api/ApiSchema.ts
@@ -15,8 +15,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import type { GlobalPermissions, StreamPermissions } from '$lib/domain/Permissions';
-import type { KeysToSnakeCase } from '$lib/utils/utilTypes';
+import type { GlobalPermissions, StreamPermissions } from '#lib/domain/Permissions.js';
+import type { KeysToSnakeCase } from '#lib/utils/utilTypes.js';
 
 type Permissions = {
   global: KeysToSnakeCase<GlobalPermissions>;
diff --git a/web/src/lib/api/clientApi.ts b/web/src/lib/api/clientApi.ts
index 322890ebe..75e4bfa8a 100644
--- a/web/src/lib/api/clientApi.ts
+++ b/web/src/lib/api/clientApi.ts
@@ -15,12 +15,12 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { browser } from '$app/environment';
+import { browser } from '$app/env';
 import { goto } from '$app/navigation';
 import { resolve } from '$app/paths';
-import { env } from '$env/dynamic/public';
-import { authStore } from '$lib/auth/authStore.svelte';
-import { typedRoute } from '$lib/types/appRoutes';
+import { PUBLIC_IGGY_API_URL } from '$app/env/public';
+import { authStore } from '#lib/auth/authStore.svelte.js';
+import { typedRoute } from '#lib/types/appRoutes.js';
 import { error } from '@sveltejs/kit';
 import { getJson } from './getJson';
 
@@ -43,7 +43,7 @@ export async function clientApi<T = unknown>(args: ApiRequest): Promise<T> {
   }
 
   // Use PUBLIC_IGGY_API_URL if set, otherwise use relative path (for embedded mode)
-  const baseUrl = env.PUBLIC_IGGY_API_URL || '';
+  const baseUrl = PUBLIC_IGGY_API_URL || '';
   let fullUrl = `${baseUrl}${path}`;
 
   if (queryParams) {
@@ -68,11 +68,11 @@ export async function clientApi<T = unknown>(args: ApiRequest): Promise<T> {
     if (browser) {
       authStore.logout();
     }
-    error(401, { message: 'Unauthorized' });
+    error(401, 'Unauthorized');
   }
 
   if (response.status === 404) {
-    error(404, { message: 'Not Found' });
+    error(404, 'Not Found');
   }
 
   if (response.status === 400) {
@@ -80,7 +80,7 @@ export async function clientApi<T = unknown>(args: ApiRequest): Promise<T> {
     throw { status: 400, data };
   }
 
-  error(500, { message: 'Internal server error' });
+  error(500, 'Internal server error');
 }
 
 /**
@@ -95,7 +95,7 @@ export async function clientApiSafe<T = unknown>(
   } catch (e: any) {
     if (e?.status === 401 || e?.status === 403) {
       if (browser) {
-        goto(resolve(typedRoute('/auth/sign-in')));
+        goto(resolve(typedRoute('auth/sign-in')));
       }
       return { data: null, error: 'Unauthorized' };
     }
diff --git a/web/src/lib/api/fetchApi.ts b/web/src/lib/api/fetchApi.ts
index c9612d762..2b6d1de7c 100644
--- a/web/src/lib/api/fetchApi.ts
+++ b/web/src/lib/api/fetchApi.ts
@@ -15,9 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { env } from '$env/dynamic/public';
-import type { ApiSchema } from '$lib/api/ApiSchema';
-import { tokens } from '$lib/utils/constants/tokens';
+import { PUBLIC_IGGY_API_URL } from '$app/env/public';
+import type { ApiSchema } from '#lib/api/ApiSchema.js';
+import { tokens } from '#lib/utils/constants/tokens.js';
 import { type Cookies } from '@sveltejs/kit';
 
 export async function fetchIggyApi(
@@ -34,7 +34,7 @@ export async function fetchIggyApi(
       if (accessToken) headers.set('Authorization', `Bearer ${accessToken}`);
     }
 
-    let fullUrl = `${env.PUBLIC_IGGY_API_URL}${path}`;
+    let fullUrl = `${PUBLIC_IGGY_API_URL}${path}`;
 
     if (queryParams) {
       const query = new URLSearchParams(Object.entries(queryParams));
diff --git a/web/src/lib/api/fetchRouteApi.ts b/web/src/lib/api/fetchRouteApi.ts
index 4daef7463..b9cbfc66e 100644
--- a/web/src/lib/api/fetchRouteApi.ts
+++ b/web/src/lib/api/fetchRouteApi.ts
@@ -15,8 +15,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { env } from '$env/dynamic/public';
-import { authStore } from '$lib/auth/authStore.svelte';
+import { PUBLIC_IGGY_API_URL } from '$app/env/public';
+import { authStore } from '#lib/auth/authStore.svelte.js';
 import type { ApiSchema } from './ApiSchema';
 import { convertBigIntsToStrings } from './convertBigIntsToStrings';
 import { getJson } from './getJson';
@@ -36,7 +36,7 @@ export const fetchRouteApi = async (
     }
 
     // Use PUBLIC_IGGY_API_URL if set, otherwise use relative path (for embedded mode)
-    const baseUrl = env.PUBLIC_IGGY_API_URL || '';
+    const baseUrl = PUBLIC_IGGY_API_URL || '';
     let fullUrl = `${baseUrl}${path}`;
 
     if (queryParams) {
diff --git a/web/src/lib/api/handleFetchErrors.ts b/web/src/lib/api/handleFetchErrors.ts
index 2100c7669..e9c0131f5 100644
--- a/web/src/lib/api/handleFetchErrors.ts
+++ b/web/src/lib/api/handleFetchErrors.ts
@@ -16,10 +16,10 @@
 // under the License.
 
 import { error, type Cookies, redirect } from '@sveltejs/kit';
-import { base } from '$app/paths';
+import { resolve } from '$app/paths';
 import { getJson } from './getJson';
-import { tokens } from '$lib/utils/constants/tokens';
-import { typedRoute } from '$lib/types/appRoutes';
+import { tokens } from '#lib/utils/constants/tokens.js';
+import { typedRoute } from '#lib/types/appRoutes.js';
 
 export const handleFetchErrors = async (
   fetchResult: Response | unknown,
@@ -58,18 +58,16 @@ export const handleFetchErrors = async (
     401: () => {
       console.log(`handleErrorStatus: 401 ${response.url}`);
       removeCookies();
-      redirect(302, `${base}${typedRoute('/auth/sign-in')}`);
+      redirect(302, resolve(typedRoute('auth/sign-in')));
     },
     403: () => {
       console.log(`handleErrorStatus: 403 ${response.url}`);
       removeCookies();
-      redirect(302, `${base}${typedRoute('/auth/sign-in')}`);
+      redirect(302, resolve(typedRoute('auth/sign-in')));
     },
     404: () => {
       console.log(`handleErrorStatus: 404 ${response.url}`);
-      error(404, {
-        message: 'Not Found'
-      });
+      error(404, 'Not Found');
     }
   };
 
@@ -78,7 +76,5 @@ export const handleFetchErrors = async (
 
   console.log(`handleErrorStatus: 500 ${response.url}`);
 
-  error(500, {
-    message: 'handleErrorStatus: Internal server error'
-  });
+  error(500, 'handleErrorStatus: Internal server error');
 };
diff --git a/web/src/lib/auth/authStore.svelte.ts b/web/src/lib/auth/authStore.svelte.ts
index aa82987da..7ae795ca7 100644
--- a/web/src/lib/auth/authStore.svelte.ts
+++ b/web/src/lib/auth/authStore.svelte.ts
@@ -15,11 +15,11 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { browser } from '$app/environment';
+import { browser } from '$app/env';
 import { goto } from '$app/navigation';
 import { resolve } from '$app/paths';
-import { typedRoute } from '$lib/types/appRoutes';
-import { tokens } from '$lib/utils/constants/tokens';
+import { typedRoute } from '#lib/types/appRoutes.js';
+import { tokens } from '#lib/utils/constants/tokens.js';
 import { jwtDecode } from 'jwt-decode';
 
 export interface AuthState {
@@ -88,7 +88,7 @@ function createAuthStore() {
   function logout(): void {
     clearTokenCookie();
     state = { isAuthenticated: false, accessToken: null, userId: null };
-    goto(resolve(typedRoute('/auth/sign-in')));
+    goto(resolve(typedRoute('auth/sign-in')));
   }
 
   function getAccessToken(): string | null {
diff --git a/web/src/lib/components/Breadcrumbs.svelte b/web/src/lib/components/Breadcrumbs.svelte
index e69737618..216ad4d3e 100644
--- a/web/src/lib/components/Breadcrumbs.svelte
+++ b/web/src/lib/components/Breadcrumbs.svelte
@@ -19,15 +19,15 @@ under the License.
 
 <script lang="ts">
   import { page } from '$app/state';
-  import { typedRoute } from '$lib/types/appRoutes';
+  import { typedRoute } from '#lib/types/appRoutes.js';
   import Icon from './Icon.svelte';
-  import { isNumber } from '$lib/utils/parsers';
+  import { isNumber } from '#lib/utils/parsers.js';
   import { twMerge } from 'tailwind-merge';
   import { resolve } from '$app/paths';
-  import type { Pathname } from '$app/types';
+  import type { Path } from '$app/types';
 
   type Crumb = {
-    path: Pathname;
+    path: Path;
     label: string;
   };
 
@@ -51,7 +51,7 @@ under the License.
   }
 
   function formatPathSegment(segment: string, index: number, parts: string[]): Crumb {
-    const path = `/dashboard/${parts.slice(0, index + 1).join('/')}` as Pathname;
+    const path = `dashboard/${parts.slice(0, index + 1).join('/')}` as Path;
 
     if (isNumber(segment)) {
       const prevSegment = parts[index - 1];
@@ -72,7 +72,7 @@ under the License.
 </script>
 
 <div class="flex items-center">
-  <a href={resolve(typedRoute('/dashboard/overview'))}>
+  <a href={resolve(typedRoute('dashboard/overview'))}>
     <Icon name="home" class="dark:fill-shade-d900 dark:stroke-white mr-2" />
   </a>
 
diff --git a/web/src/lib/components/Button.svelte b/web/src/lib/components/Button.svelte
index d53c461e3..ed8b40735 100644
--- a/web/src/lib/components/Button.svelte
+++ b/web/src/lib/components/Button.svelte
@@ -18,7 +18,7 @@ under the License.
 -->
 
 <script lang="ts">
-  import { tooltip } from '$lib/actions/tooltip';
+  import { tooltip } from '#lib/actions/tooltip.js';
   import type { Placement } from '@floating-ui/dom';
   import type { HTMLButtonAttributes } from 'svelte/elements';
   import { twMerge } from 'tailwind-merge';
diff --git a/web/src/lib/components/Combobox.svelte b/web/src/lib/components/Combobox.svelte
index c261ac6c8..543409289 100644
--- a/web/src/lib/components/Combobox.svelte
+++ b/web/src/lib/components/Combobox.svelte
@@ -20,7 +20,7 @@ under the License.
 <script lang="ts">
   import { run } from 'svelte/legacy';
 
-  import { noTypeCheck } from '$lib/utils/noTypeCheck';
+  import { noTypeCheck } from '#lib/utils/noTypeCheck.js';
   import Icon from './Icon.svelte';
   import { createEventDispatcher, onMount, tick } from 'svelte';
   import { createCombobox } from 'svelte-headlessui';
diff --git a/web/src/lib/components/DeleteButtonWithConfirmation.svelte b/web/src/lib/components/DeleteButtonWithConfirmation.svelte
index 5eb2fc534..50e0c45d9 100644
--- a/web/src/lib/components/DeleteButtonWithConfirmation.svelte
+++ b/web/src/lib/components/DeleteButtonWithConfirmation.svelte
@@ -20,7 +20,7 @@ under the License.
 <script lang="ts">
   import { run } from 'svelte/legacy';
 
-  import { tooltip } from '$lib/actions/tooltip';
+  import { tooltip } from '#lib/actions/tooltip.js';
   import { fade } from 'svelte/transition';
   import Button from './Button.svelte';
 
diff --git a/web/src/lib/components/DropdownMenu/DropdownMenu.svelte b/web/src/lib/components/DropdownMenu/DropdownMenu.svelte
index 1c896b0d3..147152eec 100644
--- a/web/src/lib/components/DropdownMenu/DropdownMenu.svelte
+++ b/web/src/lib/components/DropdownMenu/DropdownMenu.svelte
@@ -18,7 +18,7 @@ under the License.
 -->
 
 <script lang="ts">
-  import { tooltip } from '$lib/actions/tooltip';
+  import { tooltip } from '#lib/actions/tooltip.js';
   import type { Placement } from '@floating-ui/dom';
 
   interface Props {
diff --git a/web/src/lib/components/DurationInput.svelte b/web/src/lib/components/DurationInput.svelte
index 1edda06bf..f9ca415b7 100644
--- a/web/src/lib/components/DurationInput.svelte
+++ b/web/src/lib/components/DurationInput.svelte
@@ -22,7 +22,7 @@ under the License.
   import Checkbox from './Checkbox.svelte';
   import Input from './Input.svelte';
   import SegmentedControl from './SegmentedControl.svelte';
-  import { durationFormatter } from '$lib/utils/formatters/durationFormatter';
+  import { durationFormatter } from '#lib/utils/formatters/durationFormatter.js';
 
   interface Props {
     label?: string;
diff --git a/web/src/lib/components/Header.svelte b/web/src/lib/components/Header.svelte
index c8d4809b0..856dff718 100644
--- a/web/src/lib/components/Header.svelte
+++ b/web/src/lib/components/Header.svelte
@@ -22,10 +22,10 @@ under the License.
   import Icon, { type iconType } from './Icon.svelte';
   import PeriodicInvalidator from './PeriodicInvalidator.svelte';
   import { type Theme } from './ThemeController.svelte';
-  import type { User } from '$lib/domain/User';
+  import type { User } from '#lib/domain/User.js';
   import DropdownMenu from './DropdownMenu/DropdownMenu.svelte';
   import { theme } from './ThemeController.svelte';
-  import { typedRoute } from '$lib/types/appRoutes';
+  import { typedRoute } from '#lib/types/appRoutes.js';
   import { resolve } from '$app/paths';
   import Button from './Button.svelte';
   import StopPropagation from './StopPropagation.svelte';
@@ -100,7 +100,7 @@ under the License.
             </label>
           </div>
           <a
-            href={resolve(typedRoute('/auth/logout'))}
+            href={resolve(typedRoute('auth/logout'))}
             class="flex w-full items-center justify-between gap-2 px-2 py-2 hover:bg-shade-l300 dark:hover:bg-shade-d1000 rounded-md my-1 dark:hover:text-white"
           >
             <span>Log Out</span>
diff --git a/web/src/lib/components/Layouts/SettingsLayout.svelte b/web/src/lib/components/Layouts/SettingsLayout.svelte
index 845eca081..bfe66d8ab 100644
--- a/web/src/lib/components/Layouts/SettingsLayout.svelte
+++ b/web/src/lib/components/Layouts/SettingsLayout.svelte
@@ -19,10 +19,10 @@ under the License.
 
 <script lang="ts">
   import { twMerge } from 'tailwind-merge';
-  import type { iconType } from '$lib/components/Icon.svelte';
-  import Icon from '$lib/components/Icon.svelte';
+  import type { iconType } from '#lib/components/Icon.svelte';
+  import Icon from '#lib/components/Icon.svelte';
 
-  import { typedRoute } from '$lib/types/appRoutes';
+  import { typedRoute } from '#lib/types/appRoutes.js';
   import { page } from '$app/state';
   import { resolve } from '$app/paths';
   interface Props {
@@ -41,19 +41,19 @@ under the License.
       tab: 'server',
       icon: 'adjustments',
       name: 'Server',
-      path: typedRoute('/dashboard/settings/server')
+      path: typedRoute('dashboard/settings/server')
     },
     {
       tab: 'webUI',
       icon: 'settings',
       name: 'Web UI',
-      path: typedRoute('/dashboard/settings/webUI')
+      path: typedRoute('dashboard/settings/webUI')
     },
     {
       tab: 'users',
       icon: 'usersGroup',
       name: 'Users',
-      path: typedRoute('/dashboard/settings/users')
+      path: typedRoute('dashboard/settings/users')
     }
   ] satisfies { tab: Tabs; name: string; icon: iconType; path: string }[];
 </script>
diff --git a/web/src/lib/components/LoadingIndicator.svelte b/web/src/lib/components/LoadingIndicator.svelte
index ffa821d54..30f421b86 100644
--- a/web/src/lib/components/LoadingIndicator.svelte
+++ b/web/src/lib/components/LoadingIndicator.svelte
@@ -52,7 +52,9 @@ under the License.
     await opacity.set(0, { duration: 200, delay: 300 });
   }
 
-  onNavigate(() => {
+  onNavigate(({ shallow, type }) => {
+    if (shallow && type === 'goto') return;
+
     start();
     return () => {
       stop();
diff --git a/web/src/lib/components/Logo/Logo.svelte b/web/src/lib/components/Logo/Logo.svelte
index 50fa5dcfa..0d8d13ac3 100644
--- a/web/src/lib/components/Logo/Logo.svelte
+++ b/web/src/lib/components/Logo/Logo.svelte
@@ -18,12 +18,16 @@ under the License.
 -->
 
 <script lang="ts">
-  import { base } from '$app/paths';
+  import { asset } from '$app/paths';
+
   let className = '';
+
   export { className as class };
-  const lightLogo = `${base}/iggy-apache-lightbg.svg`;
-  const darkLogo = `${base}/iggy-apache-darkbg.svg`;
+
+  const lightLogo = asset('iggy-apache-lightbg.svg');
+  const darkLogo = asset('iggy-apache-darkbg.svg');
 </script>
 
 <img src={lightLogo} class="{className} block dark:hidden" alt="Apache Iggy" />
+
 <img src={darkLogo} class="{className} hidden dark:block" alt="Apache Iggy" />
diff --git a/web/src/lib/components/MessageDecoder/MessageDecoder.svelte b/web/src/lib/components/MessageDecoder/MessageDecoder.svelte
index 9d5e86b5a..d71659530 100644
--- a/web/src/lib/components/MessageDecoder/MessageDecoder.svelte
+++ b/web/src/lib/components/MessageDecoder/MessageDecoder.svelte
@@ -21,7 +21,7 @@ under the License.
   import Button from '../Button.svelte';
   import Select from '../Select.svelte';
   import { decoderRegistry } from './decoders/utils/decoderRegistry';
-  import { decodeBase64 } from '$lib/utils/base64Utils';
+  import { decodeBase64 } from '#lib/utils/base64Utils.js';
 
   interface Props {
     payload?: string | undefined;
diff --git a/web/src/lib/components/MessageDecoder/decoders/BuiltInDecoders/jsonDecoder.ts b/web/src/lib/components/MessageDecoder/decoders/BuiltInDecoders/jsonDecoder.ts
index f126471ad..296feb0de 100644
--- a/web/src/lib/components/MessageDecoder/decoders/BuiltInDecoders/jsonDecoder.ts
+++ b/web/src/lib/components/MessageDecoder/decoders/BuiltInDecoders/jsonDecoder.ts
@@ -16,7 +16,7 @@
 // under the License.
 
 import type { Decoder } from '../types';
-import { parseNestedJson } from '$lib/utils/parsers';
+import { parseNestedJson } from '#lib/utils/parsers.js';
 
 export const jsonDecoder: Decoder = {
   name: 'json',
diff --git a/web/src/lib/components/ModalConfirmation.svelte b/web/src/lib/components/ModalConfirmation.svelte
index 59e9f8294..84139452f 100644
--- a/web/src/lib/components/ModalConfirmation.svelte
+++ b/web/src/lib/components/ModalConfirmation.svelte
@@ -23,7 +23,7 @@ under the License.
   import { createEventDispatcher } from 'svelte';
   import Input from './Input.svelte';
   import Icon from './Icon.svelte';
-  import { Keys } from '$lib/utils/constants/keys';
+  import { Keys } from '#lib/utils/constants/keys.js';
 
   interface Props {
     open: boolean;
diff --git a/web/src/lib/components/Modals/AddPartitionsModal.svelte b/web/src/lib/components/Modals/AddPartitionsModal.svelte
index c93a26454..8e1b331cb 100644
--- a/web/src/lib/components/Modals/AddPartitionsModal.svelte
+++ b/web/src/lib/components/Modals/AddPartitionsModal.svelte
@@ -18,14 +18,14 @@ under the License.
 -->
 
 <script lang="ts">
-  import type { CloseModalFn } from '$lib/types/utilTypes';
+  import type { CloseModalFn } from '#lib/types/utilTypes.js';
   import { z } from 'zod';
   import Input from '../Input.svelte';
   import ModalBase from './ModalBase.svelte';
-  import { numberSizes } from '$lib/utils/constants/numberSizes';
+  import { numberSizes } from '#lib/utils/constants/numberSizes.js';
   import { setError, superForm, defaults } from 'sveltekit-superforms/client';
   import { zod4 } from 'sveltekit-superforms/adapters';
-  import { fetchRouteApi } from '$lib/api/fetchRouteApi';
+  import { fetchRouteApi } from '#lib/api/fetchRouteApi.js';
   import { page } from '$app/state';
   import { showToast } from '../AppToasts.svelte';
   import Button from '../Button.svelte';
diff --git a/web/src/lib/components/Modals/AddStreamModal.svelte b/web/src/lib/components/Modals/AddStreamModal.svelte
index 8269631f9..7c8265e98 100644
--- a/web/src/lib/components/Modals/AddStreamModal.svelte
+++ b/web/src/lib/components/Modals/AddStreamModal.svelte
@@ -18,7 +18,7 @@ under the License.
 -->
 
 <script lang="ts">
-  import type { CloseModalFn } from '$lib/types/utilTypes';
+  import type { CloseModalFn } from '#lib/types/utilTypes.js';
   import { setError, superForm, defaults } from 'sveltekit-superforms/client';
   import { zod4 } from 'sveltekit-superforms/adapters';
   import { z } from 'zod';
@@ -26,7 +26,7 @@ under the License.
   import Input from '../Input.svelte';
   import ModalBase from './ModalBase.svelte';
   import { showToast } from '../AppToasts.svelte';
-  import { fetchRouteApi } from '$lib/api/fetchRouteApi';
+  import { fetchRouteApi } from '#lib/api/fetchRouteApi.js';
   import { customInvalidateAll } from '../PeriodicInvalidator.svelte';
 
   interface Props {
diff --git a/web/src/lib/components/Modals/AddTopicModal.svelte b/web/src/lib/components/Modals/AddTopicModal.svelte
index d3f0fa269..fe4bfd538 100644
--- a/web/src/lib/components/Modals/AddTopicModal.svelte
+++ b/web/src/lib/components/Modals/AddTopicModal.svelte
@@ -25,11 +25,11 @@ under the License.
   import Select from '../Select.svelte';
   import Button from '../Button.svelte';
   import ModalBase from './ModalBase.svelte';
-  import type { CloseModalFn } from '$lib/types/utilTypes';
-  import type { StreamDetails } from '$lib/domain/StreamDetails';
-  import { fetchRouteApi } from '$lib/api/fetchRouteApi';
+  import type { CloseModalFn } from '#lib/types/utilTypes.js';
+  import type { StreamDetails } from '#lib/domain/StreamDetails.js';
+  import { fetchRouteApi } from '#lib/api/fetchRouteApi.js';
   import DurationInput from '../DurationInput.svelte';
-  import { numberSizes } from '$lib/utils/constants/numberSizes';
+  import { numberSizes } from '#lib/utils/constants/numberSizes.js';
   import { showToast } from '../AppToasts.svelte';
   import { customInvalidateAll } from '../PeriodicInvalidator.svelte';
 
diff --git a/web/src/lib/components/Modals/AddUserModal.svelte b/web/src/lib/components/Modals/AddUserModal.svelte
index 421453684..3f21e54cc 100644
--- a/web/src/lib/components/Modals/AddUserModal.svelte
+++ b/web/src/lib/components/Modals/AddUserModal.svelte
@@ -18,7 +18,7 @@ under the License.
 -->
 
 <script lang="ts">
-  import type { CloseModalFn } from '$lib/types/utilTypes';
+  import type { CloseModalFn } from '#lib/types/utilTypes.js';
   import Listbox from '../Listbox.svelte';
   import Input from '../Input.svelte';
   import { z } from 'zod';
@@ -28,8 +28,8 @@ under the License.
   import PasswordInput from '../PasswordInput.svelte';
   import Button from '../Button.svelte';
   import PermissionsManager from '../PermissionsManager.svelte';
-  import type { Stream } from '$lib/domain/Stream';
-  import { fetchRouteApi } from '$lib/api/fetchRouteApi';
+  import type { Stream } from '#lib/domain/Stream.js';
+  import { fetchRouteApi } from '#lib/api/fetchRouteApi.js';
   import { showToast } from '../AppToasts.svelte';
   import { customInvalidateAll } from '../PeriodicInvalidator.svelte';
 
diff --git a/web/src/lib/components/Modals/AppModals.svelte b/web/src/lib/components/Modals/AppModals.svelte
index 0e16ed41d..7e1638eb3 100644
--- a/web/src/lib/components/Modals/AppModals.svelte
+++ b/web/src/lib/components/Modals/AppModals.svelte
@@ -31,9 +31,9 @@ under the License.
   import StreamSettingsModal from './StreamSettingsModal.svelte';
   import TopicSettingsModal from './TopicSettingsModal.svelte';
   import { fade } from 'svelte/transition';
-  import { noTypeCheck } from '$lib/utils/noTypeCheck';
+  import { noTypeCheck } from '#lib/utils/noTypeCheck.js';
   import { writable } from 'svelte/store';
-  import { Keys } from '$lib/utils/constants/keys';
+  import { Keys } from '#lib/utils/constants/keys.js';
 
   const modals = {
     AddPartitionsModal,
diff --git a/web/src/lib/components/Modals/DeletePartitionsModal.svelte b/web/src/lib/components/Modals/DeletePartitionsModal.svelte
index 53b0f65f0..2bd21a78b 100644
--- a/web/src/lib/components/Modals/DeletePartitionsModal.svelte
+++ b/web/src/lib/components/Modals/DeletePartitionsModal.svelte
@@ -18,7 +18,7 @@ under the License.
 -->
 
 <script lang="ts">
-  import type { CloseModalFn } from '$lib/types/utilTypes';
+  import type { CloseModalFn } from '#lib/types/utilTypes.js';
 
   import Input from '../Input.svelte';
   import { z } from 'zod';
@@ -28,12 +28,12 @@ under the License.
   import Button from '../Button.svelte';
 
   import ModalConfirmation from '../ModalConfirmation.svelte';
-  import { fetchRouteApi } from '$lib/api/fetchRouteApi';
+  import { fetchRouteApi } from '#lib/api/fetchRouteApi.js';
   import { page } from '$app/state';
   import { showToast } from '../AppToasts.svelte';
   import { customInvalidateAll } from '../PeriodicInvalidator.svelte';
-  import type { TopicDetails } from '$lib/domain/TopicDetails';
-  import { arraySum } from '$lib/utils/arraySum';
+  import type { TopicDetails } from '#lib/domain/TopicDetails.js';
+  import { arraySum } from '#lib/utils/arraySum.js';
 
   interface Props {
     closeModal: CloseModalFn;
diff --git a/web/src/lib/components/Modals/DeleteUserModal.svelte b/web/src/lib/components/Modals/DeleteUserModal.svelte
index 04bc71a06..0d6b2cc74 100644
--- a/web/src/lib/components/Modals/DeleteUserModal.svelte
+++ b/web/src/lib/components/Modals/DeleteUserModal.svelte
@@ -18,7 +18,7 @@ under the License.
 -->
 
 <script lang="ts">
-  import type { CloseModalFn } from '$lib/types/utilTypes';
+  import type { CloseModalFn } from '#lib/types/utilTypes.js';
 
   import ModalBase from './ModalBase.svelte';
 
diff --git a/web/src/lib/components/Modals/EditUserModal.svelte b/web/src/lib/components/Modals/EditUserModal.svelte
index b3a574ce9..ba77a968b 100644
--- a/web/src/lib/components/Modals/EditUserModal.svelte
+++ b/web/src/lib/components/Modals/EditUserModal.svelte
@@ -18,7 +18,7 @@ under the License.
 -->
 
 <script lang="ts">
-  import type { CloseModalFn } from '$lib/types/utilTypes';
+  import type { CloseModalFn } from '#lib/types/utilTypes.js';
 
   import ModalBase from './ModalBase.svelte';
 
diff --git a/web/src/lib/components/Modals/EditUserPermissionsModal.svelte b/web/src/lib/components/Modals/EditUserPermissionsModal.svelte
index 9b95d1b76..0ed9f46be 100644
--- a/web/src/lib/components/Modals/EditUserPermissionsModal.svelte
+++ b/web/src/lib/components/Modals/EditUserPermissionsModal.svelte
@@ -18,7 +18,7 @@ under the License.
 -->
 
 <script lang="ts">
-  import type { CloseModalFn } from '$lib/types/utilTypes';
+  import type { CloseModalFn } from '#lib/types/utilTypes.js';
 
   import ModalBase from './ModalBase.svelte';
 
diff --git a/web/src/lib/components/Modals/InspectMessage.svelte b/web/src/lib/components/Modals/InspectMessage.svelte
index 3d0dae307..11c2ebf47 100644
--- a/web/src/lib/components/Modals/InspectMessage.svelte
+++ b/web/src/lib/components/Modals/InspectMessage.svelte
@@ -20,11 +20,11 @@ under the License.
 <script lang="ts">
   import { SvelteSet } from 'svelte/reactivity';
   import ModalBase from './ModalBase.svelte';
-  import type { CloseModalFn } from '$lib/types/utilTypes';
-  import { type Message, type HeaderEntry, type HeaderField } from '$lib/domain/Message';
-  import MessageDecoder from '$lib/components/MessageDecoder/MessageDecoder.svelte';
+  import type { CloseModalFn } from '#lib/types/utilTypes.js';
+  import { type Message, type HeaderEntry, type HeaderField } from '#lib/domain/Message.js';
+  import MessageDecoder from '#lib/components/MessageDecoder/MessageDecoder.svelte';
 
-  import { formatMessageId } from '$lib/utils/formatters/uuidFormatter';
+  import { formatMessageId } from '#lib/utils/formatters/uuidFormatter.js';
 
   interface Props {
     closeModal: CloseModalFn;
diff --git a/web/src/lib/components/Modals/ModalBase.svelte b/web/src/lib/components/Modals/ModalBase.svelte
index b6968e62e..bdcce5057 100644
--- a/web/src/lib/components/Modals/ModalBase.svelte
+++ b/web/src/lib/components/Modals/ModalBase.svelte
@@ -23,7 +23,7 @@ under the License.
   import type { TransitionConfig } from 'svelte/transition';
   import { quintOut } from 'svelte/easing';
   import Button from '../Button.svelte';
-  import type { CloseModalFn } from '$lib/types/utilTypes';
+  import type { CloseModalFn } from '#lib/types/utilTypes.js';
 
   interface Props {
     closeModal: CloseModalFn;
diff --git a/web/src/lib/components/Modals/StreamSettingsModal.svelte b/web/src/lib/components/Modals/StreamSettingsModal.svelte
index 8d8c6fcc6..83f1dc4ea 100644
--- a/web/src/lib/components/Modals/StreamSettingsModal.svelte
+++ b/web/src/lib/components/Modals/StreamSettingsModal.svelte
@@ -18,8 +18,8 @@ under the License.
 -->
 
 <script lang="ts">
-  import type { StreamDetails } from '$lib/domain/StreamDetails';
-  import type { CloseModalFn } from '$lib/types/utilTypes';
+  import type { StreamDetails } from '#lib/domain/StreamDetails.js';
+  import type { CloseModalFn } from '#lib/types/utilTypes.js';
   import { z } from 'zod';
   import Button from '../Button.svelte';
   import Icon from '../Icon.svelte';
@@ -27,14 +27,14 @@ under the License.
   import ModalBase from './ModalBase.svelte';
   import { setError, superForm, defaults } from 'sveltekit-superforms/client';
   import { zod4 } from 'sveltekit-superforms/adapters';
-  import { fetchRouteApi } from '$lib/api/fetchRouteApi';
+  import { fetchRouteApi } from '#lib/api/fetchRouteApi.js';
   import { goto } from '$app/navigation';
   import { showToast } from '../AppToasts.svelte';
   import ModalConfirmation from '../ModalConfirmation.svelte';
-  import { typedRoute } from '$lib/types/appRoutes';
-  import { browser } from '$app/environment';
+  import { typedRoute } from '#lib/types/appRoutes.js';
+  import { browser } from '$app/env';
   import { customInvalidateAll } from '../PeriodicInvalidator.svelte';
-  import { arraySum } from '$lib/utils/arraySum';
+  import { arraySum } from '#lib/utils/arraySum.js';
   import { resolve } from '$app/paths';
 
   interface Props {
@@ -135,7 +135,7 @@ under the License.
       if (ok) {
         closeModal(async () => {
           if (!browser) return;
-          await goto(resolve(typedRoute('/dashboard/streams')));
+          await goto(resolve(typedRoute('dashboard/streams')));
           await customInvalidateAll();
           showToast({
             type: 'success',
diff --git a/web/src/lib/components/Modals/TopicSettingsModal.svelte b/web/src/lib/components/Modals/TopicSettingsModal.svelte
index fc962d265..1e198d093 100644
--- a/web/src/lib/components/Modals/TopicSettingsModal.svelte
+++ b/web/src/lib/components/Modals/TopicSettingsModal.svelte
@@ -18,8 +18,8 @@ under the License.
 -->
 
 <script lang="ts">
-  import type { CloseModalFn } from '$lib/types/utilTypes';
-  import type { TopicDetails } from '$lib/domain/TopicDetails';
+  import type { CloseModalFn } from '#lib/types/utilTypes.js';
+  import type { TopicDetails } from '#lib/domain/TopicDetails.js';
   import { z } from 'zod';
 
   import Button from '../Button.svelte';
@@ -28,13 +28,13 @@ under the License.
   import ModalBase from './ModalBase.svelte';
   import { setError, superForm, defaults } from 'sveltekit-superforms/client';
   import { zod4 } from 'sveltekit-superforms/adapters';
-  import { fetchRouteApi } from '$lib/api/fetchRouteApi';
+  import { fetchRouteApi } from '#lib/api/fetchRouteApi.js';
   import { goto } from '$app/navigation';
   import { resolve } from '$app/paths';
-  import type { Pathname } from '$app/types';
+  import type { Path } from '$app/types';
   import { showToast } from '../AppToasts.svelte';
   import ModalConfirmation from '../ModalConfirmation.svelte';
-  import { browser } from '$app/environment';
+  import { browser } from '$app/env';
   import { customInvalidateAll } from '../PeriodicInvalidator.svelte';
   import { page } from '$app/state';
   import DurationInput from '../DurationInput.svelte';
@@ -42,7 +42,7 @@ under the License.
   interface Props {
     topic: TopicDetails;
     closeModal: CloseModalFn;
-    onDeleteRedirectPath: Pathname;
+    onDeleteRedirectPath: Path;
   }
 
   let { topic, closeModal, onDeleteRedirectPath }: Props = $props();
diff --git a/web/src/lib/components/Navbar.svelte b/web/src/lib/components/Navbar.svelte
index a135dfb54..d3e0e3b1e 100644
--- a/web/src/lib/components/Navbar.svelte
+++ b/web/src/lib/components/Navbar.svelte
@@ -23,27 +23,27 @@ under the License.
   import { page } from '$app/state';
   import { resolve } from '$app/paths';
   import { twMerge } from 'tailwind-merge';
-  import { tooltip } from '$lib/actions/tooltip';
-  import { typedRoute } from '$lib/types/appRoutes';
-  import LogoType from '$lib/components/Logo/LogoType.svelte';
-  import LogoMark from '$lib/components/Logo/LogoMark.svelte';
+  import { tooltip } from '#lib/actions/tooltip.js';
+  import { typedRoute } from '#lib/types/appRoutes.js';
+  import LogoType from '#lib/components/Logo/LogoType.svelte';
+  import LogoMark from '#lib/components/Logo/LogoMark.svelte';
   let navItems = $derived([
     {
       name: 'Overview',
       icon: 'home',
-      path: typedRoute('/dashboard/overview'),
-      active: page.url.pathname.includes(typedRoute('/dashboard/overview'))
+      path: typedRoute('dashboard/overview'),
+      active: page.url.pathname.includes(typedRoute('dashboard/overview'))
     },
     {
       name: 'Streams',
       icon: 'stream',
-      path: typedRoute('/dashboard/streams'),
-      active: page.url.pathname.includes(typedRoute('/dashboard/streams'))
+      path: typedRoute('dashboard/streams'),
+      active: page.url.pathname.includes(typedRoute('dashboard/streams'))
     },
     {
       name: 'Settings',
       icon: 'settings',
-      path: typedRoute('/dashboard/settings/webUI'),
+      path: typedRoute('dashboard/settings/webUI'),
       active: page.url.pathname.includes('/dashboard/settings')
     }
   ] satisfies { name: string; icon: iconType; path: string; active: boolean }[]);
@@ -52,10 +52,7 @@ under the License.
 <nav
   class="fixed z-10 left-0 top-0 bottom-0 min-w-[90px] max-w-[90px] pb-7 pt-4 border-r flex flex-col items-center bg-shade-l300 dark:bg-shade-d1000"
 >
-  <a
-    href={resolve(typedRoute('/dashboard/overview'))}
-    class="flex flex-col items-center gap-5 mb-5"
-  >
+  <a href={resolve(typedRoute('dashboard/overview'))} class="flex flex-col items-center gap-5 mb-5">
     <LogoType class="w-[51px] h-[28px] pointer-events-none" />
     <LogoMark class="w-[50px] h-[45px]" />
   </a>
diff --git a/web/src/lib/components/Paginator.svelte b/web/src/lib/components/Paginator.svelte
index 4c9cb670f..20d862b3b 100644
--- a/web/src/lib/components/Paginator.svelte
+++ b/web/src/lib/components/Paginator.svelte
@@ -18,8 +18,8 @@ under the License.
 -->
 
 <script lang="ts">
-  import Button from '$lib/components/Button.svelte';
-  import Icon from '$lib/components/Icon.svelte';
+  import Button from '#lib/components/Button.svelte';
+  import Icon from '#lib/components/Icon.svelte';
   import { createEventDispatcher } from 'svelte';
 
   interface Props {
diff --git a/web/src/lib/components/PasswordInput.svelte b/web/src/lib/components/PasswordInput.svelte
index b75fc1839..73e5c8288 100644
--- a/web/src/lib/components/PasswordInput.svelte
+++ b/web/src/lib/components/PasswordInput.svelte
@@ -18,7 +18,7 @@ under the License.
 -->
 
 <script lang="ts">
-  import Input from '$lib/components/Input.svelte';
+  import Input from '#lib/components/Input.svelte';
   import Icon from './Icon.svelte';
   import Button from './Button.svelte';
 
diff --git a/web/src/lib/components/PeriodicInvalidator.svelte b/web/src/lib/components/PeriodicInvalidator.svelte
index 45976a9e2..3c55f0faf 100644
--- a/web/src/lib/components/PeriodicInvalidator.svelte
+++ b/web/src/lib/components/PeriodicInvalidator.svelte
@@ -18,8 +18,8 @@ under the License.
 -->
 
 <script lang="ts" module>
-  import { browser } from '$app/environment';
-  import { invalidateAll } from '$app/navigation';
+  import { browser } from '$app/env';
+  import { refreshAll } from '$app/navigation';
   import { onMount } from 'svelte';
   import { writable } from 'svelte/store';
   import Button from './Button.svelte';
@@ -33,7 +33,7 @@ under the License.
   export async function customInvalidateAll() {
     if (!browser) return;
     isInvalidating.set(true);
-    await invalidateAll();
+    await refreshAll();
     isInvalidating.set(false);
   }
 </script>
diff --git a/web/src/lib/components/PermissionsManager.svelte b/web/src/lib/components/PermissionsManager.svelte
index d0f4a6322..443038a45 100644
--- a/web/src/lib/components/PermissionsManager.svelte
+++ b/web/src/lib/components/PermissionsManager.svelte
@@ -50,19 +50,19 @@ under the License.
 
   import Icon from './Icon.svelte';
   import Combobox from './Combobox.svelte';
-  import type { Stream } from '$lib/domain/Stream';
-  import { topicMapper, type Topic } from '$lib/domain/Topic';
-  import { fetchRouteApi } from '$lib/api/fetchRouteApi';
+  import type { Stream } from '#lib/domain/Stream.js';
+  import { topicMapper, type Topic } from '#lib/domain/Topic.js';
+  import { fetchRouteApi } from '#lib/api/fetchRouteApi.js';
   import { showToast } from './AppToasts.svelte';
-  import type { KeysToSnakeCase } from '$lib/utils/utilTypes';
+  import type { KeysToSnakeCase } from '#lib/utils/utilTypes.js';
   import type {
     GlobalPermissions,
     StreamPermissions,
     TopicPermissions
-  } from '$lib/domain/Permissions';
+  } from '#lib/domain/Permissions.js';
   import Checkbox from './Checkbox.svelte';
   import { twMerge } from 'tailwind-merge';
-  import { noTypeCheck } from '$lib/utils/noTypeCheck';
+  import { noTypeCheck } from '#lib/utils/noTypeCheck.js';
   import { fade } from 'svelte/transition';
   import { SvelteSet } from 'svelte/reactivity';
 
diff --git a/web/src/lib/components/RouteComponents/Settings/UsersTab.svelte b/web/src/lib/components/RouteComponents/Settings/UsersTab.svelte
index c06805548..8e9610bbc 100644
--- a/web/src/lib/components/RouteComponents/Settings/UsersTab.svelte
+++ b/web/src/lib/components/RouteComponents/Settings/UsersTab.svelte
@@ -25,15 +25,15 @@ under the License.
 </script>
 
 <script lang="ts">
-  import type { User } from '$lib/domain/User';
-  import SlimSortableList from '$lib/components/SlimSortableList.svelte';
-  import Checkbox from '$lib/components/Checkbox.svelte';
+  import type { User } from '#lib/domain/User.js';
+  import SlimSortableList from '#lib/components/SlimSortableList.svelte';
+  import Checkbox from '#lib/components/Checkbox.svelte';
   import { twMerge } from 'tailwind-merge';
-  import Button from '$lib/components/Button.svelte';
-  import Icon, { type iconType } from '$lib/components/Icon.svelte';
-  import DropdownMenu from '$lib/components/DropdownMenu/DropdownMenu.svelte';
-  import StopPropagation from '$lib/components/StopPropagation.svelte';
-  import { openModal } from '$lib/components/Modals/AppModals.svelte';
+  import Button from '#lib/components/Button.svelte';
+  import Icon, { type iconType } from '#lib/components/Icon.svelte';
+  import DropdownMenu from '#lib/components/DropdownMenu/DropdownMenu.svelte';
+  import StopPropagation from '#lib/components/StopPropagation.svelte';
+  import { openModal } from '#lib/components/Modals/AppModals.svelte';
 
   interface Props {
     users: Array<User>;
diff --git a/web/src/lib/components/RouteComponents/Settings/UsersTabActions.svelte b/web/src/lib/components/RouteComponents/Settings/UsersTabActions.svelte
index 7cc4384b4..29eb1ffac 100644
--- a/web/src/lib/components/RouteComponents/Settings/UsersTabActions.svelte
+++ b/web/src/lib/components/RouteComponents/Settings/UsersTabActions.svelte
@@ -18,8 +18,8 @@ under the License.
 -->
 
 <script lang="ts">
-  import Icon from '$lib/components/Icon.svelte';
-  import Input from '$lib/components/Input.svelte';
+  import Icon from '#lib/components/Icon.svelte';
+  import Input from '#lib/components/Input.svelte';
   import { searchQuery, usersCount } from './UsersTab.svelte';
 </script>
 
diff --git a/web/src/lib/components/SlimSortableList.svelte b/web/src/lib/components/SlimSortableList.svelte
index 74693f9b3..068593935 100644
--- a/web/src/lib/components/SlimSortableList.svelte
+++ b/web/src/lib/components/SlimSortableList.svelte
@@ -32,7 +32,7 @@ under the License.
 <script lang="ts">
   import { run } from 'svelte/legacy';
 
-  import { asConst } from '$lib/utils/asConst';
+  import { asConst } from '#lib/utils/asConst.js';
 
   import Icon from './Icon.svelte';
   import { twMerge } from 'tailwind-merge';
diff --git a/web/src/lib/components/SortableList.svelte b/web/src/lib/components/SortableList.svelte
index 0cec0b391..fb57e98b8 100644
--- a/web/src/lib/components/SortableList.svelte
+++ b/web/src/lib/components/SortableList.svelte
@@ -21,6 +21,7 @@ under the License.
   type ListItem = {
     id: string | number;
   };
+
   type Ordering<T> = { key: keyof T; asc: boolean } | { key: undefined; asc: undefined };
 
   function orderData<T>(data: T[], key: keyof T, asc: boolean) {
@@ -35,7 +36,7 @@ under the License.
 <script lang="ts" generics="T extends ListItem">
   import { run } from 'svelte/legacy';
 
-  import { asConst } from '$lib/utils/asConst';
+  import { asConst } from '#lib/utils/asConst.js';
 
   import { onNavigate } from '$app/navigation';
 
@@ -44,13 +45,15 @@ under the License.
   import Icon from './Icon.svelte';
 
   import { twMerge } from 'tailwind-merge';
-  import { noTypeCheck } from '$lib/utils/noTypeCheck';
+  import { noTypeCheck } from '#lib/utils/noTypeCheck.js';
 
   let animationEnabled = $state(true);
   let isAnimating = $state(false);
   let timeout: ReturnType<typeof setTimeout>;
 
-  onNavigate(() => {
+  onNavigate(({ shallow, type }) => {
+    if (shallow && type === 'goto') return;
+
     animationEnabled = false;
 
     return () => {
diff --git a/web/src/lib/components/StopPropagation.svelte b/web/src/lib/components/StopPropagation.svelte
index 59a495989..9dec023b6 100644
--- a/web/src/lib/components/StopPropagation.svelte
+++ b/web/src/lib/components/StopPropagation.svelte
@@ -18,7 +18,7 @@ under the License.
 -->
 
 <script lang="ts">
-  import { Keys } from '$lib/utils/constants/keys';
+  import { Keys } from '#lib/utils/constants/keys.js';
 
   interface Props {
     class?: string | undefined;
diff --git a/web/src/lib/components/ThemeController.svelte b/web/src/lib/components/ThemeController.svelte
index 5fbaf0c19..2c993a976 100644
--- a/web/src/lib/components/ThemeController.svelte
+++ b/web/src/lib/components/ThemeController.svelte
@@ -26,8 +26,8 @@ under the License.
 <script lang="ts">
   import { run } from 'svelte/legacy';
 
-  import { browser } from '$app/environment';
-  import { persistedStore } from '$lib/utils/persistedStore';
+  import { browser } from '$app/env';
+  import { persistedStore } from '#lib/utils/persistedStore.js';
 
   const setAppTheme = () => {
     if (!browser) return;
diff --git a/web/src/lib/domain/Message.ts b/web/src/lib/domain/Message.ts
index 247063418..4b6c7fa1b 100644
--- a/web/src/lib/domain/Message.ts
+++ b/web/src/lib/domain/Message.ts
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { formatDateWithMicroseconds } from '$lib/utils/formatters/dateFormatter';
+import { formatDateWithMicroseconds } from '#lib/utils/formatters/dateFormatter.js';
 
 export type MessagePartition = {
   partitionId: number;
diff --git a/web/src/lib/domain/Partition.ts b/web/src/lib/domain/Partition.ts
index 47bcfc13d..ba31d225a 100644
--- a/web/src/lib/domain/Partition.ts
+++ b/web/src/lib/domain/Partition.ts
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { formatDate } from '$lib/utils/formatters/dateFormatter';
+import { formatDate } from '#lib/utils/formatters/dateFormatter.js';
 
 export type Partition = {
   id: number;
diff --git a/web/src/lib/domain/Stats.ts b/web/src/lib/domain/Stats.ts
index 3d9864165..703d7c01d 100644
--- a/web/src/lib/domain/Stats.ts
+++ b/web/src/lib/domain/Stats.ts
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { formatDate, formatRuntime } from '$lib/utils/formatters/dateFormatter';
+import { formatDate, formatRuntime } from '#lib/utils/formatters/dateFormatter.js';
 
 type StatsStringItem = { name: string; value: string; rawValue: string | number };
 type StatsNumberItem = { name: string; value: number };
diff --git a/web/src/lib/domain/Topic.ts b/web/src/lib/domain/Topic.ts
index ee46cb45b..7109ca0e6 100644
--- a/web/src/lib/domain/Topic.ts
+++ b/web/src/lib/domain/Topic.ts
@@ -15,9 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { bytesFormatter } from '$lib/utils/formatters/bytesFormatter';
-import { formatDate } from '$lib/utils/formatters/dateFormatter';
-import { durationFormatter } from '$lib/utils/formatters/durationFormatter';
+import { bytesFormatter } from '#lib/utils/formatters/bytesFormatter.js';
+import { formatDate } from '#lib/utils/formatters/dateFormatter.js';
+import { durationFormatter } from '#lib/utils/formatters/durationFormatter.js';
 
 export type Topic = {
   id: number;
diff --git a/web/src/lib/domain/User.ts b/web/src/lib/domain/User.ts
index 13886c305..d480be58c 100644
--- a/web/src/lib/domain/User.ts
+++ b/web/src/lib/domain/User.ts
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { formatDate } from '$lib/utils/formatters/dateFormatter';
+import { formatDate } from '#lib/utils/formatters/dateFormatter.js';
 
 export type User = {
   id: number;
diff --git a/web/src/lib/hooks/useGoPrev.ts b/web/src/lib/hooks/useGoPrev.ts
index e9e1213fd..b61b691d4 100644
--- a/web/src/lib/hooks/useGoPrev.ts
+++ b/web/src/lib/hooks/useGoPrev.ts
@@ -16,14 +16,16 @@
 // under the License.
 
 import { afterNavigate } from '$app/navigation';
-import { base } from '$app/paths';
+import { resolve } from '$app/paths';
 import { writable } from 'svelte/store';
 
 export const useGoPrev = () => {
-  const { subscribe, set } = writable(base.toString());
+  const { subscribe, set } = writable<string>(resolve('dashboard/overview'));
 
-  afterNavigate(({ from }) => {
-    set(from?.url?.pathname || base);
+  afterNavigate(({ from, shallow, type }) => {
+    if (shallow && type === 'goto') return;
+
+    set(from?.url?.pathname || resolve('dashboard/overview'));
   });
 
   return { prevPage: { subscribe } };
diff --git a/web/src/lib/types/appRoutes.ts b/web/src/lib/types/appRoutes.ts
index f10005eb4..195dd433c 100644
--- a/web/src/lib/types/appRoutes.ts
+++ b/web/src/lib/types/appRoutes.ts
@@ -17,7 +17,7 @@
 
 type SettingsSegment = `settings/${'server' | 'users' | 'terminal' | 'webUI'}`;
 
-type DashboardRoutes = `/dashboard/${
+type DashboardRoutes = `dashboard/${
   | 'overview'
   | 'streams'
   | `streams/${number}`
@@ -27,7 +27,7 @@ type DashboardRoutes = `/dashboard/${
   | 'logs'
   | SettingsSegment}`;
 
-type AuthRoutes = `/auth/${'sign-in' | 'logout'}`;
+type AuthRoutes = `auth/${'sign-in' | 'logout'}`;
 
 export const typedRoute = <const T extends DashboardRoutes | AuthRoutes>(route: T) => route;
 export const publicRoutes = ['/auth/sign-in', '/auth/logout', '/auth/test'] as const;
diff --git a/web/vite.config.ts b/web/src/params.test.mjs
similarity index 55%
copy from web/vite.config.ts
copy to web/src/params.test.mjs
index cf5404a8d..f27963c81 100644
--- a/web/vite.config.ts
+++ b/web/src/params.test.mjs
@@ -15,23 +15,20 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { sveltekit } from '@sveltejs/kit/vite';
-import { defineConfig } from 'vite';
+import assert from 'node:assert/strict';
+import { test } from 'node:test';
+import { params } from './params.ts';
 
-export default defineConfig({
-  base: '/',
-  preview: {
-    port: 3050,
-    strictPort: true,
-    host: true,
-    allowedHosts: true
-  },
-  build: {
-    outDir: '../dist',
-    emptyOutDir: true
-  },
-  plugins: [sveltekit()],
-  define: {
-    SUPERFORMS_LEGACY: true
+test('preserve numeric route parameters as strings', async () => {
+  for (const value of ['0', '01', '42', '-1', '1.5']) {
+    const result = await params.i32['~standard'].validate(value);
+    assert.deepEqual(result, { value }, `Unexpected route parameter: ${value}`);
+  }
+});
+
+test('reject nonnumeric route parameters', async () => {
+  for (const value of ['', 'stream', '1/2', '1e3']) {
+    const result = await params.i32['~standard'].validate(value);
+    assert.ok(result.issues?.length, `Accepted invalid route parameter: ${value}`);
   }
 });
diff --git a/web/src/params/i32.ts b/web/src/params.ts
similarity index 82%
rename from web/src/params/i32.ts
rename to web/src/params.ts
index fd24317f6..fc80973a6 100644
--- a/web/src/params/i32.ts
+++ b/web/src/params.ts
@@ -15,6 +15,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
-export function match(value: any) {
-  return /^-?\d+(\.\d+)?$/.test(value);
-}
+import { defineParams } from '@sveltejs/kit/params';
+
+export const params = defineParams({
+  i32: (value) => (/^-?\d+(\.\d+)?$/.test(value) ? value : undefined)
+});
diff --git a/web/src/routes/+layout.svelte b/web/src/routes/+layout.svelte
index c61d7bf19..e97b912a3 100644
--- a/web/src/routes/+layout.svelte
+++ b/web/src/routes/+layout.svelte
@@ -18,8 +18,8 @@ under the License.
 -->
 
 <script lang="ts">
-  import LoadingIndicator from '$lib/components/LoadingIndicator.svelte';
-  import ThemeController from '$lib/components/ThemeController.svelte';
+  import LoadingIndicator from '#lib/components/LoadingIndicator.svelte';
+  import ThemeController from '#lib/components/ThemeController.svelte';
   import '../styles/app.css';
   interface Props {
     children?: import('svelte').Snippet;
diff --git a/web/src/routes/+layout.ts b/web/src/routes/+layout.ts
index 1a2d83caa..9b84935c9 100644
--- a/web/src/routes/+layout.ts
+++ b/web/src/routes/+layout.ts
@@ -15,11 +15,12 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { browser } from '$app/environment';
+import { browser } from '$app/env';
 import { goto } from '$app/navigation';
-import { base, resolve } from '$app/paths';
-import { authStore } from '$lib/auth/authStore.svelte';
-import { checkIfPathnameIsPublic, typedRoute } from '$lib/types/appRoutes';
+import { resolve } from '$app/paths';
+import type { Path } from '$app/types';
+import { authStore } from '#lib/auth/authStore.svelte.js';
+import { checkIfPathnameIsPublic, typedRoute } from '#lib/types/appRoutes.js';
 import type { LayoutLoad } from './$types';
 
 // Enable client-side rendering for SPA mode
@@ -35,23 +36,25 @@ export const load: LayoutLoad = async ({ url }) => {
   const isPublicPath = checkIfPathnameIsPublic(pathname);
   const isAuthenticated = authStore.getAccessToken() !== null;
 
+  // Entry URLs without pages are absent from the generated route types.
+  const rootPath = resolve('' as Path);
   const authRedirects = [
-    base,
-    `${base}/`,
-    `${base}/dashboard`,
-    `${base}/dashboard/`,
-    `${base}/auth`,
-    `${base}/auth/sign-in`
+    rootPath.replace(/\/$/, ''),
+    rootPath,
+    `${rootPath}dashboard`,
+    `${rootPath}dashboard/`,
+    `${rootPath}auth`,
+    resolve(typedRoute('auth/sign-in'))
   ];
 
   if (browser) {
     if (!isAuthenticated && !isPublicPath) {
-      goto(resolve(typedRoute('/auth/sign-in')));
+      goto(resolve(typedRoute('auth/sign-in')));
       return { isAuthenticated: false };
     }
 
     if (isAuthenticated && authRedirects.includes(pathname)) {
-      goto(resolve(typedRoute('/dashboard/overview')));
+      goto(resolve(typedRoute('dashboard/overview')));
       return { isAuthenticated: true };
     }
   }
diff --git a/web/src/routes/auth/+layout.svelte b/web/src/routes/auth/+layout.svelte
index 85e08689d..d32f0c235 100644
--- a/web/src/routes/auth/+layout.svelte
+++ b/web/src/routes/auth/+layout.svelte
@@ -18,7 +18,7 @@ under the License.
 -->
 
 <script>
-  import Logo from '$lib/components/Logo/Logo.svelte';
+  import Logo from '#lib/components/Logo/Logo.svelte';
 
   /** @type {{children?: import('svelte').Snippet}} */
   let { children } = $props();
diff --git a/web/src/routes/auth/logout/+page.svelte b/web/src/routes/auth/logout/+page.svelte
index 2518af297..2013a061c 100644
--- a/web/src/routes/auth/logout/+page.svelte
+++ b/web/src/routes/auth/logout/+page.svelte
@@ -21,12 +21,12 @@ under the License.
   import { onMount } from 'svelte';
   import { goto } from '$app/navigation';
   import { resolve } from '$app/paths';
-  import { authStore } from '$lib/auth/authStore.svelte';
-  import { typedRoute } from '$lib/types/appRoutes';
+  import { authStore } from '#lib/auth/authStore.svelte.js';
+  import { typedRoute } from '#lib/types/appRoutes.js';
 
   onMount(() => {
     authStore.logout();
-    goto(resolve(typedRoute('/auth/sign-in')));
+    goto(resolve(typedRoute('auth/sign-in')));
   });
 </script>
 
diff --git a/web/src/routes/auth/sign-in/+page.svelte b/web/src/routes/auth/sign-in/+page.svelte
index 676af6b13..9d90f2298 100644
--- a/web/src/routes/auth/sign-in/+page.svelte
+++ b/web/src/routes/auth/sign-in/+page.svelte
@@ -20,15 +20,15 @@ under the License.
 <script lang="ts">
   import { goto } from '$app/navigation';
   import { resolve } from '$app/paths';
-  import { env } from '$env/dynamic/public';
-  import { authStore } from '$lib/auth/authStore.svelte';
-  import Button from '$lib/components/Button.svelte';
-  import Checkbox from '$lib/components/Checkbox.svelte';
-  import Icon from '$lib/components/Icon.svelte';
-  import Input from '$lib/components/Input.svelte';
-  import PasswordInput from '$lib/components/PasswordInput.svelte';
-  import { typedRoute } from '$lib/types/appRoutes';
-  import { persistedStore } from '$lib/utils/persistedStore.js';
+  import { PUBLIC_IGGY_API_URL } from '$app/env/public';
+  import { authStore } from '#lib/auth/authStore.svelte.js';
+  import Button from '#lib/components/Button.svelte';
+  import Checkbox from '#lib/components/Checkbox.svelte';
+  import Icon from '#lib/components/Icon.svelte';
+  import Input from '#lib/components/Input.svelte';
+  import PasswordInput from '#lib/components/PasswordInput.svelte';
+  import { typedRoute } from '#lib/types/appRoutes.js';
+  import { persistedStore } from '#lib/utils/persistedStore.js';
   import { onMount } from 'svelte';
 
   let username = $state('');
@@ -72,7 +72,7 @@ under the License.
     isLoading = true;
 
     try {
-      const baseUrl = env.PUBLIC_IGGY_API_URL || '';
+      const baseUrl = PUBLIC_IGGY_API_URL || '';
       const response = await fetch(`${baseUrl}/users/login`, {
         method: 'POST',
         headers: { 'Content-Type': 'application/json' },
@@ -89,7 +89,7 @@ under the License.
       const { access_token } = data;
 
       authStore.login(access_token.token, access_token.expiry);
-      goto(resolve(typedRoute('/dashboard/overview')));
+      goto(resolve(typedRoute('dashboard/overview')));
     } catch {
       errorMessage = 'Failed to connect to server';
       isLoading = false;
diff --git a/web/src/routes/auth/sign-in/+page.ts b/web/src/routes/auth/sign-in/+page.ts
index 3e19baf7d..c5edc850d 100644
--- a/web/src/routes/auth/sign-in/+page.ts
+++ b/web/src/routes/auth/sign-in/+page.ts
@@ -15,16 +15,16 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { browser } from '$app/environment';
+import { browser } from '$app/env';
 import { goto } from '$app/navigation';
 import { resolve } from '$app/paths';
-import { authStore } from '$lib/auth/authStore.svelte';
-import { typedRoute } from '$lib/types/appRoutes';
+import { authStore } from '#lib/auth/authStore.svelte.js';
+import { typedRoute } from '#lib/types/appRoutes.js';
 import type { PageLoad } from './$types';
 
 export const load: PageLoad = async () => {
   if (browser && authStore.getAccessToken()) {
-    goto(resolve(typedRoute('/dashboard/overview')));
+    goto(resolve(typedRoute('dashboard/overview')));
   }
 
   return {};
diff --git a/web/src/routes/dashboard/+layout.svelte b/web/src/routes/dashboard/+layout.svelte
index e16c94546..b36cbe116 100644
--- a/web/src/routes/dashboard/+layout.svelte
+++ b/web/src/routes/dashboard/+layout.svelte
@@ -18,10 +18,10 @@ under the License.
 -->
 
 <script>
-  import AppModals from '$lib/components/Modals/AppModals.svelte';
-  import Navbar from '$lib/components/Navbar.svelte';
-  import AppToasts from '$lib/components/AppToasts.svelte';
-  import Header from '$lib/components/Header.svelte';
+  import AppModals from '#lib/components/Modals/AppModals.svelte';
+  import Navbar from '#lib/components/Navbar.svelte';
+  import AppToasts from '#lib/components/AppToasts.svelte';
+  import Header from '#lib/components/Header.svelte';
 
   /** @type {{data: any, children?: import('svelte').Snippet}} */
   let { data, children } = $props();
diff --git a/web/src/routes/dashboard/+layout.ts b/web/src/routes/dashboard/+layout.ts
index e9ce12e0e..6b0da9227 100644
--- a/web/src/routes/dashboard/+layout.ts
+++ b/web/src/routes/dashboard/+layout.ts
@@ -15,13 +15,13 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { browser } from '$app/environment';
+import { browser } from '$app/env';
 import { goto } from '$app/navigation';
 import { resolve } from '$app/paths';
-import { clientApi } from '$lib/api/clientApi';
-import { authStore } from '$lib/auth/authStore.svelte';
-import { userDetailsMapper } from '$lib/domain/UserDetails';
-import { typedRoute } from '$lib/types/appRoutes';
+import { clientApi } from '#lib/api/clientApi.js';
+import { authStore } from '#lib/auth/authStore.svelte.js';
+import { userDetailsMapper } from '#lib/domain/UserDetails.js';
+import { typedRoute } from '#lib/types/appRoutes.js';
 import { jwtDecode } from 'jwt-decode';
 import type { LayoutLoad } from './$types';
 
@@ -32,7 +32,7 @@ export const load: LayoutLoad = async () => {
 
   const token = authStore.getAccessToken();
   if (browser && !token) {
-    goto(resolve(typedRoute('/auth/sign-in')));
+    goto(resolve(typedRoute('auth/sign-in')));
     return { user: null };
   }
 
diff --git a/web/src/routes/dashboard/overview/+page.ts b/web/src/routes/dashboard/overview/+page.ts
index 2c7aaf89d..f1ad24d01 100644
--- a/web/src/routes/dashboard/overview/+page.ts
+++ b/web/src/routes/dashboard/overview/+page.ts
@@ -15,8 +15,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { clientApi } from '$lib/api/clientApi';
-import { statsMapper } from '$lib/domain/Stats';
+import { clientApi } from '#lib/api/clientApi.js';
+import { statsMapper } from '#lib/domain/Stats.js';
 import type { PageLoad } from './$types';
 
 export const load: PageLoad = async () => {
diff --git a/web/src/routes/dashboard/settings/server/+page.svelte b/web/src/routes/dashboard/settings/server/+page.svelte
index d1d26971d..b42904235 100644
--- a/web/src/routes/dashboard/settings/server/+page.svelte
+++ b/web/src/routes/dashboard/settings/server/+page.svelte
@@ -18,11 +18,11 @@ under the License.
 -->
 
 <script lang="ts">
-  import Button from '$lib/components/Button.svelte';
-  import SettingsLayout from '$lib/components/Layouts/SettingsLayout.svelte';
+  import Button from '#lib/components/Button.svelte';
+  import SettingsLayout from '#lib/components/Layouts/SettingsLayout.svelte';
 
-  import RangeInput from '$lib/components/RangeInput.svelte';
-  import Toggler from '$lib/components/Toggler.svelte';
+  import RangeInput from '#lib/components/RangeInput.svelte';
+  import Toggler from '#lib/components/Toggler.svelte';
 
   interface Props {
     data: any;
diff --git a/web/src/routes/dashboard/settings/server/+page.ts b/web/src/routes/dashboard/settings/server/+page.ts
index 257416ba8..ae46aca10 100644
--- a/web/src/routes/dashboard/settings/server/+page.ts
+++ b/web/src/routes/dashboard/settings/server/+page.ts
@@ -15,8 +15,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { clientApi } from '$lib/api/clientApi';
-import { statsMapper } from '$lib/domain/Stats';
+import { clientApi } from '#lib/api/clientApi.js';
+import { statsMapper } from '#lib/domain/Stats.js';
 import type { PageLoad } from './$types';
 
 export const load: PageLoad = async () => {
diff --git a/web/src/routes/dashboard/settings/terminal/+page.svelte b/web/src/routes/dashboard/settings/terminal/+page.svelte
index 272007565..3615f077d 100644
--- a/web/src/routes/dashboard/settings/terminal/+page.svelte
+++ b/web/src/routes/dashboard/settings/terminal/+page.svelte
@@ -18,7 +18,7 @@ under the License.
 -->
 
 <script>
-  import SettingsLayout from '$lib/components/Layouts/SettingsLayout.svelte';
+  import SettingsLayout from '#lib/components/Layouts/SettingsLayout.svelte';
 </script>
 
 <SettingsLayout>terminal</SettingsLayout>
diff --git a/web/src/routes/dashboard/settings/users/+page.svelte b/web/src/routes/dashboard/settings/users/+page.svelte
index 1e958a41c..304de6f73 100644
--- a/web/src/routes/dashboard/settings/users/+page.svelte
+++ b/web/src/routes/dashboard/settings/users/+page.svelte
@@ -25,17 +25,17 @@ under the License.
 </script>
 
 <script lang="ts">
-  import SlimSortableList from '$lib/components/SlimSortableList.svelte';
-  import Checkbox from '$lib/components/Checkbox.svelte';
+  import SlimSortableList from '#lib/components/SlimSortableList.svelte';
+  import Checkbox from '#lib/components/Checkbox.svelte';
   import { twMerge } from 'tailwind-merge';
-  import Button from '$lib/components/Button.svelte';
-  import Icon, { type iconType } from '$lib/components/Icon.svelte';
-  import DropdownMenu from '$lib/components/DropdownMenu/DropdownMenu.svelte';
-  import StopPropagation from '$lib/components/StopPropagation.svelte';
-  import { openModal } from '$lib/components/Modals/AppModals.svelte';
-  import SettingsLayout from '$lib/components/Layouts/SettingsLayout.svelte';
+  import Button from '#lib/components/Button.svelte';
+  import Icon, { type iconType } from '#lib/components/Icon.svelte';
+  import DropdownMenu from '#lib/components/DropdownMenu/DropdownMenu.svelte';
+  import StopPropagation from '#lib/components/StopPropagation.svelte';
+  import { openModal } from '#lib/components/Modals/AppModals.svelte';
+  import SettingsLayout from '#lib/components/Layouts/SettingsLayout.svelte';
   import { fade } from 'svelte/transition';
-  import Input from '$lib/components/Input.svelte';
+  import Input from '#lib/components/Input.svelte';
 
   interface Props {
     data: any;
diff --git a/web/src/routes/dashboard/settings/users/+page.ts b/web/src/routes/dashboard/settings/users/+page.ts
index c671eca6f..8099a1102 100644
--- a/web/src/routes/dashboard/settings/users/+page.ts
+++ b/web/src/routes/dashboard/settings/users/+page.ts
@@ -15,10 +15,10 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { clientApi } from '$lib/api/clientApi';
-import { streamListMapper } from '$lib/domain/Stream';
-import { streamDetailsMapper } from '$lib/domain/StreamDetails';
-import { userMapper, type User } from '$lib/domain/User';
+import { clientApi } from '#lib/api/clientApi.js';
+import { streamListMapper } from '#lib/domain/Stream.js';
+import { streamDetailsMapper } from '#lib/domain/StreamDetails.js';
+import { userMapper, type User } from '#lib/domain/User.js';
 import type { PageLoad } from './$types';
 
 export const load: PageLoad = async () => {
diff --git a/web/src/routes/dashboard/settings/webUI/+page.svelte b/web/src/routes/dashboard/settings/webUI/+page.svelte
index 307a1363b..1123e05be 100644
--- a/web/src/routes/dashboard/settings/webUI/+page.svelte
+++ b/web/src/routes/dashboard/settings/webUI/+page.svelte
@@ -18,11 +18,11 @@ under the License.
 -->
 
 <script lang="ts">
-  import Button from '$lib/components/Button.svelte';
-  import Input from '$lib/components/Input.svelte';
-  import SettingsLayout from '$lib/components/Layouts/SettingsLayout.svelte';
-  import { invalidateIntervalDuration } from '$lib/components/PeriodicInvalidator.svelte';
-  import { durationFormatter } from '$lib/utils/formatters/durationFormatter';
+  import Button from '#lib/components/Button.svelte';
+  import Input from '#lib/components/Input.svelte';
+  import SettingsLayout from '#lib/components/Layouts/SettingsLayout.svelte';
+  import { invalidateIntervalDuration } from '#lib/components/PeriodicInvalidator.svelte';
+  import { durationFormatter } from '#lib/utils/formatters/durationFormatter.js';
 
   let intervalValue = $state($invalidateIntervalDuration);
 
diff --git a/web/src/routes/dashboard/streams/+layout.svelte b/web/src/routes/dashboard/streams/+layout.svelte
index 769ef40f2..d4995ebc7 100644
--- a/web/src/routes/dashboard/streams/+layout.svelte
+++ b/web/src/routes/dashboard/streams/+layout.svelte
@@ -18,14 +18,14 @@ under the License.
 -->
 
 <script lang="ts">
-  import Icon from '$lib/components/Icon.svelte';
+  import Icon from '#lib/components/Icon.svelte';
   import { goto } from '$app/navigation';
   import { twMerge } from 'tailwind-merge';
   import { page } from '$app/state';
-  import { openModal } from '$lib/components/Modals/AppModals.svelte';
-  import Button from '$lib/components/Button.svelte';
+  import { openModal } from '#lib/components/Modals/AppModals.svelte';
+  import Button from '#lib/components/Button.svelte';
 
-  import { typedRoute } from '$lib/types/appRoutes';
+  import { typedRoute } from '#lib/types/appRoutes.js';
   import { onMount } from 'svelte';
   import { resolve } from '$app/paths';
 
@@ -41,11 +41,8 @@ under the License.
   let filteredData = $derived(data.streams.filter((stream) => stream.name.includes(searchQuery)));
 
   onMount(() => {
-    if (
-      data.streams.length > 0 &&
-      page.url.pathname === resolve(typedRoute('/dashboard/streams'))
-    ) {
-      goto(resolve(typedRoute(`/dashboard/streams/${data.streams[0].id}`)));
+    if (data.streams.length > 0 && page.url.pathname === resolve(typedRoute('dashboard/streams'))) {
+      goto(resolve(typedRoute(`dashboard/streams/${data.streams[0].id}`)));
     }
   });
 </script>
@@ -72,7 +69,7 @@ under the License.
         {@const isActive = page.params.streamId === id.toString()}
         <li class="last:mb-6">
           <a
-            href={resolve(typedRoute(`/dashboard/streams/${id}`))}
+            href={resolve(typedRoute(`dashboard/streams/${id}`))}
             class={twMerge(
               'flex w-full flex-col border-b gap-1 px-5 py-2 transition-colors  outline-hidden dark:text-white hoverable',
               isActive && 'bg-shade-l300 dark:bg-shade-d300'
diff --git a/web/src/routes/dashboard/streams/+layout.ts b/web/src/routes/dashboard/streams/+layout.ts
index b340bfa9b..0f906eaa7 100644
--- a/web/src/routes/dashboard/streams/+layout.ts
+++ b/web/src/routes/dashboard/streams/+layout.ts
@@ -15,8 +15,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { clientApi } from '$lib/api/clientApi';
-import { streamMapper, type Stream } from '$lib/domain/Stream';
+import { clientApi } from '#lib/api/clientApi.js';
+import { streamMapper, type Stream } from '#lib/domain/Stream.js';
 import type { LayoutLoad } from './$types';
 
 export const load: LayoutLoad = async () => {
diff --git a/web/src/routes/dashboard/streams/[streamId=i32]/+page.svelte b/web/src/routes/dashboard/streams/[streamId=i32]/+page.svelte
index 041f0de6d..648376f68 100644
--- a/web/src/routes/dashboard/streams/[streamId=i32]/+page.svelte
+++ b/web/src/routes/dashboard/streams/[streamId=i32]/+page.svelte
@@ -20,12 +20,12 @@ under the License.
 <script lang="ts">
   import { page } from '$app/state';
   import { resolve } from '$app/paths';
-  import Button from '$lib/components/Button.svelte';
-  import Icon from '$lib/components/Icon.svelte';
-  import { openModal } from '$lib/components/Modals/AppModals.svelte';
-  import SortableList from '$lib/components/SortableList.svelte';
-  import { typedRoute } from '$lib/types/appRoutes';
-  import type { StreamDetails } from '$lib/domain/StreamDetails';
+  import Button from '#lib/components/Button.svelte';
+  import Icon from '#lib/components/Icon.svelte';
+  import { openModal } from '#lib/components/Modals/AppModals.svelte';
+  import SortableList from '#lib/components/SortableList.svelte';
+  import { typedRoute } from '#lib/types/appRoutes.js';
+  import type { StreamDetails } from '#lib/domain/StreamDetails.js';
 
   interface Props {
     data: {
@@ -86,7 +86,7 @@ under the License.
   rowClass="grid grid-cols-[150px_3fr_2fr_2fr_2fr_2fr_3fr]"
   data={stream.topics}
   hrefBuilder={(topic) =>
-    resolve(typedRoute(`/dashboard/streams/${+(page.params.streamId || '')}/topics/${topic.id}`))}
+    resolve(typedRoute(`dashboard/streams/${+(page.params.streamId || '')}/topics/${topic.id}`))}
   colNames={{
     id: 'ID',
     name: 'Name',
diff --git a/web/src/routes/dashboard/streams/[streamId=i32]/+page.ts b/web/src/routes/dashboard/streams/[streamId=i32]/+page.ts
index 5d6cd6acc..34ebfe3aa 100644
--- a/web/src/routes/dashboard/streams/[streamId=i32]/+page.ts
+++ b/web/src/routes/dashboard/streams/[streamId=i32]/+page.ts
@@ -15,8 +15,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { clientApi } from '$lib/api/clientApi';
-import { streamDetailsMapper } from '$lib/domain/StreamDetails';
+import { clientApi } from '#lib/api/clientApi.js';
+import { streamDetailsMapper } from '#lib/domain/StreamDetails.js';
 import type { PageLoad } from './$types';
 
 export const load: PageLoad = async ({ params }) => {
diff --git a/web/src/routes/dashboard/streams/[streamId=i32]/topics/+page.svelte b/web/src/routes/dashboard/streams/[streamId=i32]/topics/+page.svelte
index 6e88d6765..6a91fb943 100644
--- a/web/src/routes/dashboard/streams/[streamId=i32]/topics/+page.svelte
+++ b/web/src/routes/dashboard/streams/[streamId=i32]/topics/+page.svelte
@@ -19,11 +19,11 @@ under the License.
 
 <script>
   import { goto } from '$app/navigation';
-  import { typedRoute } from '$lib/types/appRoutes';
+  import { typedRoute } from '#lib/types/appRoutes.js';
   import { onMount } from 'svelte';
   import { resolve } from '$app/paths';
 
   onMount(() => {
-    goto(resolve(typedRoute('/dashboard/streams')));
+    goto(resolve(typedRoute('dashboard/streams')));
   });
 </script>
diff --git a/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/+page.svelte b/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/+page.svelte
index c151d1157..fd6ce78fe 100644
--- a/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/+page.svelte
+++ b/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/+page.svelte
@@ -19,15 +19,15 @@ under the License.
 
 <script lang="ts">
   import { page } from '$app/state';
-  import Button from '$lib/components/Button.svelte';
-  import Icon from '$lib/components/Icon.svelte';
+  import Button from '#lib/components/Button.svelte';
+  import Icon from '#lib/components/Icon.svelte';
   import { goto } from '$app/navigation';
   import { resolve } from '$app/paths';
-  import { typedRoute } from '$lib/types/appRoutes';
-  import { openModal } from '$lib/components/Modals/AppModals.svelte';
-  import SortableList from '$lib/components/SortableList.svelte';
-  import type { Topic } from '$lib/domain/Topic';
-  import type { Partition } from '$lib/domain/Partition';
+  import { typedRoute } from '#lib/types/appRoutes.js';
+  import { openModal } from '#lib/components/Modals/AppModals.svelte';
+  import SortableList from '#lib/components/SortableList.svelte';
+  import type { Topic } from '#lib/domain/Topic.js';
+  import type { Partition } from '#lib/domain/Partition.js';
 
   interface Props {
     data: {
@@ -39,7 +39,7 @@ under the License.
 
   let { data }: Props = $props();
   let topic = $derived(data.topic);
-  let prevPage = $derived(typedRoute(`/dashboard/streams/${+(page.params.streamId || '')}`));
+  let prevPage = $derived(typedRoute(`dashboard/streams/${+(page.params.streamId || '')}`));
 </script>
 
 <div class="h-[80px] flex text-xs items-center pl-2 pr-5">
@@ -94,7 +94,7 @@ under the License.
   hrefBuilder={(partition) =>
     resolve(
       typedRoute(
-        `/dashboard/streams/${+(page.params.streamId || '')}/topics/${topic.id}/partitions/${partition.id}/messages`
+        `dashboard/streams/${+(page.params.streamId || '')}/topics/${topic.id}/partitions/${partition.id}/messages`
       )
     )}
   colNames={{
diff --git a/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/+page.ts b/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/+page.ts
index 0211f8123..816f47824 100644
--- a/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/+page.ts
+++ b/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/+page.ts
@@ -15,8 +15,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { clientApi } from '$lib/api/clientApi';
-import { topicDetailsMapper } from '$lib/domain/TopicDetails';
+import { clientApi } from '#lib/api/clientApi.js';
+import { topicDetailsMapper } from '#lib/domain/TopicDetails.js';
 import type { PageLoad } from './$types';
 
 export const load: PageLoad = async ({ params }) => {
diff --git a/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/partitions/[partitionId=i32]/+page.svelte b/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/partitions/[partitionId=i32]/+page.svelte
index 6e88d6765..6a91fb943 100644
--- a/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/partitions/[partitionId=i32]/+page.svelte
+++ b/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/partitions/[partitionId=i32]/+page.svelte
@@ -19,11 +19,11 @@ under the License.
 
 <script>
   import { goto } from '$app/navigation';
-  import { typedRoute } from '$lib/types/appRoutes';
+  import { typedRoute } from '#lib/types/appRoutes.js';
   import { onMount } from 'svelte';
   import { resolve } from '$app/paths';
 
   onMount(() => {
-    goto(resolve(typedRoute('/dashboard/streams')));
+    goto(resolve(typedRoute('dashboard/streams')));
   });
 </script>
diff --git a/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/partitions/[partitionId=i32]/messages/+page.svelte b/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/partitions/[partitionId=i32]/messages/+page.svelte
index 9689dc410..658ae5668 100644
--- a/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/partitions/[partitionId=i32]/messages/+page.svelte
+++ b/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/partitions/[partitionId=i32]/messages/+page.svelte
@@ -19,15 +19,15 @@ under the License.
 
 <script lang="ts">
   import { page } from '$app/state';
-  import Button from '$lib/components/Button.svelte';
-  import Icon from '$lib/components/Icon.svelte';
+  import Button from '#lib/components/Button.svelte';
+  import Icon from '#lib/components/Icon.svelte';
   import { goto } from '$app/navigation';
   import { resolve } from '$app/paths';
-  import { openModal } from '$lib/components/Modals/AppModals.svelte';
-  import SortableList from '$lib/components/SortableList.svelte';
-  import Paginator from '$lib/components/Paginator.svelte';
-  import type { MessagePartition } from '$lib/domain/Message';
-  import type { TopicDetails } from '$lib/domain/TopicDetails';
+  import { openModal } from '#lib/components/Modals/AppModals.svelte';
+  import SortableList from '#lib/components/SortableList.svelte';
+  import Paginator from '#lib/components/Paginator.svelte';
+  import type { MessagePartition } from '#lib/domain/Message.js';
+  import type { TopicDetails } from '#lib/domain/TopicDetails.js';
   import { SvelteURLSearchParams } from 'svelte/reactivity';
 
   interface Props {
@@ -65,16 +65,11 @@ under the License.
     searchParams.set('offset', offset.toString());
     searchParams.set('direction', direction);
 
-    // TODO: https://github.com/sveltejs/kit/issues/14750
     await goto(
-      // eslint-disable-next-line svelte/no-navigation-without-resolve
       resolve(
-        `/dashboard/streams/${page.params.streamId}/topics/${page.params.topicId}/partitions/${page.params.partitionId}/messages`
+        `dashboard/streams/${page.params.streamId}/topics/${page.params.topicId}/partitions/${page.params.partitionId}/messages`
       ) + `?${searchParams}`,
-      {
-        keepFocus: true,
-        noScroll: true
-      }
+      { reset: false }
     );
     currentPage = pageNum;
   }
@@ -95,7 +90,7 @@ under the License.
     variant="rounded"
     class="mr-5"
     onclick={() =>
-      goto(resolve(`/dashboard/streams/${page.params.streamId}/topics/${page.params.topicId}`))}
+      goto(resolve(`dashboard/streams/${page.params.streamId}/topics/${page.params.topicId}`))}
   >
     <Icon name="arrowLeft" class="h-[40px] w-[30px]" />
   </Button>
diff --git a/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/partitions/[partitionId=i32]/messages/+page.ts b/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/partitions/[partitionId=i32]/messages/+page.ts
index 541ab0cd0..e60a70ad1 100644
--- a/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/partitions/[partitionId=i32]/messages/+page.ts
+++ b/web/src/routes/dashboard/streams/[streamId=i32]/topics/[topicId=i32]/partitions/[partitionId=i32]/messages/+page.ts
@@ -15,9 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
-import { clientApi } from '$lib/api/clientApi';
-import { partitionMessagesDetailsMapper } from '$lib/domain/MessageDetails';
-import { topicDetailsMapper } from '$lib/domain/TopicDetails';
+import { clientApi } from '#lib/api/clientApi.js';
+import { partitionMessagesDetailsMapper } from '#lib/domain/MessageDetails.js';
+import { topicDetailsMapper } from '#lib/domain/TopicDetails.js';
 import type { PageLoad } from './$types';
 
 const MESSAGES_PER_PAGE = 20;
diff --git a/web/svelte.config.js b/web/svelte.config.js
deleted file mode 100644
index 500f27940..000000000
--- a/web/svelte.config.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-import adapterNode from '@sveltejs/adapter-node';
-import adapterStatic from '@sveltejs/adapter-static';
-import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
-
-// Use static adapter when STATIC_BUILD env is set (for embedding in Rust server)
-const useStaticAdapter = process.env.STATIC_BUILD === 'true';
-
-/** @type {import('@sveltejs/kit').Config} */
-const config = {
-  kit: {
-    adapter: useStaticAdapter
-      ? adapterStatic({
-          pages: 'build/static',
-          assets: 'build/static',
-          fallback: 'index.html'
-        })
-      : adapterNode({
-          out: 'build'
-        }),
-    paths: {
-      base: useStaticAdapter ? '/ui' : ''
-    },
-    csrf: {
-      trustedOrigins: ['*']
-    }
-  },
-  preprocess: vitePreprocess()
-};
-export default config;
diff --git a/web/tsconfig.json b/web/tsconfig.json
index b7b36cdf6..276622fff 100644
--- a/web/tsconfig.json
+++ b/web/tsconfig.json
@@ -1,19 +1,10 @@
 {
-  "extends": "./.svelte-kit/tsconfig.json",
+  "extends": "$app/tsconfig",
   "compilerOptions": {
-    "allowJs": true,
-    "checkJs": true,
     "noImplicitAny": false,
-    "esModuleInterop": true,
-    "forceConsistentCasingInFileNames": true,
-    "resolveJsonModule": true,
-    "skipLibCheck": true,
     "sourceMap": true,
     "strict": true,
     "noErrorTruncation": true
-  }
-  // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias
-  //
-  // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
-  // from the referenced tsconfig.json - TypeScript does not merge them in
+  },
+  "include": ["src", "vite.config.ts"]
 }
diff --git a/web/vite.config.ts b/web/vite.config.ts
index cf5404a8d..9976aa75f 100644
--- a/web/vite.config.ts
+++ b/web/vite.config.ts
@@ -15,11 +15,16 @@
 // specific language governing permissions and limitations
 // under the License.
 
+import adapterNode from '@sveltejs/adapter-node';
+import adapterStatic from '@sveltejs/adapter-static';
 import { sveltekit } from '@sveltejs/kit/vite';
+import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
 import { defineConfig } from 'vite';
 
+// Use static adapter when STATIC_BUILD env is set (for embedding in Rust server)
+const useStaticAdapter = process.env.STATIC_BUILD === 'true';
+
 export default defineConfig({
-  base: '/',
   preview: {
     port: 3050,
     strictPort: true,
@@ -27,10 +32,28 @@ export default defineConfig({
     allowedHosts: true
   },
   build: {
-    outDir: '../dist',
-    emptyOutDir: true
+    outDir: '../dist'
   },
-  plugins: [sveltekit()],
+  plugins: [
+    sveltekit({
+      preprocess: vitePreprocess(),
+      adapter: useStaticAdapter
+        ? adapterStatic({
+            pages: 'build/static',
+            assets: 'build/static',
+            fallback: 'index.html'
+          })
+        : adapterNode({
+            out: 'build'
+          }),
+      paths: {
+        base: useStaticAdapter ? '/ui' : ''
+      },
+      csrf: {
+        trustedOrigins: ['*']
+      }
+    })
+  ],
   define: {
     SUPERFORMS_LEGACY: true
   }