feat: add privacy-friendly Umami page-view analytics (#15)
Cookieless, env-gated page-view tracking via Umami. The <Analytics /> component injects the script only when NEXT_PUBLIC_UMAMI_SRC and NEXT_PUBLIC_UMAMI_WEBSITE_ID are both set, so local dev and forks send nothing to our instance. Adds .env.example docs (section 6) and a homepage footer privacy disclosure. No Cookie consent banner needed.
This commit is contained in:
@@ -55,3 +55,15 @@ TTS_SPEECH_MODEL=mimo-v2.5-tts
|
|||||||
# true → return a placeholder image instead of calling the image model.
|
# true → return a placeholder image instead of calling the image model.
|
||||||
# Text/story/voice still run normally. Great for iterating on TTS.
|
# Text/story/voice still run normally. Great for iterating on TTS.
|
||||||
MOCK_IMAGE=false
|
MOCK_IMAGE=false
|
||||||
|
|
||||||
|
# ---- 6. Analytics · Umami (optional — leave blank to disable) ------
|
||||||
|
# Privacy-friendly, cookieless page-view stats — no Cookie consent banner.
|
||||||
|
# Cloud: sign up at https://cloud.umami.is, add your site, copy its ID into
|
||||||
|
# NEXT_PUBLIC_UMAMI_WEBSITE_ID and use the cloud script URL:
|
||||||
|
# NEXT_PUBLIC_UMAMI_SRC=https://cloud.umami.is/script.js
|
||||||
|
# Self-host later: point SRC at your own instance — the integration is identical
|
||||||
|
# (no code change), e.g. NEXT_PUBLIC_UMAMI_SRC=https://stats.example.com/script.js
|
||||||
|
# Both blank → no script is injected (zero tracking). NEXT_PUBLIC_ vars are
|
||||||
|
# inlined at BUILD time, so set them in the build env (Vercel project settings).
|
||||||
|
NEXT_PUBLIC_UMAMI_SRC=
|
||||||
|
NEXT_PUBLIC_UMAMI_WEBSITE_ID=
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import type { Metadata } from "next";
|
import type { Metadata } from "next";
|
||||||
import { Cormorant_Garamond, Inter } from "next/font/google";
|
import { Cormorant_Garamond, Inter } from "next/font/google";
|
||||||
|
import { Analytics } from "@/components/Analytics";
|
||||||
import "./globals.css";
|
import "./globals.css";
|
||||||
|
|
||||||
// Editorial fonts: drive tailwind `font-serif`/`font-sans` via
|
// Editorial fonts: drive tailwind `font-serif`/`font-sans` via
|
||||||
@@ -44,6 +45,7 @@ export default function RootLayout({
|
|||||||
</head>
|
</head>
|
||||||
<body className="bg-cream-50 text-clay-900 font-sans antialiased min-h-screen overflow-x-hidden">
|
<body className="bg-cream-50 text-clay-900 font-sans antialiased min-h-screen overflow-x-hidden">
|
||||||
{children}
|
{children}
|
||||||
|
<Analytics />
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -744,6 +744,8 @@ export default function HomePage() {
|
|||||||
目前,内测期间生成的内容不会被保存,如有需要,请通过录屏或截图等方式保存游玩体验,并记录下生成故事时的提示词与风格选项等。
|
目前,内测期间生成的内容不会被保存,如有需要,请通过录屏或截图等方式保存游玩体验,并记录下生成故事时的提示词与风格选项等。
|
||||||
<br />
|
<br />
|
||||||
AI 生成的内容不代表本团队立场。
|
AI 生成的内容不代表本团队立场。
|
||||||
|
<br />
|
||||||
|
本站使用开源的 Umami 进行隐私友好的匿名访问统计:不使用 Cookie、不收集个人信息、不做跨站追踪。
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import Script from "next/script";
|
||||||
|
|
||||||
|
// Privacy-friendly, cookieless page-view analytics (Umami). Both env vars
|
||||||
|
// unset → render nothing, so local dev and forks never report to our instance.
|
||||||
|
export function Analytics() {
|
||||||
|
const src = process.env.NEXT_PUBLIC_UMAMI_SRC;
|
||||||
|
const websiteId = process.env.NEXT_PUBLIC_UMAMI_WEBSITE_ID;
|
||||||
|
if (!src || !websiteId) return null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Script
|
||||||
|
src={src}
|
||||||
|
data-website-id={websiteId}
|
||||||
|
strategy="afterInteractive"
|
||||||
|
defer
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user