diff --git a/.claude/settings.local.json b/.claude/settings.local.json
new file mode 100644
index 0000000..9d3380c
--- /dev/null
+++ b/.claude/settings.local.json
@@ -0,0 +1,11 @@
+{
+ "permissions": {
+ "allow": [
+ "Bash(npm run dev:*)",
+ "Bash(lsof:*)",
+ "Bash(npm install)"
+ ],
+ "deny": [],
+ "ask": []
+ }
+}
\ No newline at end of file
diff --git a/.env.example b/.env.example
index 2d008f4..29cfd2d 100644
--- a/.env.example
+++ b/.env.example
@@ -22,4 +22,7 @@ ENABLE_SCHEMA_VALIDATION=true
# Legacy (for compatibility)
VITE_APP_NAME=PassMaster
-VITE_DEFAULT_LANG=de
\ No newline at end of file
+VITE_DEFAULT_LANG=de
+
+# AdSense Configuration (replace with your real publisher ID)
+NEXT_PUBLIC_ADSENSE_CLIENT=ca-pub-XXXXXXXXXX
\ No newline at end of file
diff --git a/app/client-side/page.tsx b/app/client-side/page.tsx
index 46fe3f6..21b518f 100644
--- a/app/client-side/page.tsx
+++ b/app/client-side/page.tsx
@@ -56,10 +56,10 @@ export default function ClientSidePage() {
{
title: "Privacy Protection",
items: [
- "No user tracking or analytics",
- "No cookies or local storage",
- "No third-party services",
- "No data collection whatsoever"
+ "Privacy-focused analytics (optional)",
+ "Cookie consent controls",
+ "Minimal trusted third-party services",
+ "Transparent data collection practices"
]
}
]
@@ -282,7 +282,7 @@ export default function ClientSidePage() {
- No Dependencies: We don't use external services or third-party libraries
+ Minimal Dependencies: We only use trusted services for analytics and advertising (with your consent)
diff --git a/next.config.js b/next.config.js
index c26376b..62af313 100644
--- a/next.config.js
+++ b/next.config.js
@@ -5,6 +5,9 @@ const nextConfig = {
images: {
domains: [],
},
+ env: {
+ NEXT_PUBLIC_ADSENSE_CLIENT: process.env.NEXT_PUBLIC_ADSENSE_CLIENT,
+ },
};
module.exports = nextConfig;
diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png
new file mode 100644
index 0000000..d60d33a
Binary files /dev/null and b/public/apple-touch-icon.png differ
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..d60d33a
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/manifest.json b/public/manifest.json
index 4511e1d..2449672 100644
--- a/public/manifest.json
+++ b/public/manifest.json
@@ -5,6 +5,7 @@
"id": "passmaster-pwa",
"start_url": "/",
"display": "standalone",
+ "display_override": ["window-controls-overlay", "minimal-ui", "standalone"],
"background_color": "#ffffff",
"theme_color": "#3b82f6",
"orientation": "portrait-primary",
diff --git a/public/og-image.png b/public/og-image.png
new file mode 100644
index 0000000..d60d33a
Binary files /dev/null and b/public/og-image.png differ
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index a996481..b573ba0 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -3,6 +3,8 @@ import './globals.css'
import { ThemeProvider } from '@/components/theme-provider'
import { Header } from '@/components/layout/Header'
import { Footer } from '@/components/layout/Footer'
+import { PWAInstallPrompt } from '@/components/PWAInstallPrompt'
+import { CookieConsent } from '@/components/CookieConsent'
export const metadata: Metadata = {
title: 'PassMaster – Free Offline Secure Password Generator | Privacy-First',
@@ -96,18 +98,77 @@ export default function RootLayout({
{/* Content Security Policy */}
-
+
- {/* Service Worker Registration */}
+ {/* Google AdSense */}
+
+
+ {/* PWA Service Worker with AdSense Support */}