refactor(analytics): centralize Umami tracking via env vars and shared utility

Move Umami analytics from hardcoded script tags in app.html to
server-side injection via hooks.server.ts. Website IDs are now
managed centrally in .env.development and distributed via
generate-env.mjs as PUBLIC_UMAMI_WEBSITE_ID.

- Add @manacore/shared-utils/analytics-server with injectUmamiAnalytics()
- Add UMAMI_WEBSITE_ID_* for all 17 web apps to .env.development
- Add PUBLIC_UMAMI_WEBSITE_ID mapping in generate-env.mjs for all web apps
- Update 10 existing hooks.server.ts to use shared utility
- Create 7 new hooks.server.ts (picture, planta, presi, photos, clock,
  questions, manadeck)
- Remove hardcoded Umami scripts from all 17 app.html files
- Add missing Umami tracking to Mukke and Questions
- Add shared-utils dependency to 6 web apps that lacked it
- Update ANALYTICS.md with architecture docs and "add new app" guide

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-03-22 18:27:31 +01:00
parent 87516bb58a
commit e01b740dba
44 changed files with 319 additions and 52 deletions

View file

@ -92,6 +92,29 @@ STRIPE_CREDITS_1000_PRICE=price_1T1OkNAZjQCYS0ZJvc6HTfB5
# Customer Portal Configuration # Customer Portal Configuration
STRIPE_PORTAL_CONFIG_ID=bpc_1T1PFdAZjQCYS0ZJEhF9ob7q STRIPE_PORTAL_CONFIG_ID=bpc_1T1PFdAZjQCYS0ZJEhF9ob7q
# ============================================
# UMAMI ANALYTICS - Website IDs per app
# ============================================
# These are the Umami website IDs for each web app.
# Register new apps at https://umami.mana.how
UMAMI_WEBSITE_ID_CHAT=1c43fd98-4767-4f89-9dc2-ebdfbd8960db
UMAMI_WEBSITE_ID_MANACORE=face76f4-2d3e-42be-b8c8-0ea03f33a462
UMAMI_WEBSITE_ID_CALENDAR=772d2510-c5bb-47e0-b490-267f2821510a
UMAMI_WEBSITE_ID_TODO=ec1bb158-d871-4bc6-bdbc-147c97b9c1c7
UMAMI_WEBSITE_ID_SKILLTREE=5de13e08-95ae-4a69-aa2a-834f985be14d
UMAMI_WEBSITE_ID_ZITARE=6a86139a-d8e2-469c-9754-1c40a70397fa
UMAMI_WEBSITE_ID_CONTACTS=d2cc0f01-9e46-4a88-a49b-a365f58b78e7
UMAMI_WEBSITE_ID_PICTURE=273f67fa-5699-40f6-b85e-7a7a0a003539
UMAMI_WEBSITE_ID_PLANTA=1e83a8a6-7fa8-4d39-9545-5c21dedbe3a2
UMAMI_WEBSITE_ID_PRESI=a1eb8d1f-a4d5-43e6-b97a-c41351fe1c6f
UMAMI_WEBSITE_ID_NUTRIPHI=33dfae72-f8e2-4aaa-8008-cbbceeaf072d
UMAMI_WEBSITE_ID_STORAGE=392ff51d-11f1-4f0c-9d55-6af1402a3ee6
UMAMI_WEBSITE_ID_PHOTOS=dc201d68-5f78-4716-a0b8-587376eca7a1
UMAMI_WEBSITE_ID_CLOCK=f893945e-fea7-4493-82ab-f04812a54bea
UMAMI_WEBSITE_ID_MUKKE=89015bbb-dc59-45b7-ad51-2a68a1391553
UMAMI_WEBSITE_ID_QUESTIONS=4940b9a8-834a-483a-8696-a3086bd531e6
UMAMI_WEBSITE_ID_MANADECK=1c1d54c4-7829-43e5-8dde-0a6db7c86ec6
# ============================================ # ============================================
# CHAT PROJECT # CHAT PROJECT
# ============================================ # ============================================

View file

@ -6,8 +6,6 @@
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Calendar</title> <title>Calendar</title>
%sveltekit.head% %sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="772d2510-c5bb-47e0-b490-267f2821510a"></script>
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>

View file

@ -6,6 +6,7 @@
*/ */
import type { Handle } from '@sveltejs/kit'; import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
// Get client-side URLs from environment (Docker runtime) // Get client-side URLs from environment (Docker runtime)
// In dev mode, Vite exposes .env vars via import.meta.env, not process.env // In dev mode, Vite exposes .env vars via import.meta.env, not process.env
@ -35,7 +36,7 @@ window.__PUBLIC_STT_URL__ = "${PUBLIC_STT_URL}";
window.__PUBLIC_TODO_BACKEND_URL__ = "${PUBLIC_TODO_BACKEND_URL}"; window.__PUBLIC_TODO_BACKEND_URL__ = "${PUBLIC_TODO_BACKEND_URL}";
window.__PUBLIC_CONTACTS_API_URL__ = "${PUBLIC_CONTACTS_API_URL}"; window.__PUBLIC_CONTACTS_API_URL__ = "${PUBLIC_CONTACTS_API_URL}";
</script>`; </script>`;
return html.replace('<head>', `<head>${envScript}`); return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
}, },
}); });

