Build SEO-optimized local business websites that generate 80-100+ pages programmatically from your services and service areas. Every page gets unique content, Schema.org structured data, internal linking, and on-page SEO, all deployed as a fast static site on Cloudflare Pages. Works for any local service business: plumbers, electricians, HVAC techs, dentists, lawyers, roofers, landscapers, and more.
- Programmatic SEO: Automatically generates
[areas] x [services]combination pages, each with unique titles, meta descriptions, headings, FAQs, and testimonials - Schema.org JSON-LD: LocalBusiness, Service, FAQPage, BreadcrumbList, and Review markup on every page
- Responsive design: Built with Tailwind CSS v4, mobile-first, fast on every device
- Internal linking mesh: Related service links, nearby area links, breadcrumbs, and cross-links for maximum crawlability
- Blog with content collections: Astro 5 content collections for blog posts with Markdown/MDX support
- AI image generation (optional): Generate hero images, service photos, and area images using Gemini (requires API key)
- Cloudflare Pages deployment (optional): Zero-config static hosting with global CDN, or deploy anywhere that serves static files
- Industry agnostic: Preconfigured templates for plumbing, electrical, HVAC, dental, legal, roofing, landscaping, cleaning, pest control, and any other local service business
claude plugin add savvity/local-business-builder
Open Claude Code in an empty project directory and try one of these prompts:
Build a website for my plumbing business in Austin, TX
Create a website for ABC Electric serving Dallas and surrounding areas
Improve this local business site: www.example.com
The agent will ask you a few questions about your business, then scaffold and build the entire site.
The agent will ask for the following information (you can provide it up front or answer questions interactively):
| Information | Example | Required |
|---|---|---|
| Business name | "Austin Plumbing Pros" | Yes |
| Services offered | "Water heater repair, drain cleaning, slab leak detection" | Yes |
| Service areas | "Austin, Round Rock, Cedar Park, Georgetown" | Yes |
| Phone number | "(512) 555-0199" | Yes |
| Email address | "info@austinplumbing.com" | Yes |
| Street address | "1234 Main St, Austin, TX 78701" | Yes |
| Business hours | "Mon-Fri 7am-6pm, Sat 8am-2pm" | Yes |
| Website URL/domain | "www.austinplumbingpros.com" | Yes |
| Logo image file | logo.png or logo.svg | No |
| Brand colors | "Dark green and gold" | No |
| License/insurance info | "Licensed & Insured, TX License #12345" | No |
| Years in business | "15 years" | No |
| Tagline/slogan | "Your Trusted Local Plumber Since 2010" | No |
If you provide a Gemini API key, the agent can generate custom images for your site:
export GEMINI_API_KEY="your-key-here"
The generated site deploys to Cloudflare Pages out of the box. The agent can configure this for you if you have a Cloudflare account, or you can deploy the static dist/ folder to any hosting provider.
The agent follows a 7-phase build process:
- Discovery: Asks about your business, services, areas, and branding preferences
- Scaffold: Creates the Astro 5 project structure from templates, installs dependencies
- Data generation: Builds TypeScript data files for your business info, services, and areas
- SEO content: Generates unique titles, meta descriptions, H1s, intros, FAQs, and testimonials for every service-area combination page
- Customization: Applies your brand colors, logo, fonts, and contact information across all templates
- Content seeding: Creates initial blog posts targeting local keywords
- Build and verify: Runs
astro build, verifies all pages render correctly, checks for broken links
| Business Type | Schema.org Type | Example Services |
|---|---|---|
| Plumber | Plumber | Water heater repair, drain cleaning, pipe repair |
| Electrician | Electrician | Panel upgrades, wiring, lighting installation |
| HVAC | HVACBusiness | AC repair, furnace installation, duct cleaning |
| Dentist | Dentist | Teeth cleaning, crowns, implants, whitening |
| Lawyer | LegalService | Personal injury, family law, estate planning |
| Roofer | RoofingContractor | Roof repair, replacement, inspection, gutters |
| Landscaper | LandscapingService | Lawn care, tree trimming, irrigation, hardscaping |
| Cleaning Service | CleaningService | House cleaning, carpet cleaning, pressure washing |
| Pest Control | PestControlService | Termite treatment, rodent removal, mosquito control |
| Moving Company | MovingCompany | Local moving, packing, storage, commercial moves |
| Locksmith | Locksmith | Emergency lockout, rekey, lock installation |
| Painter | HousePainter | Interior painting, exterior painting, cabinet refinishing |
| Auto Repair | AutoRepair | Oil change, brake repair, engine diagnostics |
| Veterinarian | VeterinaryCare | Wellness exams, vaccinations, surgery, dental care |
| Any other local service | LocalBusiness | Customize for your industry |
| Technology | Version | Purpose |
|---|---|---|
| Astro | 5.x | Static site framework with content collections |
| Tailwind CSS | 4.x | Utility-first CSS with CSS-native configuration |
| TypeScript | 5.x | Type-safe data files and configuration |
| Cloudflare Pages | - | Global CDN hosting with zero-config deploys |
- Static-first: All pages are pre-rendered at build time for maximum speed and SEO
- Data-driven pages: Service-area combinations are generated from TypeScript data files using Astro's
getStaticPaths, not hardcoded - Tailwind CSS v4: Uses the new CSS-native configuration (no
tailwind.config.js),@themefor design tokens, and@pluginfor official plugins - Content collections: Blog posts use Astro 5's type-safe content collections with
render()fromastro:content - No JavaScript by default: Pages ship zero client-side JS unless explicitly needed (e.g., mobile menu toggle)
your-business-site/
├── public/
│ ├── robots.txt
│ ├── favicon.svg
│ └── images/
├── src/
│ ├── components/
│ │ ├── Breadcrumbs.astro
│ │ ├── Footer.astro
│ │ ├── Header.astro
│ │ ├── SEO.astro
│ │ ├── SeoFaq.astro
│ │ ├── SeoRelatedLinks.astro
│ │ ├── SeoServiceAreas.astro
│ │ └── SeoTestimonials.astro
│ ├── content/
│ │ └── blog/
│ │ └── *.md
│ ├── data/
│ │ ├── business.ts
│ │ ├── serviceAreas.ts
│ │ ├── serviceTypes.ts
│ │ └── seoContent.ts
│ ├── layouts/
│ │ └── BaseLayout.astro
│ ├── lib/
│ │ └── urls.ts
│ ├── pages/
│ │ ├── index.astro
│ │ ├── about.astro
│ │ ├── contact.astro
│ │ ├── areas/
│ │ │ ├── index.astro
│ │ │ └── [area].astro
│ │ ├── services/
│ │ │ ├── index.astro
│ │ │ ├── [service].astro
│ │ │ └── [area]/
│ │ │ └── [service].astro
│ │ └── blog/
│ │ ├── index.astro
│ │ └── [slug].astro
│ └── styles/
│ └── global.css
├── astro.config.mjs
├── package.json
└── tsconfig.json
For a business with S services and A areas, the site generates:
| Page Type | Count | Example (8 services, 10 areas) |
|---|---|---|
| Homepage | 1 | 1 |
| About | 1 | 1 |
| Contact | 1 | 1 |
| Services index | 1 | 1 |
| Individual service pages | S | 8 |
| Areas index | 1 | 1 |
| Individual area pages | A | 10 |
| Service-area combinations | S x A | 80 |
| Blog posts | varies | 5+ |
| Total | S x A + S + A + 5 + blog | 107+ |
MIT