diff --git a/package-lock.json b/package-lock.json
index f1b4f8e1d8fa522dc9c14d0ee4ea3985800dbecc..da62351ca6317c0874411306d9c64fe75b6c9bf9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,13 +12,13 @@
         "@aws-sdk/client-s3": "^3.637.0",
         "@aws-sdk/lib-storage": "^3.637.0",
         "@aws-sdk/s3-request-presigner": "^3.637.0",
-        "@fortawesome/fontawesome-free": "~6.6.0",
+        "@fortawesome/fontawesome-free": "~6.7.0",
         "@hey-api/client-axios": "^0.2.7",
         "@popperjs/core": "~2.11.8",
         "ajv": "~8.17.0",
         "bootstrap": "~5.3.0",
         "chart.js": "~4.4.0",
-        "chartjs-plugin-zoom": "~2.0.1",
+        "chartjs-plugin-zoom": "~2.1.0",
         "dayjs": "~1.11.0",
         "dompurify": "~3.2.0",
         "filesize": "~10.1.0",
@@ -40,7 +40,7 @@
         "@tsconfig/node22": "^22.0.0",
         "@types/bootstrap": "~5.2.0",
         "@types/dompurify": "~3.0.0",
-        "@types/node": "^20.11.0",
+        "@types/node": "^22.9.0",
         "@types/qs": "^6.9.16",
         "@types/semver": "~7.5.1",
         "@types/showdown": "~2.0.1",
@@ -1685,9 +1685,9 @@
       }
     },
     "node_modules/@fortawesome/fontawesome-free": {
-      "version": "6.6.0",
-      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.6.0.tgz",
-      "integrity": "sha512-60G28ke/sXdtS9KZCpZSHHkCbdsOGEhIUGlwq6yhY74UpTiToIh8np7A8yphhM4BWsvNFtIvLpi4co+h9Mr9Ow==",
+      "version": "6.7.0",
+      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.0.tgz",
+      "integrity": "sha512-lXTP8oiLGM97Aqjn47nod9awKe574HRfCngFizr7FiHTadKTiPkoVn0Mzg+tZBLD1XpE4CRvcF7/UM3g1jyVYw==",
       "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)",
       "engines": {
         "node": ">=6"
@@ -1706,9 +1706,9 @@
       }
     },
     "node_modules/@hey-api/openapi-ts": {
-      "version": "0.56.0",
-      "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.56.0.tgz",
-      "integrity": "sha512-bwqfuqJVNRVsbyC+jlAY2geJOWVQZWpVKS9z9sFeuTeRMJ5C8m+WzucMP0hurqYy67I90GaRyFSepvL1+miSXg==",
+      "version": "0.56.1",
+      "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.56.1.tgz",
+      "integrity": "sha512-AGoFnI2Mx8p70L+yaVnrpVK39Jo9flP4JyUTc5pqyp3syBdfwNecnoCL/JOjMvOq4Jy3IHneRJr0mQXKXZsziA==",
       "dev": true,
       "license": "FSL-1.1-MIT",
       "dependencies": {
@@ -2232,9 +2232,9 @@
       }
     },
     "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.2.tgz",
-      "integrity": "sha512-Tj+j7Pyzd15wAdSJswvs5CJzJNV+qqSUcr/aCD+jpQSBtXvGnV0pnrjoc8zFTe9fcKCatkpFpOO7yAzpO998HA==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.3.tgz",
+      "integrity": "sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==",
       "cpu": [
         "arm"
       ],
@@ -2246,9 +2246,9 @@
       ]
     },
     "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.2.tgz",
-      "integrity": "sha512-xsPeJgh2ThBpUqlLgRfiVYBEf/P1nWlWvReG+aBWfNv3XEBpa6ZCmxSVnxJgLgkNz4IbxpLy64h2gCmAAQLneQ==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.3.tgz",
+      "integrity": "sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==",
       "cpu": [
         "arm64"
       ],
@@ -2260,9 +2260,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.2.tgz",
-      "integrity": "sha512-KnXU4m9MywuZFedL35Z3PuwiTSn/yqRIhrEA9j+7OSkji39NzVkgxuxTYg5F8ryGysq4iFADaU5osSizMXhU2A==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.3.tgz",
+      "integrity": "sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==",
       "cpu": [
         "arm64"
       ],
@@ -2274,9 +2274,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.2.tgz",
-      "integrity": "sha512-Hj77A3yTvUeCIx/Vi+4d4IbYhyTwtHj07lVzUgpUq9YpJSEiGJj4vXMKwzJ3w5zp5v3PFvpJNgc/J31smZey6g==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.3.tgz",
+      "integrity": "sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==",
       "cpu": [
         "x64"
       ],
@@ -2288,9 +2288,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.2.tgz",
-      "integrity": "sha512-RjgKf5C3xbn8gxvCm5VgKZ4nn0pRAIe90J0/fdHUsgztd3+Zesb2lm2+r6uX4prV2eUByuxJNdt647/1KPRq5g==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.3.tgz",
+      "integrity": "sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==",
       "cpu": [
         "arm64"
       ],
@@ -2302,9 +2302,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.2.tgz",
-      "integrity": "sha512-duq21FoXwQtuws+V9H6UZ+eCBc7fxSpMK1GQINKn3fAyd9DFYKPJNcUhdIKOrMFjLEJgQskoMoiuizMt+dl20g==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.3.tgz",
+      "integrity": "sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==",
       "cpu": [
         "x64"
       ],
@@ -2316,9 +2316,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.2.tgz",
-      "integrity": "sha512-6npqOKEPRZkLrMcvyC/32OzJ2srdPzCylJjiTJT2c0bwwSGm7nz2F9mNQ1WrAqCBZROcQn91Fno+khFhVijmFA==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.3.tgz",
+      "integrity": "sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==",
       "cpu": [
         "arm"
       ],
@@ -2330,9 +2330,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.2.tgz",
-      "integrity": "sha512-V9Xg6eXtgBtHq2jnuQwM/jr2mwe2EycnopO8cbOvpzFuySCGtKlPCI3Hj9xup/pJK5Q0388qfZZy2DqV2J8ftw==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.3.tgz",
+      "integrity": "sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==",
       "cpu": [
         "arm"
       ],
@@ -2344,9 +2344,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.2.tgz",
-      "integrity": "sha512-uCFX9gtZJoQl2xDTpRdseYuNqyKkuMDtH6zSrBTA28yTfKyjN9hQ2B04N5ynR8ILCoSDOrG/Eg+J2TtJ1e/CSA==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.3.tgz",
+      "integrity": "sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==",
       "cpu": [
         "arm64"
       ],
@@ -2358,9 +2358,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.2.tgz",
-      "integrity": "sha512-/PU9P+7Rkz8JFYDHIi+xzHabOu9qEWR07L5nWLIUsvserrxegZExKCi2jhMZRd0ATdboKylu/K5yAXbp7fYFvA==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.3.tgz",
+      "integrity": "sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==",
       "cpu": [
         "arm64"
       ],
@@ -2372,9 +2372,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.2.tgz",
-      "integrity": "sha512-eCHmol/dT5odMYi/N0R0HC8V8QE40rEpkyje/ZAXJYNNoSfrObOvG/Mn+s1F/FJyB7co7UQZZf6FuWnN6a7f4g==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.3.tgz",
+      "integrity": "sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==",
       "cpu": [
         "ppc64"
       ],