View file

@ -5,8 +5,6 @@
<link rel="icon" href="%sveltekit.assets%/favicon.png" /> <link rel="icon" href="%sveltekit.assets%/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head% %sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="1c43fd98-4767-4f89-9dc2-ebdfbd8960db"></script>
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>

View file

@ -5,6 +5,7 @@
*/ */
import type { Handle } from '@sveltejs/kit'; import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
// Get client-side URLs from environment (Docker runtime) // Get client-side URLs from environment (Docker runtime)
const PUBLIC_MANA_CORE_AUTH_URL_CLIENT = const PUBLIC_MANA_CORE_AUTH_URL_CLIENT =
@ -22,7 +23,7 @@ export const handle: Handle = async ({ event, resolve }) => {
window.__PUBLIC_MANA_CORE_AUTH_URL__ = ${JSON.stringify(PUBLIC_MANA_CORE_AUTH_URL_CLIENT)}; window.__PUBLIC_MANA_CORE_AUTH_URL__ = ${JSON.stringify(PUBLIC_MANA_CORE_AUTH_URL_CLIENT)};
window.__PUBLIC_BACKEND_URL__ = ${JSON.stringify(PUBLIC_BACKEND_URL_CLIENT)}; window.__PUBLIC_BACKEND_URL__ = ${JSON.stringify(PUBLIC_BACKEND_URL_CLIENT)};
</script>`; </script>`;
return html.replace('<head>', `<head>${envScript}`); return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
}, },
}); });
}; };

View file

@ -52,6 +52,7 @@
"@manacore/shared-theme": "workspace:*", "@manacore/shared-theme": "workspace:*",
"@manacore/shared-theme-ui": "workspace:*", "@manacore/shared-theme-ui": "workspace:*",
"@manacore/shared-ui": "workspace:*", "@manacore/shared-ui": "workspace:*",
"@manacore/shared-utils": "workspace:*",
"d3": "^7.9.0", "d3": "^7.9.0",
"svelte-dnd-action": "^0.9.68", "svelte-dnd-action": "^0.9.68",
"svelte-i18n": "^4.0.1", "svelte-i18n": "^4.0.1",

View file

@ -5,8 +5,6 @@
<link rel="icon" href="%sveltekit.assets%/favicon.png" /> <link rel="icon" href="%sveltekit.assets%/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head% %sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="f893945e-fea7-4493-82ab-f04812a54bea"></script>
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>

View file

@ -0,0 +1,19 @@
import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
const PUBLIC_MANA_CORE_AUTH_URL_CLIENT =
process.env.PUBLIC_MANA_CORE_AUTH_URL_CLIENT || process.env.PUBLIC_MANA_CORE_AUTH_URL || '';
const PUBLIC_BACKEND_URL_CLIENT =
process.env.PUBLIC_BACKEND_URL_CLIENT || process.env.PUBLIC_BACKEND_URL || '';
export const handle: Handle = async ({ event, resolve }) => {
return resolve(event, {
transformPageChunk: ({ html }) => {
const envScript = `<script>
window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}";
window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}";
</script>`;
return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
},
});
};

View file

@ -6,8 +6,6 @@
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Kontakte</title> <title>Kontakte</title>
%sveltekit.head% %sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="d2cc0f01-9e46-4a88-a49b-a365f58b78e7"></script>
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>

View file

@ -5,6 +5,7 @@
*/ */
import type { Handle } from '@sveltejs/kit'; import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
// Get client-side URLs from environment (Docker runtime) // Get client-side URLs from environment (Docker runtime)
const PUBLIC_MANA_CORE_AUTH_URL_CLIENT = const PUBLIC_MANA_CORE_AUTH_URL_CLIENT =
@ -25,7 +26,7 @@ window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}";
window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}"; window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}";
window.__PUBLIC_TODO_BACKEND_URL__ = "${PUBLIC_TODO_BACKEND_URL}"; window.__PUBLIC_TODO_BACKEND_URL__ = "${PUBLIC_TODO_BACKEND_URL}";
</script>`; </script>`;
return html.replace('<head>', `<head>${envScript}`); return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
}, },
}); });
}; };

View file

@ -5,8 +5,6 @@
<link rel="icon" href="%sveltekit.assets%/favicon.png" /> <link rel="icon" href="%sveltekit.assets%/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head% %sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="face76f4-2d3e-42be-b8c8-0ea03f33a462"></script>
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>

View file

