diff --git a/deployment/docker-compose.stack.yml b/deployment/docker-compose.stack.yml
index fdb7c1c6c..dd6042e55 100644
--- a/deployment/docker-compose.stack.yml
+++ b/deployment/docker-compose.stack.yml
@@ -756,7 +756,7 @@ services:
container_name: metabuilder-dbal-frontend
restart: unless-stopped
ports:
- - "3009:3000"
+ - "3015:3000"
environment:
NODE_ENV: production
PORT: 3000
diff --git a/frontends/caproverforge/portal/Dockerfile b/frontends/caproverforge/portal/Dockerfile
index 6e5d2f997..113c482ac 100644
--- a/frontends/caproverforge/portal/Dockerfile
+++ b/frontends/caproverforge/portal/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:20-alpine AS base
+FROM node:24-alpine AS base
FROM base AS deps
RUN apk add --no-cache libc6-compat
@@ -10,7 +10,7 @@ FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
-RUN npm run build
+RUN mkdir -p public && npm run build
FROM base AS runner
WORKDIR /app
diff --git a/frontends/caproverforge/portal/app/page.tsx b/frontends/caproverforge/portal/app/page.tsx
index 38072aed0..557fe74cb 100644
--- a/frontends/caproverforge/portal/app/page.tsx
+++ b/frontends/caproverforge/portal/app/page.tsx
@@ -51,6 +51,8 @@ export default function Home() {
- ((e.currentTarget as HTMLAnchorElement).style.background =
- "var(--accent-hover)")
- }
- onMouseOut={(e) =>
- ((e.currentTarget as HTMLAnchorElement).style.background =
- "var(--accent)")
- }
>
Download APK
diff --git a/frontends/dbal/Dockerfile b/frontends/dbal/Dockerfile
index adf766f5d..defbe7b51 100644
--- a/frontends/dbal/Dockerfile
+++ b/frontends/dbal/Dockerfile
@@ -31,7 +31,7 @@ done
RUN cd frontends/dbal && npx next build
# --- Runtime stage ---
-FROM node:20-alpine
+FROM node:24-alpine
WORKDIR /app
COPY --from=builder /app/frontends/dbal/.next/standalone ./
diff --git a/frontends/dockerterminal/frontend/Dockerfile b/frontends/dockerterminal/frontend/Dockerfile
index 0942ad798..5aba5b28c 100644
--- a/frontends/dockerterminal/frontend/Dockerfile
+++ b/frontends/dockerterminal/frontend/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:20-alpine AS base
+FROM node:24-alpine AS base
# Install dependencies only when needed
FROM base AS deps
diff --git a/frontends/emailclient/Dockerfile b/frontends/emailclient/Dockerfile
index 06f397591..ac49447a0 100644
--- a/frontends/emailclient/Dockerfile
+++ b/frontends/emailclient/Dockerfile
@@ -61,7 +61,7 @@ done
RUN cd frontends/emailclient && npx next build --webpack
# --- Runtime stage ---
-FROM node:20-alpine
+FROM node:24-alpine
WORKDIR /app
COPY --from=builder /app/frontends/emailclient/.next/standalone ./
diff --git a/frontends/exploded-diagrams/Dockerfile b/frontends/exploded-diagrams/Dockerfile
index a2444f295..ca4459073 100644
--- a/frontends/exploded-diagrams/Dockerfile
+++ b/frontends/exploded-diagrams/Dockerfile
@@ -1,6 +1,6 @@
# Multi-stage build (standalone - no monorepo deps)
# Context: monorepo root (..)
-FROM node:22-alpine AS deps
+FROM node:24-alpine AS deps
WORKDIR /app
COPY frontends/exploded-diagrams/package.json ./frontends/exploded-diagrams/
@@ -17,7 +17,7 @@ COPY frontends/exploded-diagrams/ ./frontends/exploded-diagrams/
RUN cd frontends/exploded-diagrams && npx next build --webpack
# --- Runtime stage ---
-FROM node:22-alpine
+FROM node:24-alpine
WORKDIR /app
COPY --from=builder /app/frontends/exploded-diagrams/.next/standalone ./
diff --git a/frontends/nextjs/Dockerfile b/frontends/nextjs/Dockerfile
index 0436d9187..dc62a8359 100644
--- a/frontends/nextjs/Dockerfile
+++ b/frontends/nextjs/Dockerfile
@@ -61,7 +61,7 @@ done
RUN cd frontends/nextjs && npx next build --webpack
# --- Runtime stage ---
-FROM node:20-alpine
+FROM node:24-alpine
WORKDIR /app
COPY --from=builder /app/frontends/nextjs/.next/standalone ./
diff --git a/frontends/packagerepo/frontend/Dockerfile b/frontends/packagerepo/frontend/Dockerfile
index dd1fb0704..04c01a022 100644
--- a/frontends/packagerepo/frontend/Dockerfile
+++ b/frontends/packagerepo/frontend/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:18-alpine AS base
+FROM node:24-alpine AS base
# Install dependencies only when needed
FROM base AS deps
diff --git a/frontends/pastebin/Dockerfile b/frontends/pastebin/Dockerfile
index bedefafb9..bcbe2798f 100644
--- a/frontends/pastebin/Dockerfile
+++ b/frontends/pastebin/Dockerfile
@@ -61,7 +61,7 @@ done
RUN cd frontends/pastebin && npx next build --webpack
# --- Runtime stage ---
-FROM node:20-alpine
+FROM node:24-alpine
WORKDIR /app
COPY --from=builder /app/frontends/pastebin/.next/standalone ./
diff --git a/frontends/postgres/Dockerfile b/frontends/postgres/Dockerfile
index 1a7adb3c2..03c5b1677 100644
--- a/frontends/postgres/Dockerfile
+++ b/frontends/postgres/Dockerfile
@@ -65,7 +65,7 @@ ENV NODE_OPTIONS="--max-old-space-size=3072"
RUN cd frontends/postgres && npx next build --webpack
# --- Runtime stage ---
-FROM node:20-alpine
+FROM node:24-alpine
WORKDIR /app
COPY --from=builder /app/frontends/postgres/.next/standalone ./
diff --git a/frontends/repoforge/portal/Dockerfile b/frontends/repoforge/portal/Dockerfile
index 6e5d2f997..113c482ac 100644
--- a/frontends/repoforge/portal/Dockerfile
+++ b/frontends/repoforge/portal/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:20-alpine AS base
+FROM node:24-alpine AS base
FROM base AS deps
RUN apk add --no-cache libc6-compat
@@ -10,7 +10,7 @@ FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
-RUN npm run build
+RUN mkdir -p public && npm run build
FROM base AS runner
WORKDIR /app
diff --git a/frontends/workflowui/Dockerfile b/frontends/workflowui/Dockerfile
index a59f92679..ecafbdf19 100644
--- a/frontends/workflowui/Dockerfile
+++ b/frontends/workflowui/Dockerfile
@@ -65,7 +65,7 @@ done
RUN cd frontends/workflowui && npx next build --turbopack
# --- Runtime stage ---
-FROM node:20-alpine
+FROM node:24-alpine
WORKDIR /app
# Install Python for Flask backend
diff --git a/storybook/Dockerfile b/storybook/Dockerfile
index f129186d3..490a402c6 100644
--- a/storybook/Dockerfile
+++ b/storybook/Dockerfile
@@ -1,6 +1,6 @@
# Multi-stage build: deps cached separately from source changes
# Context: monorepo root (..)
-FROM node:20-alpine AS deps
+FROM node:24-alpine AS deps
WORKDIR /app
COPY package.json .npmrc ./