@@ -2386,9 +2386,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.2.tgz",
-      "integrity": "sha512-DEP3Njr9/ADDln3kNi76PXonLMSSMiCir0VHXxmGSHxCxDfQ70oWjHcJGfiBugzaqmYdTC7Y+8Int6qbnxPBIQ==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.3.tgz",
+      "integrity": "sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==",
       "cpu": [
         "riscv64"
       ],
@@ -2400,9 +2400,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.2.tgz",
-      "integrity": "sha512-NHGo5i6IE/PtEPh5m0yw5OmPMpesFnzMIS/lzvN5vknnC1sXM5Z/id5VgcNPgpD+wHmIcuYYgW+Q53v+9s96lQ==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.3.tgz",
+      "integrity": "sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==",
       "cpu": [
         "s390x"
       ],
@@ -2414,9 +2414,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.2.tgz",
-      "integrity": "sha512-PaW2DY5Tan+IFvNJGHDmUrORadbe/Ceh8tQxi8cmdQVCCYsLoQo2cuaSj+AU+YRX8M4ivS2vJ9UGaxfuNN7gmg==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.3.tgz",
+      "integrity": "sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==",
       "cpu": [
         "x64"
       ],
@@ -2428,9 +2428,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.2.tgz",
-      "integrity": "sha512-dOlWEMg2gI91Qx5I/HYqOD6iqlJspxLcS4Zlg3vjk1srE67z5T2Uz91yg/qA8sY0XcwQrFzWWiZhMNERylLrpQ==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.3.tgz",
+      "integrity": "sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==",
       "cpu": [
         "x64"
       ],
@@ -2442,9 +2442,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.2.tgz",
-      "integrity": "sha512-euMIv/4x5Y2/ImlbGl88mwKNXDsvzbWUlT7DFky76z2keajCtcbAsN9LUdmk31hAoVmJJYSThgdA0EsPeTr1+w==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.3.tgz",
+      "integrity": "sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==",
       "cpu": [
         "arm64"
       ],
@@ -2456,9 +2456,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.2.tgz",
-      "integrity": "sha512-RsnE6LQkUHlkC10RKngtHNLxb7scFykEbEwOFDjr3CeCMG+Rr+cKqlkKc2/wJ1u4u990urRHCbjz31x84PBrSQ==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.3.tgz",
+      "integrity": "sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==",
       "cpu": [
         "ia32"
       ],
@@ -2470,9 +2470,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.2.tgz",
-      "integrity": "sha512-foJM5vv+z2KQmn7emYdDLyTbkoO5bkHZE1oth2tWbQNGW7mX32d46Hz6T0MqXdWS2vBZhaEtHqdy9WYwGfiliA==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.3.tgz",
+      "integrity": "sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==",
       "cpu": [
         "x64"
       ],
@@ -3214,6 +3214,12 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/@types/hammerjs": {
+      "version": "2.0.46",
+      "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz",
+      "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==",
+      "license": "MIT"
+    },
     "node_modules/@types/json-schema": {
       "version": "7.0.15",
       "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -3222,13 +3228,13 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "20.17.6",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz",
-      "integrity": "sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==",
+      "version": "22.9.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz",
+      "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "undici-types": "~6.19.2"
+        "undici-types": "~6.19.8"
       }
     },
     "node_modules/@types/qs": {
@@ -3267,17 +3273,17 @@
       "license": "MIT"
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.14.0.tgz",
-      "integrity": "sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w==",
+      "version": "8.15.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.15.0.tgz",
+      "integrity": "sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.14.0",
-        "@typescript-eslint/type-utils": "8.14.0",
-        "@typescript-eslint/utils": "8.14.0",
-        "@typescript-eslint/visitor-keys": "8.14.0",
+        "@typescript-eslint/scope-manager": "8.15.0",
+        "@typescript-eslint/type-utils": "8.15.0",
+        "@typescript-eslint/utils": "8.15.0",
+        "@typescript-eslint/visitor-keys": "8.15.0",
         "graphemer": "^1.4.0",
         "ignore": "^5.3.1",
         "natural-compare": "^1.4.0",
@@ -3301,16 +3307,16 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.14.0.tgz",
-      "integrity": "sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA==",
+      "version": "8.15.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.15.0.tgz",
+      "integrity": "sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.14.0",
-        "@typescript-eslint/types": "8.14.0",
-        "@typescript-eslint/typescript-estree": "8.14.0",
-        "@typescript-eslint/visitor-keys": "8.14.0",
+        "@typescript-eslint/scope-manager": "8.15.0",
+        "@typescript-eslint/types": "8.15.0",
+        "@typescript-eslint/typescript-estree": "8.15.0",
+        "@typescript-eslint/visitor-keys": "8.15.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -3330,14 +3336,14 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.14.0.tgz",
-      "integrity": "sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw==",
+      "version": "8.15.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz",
+      "integrity": "sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.14.0",
-        "@typescript-eslint/visitor-keys": "8.14.0"
+        "@typescript-eslint/types": "8.15.0",
+        "@typescript-eslint/visitor-keys": "8.15.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3348,14 +3354,14 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.14.0.tgz",
-      "integrity": "sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ==",
+      "version": "8.15.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.15.0.tgz",
+      "integrity": "sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.14.0",
-        "@typescript-eslint/utils": "8.14.0",
+        "@typescript-eslint/typescript-estree": "8.15.0",
+        "@typescript-eslint/utils": "8.15.0",
         "debug": "^4.3.4",
         "ts-api-utils": "^1.3.0"
       },
@@ -3366,6 +3372,9 @@
         "type": "opencollective",
         "url": "https://opencollective.com/typescript-eslint"
       },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0"
+      },
       "peerDependenciesMeta": {
         "typescript": {
           "optional": true
@@ -3373,9 +3382,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.14.0.tgz",
-      "integrity": "sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g==",
+      "version": "8.15.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz",
+      "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3387,14 +3396,14 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.14.0.tgz",
-      "integrity": "sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ==",
+      "version": "8.15.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz",
+      "integrity": "sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
-        "@typescript-eslint/types": "8.14.0",
-        "@typescript-eslint/visitor-keys": "8.14.0",
+        "@typescript-eslint/types": "8.15.0",
+        "@typescript-eslint/visitor-keys": "8.15.0",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
@@ -3416,16 +3425,16 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.14.0.tgz",
-      "integrity": "sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA==",
+      "version": "8.15.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.15.0.tgz",
+      "integrity": "sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "8.14.0",
-        "@typescript-eslint/types": "8.14.0",
-        "@typescript-eslint/typescript-estree": "8.14.0"
+        "@typescript-eslint/scope-manager": "8.15.0",
+        "@typescript-eslint/types": "8.15.0",
+        "@typescript-eslint/typescript-estree": "8.15.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3436,17 +3445,22 @@
       },
       "peerDependencies": {
         "eslint": "^8.57.0 || ^9.0.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.14.0.tgz",
-      "integrity": "sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==",
+      "version": "8.15.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz",
+      "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.14.0",
-        "eslint-visitor-keys": "^3.4.3"
+        "@typescript-eslint/types": "8.15.0",
+        "eslint-visitor-keys": "^4.2.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3456,6 +3470,19 @@
         "url": "https://opencollective.com/typescript-eslint"
       }
     },