@ -1,4 +1,5 @@
import type { Handle } from '@sveltejs/kit'; import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
/** /**
* Server hooks for ManaCore web app * Server hooks for ManaCore web app
@ -32,7 +33,7 @@ window.__PUBLIC_CALENDAR_API_URL__ = "${PUBLIC_CALENDAR_API_URL_CLIENT}";
window.__PUBLIC_CLOCK_API_URL__ = "${PUBLIC_CLOCK_API_URL_CLIENT}"; window.__PUBLIC_CLOCK_API_URL__ = "${PUBLIC_CLOCK_API_URL_CLIENT}";
window.__PUBLIC_CONTACTS_API_URL__ = "${PUBLIC_CONTACTS_API_URL_CLIENT}"; window.__PUBLIC_CONTACTS_API_URL__ = "${PUBLIC_CONTACTS_API_URL_CLIENT}";
</script>`; </script>`;
return html.replace('<head>', `<head>${envScript}`); return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
}, },
}); });
}; };

View file

@ -4,8 +4,6 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head% %sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="1c1d54c4-7829-43e5-8dde-0a6db7c86ec6"></script>
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>

View file

@ -0,0 +1,19 @@
import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
const PUBLIC_MANA_CORE_AUTH_URL_CLIENT =
process.env.PUBLIC_MANA_CORE_AUTH_URL_CLIENT || process.env.PUBLIC_MANA_CORE_AUTH_URL || '';
const PUBLIC_BACKEND_URL_CLIENT =
process.env.PUBLIC_BACKEND_URL_CLIENT || process.env.PUBLIC_BACKEND_URL || '';
export const handle: Handle = async ({ event, resolve }) => {
return resolve(event, {
transformPageChunk: ({ html }) => {
const envScript = `<script>
window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}";
window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}";
</script>`;
return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
},
});
};

View file

@ -50,6 +50,7 @@
"@manacore/shared-theme": "workspace:*", "@manacore/shared-theme": "workspace:*",
"@manacore/shared-theme-ui": "workspace:*", "@manacore/shared-theme-ui": "workspace:*",
"@manacore/shared-ui": "workspace:*", "@manacore/shared-ui": "workspace:*",
"@manacore/shared-utils": "workspace:*",
"@mukke/shared": "workspace:*", "@mukke/shared": "workspace:*",
"wavesurfer.js": "^7.8.0" "wavesurfer.js": "^7.8.0"
}, },

View file

@ -5,6 +5,7 @@
*/ */
import type { Handle } from '@sveltejs/kit'; import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
// Get client-side URLs from environment (Docker runtime) // Get client-side URLs from environment (Docker runtime)
const PUBLIC_MANA_CORE_AUTH_URL_CLIENT = const PUBLIC_MANA_CORE_AUTH_URL_CLIENT =
@ -21,7 +22,7 @@ export const handle: Handle = async ({ event, resolve }) => {
window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}"; window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}";
window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}"; window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}";
</script>`; </script>`;
return html.replace('<head>', `<head>${envScript}`); return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
}, },
}); });
}; };

View file

@ -7,8 +7,6 @@
<meta name="theme-color" content="#22C55E" /> <meta name="theme-color" content="#22C55E" />
<meta name="description" content="NutriPhi - KI-gestützte Ernährungsanalyse per Foto" /> <meta name="description" content="NutriPhi - KI-gestützte Ernährungsanalyse per Foto" />
%sveltekit.head% %sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="33dfae72-f8e2-4aaa-8008-cbbceeaf072d"></script>
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>

View file

@ -5,6 +5,7 @@
*/ */
import type { Handle } from '@sveltejs/kit'; import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
// Get client-side URLs from environment (Docker runtime) // Get client-side URLs from environment (Docker runtime)
const PUBLIC_MANA_CORE_AUTH_URL_CLIENT = const PUBLIC_MANA_CORE_AUTH_URL_CLIENT =
@ -21,7 +22,7 @@ export const handle: Handle = async ({ event, resolve }) => {
window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}"; window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}";
window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}"; window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}";
</script>`; </script>`;
return html.replace('<head>', `<head>${envScript}`); return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
}, },
}); });
}; };

View file

@ -5,8 +5,6 @@
<link rel="icon" href="%sveltekit.assets%/favicon.png" /> <link rel="icon" href="%sveltekit.assets%/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head% %sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="dc201d68-5f78-4716-a0b8-587376eca7a1"></script>
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>

View file

@ -0,0 +1,19 @@
import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
const PUBLIC_MANA_CORE_AUTH_URL_CLIENT =
process.env.PUBLIC_MANA_CORE_AUTH_URL_CLIENT || process.env.PUBLIC_MANA_CORE_AUTH_URL || '';
const PUBLIC_BACKEND_URL_CLIENT =
process.env.PUBLIC_BACKEND_URL_CLIENT || process.env.PUBLIC_BACKEND_URL || '';
export const handle: Handle = async ({ event, resolve }) => {
return resolve(event, {
transformPageChunk: ({ html }) => {
const envScript = `<script>
window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}";
window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}";
</script>`;
return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
},
});
};

View file

@ -32,6 +32,7 @@
"@manacore/shared-theme": "workspace:*", "@manacore/shared-theme": "workspace:*",
"@manacore/shared-theme-ui": "workspace:*", "@manacore/shared-theme-ui": "workspace:*",
"@manacore/shared-ui": "workspace:*", "@manacore/shared-ui": "workspace:*",
"@manacore/shared-utils": "workspace:*",
"@picture/design-tokens": "workspace:*", "@picture/design-tokens": "workspace:*",
"@picture/shared": "workspace:*", "@picture/shared": "workspace:*",
"konva": "^10.0.2", "konva": "^10.0.2",

