A Next.js 14 (App Router) local SEO website for a house cleaning business targeting Seattle, Washington. Built for rank & rent lead generation with a mobile-first, fast-loading design.
- Next.js 14 (App Router)
- TypeScript
- Tailwind CSS
- Server components where possible, reusable UI components
src/
├── app/
│ ├── page.tsx # Home
│ ├── about/page.tsx
│ ├── services/page.tsx
│ ├── services/[slug]/ # house-cleaning, deep-cleaning, move-out-cleaning, apartment-cleaning
│ ├── service-areas/page.tsx
│ ├── contact/page.tsx
│ ├── blog/page.tsx
│ ├── blog/[slug]/page.tsx
│ ├── privacy-policy/page.tsx
│ ├── terms/page.tsx
│ ├── layout.tsx
│ ├── sitemap.ts
│ └── robots.ts
├── components/ # Hero, CTA, FAQ, ServiceCard, ContactForm, Header, Footer, etc.
├── lib/
│ ├── constants.ts # NAP, services, nav, site config
│ └── schema.ts # LocalBusiness, FAQ, Service JSON-LD
└── types/
└── index.ts
- Unique title and meta description per page
- Single H1, logical H2/H3 structure
- Internal linking (services ↔ service areas ↔ contact)
- LocalBusiness and FAQ JSON-LD on homepage and service pages
- Service schema on individual service pages
- NAP (Name, Address, Phone) in footer and schema
- OpenGraph and Twitter meta tags
sitemap.xmlandrobots.txtgenerated via App Router
- Reusable ContactForm (name, phone, email, service needed, message) with validation
- Form is ready to plug into your API or webhook (see
ContactForm.tsxTODO) - Sticky Call Now button on mobile
npm install
npm run devOpen http://localhost:3000.
npm run build
npm start- Business details: Edit
src/lib/constants.ts(name, phone, email, address, service areas). - Site URL: Set
NEXT_PUBLIC_SITE_URLfor production (used in sitemap, robots, schema). - OG image: Add
public/og-image.jpg(1200×630) for social sharing; default metadata references/og-image.jpg. - Map: Replace the embed URL in
src/components/MapEmbed.tsxwith your Google Maps embed if needed.
Private – for use with the Seattle Sparkle Cleaning project.