diff --git a/server/src/__tests__/health.test.ts b/server/src/__tests__/health.test.ts
index 5583955f..1511b95e 100644
--- a/server/src/__tests__/health.test.ts
+++ b/server/src/__tests__/health.test.ts
@@ -2,6 +2,7 @@ import { describe, it, expect } from "vitest";
import express from "express";
import request from "supertest";
import { healthRoutes } from "../routes/health.js";
+import { serverVersion } from "../version.js";
describe("GET /health", () => {
const app = express();
@@ -10,6 +11,6 @@ describe("GET /health", () => {
it("returns 200 with status ok", async () => {
const res = await request(app).get("/health");
expect(res.status).toBe(200);
- expect(res.body).toEqual({ status: "ok" });
+ expect(res.body).toEqual({ status: "ok", version: serverVersion });
});
});
diff --git a/server/src/routes/health.ts b/server/src/routes/health.ts
index ddc7c441..59897a89 100644
--- a/server/src/routes/health.ts
+++ b/server/src/routes/health.ts
@@ -3,6 +3,7 @@ import type { Db } from "@paperclipai/db";
import { and, count, eq, gt, isNull, sql } from "drizzle-orm";
import { instanceUserRoles, invites } from "@paperclipai/db";
import type { DeploymentExposure, DeploymentMode } from "@paperclipai/shared";
+import { serverVersion } from "../version.js";
export function healthRoutes(
db?: Db,
@@ -22,7 +23,7 @@ export function healthRoutes(
router.get("/", async (_req, res) => {
if (!db) {
- res.json({ status: "ok" });
+ res.json({ status: "ok", version: serverVersion });
return;
}
@@ -56,6 +57,7 @@ export function healthRoutes(
res.json({
status: "ok",
+ version: serverVersion,
deploymentMode: opts.deploymentMode,
deploymentExposure: opts.deploymentExposure,
authReady: opts.authReady,
diff --git a/server/src/version.ts b/server/src/version.ts
new file mode 100644
index 00000000..39a16a4c
--- /dev/null
+++ b/server/src/version.ts
@@ -0,0 +1,10 @@
+import { createRequire } from "node:module";
+
+type PackageJson = {
+ version?: string;
+};
+
+const require = createRequire(import.meta.url);
+const pkg = require("../package.json") as PackageJson;
+
+export const serverVersion = pkg.version ?? "0.0.0";
diff --git a/ui/src/api/health.ts b/ui/src/api/health.ts
index cb1b1374..b1573805 100644
--- a/ui/src/api/health.ts
+++ b/ui/src/api/health.ts
@@ -1,5 +1,6 @@
export type HealthStatus = {
status: "ok";
+ version?: string;
deploymentMode?: "local_trusted" | "authenticated";
deploymentExposure?: "private" | "public";
authReady?: boolean;
diff --git a/ui/src/components/Layout.tsx b/ui/src/components/Layout.tsx
index e6aaf22a..66e61bd8 100644
--- a/ui/src/components/Layout.tsx
+++ b/ui/src/components/Layout.tsx
@@ -313,6 +313,9 @@ export function Layout() {
Documentation
+ {health?.version && (
+ v{health.version}
+ )}