View file

@ -4,8 +4,6 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head% %sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="273f67fa-5699-40f6-b85e-7a7a0a003539"></script>
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>

View file

@ -0,0 +1,19 @@
import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
const PUBLIC_MANA_CORE_AUTH_URL_CLIENT =
process.env.PUBLIC_MANA_CORE_AUTH_URL_CLIENT || process.env.PUBLIC_MANA_CORE_AUTH_URL || '';
const PUBLIC_BACKEND_URL_CLIENT =
process.env.PUBLIC_BACKEND_URL_CLIENT || process.env.PUBLIC_BACKEND_URL || '';
export const handle: Handle = async ({ event, resolve }) => {
return resolve(event, {
transformPageChunk: ({ html }) => {
const envScript = `<script>
window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}";
window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}";
</script>`;
return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
},
});
};

View file

@ -32,16 +32,6 @@
<svelte:head> <svelte:head>
<link rel="icon" href={favicon} /> <link rel="icon" href={favicon} />
<!-- Umami Analytics -->
{#if import.meta.env.PUBLIC_UMAMI_WEBSITE_ID && import.meta.env.PUBLIC_UMAMI_URL}
<script
defer
src={`${import.meta.env.PUBLIC_UMAMI_URL}/script.js`}
data-website-id={import.meta.env.PUBLIC_UMAMI_WEBSITE_ID}
data-do-not-track="true"
></script>
{/if}
</svelte:head> </svelte:head>
{@render children?.()} {@render children?.()}

View file

@ -40,6 +40,7 @@
"@manacore/shared-theme": "workspace:*", "@manacore/shared-theme": "workspace:*",
"@manacore/shared-theme-ui": "workspace:*", "@manacore/shared-theme-ui": "workspace:*",
"@manacore/shared-ui": "workspace:*", "@manacore/shared-ui": "workspace:*",
"@manacore/shared-utils": "workspace:*",
"@planta/shared": "workspace:*", "@planta/shared": "workspace:*",
"svelte-i18n": "^4.0.1" "svelte-i18n": "^4.0.1"
}, },

View file

@ -6,8 +6,6 @@
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Planta - Pflanzendokumentation</title> <title>Planta - Pflanzendokumentation</title>
%sveltekit.head% %sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="1e83a8a6-7fa8-4d39-9545-5c21dedbe3a2"></script>
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>

View file

@ -0,0 +1,19 @@
import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
const PUBLIC_MANA_CORE_AUTH_URL_CLIENT =
process.env.PUBLIC_MANA_CORE_AUTH_URL_CLIENT || process.env.PUBLIC_MANA_CORE_AUTH_URL || '';
const PUBLIC_BACKEND_URL_CLIENT =
process.env.PUBLIC_BACKEND_URL_CLIENT || process.env.PUBLIC_BACKEND_URL || '';
export const handle: Handle = async ({ event, resolve }) => {
return resolve(event, {
transformPageChunk: ({ html }) => {
const envScript = `<script>
window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}";
window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}";
</script>`;
return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
},
});
};

View file

@ -46,6 +46,7 @@
"@manacore/shared-theme": "workspace:*", "@manacore/shared-theme": "workspace:*",
"@manacore/shared-theme-ui": "workspace:*", "@manacore/shared-theme-ui": "workspace:*",
"@manacore/shared-ui": "workspace:*", "@manacore/shared-ui": "workspace:*",
"@manacore/shared-utils": "workspace:*",
"svelte-i18n": "^4.0.1" "svelte-i18n": "^4.0.1"
}, },
"type": "module" "type": "module"

View file

@ -5,8 +5,6 @@
<link rel="icon" href="%sveltekit.assets%/favicon.png" /> <link rel="icon" href="%sveltekit.assets%/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head% %sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="a1eb8d1f-a4d5-43e6-b97a-c41351fe1c6f"></script>
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>

View file

@ -0,0 +1,19 @@
import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
const PUBLIC_MANA_CORE_AUTH_URL_CLIENT =
process.env.PUBLIC_MANA_CORE_AUTH_URL_CLIENT || process.env.PUBLIC_MANA_CORE_AUTH_URL || '';
const PUBLIC_BACKEND_URL_CLIENT =
process.env.PUBLIC_BACKEND_URL_CLIENT || process.env.PUBLIC_BACKEND_URL || '';
export const handle: Handle = async ({ event, resolve }) => {
return resolve(event, {
transformPageChunk: ({ html }) => {
const envScript = `<script>
window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}";
window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}";
</script>`;
return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
},
});
};

View file

@ -0,0 +1,19 @@
import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
const PUBLIC_MANA_CORE_AUTH_URL_CLIENT =
process.env.PUBLIC_MANA_CORE_AUTH_URL_CLIENT || process.env.PUBLIC_MANA_CORE_AUTH_URL || '';
const PUBLIC_BACKEND_URL_CLIENT =
process.env.PUBLIC_BACKEND_URL_CLIENT || process.env.PUBLIC_BACKEND_URL || '';
export const handle: Handle = async ({ event, resolve }) => {
return resolve(event, {
transformPageChunk: ({ html }) => {
const envScript = `<script>
window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}";
window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}";
</script>`;
return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
},
});
};