+    "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
     "node_modules/@vitejs/plugin-vue": {
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.0.tgz",
@@ -4021,13 +4048,6 @@
         "node": ">= 0.12"
       }
     },
-    "node_modules/browserify-sign/node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/browserify-sign/node_modules/readable-stream": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
@@ -4190,11 +4210,12 @@
       }
     },
     "node_modules/chartjs-plugin-zoom": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.0.1.tgz",
-      "integrity": "sha512-ogOmLu6e+Q7E1XWOCOz9YwybMslz9qNfGV2a+qjfmqJYpsw5ZMoRHZBUyW+NGhkpQ5PwwPA/+rikHpBZb7PZuA==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.1.0.tgz",
+      "integrity": "sha512-7lMimfQCUaIJLhPJaWSAA4gw+1m8lyR3Wn+M3MxjHbM/XxRUnOxN7cM5RR9jUmxmyW0h7L2hZ8KhvUsqrFxy/Q==",
       "license": "MIT",
       "dependencies": {
+        "@types/hammerjs": "^2.0.45",
         "hammerjs": "^2.0.8"
       },
       "peerDependencies": {
@@ -5258,9 +5279,9 @@
       }
     },
     "node_modules/flatted": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
-      "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
+      "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
       "dev": true,
       "license": "ISC"
     },
@@ -5853,6 +5874,13 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -5968,9 +5996,9 @@
       "license": "MIT"
     },
     "node_modules/magic-string": {
-      "version": "0.30.12",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz",
-      "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
+      "version": "0.30.13",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.13.tgz",
+      "integrity": "sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==",
       "license": "MIT",
       "dependencies": {
         "@jridgewell/sourcemap-codec": "^1.5.0"
@@ -7013,9 +7041,9 @@
       }
     },
     "node_modules/rollup": {
-      "version": "4.27.2",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.2.tgz",
-      "integrity": "sha512-KreA+PzWmk2yaFmZVwe6GB2uBD86nXl86OsDkt1bJS9p3vqWuEQ6HnJJ+j/mZi/q0920P99/MVRlB4L3crpF5w==",
+      "version": "4.27.3",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.3.tgz",
+      "integrity": "sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7029,24 +7057,24 @@
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.27.2",
-        "@rollup/rollup-android-arm64": "4.27.2",
-        "@rollup/rollup-darwin-arm64": "4.27.2",
-        "@rollup/rollup-darwin-x64": "4.27.2",
-        "@rollup/rollup-freebsd-arm64": "4.27.2",
-        "@rollup/rollup-freebsd-x64": "4.27.2",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.27.2",
-        "@rollup/rollup-linux-arm-musleabihf": "4.27.2",
-        "@rollup/rollup-linux-arm64-gnu": "4.27.2",
-        "@rollup/rollup-linux-arm64-musl": "4.27.2",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.27.2",
-        "@rollup/rollup-linux-riscv64-gnu": "4.27.2",
-        "@rollup/rollup-linux-s390x-gnu": "4.27.2",
-        "@rollup/rollup-linux-x64-gnu": "4.27.2",
-        "@rollup/rollup-linux-x64-musl": "4.27.2",
-        "@rollup/rollup-win32-arm64-msvc": "4.27.2",
-        "@rollup/rollup-win32-ia32-msvc": "4.27.2",
-        "@rollup/rollup-win32-x64-msvc": "4.27.2",
+        "@rollup/rollup-android-arm-eabi": "4.27.3",
+        "@rollup/rollup-android-arm64": "4.27.3",
+        "@rollup/rollup-darwin-arm64": "4.27.3",
+        "@rollup/rollup-darwin-x64": "4.27.3",
+        "@rollup/rollup-freebsd-arm64": "4.27.3",
+        "@rollup/rollup-freebsd-x64": "4.27.3",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.27.3",
+        "@rollup/rollup-linux-arm-musleabihf": "4.27.3",
+        "@rollup/rollup-linux-arm64-gnu": "4.27.3",
+        "@rollup/rollup-linux-arm64-musl": "4.27.3",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.27.3",
+        "@rollup/rollup-linux-riscv64-gnu": "4.27.3",
+        "@rollup/rollup-linux-s390x-gnu": "4.27.3",
+        "@rollup/rollup-linux-x64-gnu": "4.27.3",
+        "@rollup/rollup-linux-x64-musl": "4.27.3",
+        "@rollup/rollup-win32-arm64-msvc": "4.27.3",
+        "@rollup/rollup-win32-ia32-msvc": "4.27.3",
+        "@rollup/rollup-win32-x64-msvc": "4.27.3",
         "fsevents": "~2.3.2"
       }
     },
@@ -7494,15 +7522,15 @@
       }
     },
     "node_modules/typescript-eslint": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.14.0.tgz",
-      "integrity": "sha512-K8fBJHxVL3kxMmwByvz8hNdBJ8a0YqKzKDX6jRlrjMuNXyd5T2V02HIq37+OiWXvUUOXgOOGiSSOh26Mh8pC3w==",
+      "version": "8.15.0",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.15.0.tgz",
+      "integrity": "sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/eslint-plugin": "8.14.0",
-        "@typescript-eslint/parser": "8.14.0",
-        "@typescript-eslint/utils": "8.14.0"
+        "@typescript-eslint/eslint-plugin": "8.15.0",
+        "@typescript-eslint/parser": "8.15.0",
+        "@typescript-eslint/utils": "8.15.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -7511,6 +7539,9 @@
         "type": "opencollective",
         "url": "https://opencollective.com/typescript-eslint"
       },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0"
