diff --git a/README.md b/README.md
index f0f7063..1144d70 100644
--- a/README.md
+++ b/README.md
@@ -1,31 +1,80 @@
-# Vail Renovations Static Site
+# Vail Renovations Platform Foundation
-Static Netlify-ready website for Vail Renovations built around the Vail Home Command intake paths.
+This repo is being converted from a static Netlify HTML site into a Next.js App Router foundation for the Vail Renovations public website and future mobile-friendly CRM.
+
+## Current scope
+
+Implemented in the platform foundation:
+
+- Next.js App Router
+- TypeScript
+- Tailwind configuration
+- Public layout, header, footer and mobile sticky CTAs
+- Homepage foundation
+- Public route placeholders
+- Legacy static-route redirects
+- Netlify Next.js build configuration
+- Platform foundation report
+
+Not implemented in this ticket:
+
+- CRM
+- Database
+- Auth
+- Lead creation
+- Project Starter functionality
+- Scope Builder functionality
+- Callback submission
+- Photo uploads
+- Private storage
+- Notifications
+- Analytics
+- Estimate workflow
## Required routes
- `/`
-- `/start-a-project`
-- `/fix-list-builder`
-- `/maintenance-plans`
-- `/inspection-report-repairs`
-- `/thank-you`
+- `/services`
+- `/services/bathroom-renovations`
+- `/services/basement-renovations`
+- `/services/kitchen-updates`
+- `/services/repairs-refreshes`
+- `/services/pre-sale-improvements`
+- `/services/rental-turnovers`
+- `/how-it-works`
+- `/project-request`
+- `/scope-builder`
+- `/book-call`
+- `/callback`
+- `/contact`
+- `/privacy`
+- `/terms`
-## Netlify Forms
+## Legacy redirects
-Included forms:
+Legacy static URLs redirect to the new foundation routes:
-- `vail-project-intake`
-- `vail-fix-list`
-- `vail-maintenance-plan`
-- `vail-inspection-report`
+- `/start-a-project` -> `/project-request`
+- `/fix-list-builder` -> `/scope-builder`
+- `/maintenance-plans` -> `/services/repairs-refreshes`
+- `/inspection-report-repairs` -> `/services/pre-sale-improvements`
+- `/renovations` -> `/services`
+- `/thank-you` -> `/contact`
-## Deploy
+## Scripts
-Netlify settings:
+```bash
+npm run dev
+npm run typecheck
+npm run lint
+npm run build
+npm run check
+```
+
+## Deploy
-- Base directory: blank
-- Build command: blank
-- Publish directory: `.`
+Netlify settings for this foundation:
-Run `npm run check` before deploying.
+- Build command: `npm run build`
+- Publish directory: `.next`
+- Plugin: `@netlify/plugin-nextjs`
diff --git a/app/book-call/page.tsx b/app/book-call/page.tsx
new file mode 100644
index 0000000..4447d2f
--- /dev/null
+++ b/app/book-call/page.tsx
@@ -0,0 +1,20 @@
+import { PlaceholderPage } from "@/components/placeholder-page";
+
+export const metadata = {
+ title: "Book a Quick Call",
+ description: "Vail quick call foundation route."
+};
+
+export default function BookCallPage() {
+ return (
+
+ );
+}
diff --git a/app/callback/page.tsx b/app/callback/page.tsx
new file mode 100644
index 0000000..01eaadd
--- /dev/null
+++ b/app/callback/page.tsx
@@ -0,0 +1,20 @@
+import { PlaceholderPage } from "@/components/placeholder-page";
+
+export const metadata = {
+ title: "Request a Callback",
+ description: "Vail callback request foundation route."
+};
+
+export default function CallbackPage() {
+ return (
+
+ );
+}
diff --git a/app/contact/page.tsx b/app/contact/page.tsx
new file mode 100644
index 0000000..fb8df6b
--- /dev/null
+++ b/app/contact/page.tsx
@@ -0,0 +1,20 @@
+import { PlaceholderPage } from "@/components/placeholder-page";
+
+export const metadata = {
+ title: "Contact",
+ description: "Contact Vail Renovations."
+};
+
+export default function ContactPage() {
+ return (
+
+ );
+}
diff --git a/app/globals.css b/app/globals.css
new file mode 100644
index 0000000..664f41f
--- /dev/null
+++ b/app/globals.css
@@ -0,0 +1,41 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+:root {
+ --background: #f6f1e9;
+ --foreground: #16201a;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ min-width: 320px;
+ margin: 0;
+ background: var(--background);
+ color: var(--foreground);
+ font-family: Arial, Helvetica, sans-serif;
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+}
+
+button,
+input,
+select,
+textarea {
+ font: inherit;
+}
+
+::selection {
+ background: #b98b4b;
+ color: #16201a;
+}
diff --git a/app/how-it-works/page.tsx b/app/how-it-works/page.tsx
new file mode 100644
index 0000000..a1b746c
--- /dev/null
+++ b/app/how-it-works/page.tsx
@@ -0,0 +1,20 @@
+import { PlaceholderPage } from "@/components/placeholder-page";
+
+export const metadata = {
+ title: "How It Works",
+ description: "The Vail Project Path foundation route."
+};
+
+export default function HowItWorksPage() {
+ return (
+
+ );
+}
diff --git a/app/layout.tsx b/app/layout.tsx
new file mode 100644
index 0000000..f2c1940
--- /dev/null
+++ b/app/layout.tsx
@@ -0,0 +1,33 @@
+import type { Metadata } from "next";
+import "./globals.css";
+import { MobileCtaBar } from "@/components/mobile-cta-bar";
+import { SiteFooter } from "@/components/site-footer";
+import { SiteHeader } from "@/components/site-header";
+
+export const metadata: Metadata = {
+ title: {
+ default: "Vail Renovations | Renovation Help Without the Runaround",
+ template: "%s | Vail Renovations"
+ },
+ description:
+ "Vail Renovations helps Ottawa homeowners start repairs, updates and renovation projects with one clear point of contact and practical scope guidance.",
+ metadataBase: new URL("https://vail-renovations.netlify.app"),
+ openGraph: {
+ title: "Vail Renovations",
+ description: "Renovation help without the runaround.",
+ type: "website"
+ }
+};
+
+export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) {
+ return (
+
+
+
+ {children}
+
+
+
+
+ );
+}
diff --git a/app/page.tsx b/app/page.tsx
new file mode 100644
index 0000000..721101d
--- /dev/null
+++ b/app/page.tsx
@@ -0,0 +1,120 @@
+import Link from "next/link";
+import { serviceRoutes } from "@/lib/routes";
+
+const projectSteps = [
+ "Tell Vail what you want fixed, changed or improved.",
+ "Share photos or a budget only if you already have them.",
+ "Vail reviews the request and gives you the next clear step."
+];
+
+export default function Home() {
+ return (
+
+
+
+
+
+
Vail Renovations
+
+ Renovation help without the runaround.
+
+
+ Vail Renovations helps Ottawa homeowners handle repairs, updates and renovation projects with one clear point of contact, practical scope guidance and the right specialists brought in when needed.
+
+
+ Not sure what trade you need? Just tell us what you are trying to fix, change or improve.
+
+
+
+ Start a Project Request
+
+
+ Book a Quick Call
+
+
+
+ Want to organize your ideas first? Try the Vail Scope Builder.
+
+
+
+
+
+
+
+
+
+
Low friction by design
+
You do not need the whole project figured out.
+
+ The site is now a Next.js platform foundation ready for the future Project Starter, Scope Builder and CRM work. This ticket intentionally keeps forms, CRM, auth, database and uploads out of scope.
+
+
+
+
+
Simple starting point
+
Homeowners should be able to start with plain-language notes, not contractor terminology.
+
+
+
Optional detail
+
Photos, budget and exact measurements belong as optional helpers, not barriers.
+
+
+
Clear next step
+
Every route should point back to a project request, callback or quick call.
+
+
+
+
+
+
+
+
+
+
Services
+
Repairs, updates and renovation work organized properly.
+
+
+ View Services
+
+
+
+ {serviceRoutes.map((service) => (
+
+
{service.title}
+
{service.description}
+
+ ))}
+
+
+
+
+
+
+
Shareable by design
+
Know someone trying to figure out a renovation or repair?
+
+ Send them the Project Starter when the route is connected in the next implementation ticket. For now, this foundation preserves the Vail positioning and app structure without faking lead capture.
+
+
+
+ Start a Project Request
+
+
+ Build My Scope
+
+
+ This route exists so the public site architecture is ready before the full content, Project Starter, Scope Builder and CRM tickets are implemented. No lead is created from this page in the foundation ticket.
+
+
+
+
+ Start a Project Request
+
+
+ Back to Services
+
+
+
+
+ );
+}
diff --git a/app/services/page.tsx b/app/services/page.tsx
new file mode 100644
index 0000000..cf683e5
--- /dev/null
+++ b/app/services/page.tsx
@@ -0,0 +1,29 @@
+import Link from "next/link";
+import { serviceRoutes } from "@/lib/routes";
+
+export const metadata = {
+ title: "Services",
+ description: "Vail Renovations service route placeholders for bathroom, basement, kitchen, repair, pre-sale and rental turnover work."
+};
+
+export default function ServicesPage() {
+ return (
+
+
+
Services
+
Renovation work organized around the next clear step.
+
+ These routes establish the public-site foundation for Vail Renovations. They are placeholders for the next content and intake tickets, not live estimating or lead creation flows.
+
+
+ {serviceRoutes.map((service) => (
+
+
{service.title}
+
{service.description}
+
+ ))}
+
+
+
+ );
+}
diff --git a/app/terms/page.tsx b/app/terms/page.tsx
new file mode 100644
index 0000000..e778c8c
--- /dev/null
+++ b/app/terms/page.tsx
@@ -0,0 +1,20 @@
+import { PlaceholderPage } from "@/components/placeholder-page";
+
+export const metadata = {
+ title: "Terms",
+ description: "Vail Renovations terms and disclaimer placeholder."
+};
+
+export default function TermsPage() {
+ return (
+
+ );
+}
diff --git a/components/mobile-cta-bar.tsx b/components/mobile-cta-bar.tsx
new file mode 100644
index 0000000..f9bd7b8
--- /dev/null
+++ b/components/mobile-cta-bar.tsx
@@ -0,0 +1,16 @@
+import Link from "next/link";
+
+export function MobileCtaBar() {
+ return (
+