View file

@ -16,8 +16,6 @@
<meta name="apple-mobile-web-app-title" content="SkillTree" /> <meta name="apple-mobile-web-app-title" content="SkillTree" />
%sveltekit.head% %sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="5de13e08-95ae-4a69-aa2a-834f985be14d"></script>
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>

View file

@ -5,6 +5,7 @@
*/ */
import type { Handle } from '@sveltejs/kit'; import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
const PUBLIC_MANA_CORE_AUTH_URL_CLIENT = const PUBLIC_MANA_CORE_AUTH_URL_CLIENT =
process.env.PUBLIC_MANA_CORE_AUTH_URL_CLIENT || process.env.PUBLIC_MANA_CORE_AUTH_URL || ''; process.env.PUBLIC_MANA_CORE_AUTH_URL_CLIENT || process.env.PUBLIC_MANA_CORE_AUTH_URL || '';
@ -18,7 +19,7 @@ export const handle: Handle = async ({ event, resolve }) => {
window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}"; window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}";
window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}"; window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}";
</script>`; </script>`;
return html.replace('<head>', `<head>${envScript}`); return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
}, },
}); });
}; };

View file

@ -53,6 +53,7 @@
"@manacore/shared-theme": "workspace:*", "@manacore/shared-theme": "workspace:*",
"@manacore/shared-theme-ui": "workspace:*", "@manacore/shared-theme-ui": "workspace:*",
"@manacore/shared-ui": "workspace:*", "@manacore/shared-ui": "workspace:*",
"@manacore/shared-utils": "workspace:*",
"svelte-i18n": "^4.0.1" "svelte-i18n": "^4.0.1"
}, },
"type": "module" "type": "module"

View file

@ -11,11 +11,7 @@
<meta property="og:description" content="Dein sicherer Cloud-Speicher für Dateien, Ordner und mehr." /> <meta property="og:description" content="Dein sicherer Cloud-Speicher für Dateien, Ordner und mehr." />
<meta property="og:site_name" content="Storage" /> <meta property="og:site_name" content="Storage" />
<title>Storage - Cloud Drive</title> <title>Storage - Cloud Drive</title>
<link rel="preconnect" href="https://stats.mana.how" />
<link rel="dns-prefetch" href="https://stats.mana.how" />
%sveltekit.head% %sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="392ff51d-11f1-4f0c-9d55-6af1402a3ee6"></script>
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>

View file

@ -17,8 +17,6 @@
<title>Todo</title> <title>Todo</title>
%sveltekit.head% %sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="ec1bb158-d871-4bc6-bdbc-147c97b9c1c7"></script>
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>

View file

@ -5,6 +5,7 @@
*/ */
import type { Handle } from '@sveltejs/kit'; import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
// Get client-side URLs from environment (Docker runtime) // Get client-side URLs from environment (Docker runtime)
const PUBLIC_MANA_CORE_AUTH_URL_CLIENT = const PUBLIC_MANA_CORE_AUTH_URL_CLIENT =
@ -21,7 +22,7 @@ export const handle: Handle = async ({ event, resolve }) => {
window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}"; window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}";
window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}"; window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}";
</script>`; </script>`;
return html.replace('<head>', `<head>${envScript}`); return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
}, },
}); });
}; };

View file

@ -8,8 +8,6 @@
<meta name="description" content="Zitare - Inspirierende Zitate jeden Tag" /> <meta name="description" content="Zitare - Inspirierende Zitate jeden Tag" />
<title>Zitare</title> <title>Zitare</title>
%sveltekit.head% %sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="6a86139a-d8e2-469c-9754-1c40a70397fa"></script>
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>

View file

@ -5,6 +5,7 @@
*/ */
import type { Handle } from '@sveltejs/kit'; import type { Handle } from '@sveltejs/kit';
import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
// Get client-side URLs from environment (Docker runtime) // Get client-side URLs from environment (Docker runtime)
const PUBLIC_MANA_CORE_AUTH_URL_CLIENT = const PUBLIC_MANA_CORE_AUTH_URL_CLIENT =
@ -21,7 +22,7 @@ export const handle: Handle = async ({ event, resolve }) => {
window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}"; window.__PUBLIC_MANA_CORE_AUTH_URL__ = "${PUBLIC_MANA_CORE_AUTH_URL_CLIENT}";
window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}"; window.__PUBLIC_BACKEND_URL__ = "${PUBLIC_BACKEND_URL_CLIENT}";
</script>`; </script>`;
return html.replace('<head>', `<head>${envScript}`); return injectUmamiAnalytics(html.replace('<head>', `<head>${envScript}`));
}, },
}); });
}; };

View file

