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>
49 lines
1.4 KiB
TypeScript
49 lines
1.4 KiB
TypeScript
import type { Metadata } from "next"
|
||
import { Geist, Geist_Mono } from "next/font/google"
|
||
import { Toaster } from "sonner"
|
||
import "./globals.css"
|
||
|
||
const geistSans = Geist({
|
||
variable: "--font-geist-sans",
|
||
subsets: ["latin"],
|
||
})
|
||
|
||
const geistMono = Geist_Mono({
|
||
variable: "--font-geist-mono",
|
||
subsets: ["latin"],
|
||
})
|
||
|
||
export const metadata: Metadata = {
|
||
title: {
|
||
default: "Property Management Network — Built for Independent Landlords",
|
||
template: "%s | Property Management Network",
|
||
},
|
||
description:
|
||
"Manage your rental properties, tenants, rent, maintenance, and leases from one dashboard. Built for independent landlords with 1–20 properties.",
|
||
keywords: ["property management", "landlord software", "rent tracker", "tenant management"],
|
||
openGraph: {
|
||
title: "Property Management Network — Built for Independent Landlords",
|
||
description: "One dashboard to manage all your rental properties.",
|
||
type: "website",
|
||
url: process.env.NEXT_PUBLIC_APP_URL,
|
||
},
|
||
}
|
||
|
||
export default function RootLayout({
|
||
children,
|
||
}: Readonly<{
|
||
children: React.ReactNode
|
||
}>) {
|
||
return (
|
||
<html
|
||
lang="en"
|
||
className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}
|
||
>
|
||
<body suppressHydrationWarning className="min-h-full flex flex-col bg-[#09090b] text-white">
|
||
{children}
|
||
<Toaster position="bottom-right" theme="dark" richColors />
|
||
</body>
|
||
</html>
|
||
)
|
||
}
|