Files
property-management-network/app/(marketing)/cookie-policy/page.tsx
T
Leon SerfatyandClaude Opus 4.8 857b9a7811 Initial import: property management SaaS + security hardening + admin dashboard
Property Management Network — Next.js 16 (App Router), Better Auth,
Drizzle ORM over PostgreSQL, Stripe, OpenAI, Resend.

Includes:
- Security hardening: access-control/IDOR fixes, TLS-by-default DB layer,
  constant-time cron auth, strict security headers, atomic AI quota gating,
  HTML/email output encoding, demo-backdoor disabled in production.
- Superadmin dashboard at /admin (overview/MRR, server-paginated users with
  ban/impersonate/plan/delete, billing, platform activity + admin audit log,
  AI usage, system health) via the Better Auth admin plugin.
- Seed/migration utility scripts under scripts/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 20:36:07 -04:00

78 lines
4.2 KiB
TypeScript

export const metadata = {
title: "Cookie Policy — Property Management Network",
description: "How Property Management Network uses cookies and similar tracking technologies.",
}
const SECTIONS = [
{
title: "What are cookies?",
body: "Cookies are small text files stored on your device by your browser when you visit a website. They help websites remember your preferences, keep you logged in, and understand how the site is being used.",
},
{
title: "Cookies we use",
body: "We use the following types of cookies: (1) Essential cookies — required for the application to function, such as session authentication tokens. Without these, you cannot log in. (2) Analytics cookies — we use Vercel Analytics (privacy-preserving, no personal data stored) to understand page performance. (3) Preference cookies — we store your dashboard preferences (dark/light mode, column visibility) in browser localStorage.",
},
{
title: "Third-party cookies",
body: "Stripe may set cookies when you make a payment for fraud prevention and PCI compliance purposes. We do not use advertising, retargeting, or social media tracking cookies.",
},
{
title: "How to control cookies",
body: "You can manage cookies through your browser settings. Most browsers allow you to block or delete cookies. Note that blocking essential cookies will prevent you from logging in to Property Management Network. For analytics cookies, you can opt out by enabling the Do Not Track header in your browser.",
},
{
title: "Cookie retention",
body: "Session cookies expire when you close your browser. Authentication tokens are refreshed automatically and expire after 7 days of inactivity. Analytics data is retained for 90 days in aggregate, with no individual identifiers stored.",
},
{
title: "Changes to this policy",
body: "We may update this Cookie Policy as we add new features. Significant changes will be announced via the in-app notification banner. The date at the bottom of this page reflects the most recent update.",
},
{
title: "Contact",
body: "For questions about cookies or this policy, contact us at privacy@propertymanagement.network.",
},
]
export default function CookiePolicyPage() {
return (
<div className="bg-[#09090b] text-white min-h-screen">
<div className="mx-auto max-w-3xl px-6 pt-32 pb-24">
<div className="mb-10">
<h1 className="text-3xl font-bold text-white mb-2">Cookie Policy</h1>
<p className="text-xs text-white/30">Last updated: April 2026</p>
</div>
<div className="space-y-8">
{SECTIONS.map((s) => (
<div key={s.title}>
<h2 className="text-base font-semibold text-white mb-2">{s.title}</h2>
<p className="text-sm text-white/50 leading-relaxed">{s.body}</p>
</div>
))}
</div>
{/* Cookie types summary table */}
<div className="mt-10 rounded-2xl border border-white/[0.06] bg-[#111118] overflow-hidden">
<div className="px-5 py-3.5 border-b border-white/[0.04]">
<p className="text-xs font-semibold uppercase tracking-wider text-white/30">Cookie Summary</p>
</div>
{[
{ name: "pf_session", type: "Essential", purpose: "Authentication session token", expires: "7 days" },
{ name: "pf_prefs", type: "Preference", purpose: "Dashboard layout preferences", expires: "1 year" },
{ name: "_vercel_*", type: "Analytics", purpose: "Anonymous page performance data", expires: "90 days" },
{ name: "__stripe_*", type: "Third-party", purpose: "Stripe payment fraud prevention", expires: "Session" },
].map((row, i, arr) => (
<div key={row.name} className={`grid grid-cols-4 gap-4 px-5 py-3.5 text-xs ${i !== arr.length - 1 ? "border-b border-white/[0.04]" : ""}`}>
<code className="font-mono text-indigo-300">{row.name}</code>
<span className="text-white/60">{row.type}</span>
<span className="text-white/40 col-span-1">{row.purpose}</span>
<span className="text-white/40">{row.expires}</span>
</div>
))}
</div>
</div>
</div>
)
}