From 3e3f6d521a78f104ebc7b57c8f45a5a66ab7d8b2 Mon Sep 17 00:00:00 2001 From: KM Koushik Date: Sun, 7 Dec 2025 22:18:56 +1100 Subject: [PATCH] Display Docker image version in sidebar (#304) Co-authored-by: Claude --- .github/workflows/publish.yml | 2 ++ apps/web/src/components/AppSideBar.tsx | 32 ++++++++++++++++++++++++++ apps/web/src/env.js | 4 ++++ docker/Dockerfile | 6 +++++ docker/build.sh | 2 ++ 5 files changed, 46 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d9b2e7f..4da714e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -65,6 +65,8 @@ jobs: docker build \ -f "$DOCKER_FILE" \ --progress=plain \ + --build-arg APP_VERSION="$APP_VERSION" \ + --build-arg GIT_SHA="$GIT_SHA" \ -t "usesend/$APP-$BUILD_PLATFORM:latest" \ -t "usesend/$APP-$BUILD_PLATFORM:$GIT_SHA" \ -t "usesend/$APP-$BUILD_PLATFORM:$APP_VERSION" \ diff --git a/apps/web/src/components/AppSideBar.tsx b/apps/web/src/components/AppSideBar.tsx index f0f58b6..47bf9f8 100644 --- a/apps/web/src/components/AppSideBar.tsx +++ b/apps/web/src/components/AppSideBar.tsx @@ -51,6 +51,7 @@ import { DropdownMenuTrigger, } from "@usesend/ui/src/dropdown-menu"; import { FeedbackDialog } from "./FeedbackDialog"; +import { env } from "~/env"; // General items const generalItems = [ @@ -257,6 +258,7 @@ export function AppSidebar() { + {isSelfHosted() && } ); } + +function VersionInfo() { + const appVersion = env.NEXT_PUBLIC_APP_VERSION; + const gitSha = env.NEXT_PUBLIC_GIT_SHA; + + // If no version info available, don't render anything + if (!appVersion && !gitSha) { + return null; + } + + const displayVersion = + appVersion && appVersion !== "unknown" + ? appVersion + : gitSha && gitSha !== "unknown" + ? gitSha.substring(0, 7) + : null; + + if (!displayVersion) { + return null; + } + + return ( +
+
+ Version + {displayVersion} +
+
+ ); +} diff --git a/apps/web/src/env.js b/apps/web/src/env.js index f80b6bc..5cab490 100644 --- a/apps/web/src/env.js +++ b/apps/web/src/env.js @@ -83,6 +83,8 @@ export const env = createEnv({ .string() .default("false") .transform((str) => str === "true"), + NEXT_PUBLIC_APP_VERSION: z.string().optional(), + NEXT_PUBLIC_GIT_SHA: z.string().optional(), }, /** @@ -108,6 +110,8 @@ export const env = createEnv({ API_RATE_LIMIT: process.env.API_RATE_LIMIT, AUTH_EMAIL_RATE_LIMIT: process.env.AUTH_EMAIL_RATE_LIMIT, NEXT_PUBLIC_IS_CLOUD: process.env.NEXT_PUBLIC_IS_CLOUD, + NEXT_PUBLIC_APP_VERSION: process.env.NEXT_PUBLIC_APP_VERSION, + NEXT_PUBLIC_GIT_SHA: process.env.NEXT_PUBLIC_GIT_SHA, ADMIN_EMAIL: process.env.ADMIN_EMAIL, FOUNDER_EMAIL: process.env.FOUNDER_EMAIL, DISCORD_WEBHOOK_URL: process.env.DISCORD_WEBHOOK_URL, diff --git a/docker/Dockerfile b/docker/Dockerfile index 78b2171..b158234 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -46,7 +46,13 @@ RUN pnpm turbo run build --filter=web... FROM base AS runner WORKDIR /app +# Build arguments for version information +ARG APP_VERSION=unknown +ARG GIT_SHA=unknown +# Set version as environment variables +ENV NEXT_PUBLIC_APP_VERSION=$APP_VERSION +ENV NEXT_PUBLIC_GIT_SHA=$GIT_SHA COPY --from=installer /app/apps/web/next.config.js . COPY --from=installer /app/apps/web/package.json . diff --git a/docker/build.sh b/docker/build.sh index 3aaf89a..3348d65 100644 --- a/docker/build.sh +++ b/docker/build.sh @@ -17,6 +17,8 @@ echo "Git SHA: $GIT_SHA" docker build -f "$SCRIPT_DIR/Dockerfile" \ --progress=plain \ + --build-arg APP_VERSION="$APP_VERSION" \ + --build-arg GIT_SHA="$GIT_SHA" \ -t "unsend/unsend:latest" \ -t "unsend/unsend:$GIT_SHA" \ -t "unsend/unsend:$APP_VERSION" \