+
!l.adminOnly || isAdmin)}
/>
-
+
+
);
diff --git a/ci/deploy-client.sh b/ci/deploy-client.sh
index c22267f..50c99c3 100755
--- a/ci/deploy-client.sh
+++ b/ci/deploy-client.sh
@@ -4,20 +4,26 @@ set -euo pipefail
# Builds the client SPA and deploys to Cloudflare Pages.
#
# Required env vars:
-# CLOUDFLARE_API_TOKEN — Cloudflare API token with Pages permissions
-# CLOUDFLARE_ACCOUNT_ID — Cloudflare account ID
+# CLOUDFLARE_API_TOKEN - Cloudflare API token with Pages permissions
+# CLOUDFLARE_ACCOUNT_ID - Cloudflare account ID
#
# Optional env vars:
-# VITE_SERVER_URL — API server URL (default: https://cv-generator-api.riotbyte.com)
-# PAGES_PROJECT — Cloudflare Pages project name (default: cv-generator)
+# VITE_SERVER_URL - API server URL (default: https://cv-generator-api.riotbyte.com)
+# VITE_APP_VERSION - SPA version label baked into the build (default: dev)
+# VITE_GIT_SHA - git sha baked into the build (default: unknown)
+# VITE_BUILD_DATE - ISO build timestamp baked into the build (default: current UTC time)
+# PAGES_PROJECT - Cloudflare Pages project name (default: cv-generator)
export VITE_SERVER_URL="${VITE_SERVER_URL:-https://cv-generator-api.riotbyte.com}"
+export VITE_APP_VERSION="${VITE_APP_VERSION:-dev}"
+export VITE_GIT_SHA="${VITE_GIT_SHA:-unknown}"
+export VITE_BUILD_DATE="${VITE_BUILD_DATE:-$(date -u +%Y-%m-%dT%H:%M:%SZ)}"
PAGES_PROJECT="${PAGES_PROJECT:-cv-generator}"
: "${CLOUDFLARE_API_TOKEN:?CLOUDFLARE_API_TOKEN is required}"
: "${CLOUDFLARE_ACCOUNT_ID:?CLOUDFLARE_ACCOUNT_ID is required}"
-echo "Building client with VITE_SERVER_URL=${VITE_SERVER_URL}..."
+echo "Building client (VITE_SERVER_URL=${VITE_SERVER_URL}, VITE_APP_VERSION=${VITE_APP_VERSION})..."
pnpm --filter @cv/client build
echo "Deploying to Cloudflare Pages project '${PAGES_PROJECT}'..."