diff --git a/.claude/launch.json b/.claude/launch.json index c59cb06..d99f58a 100644 --- a/.claude/launch.json +++ b/.claude/launch.json @@ -6,6 +6,12 @@ "runtimeExecutable": "npm", "runtimeArgs": ["run", "dev"], "port": 3050 + }, + { + "name": "dev-node", + "runtimeExecutable": "node", + "runtimeArgs": ["node_modules/next/dist/bin/next", "dev", "-p", "3050"], + "port": 3050 } ] } diff --git a/env.example b/env.example index e321c44..412e041 100644 --- a/env.example +++ b/env.example @@ -49,10 +49,13 @@ NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY= NEXT_PUBLIC_POSTHOG_KEY= NEXT_PUBLIC_POSTHOG_HOST=https://app.posthog.com +# Analytics (Optional - Microsoft Clarity session recordings & heatmaps) +NEXT_PUBLIC_CLARITY_PROJECT_ID= + # TikTok Content Posting API (Hermes Agent automated posting) TIKTOK_CLIENT_KEY= TIKTOK_CLIENT_SECRET= TIKTOK_REDIRECT_URI=https://qrmaster.net/api/tiktok/callback # Optional: protects /api/tiktok/connect from being triggered by strangers -TIKTOK_ADMIN_KEY= -TIKTOK_EXPECTED_OPEN_ID= +TIKTOK_ADMIN_KEY= +TIKTOK_EXPECTED_OPEN_ID= diff --git a/src/app/(main)/(marketing)/cookie-policy/page.tsx b/src/app/(main)/(marketing)/cookie-policy/page.tsx index f0467e3..6c90f7a 100644 --- a/src/app/(main)/(marketing)/cookie-policy/page.tsx +++ b/src/app/(main)/(marketing)/cookie-policy/page.tsx @@ -36,7 +36,7 @@ export default function CookiePolicyPage() {

How We Use Cookies

diff --git a/src/app/(main)/(marketing)/privacy/page.tsx b/src/app/(main)/(marketing)/privacy/page.tsx index 2ae6bf9..560dec9 100644 --- a/src/app/(main)/(marketing)/privacy/page.tsx +++ b/src/app/(main)/(marketing)/privacy/page.tsx @@ -25,7 +25,7 @@ export default function PrivacyPage() {

Privacy Policy

-

Last updated: August 2026

+

Last updated: August 2026

@@ -38,20 +38,20 @@ export default function PrivacyPage() { We implement appropriate security measures including secure HTTPS transmission, password hashing, database access controls, and CSRF protection to keep your data safe.

-
- -
-

2. Chrome Extension

-

- The QR Master: QR Code for Current Tab Chrome extension processes the active tab URL and the URL, text, Wi-Fi, or vCard details you enter only to create a QR code in the extension popup. This information is processed locally in your browser, is not stored by the extension, and is not transmitted to QR Master or third parties. -

-

- The extension uses clipboard access only after you select Copy Image, so that it can copy the generated QR code image to your device clipboard. We do not sell, share, or use extension input data for advertising, analytics, profiling, or creditworthiness decisions. -

-
+
-

3. Information We Collect

+

2. Chrome Extension

+

+ The QR Master: QR Code for Current Tab Chrome extension processes the active tab URL and the URL, text, Wi-Fi, or vCard details you enter only to create a QR code in the extension popup. This information is processed locally in your browser, is not stored by the extension, and is not transmitted to QR Master or third parties. +

+

+ The extension uses clipboard access only after you select Copy Image, so that it can copy the generated QR code image to your device clipboard. We do not sell, share, or use extension input data for advertising, analytics, profiling, or creditworthiness decisions. +

+
+ +
+

3. Information We Collect

Information You Provide

-

4. How We Use Your Information

+

4. How We Use Your Information

We use your data to:

-

5. Data Sharing

+

5. Data Sharing

We may share your data with:

@@ -99,7 +100,7 @@ export default function PrivacyPage() {
-

6. Your Rights (GDPR)

+

6. Your Rights (GDPR)

You have the right to:

-

7. Contact Us

+

7. Contact Us

If you have questions about this privacy policy, please contact us:

diff --git a/src/app/(main)/layout.tsx b/src/app/(main)/layout.tsx index 51dc041..59a4685 100644 --- a/src/app/(main)/layout.tsx +++ b/src/app/(main)/layout.tsx @@ -5,6 +5,7 @@ import '@/styles/globals.css'; import { Providers } from '@/components/Providers'; import AdSenseScript from '@/components/ads/AdSenseScript'; import FacebookPixel from '@/components/analytics/FacebookPixel'; +import MicrosoftClarity from '@/components/analytics/MicrosoftClarity'; const isIndexable = process.env.NEXT_PUBLIC_INDEXABLE === 'true'; @@ -65,6 +66,7 @@ export default function RootLayout({ + {children} {process.env.NEXT_PUBLIC_UMAMI_SRC && process.env.NEXT_PUBLIC_UMAMI_ID && ( + ); +}