+      },
       "peerDependenciesMeta": {
         "typescript": {
           "optional": true
diff --git a/package.json b/package.json
index 6beff182cb443921454191b000a2ffeefa1bef39..9f277ecb4005ccda4bdaf687d79f8ed9109ea1c5 100644
--- a/package.json
+++ b/package.json
@@ -15,13 +15,13 @@
     "@aws-sdk/client-s3": "^3.637.0",
     "@aws-sdk/lib-storage": "^3.637.0",
     "@aws-sdk/s3-request-presigner": "^3.637.0",
-    "@fortawesome/fontawesome-free": "~6.6.0",
+    "@fortawesome/fontawesome-free": "~6.7.0",
     "@hey-api/client-axios": "^0.2.7",
     "@popperjs/core": "~2.11.8",
     "ajv": "~8.17.0",
     "bootstrap": "~5.3.0",
     "chart.js": "~4.4.0",
-    "chartjs-plugin-zoom": "~2.0.1",
+    "chartjs-plugin-zoom": "~2.1.0",
     "dayjs": "~1.11.0",
     "dompurify": "~3.2.0",
     "filesize": "~10.1.0",
@@ -43,7 +43,7 @@
     "@tsconfig/node22": "^22.0.0",
     "@types/bootstrap": "~5.2.0",
     "@types/dompurify": "~3.0.0",
-    "@types/node": "^20.11.0",
+    "@types/node": "^22.9.0",
     "@types/qs": "^6.9.16",
     "@types/semver": "~7.5.1",
     "@types/showdown": "~2.0.1",
diff --git a/src/assets/base.css b/src/assets/base.css
index 459bda1b18677534994f349a59e766625fca9789..2f1e22ec1c4e1794dea8ea209c3e7b5db2b99d86 100644
--- a/src/assets/base.css
+++ b/src/assets/base.css
@@ -31,7 +31,8 @@
     --color-text: var(--vt-c-text-light-1);
 
     --section-gap: 160px;
-    --color-header: rgb(255, 177, 45)
+    --color-header: rgb(255, 177, 45);
+    --bs-cyan-rgb: rgb(29, 230, 230);
 }
 
 *,
@@ -70,8 +71,14 @@ header {
     --bs-box-shadow-lg: 0 1rem 3rem rgba(150, 150, 150, .575);
     --bs-box-shadow-inset: inset 0 1px 2px rgba(150, 150, 150, .475);
     --color-header: rgb(204, 129, 0);
+    --bs-cyan-rgb: rgb(0, 255, 255);
 }
 
 img {
     max-width: 100%;
 }
+
+.bg-cyan {
+    background-color: var(--bs-cyan-rgb) !important;
+    color: black;
+}
\ No newline at end of file
diff --git a/src/components/ParameterTable.vue b/src/components/ParameterTable.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7cfd8a234c782b98aa048a10a05cd5bc66e70fd8
--- /dev/null
+++ b/src/components/ParameterTable.vue
@@ -0,0 +1,199 @@
+<script setup lang="ts">
+import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
+import MarkdownRenderer from "@/components/MarkdownRenderer.vue";
+import type {
+  FlatWorkflowParameters,
+  TemporaryParams,
+} from "@/types/WorkflowParameters.ts";
+import { computed } from "vue";
+import { flattenParameters } from "@/utils/Workflow.ts";
+import type { RouteLocationRaw, RouteParamsRaw } from "vue-router";
+
+const props = defineProps<{
+  loading?: boolean;
+  parameters: TemporaryParams;
+}>();
+
+const emit = defineEmits<{
+  (e: "link-clicked", route: RouteLocationRaw): void;
+}>();
+
+const flatParameters = computed<FlatWorkflowParameters | undefined>(() => {
+  if (props.parameters.params == undefined) {
+    return undefined;
+  }
+  return flattenParameters(flattenParameters(props.parameters.params));
+});
+
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+function isBucketLink(value: any): boolean {
+  if (typeof value === "string") {
+    return value.startsWith("s3://");
+  }
+  return false;
+}
+
+function getS3LinkParameters(s3String: string): RouteParamsRaw {
+  const pathComponents = s3String.slice(5).split("/");
+  const s3File =
+    pathComponents.length > 1 &&
+    pathComponents[pathComponents.length - 1].includes(".");
+  return {
+    bucketName: pathComponents[0],
+    subFolders: pathComponents.slice(1, s3File ? -1 : undefined),
+  };
+}
+
+const logs_s3_path = computed<string | undefined>(
+  () => props.parameters.metaParams?.logs_s3_path ?? undefined,
+);
+const debug_s3_path = computed<string | undefined>(
+  () => props.parameters.metaParams?.debug_s3_path ?? undefined,
+);
+const provenance_s3_path = computed<string | undefined>(
+  () => props.parameters.metaParams?.provenance_s3_path ?? undefined,
+);
+const notes = computed<string | undefined>(
+  () => props.parameters.metaParams?.notes ?? undefined,
+);
+</script>
+
+<template>
+  <table class="table table-hover">
+    <caption class="placeholder-glow">
+      <span v-if="loading" class="placeholder col-1"></span>
+      <template v-else>
+        {{ Object.keys(flatParameters ?? {}).length }}
+      </template>
+      Parameters
+    </caption>
+    <tbody>
+      <template v-if="loading">
+        <tr v-for="n in 5" :key="n">
+          <th scope="row" style="width: 20%" class="placeholder-glow">
+            <div class="placeholder col-12"></div>
+          </th>
+          <td class="placeholder-glow">
+            <div class="placeholder col-8"></div>
+          </td>
+        </tr>
+      </template>
+      <template v-else>
+        <tr v-if="notes">
+          <th scope="row" class="text-end"><b>notes</b></th>
+          <th>
+            <markdown-renderer :markdown="notes" />
+          </th>
+        </tr>
+        <tr
+          v-if="logs_s3_path"
+          :class="{
+            'border-bottom-thick': !debug_s3_path && !provenance_s3_path,
+          }"
+        >
+          <th scope="row" style="width: 10%" class="text-end">
+            <b>logs</b>
+          </th>
+          <td>
+            <router-link
+              :to="{
+                name: 'bucket',
+                params: getS3LinkParameters(logs_s3_path),
+              }"
+              @click.prevent="
+                emit('link-clicked', {
+                  name: 'bucket',
+                  params: getS3LinkParameters(logs_s3_path),
+                })
+              "
+              >{{ logs_s3_path }}
+            </router-link>
+          </td>
+        </tr>
+        <tr
+          v-if="provenance_s3_path"
+          :class="{
+            'border-bottom-thick': !debug_s3_path,
+          }"
+        >
+          <th scope="row" style="width: 10%" class="text-end">
+            <b>provenance</b>
+          </th>
+          <td>
+            <router-link
+              :to="{
+                name: 'bucket',
+                params: getS3LinkParameters(provenance_s3_path),
+              }"
+              @click.prevent="
+                emit('link-clicked', {
+                  name: 'bucket',
+                  params: getS3LinkParameters(provenance_s3_path),
+                })
+              "
+              >{{ provenance_s3_path }}
+            </router-link>
+          </td>
+        </tr>
+        <tr v-if="debug_s3_path" class="border-bottom-thick">
+          <th scope="row" style="width: 10%" class="text-end">
+            <b>debug</b>
+          </th>
+          <td>
+            <router-link
+              :to="{
+                name: 'bucket',
+                params: getS3LinkParameters(debug_s3_path),
+              }"
+              @click.prevent="
+                emit('link-clicked', {
+                  name: 'bucket',
+                  params: getS3LinkParameters(debug_s3_path),
+                })
+              "
+              >{{ debug_s3_path }}
+            </router-link>
+          </td>
+        </tr>
+        <tr v-for="(value, name) in flatParameters" :key="name">
+          <th scope="row" style="width: 10%" class="text-end">
+            <b>{{ name }}</b>
+          </th>
+          <td>
+            <router-link
+              v-if="typeof value === 'string' && isBucketLink(value)"
+              :to="{
+                name: 'bucket',
+                params: getS3LinkParameters(value),
+              }"
+              @click.prevent="
+                emit('link-clicked', {
+                  name: 'bucket',
+                  params: getS3LinkParameters(value),
+                })
+              "
+              >{{ value }}
+            </router-link>
+            <a
+              v-else-if="typeof value === 'string' && value.startsWith('http')"
+              :href="value"
+              target="_blank"
+              >{{ value }}
+              <font-awesome-icon
+                icon="fa-solid fa-arrow-up-right-from-square"
+                class="ms-1"
+              />
+            </a>
+            <template v-else>{{ value }}</template>
+          </td>
+        </tr>
+      </template>
+    </tbody>
+  </table>
+</template>
+
+<style scoped>
+.border-bottom-thick {
+  border-bottom: 3px var(--bs-border-style) var(--bs-border-color) !important;
+}
+</style>
diff --git a/src/components/parameter-schema/LastParameterizationsModal.vue b/src/components/parameter-schema/LastParameterizationsModal.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2cf2ff6475698737f76ccf4f7690b6f9657e4e20
--- /dev/null
+++ b/src/components/parameter-schema/LastParameterizationsModal.vue
@@ -0,0 +1,314 @@
+<script setup lang="ts">
+import BootstrapModal from "@/components/modals/BootstrapModal.vue";
+import { computed, nextTick, onMounted, reactive, ref } from "vue";
+import { useUserStore } from "@/stores/users.ts";
+import { useWorkflowExecutionStore } from "@/stores/workflowExecutions.ts";
+import type { WorkflowExecutionOut } from "@/client";
+import { useNameStore } from "@/stores/names.ts";
+import dayjs from "dayjs";
+import type {
+  FlatWorkflowParameters,
+  NestedWorkflowParameters,
+  TemporaryParams,
+} from "@/types/WorkflowParameters.ts";
+import { flattenParameters } from "@/utils/Workflow.ts";
+import ParameterTable from "@/components/ParameterTable.vue";
+import { type RouteLocationRaw, useRouter } from "vue-router";
+import { Modal } from "bootstrap";
+
+const props = defineProps<{
+  modalId: string;
+  workflowId?: string;
+}>();
+
+const userRepository = useUserStore();
+const executionRepository = useWorkflowExecutionStore();
+const nameRepository = useNameStore();
+const router = useRouter();
+
+let parameterModal: Modal | null = null;
+
+let loadingObserver: IntersectionObserver;
+const endOfTableElement = ref<HTMLTableCaptionElement | undefined>(undefined);
+
+const formState = reactive<{
+  loading: boolean;
+  executions: WorkflowExecutionOut[];
+  params?: NestedWorkflowParameters;
+  selectedExecution?: WorkflowExecutionOut;
+}>({
+  loading: false,
+  executions: [],
+  params: undefined,
+  selectedExecution: undefined,
+});
+
+const emit = defineEmits<{
+  (e: "parameters-selected", params: TemporaryParams): void;
+}>();
+
+const statusToColorMapping = {
+  PENDING: "bg-warning",
+  SCHEDULED: "bg-warning",
+  RUNNING: "bg-info",
+  CANCELED: "bg-danger",
+  SUCCESS: "bg-success",
+  ERROR: "bg-danger",
+};
+
+const parameterTableParams = computed<TemporaryParams>(() => {
+  return {
+    params: formState.params,
+    metaParams: {
+      notes: formState.selectedExecution?.notes,
+      provenance_s3_path: formState.selectedExecution?.provenance_s3_path,
+      debug_s3_path: formState.selectedExecution?.debug_s3_path,
+      logs_s3_path: formState.selectedExecution?.logs_s3_path,
+    },
+  };
+});
+
+const executionIterator = ref<
+  AsyncGenerator<WorkflowExecutionOut[], void, never> | undefined
+>(undefined);
+
+function loadExecution() {
+  loadingObserver.disconnect();
+  formState.loading = true;
+  formState.executions = [];
+  executionIterator.value = executionRepository.fetchExecutionsRaw(
+    userRepository.currentUID,
+    undefined,
+    undefined,
+    props.workflowId,
+    undefined,
+    undefined,
+    30,
+  );
+  loadNextExecutions();
+}
+
+function loadNextExecutions() {
+  formState.loading = true;
+  executionIterator.value
+    ?.next()
+    .then((executions) => {
+      if (executions.done ?? false) {
+        return;
+      }
+      formState.executions.push(...executions.value);
+      nextTick(() => {
+        if (endOfTableElement.value != undefined) {
+          loadingObserver.observe(endOfTableElement.value);
+        }
+      });
+    })
+    .finally(() => {
+      formState.loading = false;
+    });
+}
+
+const flatParameters = computed<FlatWorkflowParameters | undefined>(() => {
+  if (formState.params == undefined) {
+    return undefined;
+  }
+  return flattenParameters(formState.params);
+});
+
+function emitParameters() {
+  if (formState.params != undefined) {
+    emit("parameters-selected", {
+      params: formState.params,
+      metaParams: {
+        notes: formState.selectedExecution?.notes,
+        provenance_s3_path: parentDir(
+          formState.selectedExecution?.provenance_s3_path,
+        ),
+        debug_s3_path: parentDir(formState.selectedExecution?.debug_s3_path),
+        logs_s3_path: parentDir(formState.selectedExecution?.logs_s3_path),
+      },
+    });
+    formState.selectedExecution = undefined;
+    formState.params = undefined;
+  }
+}
+
+function loadParameters(execution: WorkflowExecutionOut) {
+  executionRepository
+    .fetchExecutionParameters(execution.execution_id)
+    .then((params) => {
+      formState.selectedExecution = execution;
+      formState.params = params;
+    });
+}
+
+function handleLinkClick(route: RouteLocationRaw) {
+  parameterModal?.hide();
+  router.push(route);
+}
+
+onMounted(() => {
+  parameterModal = Modal.getOrCreateInstance("#" + props.modalId);
+  loadingObserver = new IntersectionObserver(
+    (entries) => {
+      if (entries.length > 0 && entries[0].isIntersecting) {
+        loadingObserver.unobserve(entries[0].target);
+        loadNextExecutions();
+      }
+    },
+    {
+      threshold: 0,
+      rootMargin: "0px 0px 150px 0px",
+    },
+  );
+  loadExecution();
+});
+
+function parentDir(s3Path?: string | null): string | undefined {
+  if (s3Path == undefined) {
+    return undefined;
+  }
+  return s3Path.split("/").slice(0, -1).join("/");
+}
+</script>
+
+<template>
+  <bootstrap-modal
+    :modal-id="props.modalId"
+    :static-backdrop="true"
+    modal-label="List Last Parameterization Modal"
+    size-modifier-modal="xl"
+  >
+    <template #header
+      >Last parameterization for
+      <b>{{ nameRepository.getName(props.workflowId) }}</b></template
+    >
+    <template #body>
+      <div class="overflow-y-auto" style="max-height: 40vh">
+        <table ref="executionTable" class="table table-hover align-middle">
+          <caption ref="endOfTableElement">
+            Displaying
+            {{
+              formState.executions.length
+            }}
+            Workflow Execution
+          </caption>
+          <thead>
+            <tr>
+              <th scope="col">Version</th>
+              <th scope="col">Status</th>
+              <th scope="col">Started</th>
+              <th scope="col">Duration</th>
+              <th scope="col"></th>
+            </tr>
+          </thead>
+          <tbody>
+            <template v-if="formState.executions.length > 0">
+              <tr
+                v-for="execution in formState.executions"
+                :id="`last-parameterization-execution-${execution.execution_id}`"
+                :key="execution.execution_id"
+              >
+                <td>
+                  <span v-if="execution.workflow_version_id">
+                    {{ nameRepository.getName(execution.workflow_version_id) }}
+                  </span>
+                  <span v-else>Deleted Workflow</span>
+                </td>
+                <td>
+                  <span
+                    class="rounded-pill py-1 px-2 text-light"
+                    :class="statusToColorMapping[execution.status]"
+                  >
+                    {{ execution.status }}</span
+                  >
+                </td>
+                <td>
+                  {{
+                    dayjs.unix(execution.start_time).format("DD.MM.YYYY HH:mm")
+                  }}
+                </td>
+                <td>
+                  <template v-if="execution.end_time">
+                    {{
+                      dayjs
+                        .duration(
+                          execution.end_time - execution.start_time,
+                          "seconds",
+                        )
+                        .humanize()
+                    }}
+                  </template>
+                  <template v-else>
+                    {{ dayjs.unix(execution.start_time).toNow(true) }}
+                  </template>
+                </td>
+                <td class="text-end">
+                  <button
+                    type="button"
+                    class="btn btn-secondary"
+                    @click="loadParameters(execution)"
+                  >
+                    View
+                  </button>
+                </td>
+              </tr>
+            </template>
+            <tr v-else-if="!formState.loading">
+              <td colspan="9" class="text-center">
+                <i>No workflow executions</i>
+              </td>
+            </tr>
+            <tr v-if="formState.loading">
+              <td colspan="9" class="text-center">
+                <div
+                  class="spinner-border text-secondary spinner-border-sm"
+                  role="status"
+                >
+                  <span class="visually-hidden">Loading...</span>
+                </div>
+              </td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+      <div
+        v-if="flatParameters"
+        class="overflow-y-auto mt-2"
+        style="max-height: 50vh"
+      >
+        <h5>
+          Parameters
+          <span v-if="formState.selectedExecution != undefined"
+            >from
+            {{
+              dayjs
+                .unix(formState.selectedExecution.start_time)
+                .format("DD.MM.YYYY HH:mm")
+            }}</span
+          >:
+        </h5>
+        <parameter-table
+          :parameters="parameterTableParams"
+          @link-clicked="handleLinkClick"
+        />
+      </div>
+    </template>
+    <template #footer>
+      <button
+        type="button"
+        class="btn btn-success"
+        data-bs-dismiss="modal"
+        :disabled="formState.params == undefined"
+        @click="emitParameters"
+      >
+        Load
+      </button>
+      <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
+        Close
+      </button>
+    </template>
+  </bootstrap-modal>
+</template>
+
+<style scoped></style>
diff --git a/src/components/parameter-schema/ParameterSchemaFormComponent.vue b/src/components/parameter-schema/ParameterSchemaFormComponent.vue
index a0c2069bef6e9a11ab17355e129a463981a602e8..2ebc26f432ca2f1773017e3220e38646b90b587e 100644
--- a/src/components/parameter-schema/ParameterSchemaFormComponent.vue
+++ b/src/components/parameter-schema/ParameterSchemaFormComponent.vue
@@ -22,6 +22,7 @@ import type {
 import { useWorkflowExecutionStore } from "@/stores/workflowExecutions";
 import { NextflowVersion, type ParameterExtension } from "@/client/types.gen";
 import { flattenParameters, nestParameters } from "@/utils/Workflow";
+import LastParameterizationsModal from "@/components/parameter-schema/LastParameterizationsModal.vue";
 
 const bucketRepository = useBucketStore();
 const resourceRepository = useResourceStore();
@@ -61,6 +62,10 @@ const props = defineProps({
       return ["simple", "advanced", "expert"].includes(value);
     },
   },
+  workflowId: {
+    type: String,
+    required: false,
+  },
 });
 
 const emit = defineEmits<{
@@ -270,7 +275,7 @@ function scroll(selectedAnchor: string) {
 onMounted(() => {
   if (props.schema) updateSchema(props.schema);
   if (props.clowmInfo?.exampleParameters)
-    Tooltip.getOrCreateInstance("#exampleDataButton");
+    Tooltip.getOrCreateInstance("#TryItOutButton");
   bucketRepository.fetchOwnBuckets();
   bucketRepository.fetchOwnPermissions();
   keyRepository.fetchS3Keys();
@@ -302,13 +307,18 @@ onMounted(() => {
   <upload-parameter-file-modal
     modal-id="parameterUploadModal"
     @parameters-uploaded="
-      (params: FlatWorkflowParameters) =>
+      (params: NestedWorkflowParameters) =>
         loadParameters({
           params: params,
           metaParams: {},
         })
     "
   />
+  <last-parameterizations-modal
+    modal-id="last-parameterization-modal"
+    :workflow-id="workflowId"
+    @parameters-selected="loadParameters"
+  />
   <div class="row align-items-start">
     <form
       v-if="props.schema"
@@ -340,7 +350,7 @@ onMounted(() => {
           <h5 class="card-title">
             General Options about the pipeline execution
           </h5>
-          <div v-if="props.allowNotes" :hidden="!showOptional">
+          <div v-if="props.allowNotes">
             <code
               class="bg-secondary-subtle p-2 rounded-top border border-secondary"
               >--notes</code
@@ -564,7 +574,7 @@ onMounted(() => {
       <div class="d-grid gap-2 mb-2 px-2">
         <button
           v-if="props.clowmInfo?.exampleParameters"
-          id="exampleDataButton"
+          id="TryItOutButton"
           type="button"
           class="btn btn-primary"
           data-bs-toggle="tooltip"
@@ -578,6 +588,15 @@ onMounted(() => {
         >
           Try it out
         </button>
+        <button
+          type="button"
+          class="btn btn-primary"
+          data-bs-toggle="modal"
+          data-bs-target="#last-parameterization-modal"
+        >
+          <font-awesome-icon icon="fas fa-user-gear" class="me-2" />
+          My last parameterizations
+        </button>
         <button
           class="btn btn-primary"
           data-bs-toggle="modal"
diff --git a/src/components/parameter-schema/UploadParameterFileModal.vue b/src/components/parameter-schema/UploadParameterFileModal.vue
index 7aabd414311dd21f9678ac2a1f1f90b9ede1fdac..b90a3eff66f1d82504b7df36ef2a9d3619925e9f 100644
--- a/src/components/parameter-schema/UploadParameterFileModal.vue
+++ b/src/components/parameter-schema/UploadParameterFileModal.vue
@@ -1,11 +1,14 @@
 <script setup lang="ts">
 import BootstrapModal from "@/components/modals/BootstrapModal.vue";
-import { computed, reactive, ref } from "vue";
+import { computed, onMounted, reactive, ref } from "vue";
 import type {
   NestedWorkflowParameters,
   FlatWorkflowParameters,
 } from "@/types/WorkflowParameters";
 import { flattenParameters } from "@/utils/Workflow";
+import ParameterTable from "@/components/ParameterTable.vue";
+import { type RouteLocationRaw, useRouter } from "vue-router";
+import { Modal } from "bootstrap";
 
 const props = defineProps<{
   modalId: string;
@@ -19,8 +22,10 @@ const parameterState = reactive<{
   error: undefined,
 });
 
+const router = useRouter();
 const randomIDSuffix = Math.random().toString(16).substring(2, 8);
 const parameterFileInput = ref<HTMLInputElement | undefined>(undefined);
+let parameterModal: Modal | null = null;
 
 const emit = defineEmits<{
   (e: "parameters-uploaded", params: NestedWorkflowParameters): void;
@@ -64,13 +69,22 @@ function fileChange() {
     }
   });
 }
+
+function handleLinkClick(route: RouteLocationRaw) {
+  parameterModal?.hide();
+  router.push(route);
+}
+
+onMounted(() => {
+  parameterModal = Modal.getOrCreateInstance("#" + props.modalId);
+});
 </script>
 
 <template>
   <bootstrap-modal
     :modal-id="props.modalId"
     :static-backdrop="true"
-    modal-label="Confirm Delete Modal"
+    modal-label="Upload Parameters Modal"
     size-modifier-modal="lg"
   >
     <template #header>Upload Parameter File</template>
@@ -92,24 +106,10 @@ function fileChange() {
       </template>
       <template v-else-if="flatParameters">
         <h5>Uploaded Parameters:</h5>
-        <table class="table table-bordered">
-          <caption>
-            {{
-              Object.keys(flatParameters).length
-            }}
-            Parameters
-          </caption>
-          <tbody>
-            <tr v-for="(value, name) in flatParameters" :key="name">
-              <th scope="row" style="width: 10%" class="text-end">
-                <b>{{ name }}</b>
-              </th>
-              <td>
-                {{ value }}
-              </td>
-            </tr>
-          </tbody>
-        </table>
+        <parameter-table
+          :parameters="{ params: parameterState.params }"
+          @link-clicked="handleLinkClick"
+        />
       </template>
     </template>
     <template #footer>
diff --git a/src/components/parameter-schema/description-mode/ParameterDescription.vue b/src/components/parameter-schema/description-mode/ParameterDescription.vue
index ef548fbce7c15330372b80fc6be1524d14508725..4e3bc3e9c0870ca76b695e8d35e7c95c7228f9f4 100644
--- a/src/components/parameter-schema/description-mode/ParameterDescription.vue
+++ b/src/components/parameter-schema/description-mode/ParameterDescription.vue
@@ -134,7 +134,7 @@ onMounted(() => {
           </span>
           <span
             v-if="anyOfTooltip != undefined"
-            class="rounded py-0 px-1 bg-secondary ms-2 label w-fit fs-6"
+            class="rounded py-0 px-1 bg-cyan ms-2 label w-fit fs-6"
             data-bs-toggle="tooltip"
             data-bs-placement="bottom"
             :data-bs-title="anyOfTooltip"
@@ -144,7 +144,7 @@ onMounted(() => {
           >
           <span
             v-if="oneOfTooltip != undefined"
-            class="rounded py-0 px-1 bg-secondary ms-2 label w-fit fs-6"
+            class="rounded py-0 px-1 bg-cyan ms-2 label w-fit fs-6"
             data-bs-toggle="tooltip"
             data-bs-placement="bottom"
             :data-bs-title="oneOfTooltip"
@@ -154,7 +154,7 @@ onMounted(() => {
           >
           <span
             v-if="dependentTooltip != undefined"
-            class="rounded py-0 px-1 bg-secondary ms-2 label w-fit fs-6"
+            class="rounded py-0 px-1 bg-cyan ms-2 label w-fit fs-6"
             data-bs-toggle="tooltip"
             data-bs-placement="bottom"
             :data-bs-title="dependentTooltip"
diff --git a/src/components/parameter-schema/form-mode/ParameterGroupForm.vue b/src/components/parameter-schema/form-mode/ParameterGroupForm.vue
index f3555c7d3392562f41aad2bb9f0ba3b4bc171aef..70ad2e6bbe99c9ec30a356dd14da972d11d3ffdd 100644
--- a/src/components/parameter-schema/form-mode/ParameterGroupForm.vue
+++ b/src/components/parameter-schema/form-mode/ParameterGroupForm.vue
@@ -350,7 +350,7 @@ onMounted(() => {
           </span>
           <span
             v-if="anyOfTooltip[parameterName] != undefined"
-            class="rounded p-1 bg-secondary ms-2 label"
+            class="rounded p-1 bg-cyan ms-2 label"
             data-bs-toggle="tooltip"
             data-bs-placement="bottom"
             :data-bs-title="anyOfTooltip[parameterName]"
@@ -360,7 +360,7 @@ onMounted(() => {
           >
           <span
             v-if="oneOfTooltip[parameterName] != undefined"
-            class="rounded p-1 bg-secondary ms-2 label"
+            class="rounded p-1 bg-cyan ms-2 label"
             data-bs-toggle="tooltip"
             data-bs-placement="bottom"
             :data-bs-title="oneOfTooltip[parameterName]"
@@ -370,7 +370,7 @@ onMounted(() => {
           >
           <span
             v-if="dependentTooltip[parameterName] != undefined"
-            class="rounded p-1 bg-secondary ms-2 label"
+            class="rounded p-1 bg-cyan ms-2 label"
             data-bs-toggle="tooltip"
             data-bs-placement="bottom"
             :data-bs-title="dependentTooltip[parameterName]"
diff --git a/src/components/workflows/modals/ParameterModal.vue b/src/components/workflows/modals/ParameterModal.vue
index 23c3f6c174b5aa51fd05914e54e41a3c7bb58070..9b52f749880d5a9b8925a2afaa8cc1f47ca79ae0 100644
--- a/src/components/workflows/modals/ParameterModal.vue
+++ b/src/components/workflows/modals/ParameterModal.vue
@@ -2,7 +2,7 @@
 import BootstrapModal from "@/components/modals/BootstrapModal.vue";
 import { computed, onMounted, reactive, watch } from "vue";
 import { useWorkflowExecutionStore } from "@/stores/workflowExecutions";
-import type { RouteLocationRaw, RouteParamsRaw } from "vue-router";
+import type { RouteLocationRaw } from "vue-router";
 import { Modal } from "bootstrap";
 import { useRouter } from "vue-router";
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
@@ -12,10 +12,9 @@ import { useWorkflowStore } from "@/stores/workflows";
 import { createDownloadUrl } from "@/utils/DownloadJson";
 import type {
   NestedWorkflowParameters,
-  FlatWorkflowParameters,
+  TemporaryParams,
 } from "@/types/WorkflowParameters";
-import { flattenParameters } from "@/utils/Workflow";
-import MarkdownRenderer from "@/components/MarkdownRenderer.vue";
+import ParameterTable from "@/components/ParameterTable.vue";
 
 const nameRepository = useNameStore();
 const executionRepository = useWorkflowExecutionStore();
@@ -82,11 +81,16 @@ const parameters = computed<NestedWorkflowParameters | undefined>(() => {
   return executionRepository.parameters[props.executionId] ?? undefined;
 });
 
-const flatParameters = computed<FlatWorkflowParameters | undefined>(() => {
-  if (parameters.value == undefined) {
-    return undefined;
-  }
-  return flattenParameters(flattenParameters(parameters.value));
+const parameterTableParams = computed<TemporaryParams>(() => {
+  return {
+    params: parameters.value,
+    metaParams: {
+      notes: notes.value,
+      provenance_s3_path: provenance_s3_path.value,
+      debug_s3_path: debug_s3_path.value,
+      logs_s3_path: logs_s3_path.value,
+    },
+  };
 });
 
 const parameterDownloadUrl = computed<string | undefined>(() => {
@@ -150,25 +154,6 @@ function saveParameters() {
   }
 }
 
-function getS3LinkParameters(s3String: string): RouteParamsRaw {
-  const pathComponents = s3String.slice(5).split("/");
-  const s3File =
-    pathComponents.length > 1 &&
-    pathComponents[pathComponents.length - 1].includes(".");
-  return {
-    bucketName: pathComponents[0],
-    subFolders: pathComponents.slice(1, s3File ? -1 : undefined),
-  };
-}
-
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-function isBucketLink(value: any): boolean {
-  if (typeof value === "string") {
-    return value.startsWith("s3://");
-  }
-  return false;
-}
-
 watch(
   () => props.executionId,
   (newId, oldId) => {
@@ -209,139 +194,12 @@ onMounted(() => {
           Workflow Execution <i>{{ props.executionId }}</i> not found
         </p>
       </div>
-      <table v-else-if="props.executionId" class="table table-hover">
-        <caption class="placeholder-glow">
-          <span v-if="parameterState.loading" class="placeholder col-1"></span>
-          <template v-else>
-            {{ Object.keys(flatParameters ?? {}).length }}
-          </template>
-          Parameters
-        </caption>
-        <tbody>
-          <template v-if="parameterState.loading">
-            <tr v-for="n in 6" :key="n">
-              <th scope="row" style="width: 20%" class="placeholder-glow">
-                <div class="placeholder col-12"></div>
-              </th>
-              <td class="placeholder-glow">
-                <div class="placeholder col-8"></div>
-              </td>
-            </tr>
-          </template>
-          <template v-else>
-            <tr v-if="execution?.notes">
-              <th scope="row" class="text-end"><b>Notes</b></th>
-              <th>
-                <markdown-renderer :markdown="execution.notes" />
-              </th>
-            </tr>
-            <tr
-              v-if="logs_s3_path"
-              :class="{
-                'border-bottom-thick': !debug_s3_path && !provenance_s3_path,
-              }"
-            >
-              <th scope="row" style="width: 10%" class="text-end">
-                <b>logs</b>
-              </th>
-              <td>
-                <router-link
-                  :to="{
-                    name: 'bucket',
-                    params: getS3LinkParameters(logs_s3_path),
-                  }"
-                  @click.prevent="
-                    handleLinkClick({
-                      name: 'bucket',
-                      params: getS3LinkParameters(logs_s3_path),
-                    })
-                  "
-                  >{{ logs_s3_path }}
-                </router-link>
-              </td>
-            </tr>
-            <tr
-              v-if="provenance_s3_path"
-              :class="{
-                'border-bottom-thick': !debug_s3_path,
-              }"
-            >
-              <th scope="row" style="width: 10%" class="text-end">
-                <b>provenance</b>
-              </th>
-              <td>
-                <router-link
-                  :to="{
-                    name: 'bucket',
-                    params: getS3LinkParameters(provenance_s3_path),
-                  }"
-                  @click.prevent="
-                    handleLinkClick({
-                      name: 'bucket',
-                      params: getS3LinkParameters(provenance_s3_path),
-                    })
-                  "
-                  >{{ provenance_s3_path }}
-                </router-link>
-              </td>
-            </tr>
-            <tr v-if="debug_s3_path" class="border-bottom-thick">
-              <th scope="row" style="width: 10%" class="text-end">
-                <b>debug</b>
-              </th>
-              <td>
-                <router-link
-                  :to="{
-                    name: 'bucket',
-                    params: getS3LinkParameters(debug_s3_path),
-                  }"
-                  @click.prevent="
-                    handleLinkClick({
-                      name: 'bucket',
-                      params: getS3LinkParameters(debug_s3_path),
-                    })
-                  "
-                  >{{ debug_s3_path }}
-                </router-link>
-              </td>
-            </tr>
-            <tr v-for="(value, name) in flatParameters" :key="name">
-              <th scope="row" style="width: 10%" class="text-end">
-                <b>{{ name }}</b>
-              </th>
-              <td>
-                <router-link
-                  v-if="typeof value === 'string' && isBucketLink(value)"
-                  :to="{
-                    name: 'bucket',
-                    params: getS3LinkParameters(value),
-                  }"
-                  @click.prevent="
-                    handleLinkClick({
-                      name: 'bucket',
-                      params: getS3LinkParameters(value),
-                    })
-                  "
-                  >{{ value }}
-                </router-link>
-                <a
-                  v-else-if="
-                    typeof value === 'string' && value.startsWith('http')
-                  "
-                  :href="value"
-                  target="_blank"
-                  >{{ value }}
-                  <font-awesome-icon
-                    icon="fa-solid fa-arrow-up-right-from-square"
-                    class="ms-1"
-                  />
-                </a>
-                <template v-else>{{ value }}</template>
-              </td>
-            </tr>
-          </template>
-        </tbody>
-      </table>
+      <parameter-table
+        v-else-if="props.executionId"
+        :loading="parameterState.loading"
+        :parameters="parameterTableParams"
+        @link-clicked="handleLinkClick"
+      />
     </template>
     <template #footer>
       <router-link
@@ -398,8 +256,4 @@ onMounted(() => {
   </bootstrap-modal>
 </template>
 
-<style scoped>
-.border-bottom-thick {
-  border-bottom: 3px var(--bs-border-style) var(--bs-border-color) !important;
-}
-</style>
+<style scoped></style>
diff --git a/src/stores/workflowExecutions.ts b/src/stores/workflowExecutions.ts
index 554ace50f4d508bb052d8234571c77002752ed44..7fe936a949de0fb85efc0c21d140a58d2a97bd6d 100644
--- a/src/stores/workflowExecutions.ts
+++ b/src/stores/workflowExecutions.ts
@@ -47,7 +47,7 @@ export const useWorkflowExecutionStore = defineStore({
       anonymizedExecutions: AnonymizedWorkflowExecution[];
       parameters: Record<string, FlatWorkflowParameters>;
       __temporaryParameters?: FlatWorkflowParameters;
-      __temporaryMetaParameters?: Record<string, string>;
+      __temporaryMetaParameters?: Record<string, string | undefined | null>;
     },
   getters: {
     executions(): WorkflowExecutionOut[] {
diff --git a/src/types/WorkflowParameters.ts b/src/types/WorkflowParameters.ts
index d524f052f53972677370d6add74c3f84325402fd..0328356bc8ec07f3bfa53ff1c46e5a3ca0b7c77d 100644
--- a/src/types/WorkflowParameters.ts
+++ b/src/types/WorkflowParameters.ts
@@ -7,10 +7,10 @@ export type FlatWorkflowParameters = Record<
 export type NestedWorkflowParameters = Record<string, any>;
 
 export type WorkflowMetaParameters = {
-  logs_s3_path?: string;
-  debug_s3_path?: string;
-  provenance_s3_path?: string;
-  notes?: string;
+  logs_s3_path?: string | null;
+  debug_s3_path?: string | null;
+  provenance_s3_path?: string | null;
+  notes?: string | null;
 };
 
 export type TemporaryParams = {
diff --git a/src/views/workflows/StartWorkflowView.vue b/src/views/workflows/StartWorkflowView.vue
index e84885ded48e880fec6450a0d0619f9ce0bc7d10..5ea539f48a61626b958398b37f5a9f4e544ee30e 100644
--- a/src/views/workflows/StartWorkflowView.vue
+++ b/src/views/workflows/StartWorkflowView.vue
@@ -137,6 +137,7 @@ onMounted(() => {
       workflowRepository.versionMapping[versionId]?.parameter_extension ??
       undefined
     "
+    :workflow-id="props.workflowId"
     @start-workflow="startWorkflow"
   />
 </template>