[object Object]

← back to Stayclaim

add AdSense-compliant privacy policy (/privacy) + footer link — account-ban prevention

6449ef37998d48405c3d7821b72788704b4e4779 · 2026-08-05 08:21:35 -0700 · Steve Abrams

Files touched

Diff

commit 6449ef37998d48405c3d7821b72788704b4e4779
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Aug 5 08:21:35 2026 -0700

    add AdSense-compliant privacy policy (/privacy) + footer link — account-ban prevention
---
 src/app/layout.tsx       |   1 +
 src/app/privacy/page.tsx | 124 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 125 insertions(+)

diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 5dc96c0..dfa285e 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -131,6 +131,7 @@ export default async function RootLayout({ children }: { children: React.ReactNo
             <span className="text-ink/40">
               Public record. Historical associations only. Living persons protected by design.
               {FREE_FOREVER && ' Free forever.'}
+              {' '}<Link href="/privacy" className="underline hover:text-ink/70">Privacy</Link>
             </span>
           </div>
         </footer>
diff --git a/src/app/privacy/page.tsx b/src/app/privacy/page.tsx
new file mode 100644
index 0000000..efd645b
--- /dev/null
+++ b/src/app/privacy/page.tsx
@@ -0,0 +1,124 @@
+import type { Metadata } from 'next';
+import { headers } from 'next/headers';
+import { siteForHost } from '@/lib/site';
+
+export async function generateMetadata(): Promise<Metadata> {
+  const h = await headers();
+  const surface = siteForHost(h.get('x-pastdoor-host') || h.get('host'));
+  return {
+    title: 'Privacy Policy',
+    description: `How ${surface.brandName} handles data, cookies, and advertising.`,
+    alternates: { canonical: '/privacy' },
+    robots: { index: true, follow: true },
+  };
+}
+
+/**
+ * Privacy Policy — AdSense program-policy requirement. Must be reachable and must
+ * disclose (1) that we use cookies, (2) that Google, as a third-party vendor, uses
+ * cookies (incl. the DoubleClick/AdSense cookie) to serve ads based on prior visits,
+ * and (3) how users opt out. Host-routed: one page covers every pastdoor surface,
+ * branded per host via siteForHost. Keep this URL stable — Google re-crawls it.
+ */
+export default async function PrivacyPage() {
+  const h = await headers();
+  const surface = siteForHost(h.get('x-pastdoor-host') || h.get('host'));
+  const updated = 'August 5, 2026';
+
+  return (
+    <div className="max-w-3xl mx-auto px-6 py-16 prose prose-neutral">
+      <h1 className="text-3xl font-semibold mb-2">Privacy Policy</h1>
+      <p className="text-sm text-ink/50 mb-8">
+        {surface.brandName} ({surface.domain}) · Last updated {updated}
+      </p>
+
+      <p>
+        This Privacy Policy explains what information {surface.brandName} collects when you
+        visit {surface.domain}, how we use it, and the choices you have. By using this site
+        you agree to the practices described here.
+      </p>
+
+      <h2 className="text-xl font-semibold mt-8 mb-2">Information we collect</h2>
+      <p>
+        We collect standard server log information (your IP address, browser type, referring
+        pages, and the time of your visit) and information stored in cookies or similar
+        technologies. We do not require you to create an account to browse public records
+        content, and we do not sell your personal information.
+      </p>
+
+      <h2 className="text-xl font-semibold mt-8 mb-2">Cookies and advertising</h2>
+      <p>
+        We use cookies to operate the site and to display advertising. Specifically:
+      </p>
+      <ul>
+        <li>
+          <strong>Third-party vendors, including Google, use cookies to serve ads</strong>{' '}
+          based on your prior visits to this website and other websites.
+        </li>
+        <li>
+          Google&rsquo;s use of advertising cookies (including the DoubleClick cookie)
+          enables it and its partners to serve ads to you based on your visits to this and/or
+          other sites on the Internet.
+        </li>
+        <li>
+          You may opt out of personalized advertising by visiting{' '}
+          <a href="https://www.google.com/settings/ads" target="_blank" rel="noopener noreferrer">
+            Google Ads Settings
+          </a>
+          . You can opt out of a third-party vendor&rsquo;s use of cookies for personalized
+          advertising by visiting{' '}
+          <a href="https://www.aboutads.info/choices/" target="_blank" rel="noopener noreferrer">
+            aboutads.info
+          </a>{' '}
+          or{' '}
+          <a href="https://www.youronlinechoices.eu/" target="_blank" rel="noopener noreferrer">
+            youronlinechoices.eu
+          </a>{' '}
+          (EEA/UK).
+        </li>
+        <li>
+          Where required by law (including the EEA, UK, and Switzerland), we request consent
+          before setting non-essential advertising cookies.
+        </li>
+      </ul>
+      <p>
+        For more information about how Google uses data when you use our partners&rsquo; sites
+        or apps, see{' '}
+        <a href="https://policies.google.com/technologies/partner-sites" target="_blank" rel="noopener noreferrer">
+          Google&rsquo;s Privacy &amp; Terms
+        </a>
+        .
+      </p>
+
+      <h2 className="text-xl font-semibold mt-8 mb-2">Analytics</h2>
+      <p>
+        We use Google Analytics to understand how visitors use the site. Google Analytics sets
+        cookies to measure pageviews and sessions in aggregate. You can opt out using the{' '}
+        <a href="https://tools.google.com/dlpage/gaoptout" target="_blank" rel="noopener noreferrer">
+          Google Analytics Opt-out Browser Add-on
+        </a>
+        .
+      </p>
+
+      <h2 className="text-xl font-semibold mt-8 mb-2">Your choices</h2>
+      <p>
+        Most browsers let you block or delete cookies through their settings. Blocking cookies
+        may affect how the site functions. You can also use the opt-out links above to limit
+        personalized advertising.
+      </p>
+
+      <h2 className="text-xl font-semibold mt-8 mb-2">Public records &amp; living persons</h2>
+      <p>
+        {surface.brandName} presents historical, public-record information about addresses and
+        their past associations. Content is limited to historical associations; living persons
+        are protected by design. To request removal or correction, contact us below.
+      </p>
+
+      <h2 className="text-xl font-semibold mt-8 mb-2">Contact</h2>
+      <p>
+        Questions about this policy or a removal request? Email{' '}
+        <a href={`mailto:privacy@${surface.domain}`}>privacy@{surface.domain}</a>.
+      </p>
+    </div>
+  );
+}

← 3d9c885 AdSense: inject Auto-ads loader into root layout + add publi  ·  back to Stayclaim  ·  Verify historic monument layer identity before importing 3881fa9 →