@ -7,6 +7,35 @@ ManaCore verwendet Umami für Web Analytics. Alle Events werden zu `stats.mana.h
- **URL**: https://stats.mana.how - **URL**: https://stats.mana.how
- **Public Stats**: Alle Websites haben Public Sharing aktiviert - **Public Stats**: Alle Websites haben Public Sharing aktiviert
## Architektur
Web-App Analytics werden über `hooks.server.ts` injiziert (nicht mehr hardcoded in `app.html`).
```
.env.development → UMAMI_WEBSITE_ID_CHAT=xxx
↓ (scripts/generate-env.mjs)
apps/chat/apps/web/.env → PUBLIC_UMAMI_WEBSITE_ID=xxx
↓ (process.env in hooks.server.ts)
injectUmamiAnalytics(html) → <script defer src="stats.mana.how/script.js" data-website-id="xxx">
```
### Zentrale Konfiguration
- **Website-IDs**: `.env.development` (`UMAMI_WEBSITE_ID_*`)
- **Env-Verteilung**: `scripts/generate-env.mjs``PUBLIC_UMAMI_WEBSITE_ID`
- **Server-Side Injection**: `@manacore/shared-utils/analytics-server` (`injectUmamiAnalytics()`)
- **Client-Side Events**: `@manacore/shared-utils/analytics` (`trackEvent()`, etc.)
### Neue App hinzufügen
1. Website in Umami anlegen (https://umami.mana.how)
2. `UMAMI_WEBSITE_ID_APPNAME=<uuid>` zu `.env.development` hinzufügen
3. `PUBLIC_UMAMI_WEBSITE_ID` Mapping in `scripts/generate-env.mjs` hinzufügen
4. `@manacore/shared-utils` als Dependency in der Web-App `package.json`
5. In `hooks.server.ts`: `import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server'`
6. `injectUmamiAnalytics(html)` im `transformPageChunk` aufrufen
7. `pnpm setup:env` ausführen
## Website IDs ## Website IDs
### Landing Pages ### Landing Pages
@ -33,6 +62,8 @@ ManaCore verwendet Umami für Web Analytics. Alle Events werden zu `stats.mana.h
| Picture | `bc552bd2-667d-44b4-a717-0dce6a8db98f` | stats.mana.how/share/picturewebapp | | Picture | `bc552bd2-667d-44b4-a717-0dce6a8db98f` | stats.mana.how/share/picturewebapp |
| ManaDeck | `314fc57a-c63d-4008-b19e-5e272c0329d6` | stats.mana.how/share/manadeckwebapp | | ManaDeck | `314fc57a-c63d-4008-b19e-5e272c0329d6` | stats.mana.how/share/manadeckwebapp |
| Planta | `876f30bd-43e3-405a-9697-6157db67ca6b` | stats.mana.how/share/plantawebapp | | Planta | `876f30bd-43e3-405a-9697-6157db67ca6b` | stats.mana.how/share/plantawebapp |
| Mukke | `89015bbb-dc59-45b7-ad51-2a68a1391553` | stats.mana.how/share/mukkewebapp |
| Questions | `4940b9a8-834a-483a-8696-a3086bd531e6` | stats.mana.how/share/questionswebapp |
--- ---

View file

@ -6,7 +6,9 @@
"main": "./src/index.ts", "main": "./src/index.ts",
"types": "./src/index.ts", "types": "./src/index.ts",
"exports": { "exports": {
".": "./src/index.ts" ".": "./src/index.ts",
"./analytics": "./src/analytics.ts",
"./analytics-server": "./src/analytics-server.ts"
}, },
"scripts": { "scripts": {
"type-check": "tsc --noEmit", "type-check": "tsc --noEmit",

View file

@ -0,0 +1,43 @@
/**
* Server-side Umami Analytics Utilities
*
* Used in SvelteKit hooks.server.ts to inject the Umami analytics script.
* Reads the website ID from the PUBLIC_UMAMI_WEBSITE_ID environment variable.
*
* @example
* ```typescript
* import { injectUmamiAnalytics } from '@manacore/shared-utils/analytics-server';
*
* export const handle: Handle = async ({ event, resolve }) => {
* return resolve(event, {
* transformPageChunk: ({ html }) => injectUmamiAnalytics(html),
* });
* };
* ```
*/
const UMAMI_SCRIPT_URL = 'https://stats.mana.how/script.js';
/**
* Get the Umami analytics script tag.
* Returns empty string if no website ID is configured.
*/
export function getUmamiScriptTag(websiteId?: string): string {
const id = websiteId || process.env.PUBLIC_UMAMI_WEBSITE_ID || '';
if (!id) return '';
return `<script defer src="${UMAMI_SCRIPT_URL}" data-website-id="${id}"></script>`;
}
/**
* Inject the Umami analytics script into HTML.
* Designed to be used in SvelteKit's transformPageChunk.
*
* @param html - The HTML string to inject the script into
* @param websiteId - Optional website ID override (defaults to PUBLIC_UMAMI_WEBSITE_ID env var)
* @returns The HTML with the Umami script injected before </head>
*/
export function injectUmamiAnalytics(html: string, websiteId?: string): string {
const scriptTag = getUmamiScriptTag(websiteId);
if (!scriptTag) return html;
return html.replace('</head>', `${scriptTag}\n</head>`);
}

18
pnpm-lock.yaml generated
View file

@ -1036,6 +1036,9 @@ importers:
'@manacore/shared-ui': '@manacore/shared-ui':
specifier: workspace:* specifier: workspace:*
version: link:../../../../packages/shared-ui version: link:../../../../packages/shared-ui
'@manacore/shared-utils':
specifier: workspace:*
version: link:../../../../packages/shared-utils
d3: d3:
specifier: ^7.9.0 specifier: ^7.9.0
version: 7.9.0 version: 7.9.0
@ -2943,6 +2946,9 @@ importers:
'@manacore/shared-ui': '@manacore/shared-ui':
specifier: workspace:* specifier: workspace:*
version: link:../../../../packages/shared-ui version: link:../../../../packages/shared-ui
'@manacore/shared-utils':
specifier: workspace:*
version: link:../../../../packages/shared-utils
'@mukke/shared': '@mukke/shared':
specifier: workspace:* specifier: workspace:*
version: link:../../packages/shared version: link:../../packages/shared
@ -3952,6 +3958,9 @@ importers:
'@manacore/shared-ui': '@manacore/shared-ui':
specifier: workspace:* specifier: workspace:*
version: link:../../../../packages/shared-ui version: link:../../../../packages/shared-ui
'@manacore/shared-utils':
specifier: workspace:*
version: link:../../../../packages/shared-utils
'@picture/design-tokens': '@picture/design-tokens':
specifier: workspace:* specifier: workspace:*
version: link:../../packages/design-tokens version: link:../../packages/design-tokens
@ -4247,6 +4256,9 @@ importers:
'@manacore/shared-ui': '@manacore/shared-ui':
specifier: workspace:* specifier: workspace:*
version: link:../../../../packages/shared-ui version: link:../../../../packages/shared-ui
'@manacore/shared-utils':
specifier: workspace:*
version: link:../../../../packages/shared-utils
'@planta/shared': '@planta/shared':
specifier: workspace:* specifier: workspace:*
version: link:../../packages/shared version: link:../../packages/shared
@ -4587,6 +4599,9 @@ importers:
'@manacore/shared-ui': '@manacore/shared-ui':
specifier: workspace:* specifier: workspace:*
version: link:../../../../packages/shared-ui version: link:../../../../packages/shared-ui
'@manacore/shared-utils':
specifier: workspace:*
version: link:../../../../packages/shared-utils
'@presi/shared': '@presi/shared':
specifier: workspace:* specifier: workspace:*
version: link:../../packages/shared version: link:../../packages/shared
@ -5197,6 +5212,9 @@ importers:
'@manacore/shared-ui': '@manacore/shared-ui':
specifier: workspace:* specifier: workspace:*
version: link:../../../../packages/shared-ui version: link:../../../../packages/shared-ui
'@manacore/shared-utils':
specifier: workspace:*
version: link:../../../../packages/shared-utils
svelte-i18n: svelte-i18n:
specifier: ^4.0.1 specifier: ^4.0.1
version: 4.0.1(svelte@5.44.0) version: 4.0.1(svelte@5.44.0)

View file

@ -118,6 +118,7 @@ const APP_CONFIGS = [
PUBLIC_SUPABASE_URL: (env) => env.CHAT_SUPABASE_URL, PUBLIC_SUPABASE_URL: (env) => env.CHAT_SUPABASE_URL,
PUBLIC_SUPABASE_ANON_KEY: (env) => env.CHAT_SUPABASE_ANON_KEY, PUBLIC_SUPABASE_ANON_KEY: (env) => env.CHAT_SUPABASE_ANON_KEY,
PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.CHAT_BACKEND_PORT || '3002'}`, PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.CHAT_BACKEND_PORT || '3002'}`,
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_CHAT || '',
}, },
}, },
@ -137,6 +138,7 @@ const APP_CONFIGS = [
PUBLIC_SUPABASE_URL: (env) => env.MANACORE_SUPABASE_URL, PUBLIC_SUPABASE_URL: (env) => env.MANACORE_SUPABASE_URL,
PUBLIC_SUPABASE_ANON_KEY: (env) => env.MANACORE_SUPABASE_ANON_KEY, PUBLIC_SUPABASE_ANON_KEY: (env) => env.MANACORE_SUPABASE_ANON_KEY,
MIDDLEWARE_URL: (env) => env.MANA_CORE_AUTH_URL, MIDDLEWARE_URL: (env) => env.MANA_CORE_AUTH_URL,
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_MANACORE || '',
}, },
}, },
@ -181,6 +183,7 @@ const APP_CONFIGS = [
PUBLIC_SUPABASE_ANON_KEY: (env) => env.MANADECK_SUPABASE_ANON_KEY, PUBLIC_SUPABASE_ANON_KEY: (env) => env.MANADECK_SUPABASE_ANON_KEY,
PUBLIC_API_URL: (env) => `http://localhost:${env.MANADECK_BACKEND_PORT || '3004'}`, PUBLIC_API_URL: (env) => `http://localhost:${env.MANADECK_BACKEND_PORT || '3004'}`,
PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL, PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL,
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_MANADECK || '',
}, },
}, },
@ -231,6 +234,7 @@ const APP_CONFIGS = [
PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL, PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL,
PUBLIC_GOOGLE_CLIENT_ID: (env) => env.PICTURE_GOOGLE_CLIENT_ID || '', PUBLIC_GOOGLE_CLIENT_ID: (env) => env.PICTURE_GOOGLE_CLIENT_ID || '',
PUBLIC_APPLE_CLIENT_ID: (env) => env.PICTURE_APPLE_CLIENT_ID || '', PUBLIC_APPLE_CLIENT_ID: (env) => env.PICTURE_APPLE_CLIENT_ID || '',
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_PICTURE || '',
}, },
}, },
@ -259,6 +263,7 @@ const APP_CONFIGS = [
PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.NUTRIPHI_BACKEND_PORT || '3002'}`, PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.NUTRIPHI_BACKEND_PORT || '3002'}`,
PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL, PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL,
PUBLIC_MIDDLEWARE_APP_ID: (env) => env.NUTRIPHI_APP_ID || 'nutriphi', PUBLIC_MIDDLEWARE_APP_ID: (env) => env.NUTRIPHI_APP_ID || 'nutriphi',
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_NUTRIPHI || '',
}, },
}, },
@ -291,6 +296,7 @@ const APP_CONFIGS = [
vars: { vars: {
PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.ZITARE_BACKEND_PORT || '3007'}`, PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.ZITARE_BACKEND_PORT || '3007'}`,
PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL, PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL,
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_ZITARE || '',
}, },
}, },
@ -324,6 +330,7 @@ const APP_CONFIGS = [
vars: { vars: {
PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.PRESI_BACKEND_PORT || '3008'}`, PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.PRESI_BACKEND_PORT || '3008'}`,
PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL, PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL,
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_PRESI || '',
}, },
}, },
@ -348,6 +355,7 @@ const APP_CONFIGS = [
vars: { vars: {
PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.SKILLTREE_BACKEND_PORT || '3024'}`, PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.SKILLTREE_BACKEND_PORT || '3024'}`,
PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL, PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL,
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_SKILLTREE || '',
}, },
}, },
@ -443,6 +451,7 @@ const APP_CONFIGS = [
PUBLIC_CONTACTS_WEB_URL: () => 'http://localhost:5184', PUBLIC_CONTACTS_WEB_URL: () => 'http://localhost:5184',
// Speech-to-Text Service // Speech-to-Text Service
PUBLIC_STT_URL: (env) => env.STT_URL || 'http://localhost:3020', PUBLIC_STT_URL: (env) => env.STT_URL || 'http://localhost:3020',
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_CALENDAR || '',
}, },
}, },
@ -484,6 +493,7 @@ const APP_CONFIGS = [
vars: { vars: {
PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.CONTACTS_BACKEND_PORT || '3015'}`, PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.CONTACTS_BACKEND_PORT || '3015'}`,
PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL, PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL,
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_CONTACTS || '',
}, },
}, },
@ -514,6 +524,7 @@ const APP_CONFIGS = [
vars: { vars: {
PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.STORAGE_BACKEND_PORT || '3016'}`, PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.STORAGE_BACKEND_PORT || '3016'}`,
PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL, PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL,
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_STORAGE || '',
}, },
}, },
@ -537,6 +548,7 @@ const APP_CONFIGS = [
vars: { vars: {
PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.CLOCK_BACKEND_PORT || '3017'}`, PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.CLOCK_BACKEND_PORT || '3017'}`,
PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL, PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL,
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_CLOCK || '',
}, },
}, },
@ -560,6 +572,7 @@ const APP_CONFIGS = [
vars: { vars: {
PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.TODO_BACKEND_PORT || '3018'}`, PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.TODO_BACKEND_PORT || '3018'}`,
PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL, PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL,
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_TODO || '',
}, },
}, },
@ -688,6 +701,36 @@ const APP_CONFIGS = [
}, },
}, },
// Photos Web (SvelteKit)
{
path: 'apps/photos/apps/web/.env',
vars: {
PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.PHOTOS_BACKEND_PORT || '3039'}`,
PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL,
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_PHOTOS || '',
},
},
// Planta Web (SvelteKit)
{
path: 'apps/planta/apps/web/.env',
vars: {
PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.PLANTA_BACKEND_PORT || '3022'}`,
PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL,
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_PLANTA || '',
},
},
// Questions Web (SvelteKit)
{
path: 'apps/questions/apps/web/.env',
vars: {
PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.QUESTIONS_BACKEND_PORT || '3011'}`,
PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL,
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_QUESTIONS || '',
},
},
// Mukke Backend (NestJS) // Mukke Backend (NestJS)
{ {
path: 'apps/mukke/apps/backend/.env', path: 'apps/mukke/apps/backend/.env',
@ -713,6 +756,7 @@ const APP_CONFIGS = [
vars: { vars: {
PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.MUKKE_BACKEND_PORT || '3010'}`, PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.MUKKE_BACKEND_PORT || '3010'}`,
PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL, PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL,
PUBLIC_UMAMI_WEBSITE_ID: (env) => env.UMAMI_WEBSITE_ID_MUKKE || '',
}, },
}, },