diff --git a/apps/mukke/apps/web/src/app.d.ts b/apps/mukke/apps/web/src/app.d.ts
new file mode 100644
index 000000000..c269fca6f
--- /dev/null
+++ b/apps/mukke/apps/web/src/app.d.ts
@@ -0,0 +1,2 @@
+declare const __BUILD_HASH__: string;
+declare const __BUILD_TIME__: string;
diff --git a/apps/mukke/apps/web/src/routes/(app)/+layout.svelte b/apps/mukke/apps/web/src/routes/(app)/+layout.svelte
index 32606826f..6349d65be 100644
--- a/apps/mukke/apps/web/src/routes/(app)/+layout.svelte
+++ b/apps/mukke/apps/web/src/routes/(app)/+layout.svelte
@@ -2,7 +2,7 @@
import { goto } from '$app/navigation';
import { page } from '$app/stores';
import { onMount } from 'svelte';
- import { PillNavigation } from '@manacore/shared-ui';
+ import { PillNavigation, DevBuildBadge } from '@manacore/shared-ui';
import type { PillNavItem, PillDropdownItem } from '@manacore/shared-ui';
import {
SplitPaneContainer,
@@ -166,6 +166,7 @@
+
{/if}
diff --git a/apps/mukke/apps/web/vite.config.ts b/apps/mukke/apps/web/vite.config.ts
index 2cd76c607..eb13508eb 100644
--- a/apps/mukke/apps/web/vite.config.ts
+++ b/apps/mukke/apps/web/vite.config.ts
@@ -3,7 +3,7 @@ import { defineConfig } from 'vite';
import tailwindcss from '@tailwindcss/vite';
import { SvelteKitPWA } from '@vite-pwa/sveltekit';
import { createPWAConfig } from '@manacore/shared-pwa';
-import { MANACORE_SHARED_PACKAGES } from '@manacore/shared-vite-config';
+import { MANACORE_SHARED_PACKAGES, getBuildDefines } from '@manacore/shared-vite-config';
export default defineConfig({
plugins: [
@@ -28,4 +28,7 @@ export default defineConfig({
optimizeDeps: {
exclude: [...MANACORE_SHARED_PACKAGES, '@mukke/shared'],
},
+ define: {
+ ...getBuildDefines(),
+ },
});
diff --git a/packages/shared-ui/src/components/DevBuildBadge.svelte b/packages/shared-ui/src/components/DevBuildBadge.svelte
new file mode 100644
index 000000000..1de94ebaf
--- /dev/null
+++ b/packages/shared-ui/src/components/DevBuildBadge.svelte
@@ -0,0 +1,77 @@
+
+
+
+
+
diff --git a/packages/shared-ui/src/index.ts b/packages/shared-ui/src/index.ts
index b6823779d..aa4414d68 100644
--- a/packages/shared-ui/src/index.ts
+++ b/packages/shared-ui/src/index.ts
@@ -200,6 +200,7 @@ export type {
// Immersive Mode
export { default as ImmersiveModeToggle } from './components/ImmersiveModeToggle.svelte';
+export { default as DevBuildBadge } from './components/DevBuildBadge.svelte';
// Toast & Global Error Handling
export {
diff --git a/packages/shared-vite-config/src/index.ts b/packages/shared-vite-config/src/index.ts
index 62bcce037..326347629 100644
--- a/packages/shared-vite-config/src/index.ts
+++ b/packages/shared-vite-config/src/index.ts
@@ -3,6 +3,7 @@
* Provides consistent SSR and optimization settings.
*/
+import { execSync } from 'child_process';
import type { UserConfig, UserConfigExport } from 'vite';
/**
@@ -34,6 +35,24 @@ export const MANACORE_SHARED_PACKAGES = [
'@manacore/shared-help-ui',
] as const;
+/**
+ * Get build-time defines for version tracking.
+ * Injects __BUILD_HASH__ and __BUILD_TIME__ as compile-time constants.
+ */
+export function getBuildDefines(): Record {
+ let commitHash = 'dev';
+ try {
+ commitHash = execSync('git rev-parse --short HEAD').toString().trim();
+ } catch {
+ // fallback if not in a git repo
+ }
+ const buildTime = new Date().toISOString();
+ return {
+ __BUILD_HASH__: JSON.stringify(commitHash),
+ __BUILD_TIME__: JSON.stringify(buildTime),
+ };
+}
+
export interface ViteConfigOptions {
/** Server port */
port: number;