Files
property-management-network/app/layout.tsx
T
Leon SerfatyandClaude Opus 4.8 c9968531e4 Consolidate audit-fixes branch: webhooks, integrations, and deploy hardening
Batch commit of the pending working tree on security/audit-fixes-2026-07.
Major areas:
- Outbound webhooks / Zapier: schema + signed delivery with retries, public
  v1 API (REST-hook subscribe/unsubscribe), settings UI, cron drain.
- Deploy hardening: email via SMTP2GO (Resend fully removed), verified DB TLS
  (DATABASE_SSL=require + DATABASE_CA), storage fails loud in production when
  Spaces is unconfigured instead of silently using ephemeral disk.
- Integrations & features (concurrent work): accounting (QuickBooks/Xero),
  e-signature (DocuSign/Dropbox Sign), PayPal, geocoding/maps, onboarding,
  expanded legal pages.
- DB migrations 0006–0009.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 13:42:34 -04:00

78 lines
2.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { Metadata } from "next"
import { Geist, Geist_Mono } from "next/font/google"
import { Toaster } from "@/components/ui/toaster"
import { UmamiAnalytics } from "@/components/analytics/umami"
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 = {
metadataBase: new URL(process.env.NEXT_PUBLIC_APP_URL ?? "https://propertymanagement.network"),
applicationName: "Property Management Network",
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 120 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: "/",
siteName: "Property Management Network",
locale: "en_US",
},
twitter: {
card: "summary_large_image",
title: "Property Management Network — Built for Independent Landlords",
description: "One dashboard to manage all your rental properties.",
creator: "@propertymgmtnet",
site: "@propertymgmtnet",
},
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
"max-image-preview": "large",
"max-snippet": -1,
"max-video-preview": -1,
},
},
verification: {
// Set GOOGLE_SITE_VERIFICATION in the environment to emit the
// <meta name="google-site-verification"> tag. Left undefined => tag omitted.
google: process.env.GOOGLE_SITE_VERIFICATION,
},
}
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 />
<UmamiAnalytics />
</body>
</html>
)
}