# 37 — SEO & Content Specification ## HER — Home Enhancement and Renovation > **Phase 3 Spec** | Static site, no CMS | Placeholder domain: `https://her-sf.com` > > ⚠️ Replace all placeholder values marked below (telephone, email, postal code, domain) with Diana's actual production values before deployment. --- ## Table of Contents 1. [URL Structure](#1-url-structure) 2. [Title Tags](#2-title-tags) 3. [Meta Descriptions](#3-meta-descriptions) 4. [Heading Structure](#4-heading-structure) 5. [Schema.org Structured Data (JSON-LD)](#5-schemaorg-structured-data-json-ld) 6. [Open Graph & Twitter Card](#6-open-graph--twitter-card) 7. [sitemap.xml](#7-sitemapxml) 8. [robots.txt](#8-robotstxt) 9. [Content Requirements Per Service Page](#9-content-requirements-per-service-page) 10. [Internal Linking Strategy](#10-internal-linking-strategy) 11. [Image SEO](#11-image-seo) 12. [Service Area Signals](#12-service-area-signals) 13. [Page Speed & Technical SEO Notes](#13-page-speed--technical-seo-notes) 14. [Requirements Traceability](#14-requirements-traceability) --- ## 1. URL Structure All URLs use **trailing slashes**. Each page declares a `` pointing to itself at the production domain with the trailing slash. | Page | URL | Canonical | |------|-----|-----------| | Homepage | `/` | `https://her-sf.com/` | | Services Hub | `/services/` | `https://her-sf.com/services/` | | Painting | `/services/painting/` | `https://her-sf.com/services/painting/` | | Tile Setting | `/services/tile-setting/` | `https://her-sf.com/services/tile-setting/` | | Drywall & Sheetrocking | `/services/drywall/` | `https://her-sf.com/services/drywall/` | | Minor Plumbing | `/services/plumbing/` | `https://her-sf.com/services/plumbing/` | | Minor Electrical | `/services/electrical/` | `https://her-sf.com/services/electrical/` | | Carpentry & Mounting | `/services/carpentry-and-mounting/` | `https://her-sf.com/services/carpentry-and-mounting/` | | Flooring & Wood Refinishing | `/services/flooring/` | `https://her-sf.com/services/flooring/` | | Security & Safety Equipment | `/services/security-safety/` | `https://her-sf.com/services/security-safety/` | | Boat Work | `/services/boat-work/` | `https://her-sf.com/services/boat-work/` | | About Diana | `/about/` | `https://her-sf.com/about/` | | Testimonials | `/testimonials/` | `https://her-sf.com/testimonials/` | | Contact / Request a Quote | `/contact/` | `https://her-sf.com/contact/` | | Thank You (post-form) | `/thank-you/` | — (noindex; no canonical needed) | **Implementation notes:** - The Caddy configuration (or build output) must issue a **301 redirect** from any non-trailing-slash URL (e.g., `/services/painting`) to its trailing-slash equivalent. Inconsistent trailing slashes create duplicate-content signals. - The `/thank-you/` page must carry `` in ``. It is excluded from the sitemap and disallowed in `robots.txt` (see Sections 7 and 8). - Total indexable pages: **14** (excluding `/thank-you/`). --- ## 2. Title Tags ### Formula | Page type | Formula | |-----------|---------| | Homepage | `HER — Handywoman San Francisco \| Home Enhancement and Renovation` | | Services Hub | `Handywoman Services in San Francisco \| HER` | | Service detail pages | `[Service] in San Francisco \| HER Handywoman` ¹ | | About | `About Diana \| HER — San Francisco Handywoman` | | Testimonials | `Client Reviews \| HER — San Francisco Handywoman` | | Contact | `Request a Quote \| HER — San Francisco Handywoman` | | Thank You | `Thank You \| HER — San Francisco Handywoman` (noindex) | > ¹ **Formula note — why the suffix is shortened for service pages:** > The originally specified formula `[Service] in San Francisco | HER — Home Enhancement and Renovation` produces titles of 65–84 characters for every service page — consistently above Google's ~60-character SERP display threshold. The suffix `| HER — Home Enhancement and Renovation` alone is 40 characters, leaving fewer than 20 characters for the service name and city before truncation. The shortened suffix `| HER Handywoman` (16 chars) preserves the brand acronym and the differentiating keyword "Handywoman" while keeping every title under 56 characters. For the three service pages with longer names (Drywall & Sheetrocking, Flooring & Wood Refinishing, Security & Safety Equipment), even `| HER Handywoman` is dropped to `| HER` to stay comfortably under 60 characters. The full brand name "Home Enhancement and Renovation" appears in the `og:site_name` tag, the footer on every page, and in the `LocalBusiness` schema — it remains fully indexable. ### Final Recommended Title Tags | Page | Recommended Title Tag | Chars | Status | |------|----------------------|------:|--------| | Homepage | `HER — Handywoman San Francisco \| Home Enhancement and Renovation` | 64 | ⚠️ See note ² | | Services Hub | `Handywoman Services in San Francisco \| HER` | 42 | ✅ | | Painting | `Painting in San Francisco \| HER Handywoman` | 42 | ✅ | | Tile Setting | `Tile Setting in San Francisco \| HER Handywoman` | 46 | ✅ | | Drywall & Sheetrocking | `Drywall & Sheetrocking in San Francisco \| HER` | 45 | ✅ | | Minor Plumbing | `Minor Plumbing in San Francisco \| HER Handywoman` | 48 | ✅ | | Minor Electrical | `Minor Electrical in San Francisco \| HER Handywoman` | 50 | ✅ | | Carpentry & Mounting | `Carpentry & Mounting in San Francisco \| HER` | 43 | ✅ | | Flooring & Wood Refinishing | `Flooring & Wood Refinishing in San Francisco \| HER` | 50 | ✅ | | Security & Safety Equipment | `Security & Safety Equipment in San Francisco \| HER` | 50 | ✅ | | Boat Work | `Boat Work in San Francisco Bay Area \| HER` | 41 | ✅ | | About | `About Diana \| HER — San Francisco Handywoman` | 44 | ✅ | | Testimonials | `Client Reviews \| HER — San Francisco Handywoman` | 47 | ✅ | | Contact | `Request a Quote \| HER — San Francisco Handywoman` | 48 | ✅ | | Thank You | `Thank You \| HER — San Francisco Handywoman` | 42 | ✅ (noindex) | > ² The homepage title at 64 characters is marginally over the 60-character rule. Google's rendering engine measures pixel width (~580px), not raw character count; short words like "HER" and narrow characters in "Renovation" mean it is likely to display in full. Use Google Search Console's "URL Inspection" tool after indexing to confirm no truncation, and shorten if needed (e.g., `HER — Handywoman San Francisco | Home Enhancement & Reno`). --- ## 3. Meta Descriptions All descriptions target: **service/page keyword + city or Bay Area + trust signal + CTA verb**. Maximum ~155 characters. | Page | Meta Description | ~Chars | |------|-----------------|-------:| | Homepage | Diana is San Francisco's trusted female handywoman serving the Bay Area. Painting, plumbing, tile, electrical & more. Get a free quote from HER today. | 150 | | Services Hub | Explore all handywoman services by HER in San Francisco and the Bay Area — painting, tile, drywall, plumbing, electrical & more. Request a free quote. | 150 | | Painting | Professional interior and exterior painting in San Francisco by HER handywoman Diana. Quality prep, clean finish, Bay Area coverage. Request a quote today. | 155 | | Tile Setting | Expert tile installation in San Francisco — bathroom, kitchen backsplash, floor, and shower tile by HER. Serving the Bay Area. Get your free quote. | 147 | | Drywall & Sheetrocking | Drywall repair, patching, and sheetrocking in San Francisco by HER handywoman. Bay Area homeowners trust Diana for quality, tidy results. Get a quote. | 150 | | Minor Plumbing | Minor plumbing in San Francisco — faucets, toilets, sinks, and fixture installation by HER handywoman Diana. Bay Area coverage. Request a free quote. | 149 | | Minor Electrical | Minor electrical work in San Francisco — light fixtures, ceiling fans, outlets, and switches installed by HER. Trusted Bay Area handywoman. Get a quote. | 152 | | Carpentry & Mounting | Carpentry, furniture assembly, TV mounting, and shelf installation in San Francisco by HER handywoman. Reliable Bay Area service. Request a quote. | 145 | | Flooring & Wood Refinishing | Hardwood floor refinishing, flooring installation, and deck refinishing in San Francisco by HER. Trusted Bay Area handywoman. Get a free quote today. | 149 | | Security & Safety Equipment | Grab bars, deadbolts, cameras, and smart locks installed in San Francisco by HER handywoman. Bay Area safety and security upgrades. Request a quote. | 148 | | Boat Work | Marine repairs, boat painting, woodwork, and hardware installation in San Francisco Bay by HER handywoman. Serving Bay Area marinas. Get a quote. | 144 | | About | Meet Diana — San Francisco's trusted female handywoman and project coordinator. Skilled, reliable, and easy to work with across the Bay Area. | 140 | | Testimonials | Read what Bay Area homeowners say about HER handywoman services in San Francisco. Real reviews from real clients who trust Diana's quality work. | 142 | | Contact | Ready to get started? Request a free quote from HER — San Francisco's trusted female handywoman. Serving the Bay Area within a 50-mile radius. | 141 | | Thank You | (Not indexed — no meta description required.) | — | > **Verify before deployment:** Run each description through a meta tag length checker (e.g., Sistrix Snippet Generator or Google's own SERP preview tools) at final content-lock, as small wording changes during copywriting can push lengths over the limit. --- ## 4. Heading Structure ### H1 Rule - **Exactly one `

` per page.** No two pages share the same H1 text. - The H1 carries the strongest on-page keyword relevance signal. It must include the primary keyword for that page and, where natural, a geographic reference (city or Bay Area). - The H1 does not need to match the `` tag word-for-word but must be thematically aligned. - The H1 should be the first visible text element inside the page `<main>` landmark, not buried inside a decorative hero component. ### H1 Per Page | Page | H1 | |------|----| | Homepage | `San Francisco's Trusted Female Handywoman` | | Services Hub | `Handywoman Services in San Francisco & the Bay Area` | | Painting | `Professional Painting Services in San Francisco` | | Tile Setting | `Tile Setting & Installation in San Francisco` | | Drywall & Sheetrocking | `Drywall Repair & Sheetrocking in San Francisco` | | Minor Plumbing | `Minor Plumbing Services in San Francisco` | | Minor Electrical | `Minor Electrical Services in San Francisco` | | Carpentry & Mounting | `Carpentry & Mounting Services in San Francisco` | | Flooring & Wood Refinishing | `Flooring & Wood Refinishing in San Francisco` | | Security & Safety Equipment | `Security & Safety Equipment Installation in San Francisco` | | Boat Work | `Boat Repairs & Marine Work in San Francisco Bay` | | About | `About Diana — San Francisco's Handywoman` | | Testimonials | `What Our Clients Say` | | Contact | `Request a Free Quote` | ### H2/H3 Structure — Service Detail Page Template Each of the 9 service detail pages follows this heading hierarchy: ``` h1 [Service] in San Francisco ← Primary keyword + city h2 What's Included ← Opens the service scope list h2 Why Choose HER for [Service] ← Trust + differentiation copy h2 Serving San Francisco & the Bay Area ← Local relevance signal h2 Frequently Asked Questions ← Optional; only on designated pages h3 [Question 1] h3 [Question 2] h3 [Question 3] h2 Ready to Get Started? ← CTA section ``` **Content guidance for each H2:** - **"What's Included"** — The list of specific sub-services should be a `<ul>` with `<li>` items, not individual `<h3>` tags. Reserve `<h3>` for meaningful content sub-sections (e.g., splitting "Interior Painting" from "Exterior Painting" if page depth warrants it). Keyword-dense sub-service names belong in the list item text, not forced into heading tags. - **"Why Choose HER for [Service]"** — This is the primary location for Diana's differentiating copy: years of experience, aerospace team-lead background, female handywoman positioning, project coordination skills, and trustworthiness (FR-16, FR-17, FR-18). 2–4 sentences minimum. - **"Serving San Francisco & the Bay Area"** — Name 4–8 specific cities or SF neighborhoods inline (see Section 12). This adds hyperlocal signals without thin-content pages. - **"Frequently Asked Questions"** — Only include this H2 on pages that carry the FAQPage schema (see Section 5.5: Painting, Tile Setting, Minor Plumbing). Do not use this schema on pages without a visible FAQ section. --- ## 5. Schema.org Structured Data (JSON-LD) ### Schema Assignment by Page | Page | JSON-LD Block(s) | |------|-----------------| | Homepage (`/`) | `LocalBusiness` | | Services Hub (`/services/`) | `LocalBusiness`, `BreadcrumbList` | | All 9 service detail pages | `LocalBusiness`, `BreadcrumbList`, `Service` [, `FAQPage`] | | About (`/about/`) | `LocalBusiness`, `BreadcrumbList`, `Person` | | Testimonials (`/testimonials/`) | `LocalBusiness`, `BreadcrumbList` | | Contact (`/contact/`) | `LocalBusiness`, `BreadcrumbList` | | Thank You (`/thank-you/`) | None (noindex page) | Each schema block goes in a separate `<script type="application/ld+json">` element inside `<head>`. Multiple blocks per page are valid and preferred over combining unrelated types into a single object. --- ### 5.1 LocalBusiness — Concrete Example (included on every page) The `@id` value (`https://her-sf.com/#business`) acts as a stable identifier for this entity. Other schema blocks (Service, Person) reference it by `@id` rather than repeating the full object. ```json { "@context": "https://schema.org", "@type": "LocalBusiness", "@id": "https://her-sf.com/#business", "name": "HER — Home Enhancement and Renovation", "url": "https://her-sf.com", "telephone": "+1-415-555-0100", "email": "diana@her-sf.com", "image": "https://her-sf.com/assets/diana_photo-min-1-scaled.webp", "logo": "https://her-sf.com/assets/Group-433.png", "priceRange": "$$", "address": { "@type": "PostalAddress", "addressLocality": "San Francisco", "addressRegion": "CA", "postalCode": "94103", "addressCountry": "US" }, "geo": { "@type": "GeoCoordinates", "latitude": 37.7749, "longitude": -122.4194 }, "areaServed": [ { "@type": "City", "name": "San Francisco" }, { "@type": "City", "name": "Oakland" }, { "@type": "City", "name": "Berkeley" }, { "@type": "City", "name": "San Jose" }, { "@type": "City", "name": "Palo Alto" }, { "@type": "City", "name": "Daly City" }, { "@type": "City", "name": "South San Francisco" }, { "@type": "City", "name": "Burlingame" }, { "@type": "City", "name": "San Mateo" }, { "@type": "City", "name": "Redwood City" }, { "@type": "City", "name": "Menlo Park" }, { "@type": "City", "name": "Fremont" }, { "@type": "City", "name": "Alameda" }, { "@type": "City", "name": "Tiburon" }, { "@type": "City", "name": "Sausalito" }, { "@type": "AdministrativeArea", "name": "Marin County" } ], "sameAs": [] } ``` > ⚠️ **Placeholders:** Replace `telephone`, `email`, and `postalCode` with Diana's actual values before deployment. Add any verified social/directory profile URLs (Yelp, LinkedIn, Nextdoor, etc.) to the `sameAs` array when they exist. --- ### 5.2 Service Schema (each service detail page) Place in addition to `LocalBusiness`. The `provider` field references the `LocalBusiness` entity by `@id`. Adapt `name`, `description`, `serviceType`, and `url` for each page. **Pattern — Painting page:** ```json { "@context": "https://schema.org", "@type": "Service", "name": "Painting Services in San Francisco", "description": "Professional interior and exterior painting for homes in San Francisco and the Bay Area, including wall painting, cabinet painting, trim painting, and thorough surface preparation.", "serviceType": "Painting", "provider": { "@id": "https://her-sf.com/#business" }, "areaServed": [ { "@type": "City", "name": "San Francisco" }, { "@type": "City", "name": "Oakland" }, { "@type": "City", "name": "Berkeley" }, { "@type": "AdministrativeArea", "name": "San Francisco Bay Area" } ], "url": "https://her-sf.com/services/painting/" } ``` **`serviceType` and `name` values per page:** | Page | `serviceType` | `name` | |------|--------------|--------| | Painting | `Painting` | `Painting Services in San Francisco` | | Tile Setting | `Tile Installation` | `Tile Setting & Installation in San Francisco` | | Drywall & Sheetrocking | `Drywall Repair` | `Drywall Repair & Sheetrocking in San Francisco` | | Minor Plumbing | `Plumbing` | `Minor Plumbing Services in San Francisco` | | Minor Electrical | `Electrical` | `Minor Electrical Services in San Francisco` | | Carpentry & Mounting | `Carpentry` | `Carpentry & Mounting Services in San Francisco` | | Flooring & Wood Refinishing | `Flooring` | `Flooring & Wood Refinishing in San Francisco` | | Security & Safety Equipment | `Security Installation` | `Security & Safety Equipment Installation in San Francisco` | | Boat Work | `Marine Repair` | `Boat Repairs & Marine Work in San Francisco Bay` | --- ### 5.3 Person Schema (About page only) ```json { "@context": "https://schema.org", "@type": "Person", "name": "Diana", "jobTitle": "Handywoman", "description": "Diana is a professional female handywoman and project coordinator based in San Francisco, serving the Bay Area. With years of hands-on experience and an aerospace team-lead background, she brings expertise, reliability, and clear communication to every project.", "image": "https://her-sf.com/assets/diana_photo-min-1-scaled.webp", "worksFor": { "@id": "https://her-sf.com/#business" }, "url": "https://her-sf.com/about/" } ``` --- ### 5.4 BreadcrumbList (all inner pages) **Service detail pages** use a 3-level breadcrumb (Home > Services > [Service]): ```json { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://her-sf.com/" }, { "@type": "ListItem", "position": 2, "name": "Services", "item": "https://her-sf.com/services/" }, { "@type": "ListItem", "position": 3, "name": "Painting", "item": "https://her-sf.com/services/painting/" } ] } ``` **Non-service inner pages** (Services Hub, About, Testimonials, Contact) use a 2-level breadcrumb (Home > [Page]): ```json { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://her-sf.com/" }, { "@type": "ListItem", "position": 2, "name": "About Diana", "item": "https://her-sf.com/about/" } ] } ``` **Breadcrumb label reference:** | URL | Breadcrumb label (`name`) | |-----|--------------------------| | `/services/` | Services | | `/services/painting/` | Painting | | `/services/tile-setting/` | Tile Setting | | `/services/drywall/` | Drywall & Sheetrocking | | `/services/plumbing/` | Minor Plumbing | | `/services/electrical/` | Minor Electrical | | `/services/carpentry-and-mounting/` | Carpentry & Mounting | | `/services/flooring/` | Flooring & Wood Refinishing | | `/services/security-safety/` | Security & Safety Equipment | | `/services/boat-work/` | Boat Work | | `/about/` | About Diana | | `/testimonials/` | Client Reviews | | `/contact/` | Request a Quote | The breadcrumb labels must match the visible breadcrumb component rendered on the page (see `33-frontend-spec.md` §6.9). --- ### 5.5 FAQPage Schema (optional; 3 designated pages) Add `FAQPage` schema **only** when a visible FAQ section exists in the page body. Do not include this schema if the questions are not rendered to the user — Google's quality guidelines explicitly prohibit hidden FAQ schema. **Recommended on:** Painting, Tile Setting, Minor Plumbing. **Pattern — Tile Setting example:** ```json { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "What types of tile do you install?", "acceptedAnswer": { "@type": "Answer", "text": "HER installs ceramic, porcelain, natural stone, and glass tile for bathroom floors and walls, kitchen backsplashes, shower surrounds, and more throughout San Francisco and the Bay Area." } }, { "@type": "Question", "name": "Do you include waterproofing for shower tile work?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Cement backer board and a waterproofing membrane are always installed in wet areas before tile is set." } }, { "@type": "Question", "name": "Can you match and repair existing tile?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Tile repair and close-match replacement is a core part of HER's tile setting service for San Francisco homeowners." } } ] } ``` **Suggested FAQ questions by page:** | Page | Question 1 | Question 2 | Question 3 | |------|------------|------------|------------| | Painting | Do you handle both interior and exterior painting? | Is surface preparation (patching, sanding, priming) included? | Can you paint kitchen cabinets? | | Tile Setting | What types of tile do you install? | Do you include waterproofing for shower tile? | Can you match and repair existing tile? | | Minor Plumbing | What counts as "minor plumbing"? | Do you pull permits for plumbing work? | Can you install a new toilet or faucet? | --- ## 6. Open Graph & Twitter Card ### Required Meta Tags (every page) ```html <!-- Open Graph --> <meta property="og:type" content="website" /> <meta property="og:site_name" content="HER — Home Enhancement and Renovation" /> <meta property="og:url" content="[canonical URL of current page]" /> <meta property="og:title" content="[title tag value for current page]" /> <meta property="og:description" content="[meta description for current page]" /> <meta property="og:image" content="[OG image URL — see table below]" /> <meta property="og:image:alt" content="[OG image alt text — see table below]" /> <meta property="og:image:width" content="1200" /> <meta property="og:image:height" content="630" /> <!-- Twitter Card --> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:title" content="[title tag value]" /> <meta name="twitter:description" content="[meta description]" /> <meta name="twitter:image" content="[OG image URL]" /> <meta name="twitter:image:alt" content="[OG image alt text]" /> ``` - `og:url` must match the canonical URL exactly, including the trailing slash and HTTPS scheme. - `og:title` and `og:description` should use the same values as the `<title>` tag and meta description for that page — do not create separate OG-only copy. ### OG Image Per Page | Page | Asset | Alt Text | |------|-------|----------| | Homepage | `diana_photo-min-1-scaled.webp` | Diana, professional female handywoman, HER Home Enhancement and Renovation, San Francisco | | Services Hub | `diana_photo-min-1-scaled.webp` | Diana, HER handywoman, offering services across San Francisco and the Bay Area | | Painting | `painting-1-min.png` | Freshly painted interior wall, professional painting service in San Francisco by HER | | Tile Setting | `tile-setting-1-min.png` | Tile installation in a San Francisco bathroom by HER handywoman | | Drywall & Sheetrocking | `sheetrocking-1-min.png` | Drywall and sheetrocking work in a San Francisco home by HER | | Minor Plumbing | `plumbing-2-min.png` | Plumbing fixture installation by HER handywoman in a San Francisco home | | Minor Electrical | `electrical-1-min.jpg` | Light fixture installation by HER handywoman in a San Francisco home | | Carpentry & Mounting | `diana_photo-min-1-scaled.webp` | Diana, HER handywoman, carpentry and mounting services in San Francisco | | Flooring & Wood Refinishing | `wood-refinishing-1-min.png` | Hardwood floor refinishing in a San Francisco home by HER handywoman | | Security & Safety Equipment | `grab-bar-min.png` | Grab bar installation in a San Francisco bathroom, safety upgrade by HER | | Boat Work | `boat-work-min-scaled.jpg` | Boat repair and marine work in the San Francisco Bay by HER handywoman | | About | `diana_photo-min-1-scaled.webp` | Diana, professional female handywoman serving San Francisco and the Bay Area | | Testimonials | `diana_photo-min-1-scaled.webp` | Diana, HER handywoman, trusted by San Francisco Bay Area homeowners | | Contact | `diana_photo-min-1-scaled.webp` | Request a free quote from HER — San Francisco handywoman Diana | **Implementation notes:** - The `og:image:width` / `og:image:height` values (1200×630) are the required OG dimensions. The existing assets are not necessarily 1200×630px. **Before launch, export or crop an OG-specific version of each asset at 1200×630px** and serve them from a dedicated `/assets/og/` directory. Do not link directly to full-resolution gallery images or thumbnail crops in the OG tag. - Some OG crawlers (Facebook, LinkedIn) have inconsistent WebP support. Until a JPG/PNG OG export exists, the existing WebP files are an acceptable fallback — modern crawlers handle them — but plan to produce JPG OG exports in the first post-launch update. - The Carpentry & Mounting page has no dedicated photo in the v1 asset library. Diana's portrait (`diana_photo-min-1-scaled.webp`) is the correct fallback until carpentry-specific images are available. --- ## 7. sitemap.xml The sitemap includes all 14 indexable pages. `/thank-you/` is deliberately excluded. Update `<lastmod>` to the actual build/publish date at deployment; this value can be generated automatically by the build script. ```xml <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <!-- ════════════════════════════════════════ --> <!-- Homepage — priority 1.0 --> <!-- ════════════════════════════════════════ --> <url> <loc>https://her-sf.com/</loc> <lastmod>2025-01-01</lastmod> <changefreq>monthly</changefreq> <priority>1.0</priority> </url> <!-- ════════════════════════════════════════ --> <!-- Services Hub — priority 0.9 --> <!-- ════════════════════════════════════════ --> <url> <loc>https://her-sf.com/services/</loc> <lastmod>2025-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.9</priority> </url> <!-- ════════════════════════════════════════ --> <!-- Service Detail Pages — priority 0.8 --> <!-- ════════════════════════════════════════ --> <url> <loc>https://her-sf.com/services/painting/</loc> <lastmod>2025-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> <url> <loc>https://her-sf.com/services/tile-setting/</loc> <lastmod>2025-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> <url> <loc>https://her-sf.com/services/drywall/</loc> <lastmod>2025-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> <url> <loc>https://her-sf.com/services/plumbing/</loc> <lastmod>2025-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> <url> <loc>https://her-sf.com/services/electrical/</loc> <lastmod>2025-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> <url> <loc>https://her-sf.com/services/carpentry-and-mounting/</loc> <lastmod>2025-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> <url> <loc>https://her-sf.com/services/flooring/</loc> <lastmod>2025-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> <url> <loc>https://her-sf.com/services/security-safety/</loc> <lastmod>2025-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> <url> <loc>https://her-sf.com/services/boat-work/</loc> <lastmod>2025-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> <!-- ════════════════════════════════════════ --> <!-- Contact — priority 0.8 (conversion) --> <!-- ════════════════════════════════════════ --> <url> <loc>https://her-sf.com/contact/</loc> <lastmod>2025-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> <!-- ════════════════════════════════════════ --> <!-- About & Testimonials — priority 0.7 --> <!-- ════════════════════════════════════════ --> <url> <loc>https://her-sf.com/about/</loc> <lastmod>2025-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.7</priority> </url> <url> <loc>https://her-sf.com/testimonials/</loc> <lastmod>2025-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.7</priority> </url> </urlset> ``` **Notes:** - Total: **14 URLs**. `/thank-you/` is excluded. - The `<priority>` element signals relative importance within this site only; it does not directly affect ranking. The values above reflect: homepage (highest) → services hub → service pages + contact (conversion focus) → trust pages. - Submit `https://her-sf.com/sitemap.xml` via Google Search Console once the domain is live and DNS has propagated. - Image sitemap is out of scope for v1 (see Section 11). --- ## 8. robots.txt ``` User-agent: * Allow: / # Exclude the post-form confirmation page from indexing Disallow: /thank-you/ Sitemap: https://her-sf.com/sitemap.xml ``` **Notes:** - No other paths need to be disallowed on this static site. All non-`/thank-you/` pages are public and indexable. - The `Sitemap:` directive must use the fully-qualified HTTPS URL. - If a `/assets/` subdirectory later holds unlisted or private files, add a targeted `Disallow` directive at that time. Do not preemptively block `/assets/` — Google Images discovery of the service photos is a secondary benefit. - The `/thank-you/` page is disallowed here as a belt-and-suspenders measure in addition to the `noindex` meta tag on the page itself. --- ## 9. Content Requirements Per Service Page All 9 service pages use the structural template defined in Section 4. The requirements below specify **keyword targeting and content minimums** for each page individually. Word count floors are the minimum for genuine SEO value in a competitive local market (San Francisco). They are not targets to hit mechanically — useful, specific copy always outranks padded generic text. --- ### 9.1 Painting (`/services/painting/`) | | | |--|--| | **Word count floor** | 400 words | | **Primary keyword** | `house painter San Francisco` / `interior painting San Francisco` | | **Secondary keywords** | `exterior house painting Bay Area`, `room painting contractor San Francisco`, `cabinet painting San Francisco`, `trim painting Bay Area`, `residential painting service SF` | | **Key assets** | `painting-1-min.png` — `painting-8-min.jpg` | **"What's Included" bullets should cover:** - Interior wall and ceiling painting - Exterior siding and trim painting - Cabinet painting and refinishing - Accent walls and color consultation - Surface preparation: hole patching, sanding, priming - Clean-up and final walkthrough **FAQPage:** Recommended (see Section 5.5). **Internal links out:** | Anchor text | Target page | |------------|------------| | "Need drywall work before we paint?" | `/services/drywall/` | | "Painting trim and baseboards?" or similar | `/services/carpentry-and-mounting/` | | "Request a free quote" (CTA) | `/contact/` | --- ### 9.2 Tile Setting (`/services/tile-setting/`) | | | |--|--| | **Word count floor** | 400 words | | **Primary keyword** | `tile installation San Francisco` | | **Secondary keywords** | `bathroom tile installation SF Bay Area`, `kitchen backsplash tile San Francisco`, `floor tile installation Bay Area`, `shower tile San Francisco`, `tile repair and replacement SF` | | **Key assets** | `tile-setting-1-min.png` — `tile-setting-8-min.png` | **"What's Included" bullets should cover:** - Bathroom floor and wall tile - Kitchen backsplash installation - Shower surrounds and wet areas (with backer board and waterproofing) - Porcelain, ceramic, natural stone, and glass tile - Grout installation and sealing - Tile repair, matching, and replacement **FAQPage:** Recommended (see Section 5.5). **Internal links out:** | Anchor text | Target page | |------------|------------| | "Need flooring beyond tile?" or similar | `/services/flooring/` | | "Renovating a bathroom? We also handle minor plumbing." | `/services/plumbing/` | | "Request a free quote" (CTA) | `/contact/` | --- ### 9.3 Drywall & Sheetrocking (`/services/drywall/`) | | | |--|--| | **Word count floor** | 350 words | | **Primary keyword** | `drywall repair San Francisco` | | **Secondary keywords** | `sheetrocking contractor San Francisco`, `drywall patching Bay Area`, `drywall installation SF`, `hole repair drywall San Francisco`, `skim coat drywall SF` | | **Key assets** | `sheetrocking-1-min.png` — `sheetrocking-5-min.png` | **"What's Included" bullets should cover:** - Drywall installation (new and replacement panels) - Patching holes — nail-hole size up to large openings - Taping, joint compound (mudding), and finishing - Skim coat and surface texturing - Smooth finish ready for painting - Water-damage and impact repairs **Internal links out:** | Anchor text | Target page | |------------|------------| | "Drywall done? We can paint it too." | `/services/painting/` | | "Need trim or woodwork after drywall?" | `/services/carpentry-and-mounting/` | | "Request a free quote" (CTA) | `/contact/` | --- ### 9.4 Minor Plumbing (`/services/plumbing/`) | | | |--|--| | **Word count floor** | 350 words | | **Primary keyword** | `minor plumbing San Francisco` | | **Secondary keywords** | `faucet installation San Francisco`, `toilet replacement SF Bay Area`, `sink installation San Francisco`, `shower fixture replacement SF`, `plumbing fixture installation Bay Area` | | **Key assets** | `plumbing-2-min.png` — `plumbing-8-min.png` | **"What's Included" bullets should cover:** - Faucet and fixture replacement (kitchen and bathroom) - Toilet installation and replacement - Sink and vanity hookup - Showerhead and tub spout replacement - Supply line and drain connection - Garbage disposal installation **Scope boundary — state clearly on-page:** HER handles non-permitted minor plumbing fixture work. Projects requiring a licensed plumber or building permits are referred to a licensed contractor. **FAQPage:** Recommended (see Section 5.5). **Internal links out:** | Anchor text | Target page | |------------|------------| | "Renovating a bathroom? We also set tile." | `/services/tile-setting/` | | "Adding grab bars near the tub?" | `/services/security-safety/` | | "Request a free quote" (CTA) | `/contact/` | --- ### 9.5 Minor Electrical (`/services/electrical/`) | | | |--|--| | **Word count floor** | 350 words | | **Primary keyword** | `minor electrical work San Francisco` | | **Secondary keywords** | `light fixture installation SF Bay Area`, `ceiling fan installation San Francisco`, `outlet replacement San Francisco`, `GFCI outlet installation SF`, `switch installation Bay Area` | | **Key assets** | `electrical-1-min.jpg` — `electrical-8-min.jpg` | **"What's Included" bullets should cover:** - Light fixture installation and replacement - Ceiling fan installation - Outlet and switch replacement - GFCI outlet installation (kitchens, bathrooms, outdoor areas) - Under-cabinet and accent lighting - Dimmer switch installation **Scope boundary — state clearly on-page:** HER handles fixture-level electrical work. Panel upgrades, new circuit runs, and permitted electrical installations require a licensed electrician and are referred accordingly. **Internal links out:** | Anchor text | Target page | |------------|------------| | "Powering security cameras or smart locks?" | `/services/security-safety/` | | "Need mounting or assembly alongside electrical?" | `/services/carpentry-and-mounting/` | | "Request a free quote" (CTA) | `/contact/` | --- ### 9.6 Carpentry & Mounting (`/services/carpentry-and-mounting/`) | | | |--|--| | **Word count floor** | 350 words | | **Primary keyword** | `carpentry services San Francisco` / `handywoman mounting San Francisco` | | **Secondary keywords** | `furniture assembly San Francisco`, `TV mounting SF Bay Area`, `shelf installation San Francisco`, `door repair SF`, `baseboard and trim installation San Francisco` | | **Key assets** | `diana_photo-min-1-scaled.webp` (no dedicated carpentry images in v1) | **"What's Included" bullets should cover:** - Furniture assembly (flat-pack and pre-built) - TV mounting and cable management - Floating shelf and wall-unit installation - Curtain rod and blind installation - Door adjustment, hanging, and hardware installation - Baseboard, crown molding, and trim installation **Asset gap note:** No dedicated carpentry or mounting photos are in the v1 asset library. Diana's portrait is the correct fallback for page hero and OG image. Adding 3–5 carpentry-specific photos is recommended before launch or in the first post-launch content update. **Internal links out:** | Anchor text | Target page | |------------|------------| | "Need trim or woodwork painted?" | `/services/painting/` | | "Installing baseboards or cabinets alongside new flooring?" | `/services/flooring/` | | "Request a free quote" (CTA) | `/contact/` | --- ### 9.7 Flooring & Wood Refinishing (`/services/flooring/`) | | | |--|--| | **Word count floor** | 400 words | | **Primary keyword** | `hardwood floor refinishing San Francisco` / `flooring installation San Francisco` | | **Secondary keywords** | `hardwood floor refinishing Bay Area`, `LVP flooring installation SF`, `deck refinishing San Francisco`, `stair tread refinishing Bay Area`, `wood floor repair SF` | | **Key assets** | `wood-refinishing-1-min.png` — `wood-refinishing-9-min.png` | **"What's Included" bullets should cover:** - Hardwood floor sanding and refinishing - Stain application and polyurethane sealing - LVP (luxury vinyl plank) and laminate installation - Subfloor preparation and repair - Deck and outdoor wood surface refinishing - Stair tread refinishing **Internal links out:** | Anchor text | Target page | |------------|------------| | "Related woodwork and trim?" | `/services/carpentry-and-mounting/` | | "Refinishing floors and refreshing the walls?" | `/services/painting/` | | "Request a free quote" (CTA) | `/contact/` | --- ### 9.8 Security & Safety Equipment (`/services/security-safety/`) | | | |--|--| | **Word count floor** | 350 words | | **Primary keyword** | `security equipment installation San Francisco` / `safety equipment installation SF` | | **Secondary keywords** | `grab bar installation San Francisco`, `door lock installation Bay Area`, `security camera installation SF`, `smart lock installation San Francisco`, `ADA safety upgrades Bay Area` | | **Key assets** | `grab-bar-min.png`, `security-garage-door-min.png` | **"What's Included" bullets should cover:** - Grab bar installation (bathroom, shower, stairway) - Deadbolt and door lock installation and replacement - Security camera mounting and basic setup - Smart lock and keypad entry installation - Door reinforcement and peephole installation - Motion-sensor and safety lighting installation **Internal links out:** | Anchor text | Target page | |------------|------------| | "Need an outlet for your camera system?" | `/services/electrical/` | | "Adding grab bars near the tub or shower?" | `/services/plumbing/` | | "Request a free quote" (CTA) | `/contact/` | --- ### 9.9 Boat Work (`/services/boat-work/`) | | | |--|--| | **Word count floor** | 300 words | | **Primary keyword** | `boat repair San Francisco Bay` / `marine handywoman San Francisco` | | **Secondary keywords** | `boat painting San Francisco Bay`, `marine woodwork Bay Area`, `boat hardware installation SF`, `sailboat maintenance Bay Area`, `liveaboard repairs San Francisco` | | **Key assets** | `boat-work-min-scaled.jpg` | **"What's Included" bullets should cover:** - Marine paint and gelcoat touch-up and refinishing - Teak and wood surface cleaning, oiling, and refinishing - Deck hardware installation and replacement - Liveaboard interior repairs and improvements - Canvas and upholstery minor repairs - General boat maintenance and handywork **Tone note:** This page targets a niche, high-trust market. The copy should emphasize Diana's comfort and experience in marine environments and working on vessels docked at Bay Area marinas. If Diana has worked at specific marinas (e.g., Sausalito, Alameda, South Beach Harbor), naming them adds authenticity and hyperlocal signal. **Asset note:** Only one boat-work photo is in the v1 library. Adding 2–3 more boat-specific images is recommended to bring the image gallery in line with other service pages. **Internal links out:** | Anchor text | Target page | |------------|------------| | "Marine painting shares a lot with land-side painting — we do both." | `/services/painting/` | | "Wood deck refinishing on boats and homes alike." | `/services/flooring/` | | "Request a free quote" (CTA) | `/contact/` | --- ## 10. Internal Linking Strategy ### Site Link Graph ``` / (Homepage) ├── /services/ ← hero "View all services" + nav │ ├── /services/painting/ │ ├── /services/tile-setting/ │ ├── /services/drywall/ │ ├── /services/plumbing/ │ ├── /services/electrical/ │ ├── /services/carpentry-and-mounting/ │ ├── /services/flooring/ │ ├── /services/security-safety/ │ └── /services/boat-work/ ├── /about/ ├── /testimonials/ └── /contact/ ``` Every page links back to `/` and `/contact/` via the navigation header and footer. The graph above shows content-body links. ### Required Links Per Page Type | Page | Required body links | |------|-------------------| | Homepage | `/services/` (hub link), all 9 service cards, `/about/`, `/testimonials/`, `/contact/` | | Services Hub | All 9 service page cards, `/contact/` | | Each service detail page | `/contact/` (primary CTA, at least twice: inline + CTA band), 2 related service pages (see cross-link table below), `/services/` and `/` via breadcrumb | | About | `/contact/` | | Testimonials | `/contact/` | | Footer (every page) | `/`, `/services/`, all 9 service pages, `/about/`, `/testimonials/`, `/contact/` | ### Cross-Service Link Pairs Each service page links out to 2 contextually related service pages. Both directions of each pair are shown; implement both ends. | Page | Related page 1 | Related page 2 | |------|---------------|---------------| | Painting | Drywall & Sheetrocking | Carpentry & Mounting | | Tile Setting | Flooring & Wood Refinishing | Minor Plumbing | | Drywall & Sheetrocking | Painting | Carpentry & Mounting | | Minor Plumbing | Tile Setting | Security & Safety Equipment | | Minor Electrical | Security & Safety Equipment | Carpentry & Mounting | | Carpentry & Mounting | Painting | Flooring & Wood Refinishing | | Flooring & Wood Refinishing | Carpentry & Mounting | Painting | | Security & Safety Equipment | Minor Electrical | Minor Plumbing | | Boat Work | Painting | Flooring & Wood Refinishing | ### Anchor Text Guidance - Use **descriptive, keyword-relevant anchor text** for all content body links. Avoid "click here", "learn more", or bare URLs. - Good: `"our painting services in San Francisco"`, `"drywall repair and patching"`, `"request a free quote"` - Avoid repeating the same anchor text string for the same target more than once on a single page. - CTA buttons may use action-first copy: "Request a Free Quote", "Get in Touch", "Schedule a Visit". - Breadcrumb links use short, literal labels ("Services", "Painting") — this is correct and expected for breadcrumbs. --- ## 11. Image SEO ### Alt Text Guidance Alt text must describe what is **visible** in the image and add useful context — not keyword lists. **Formula:** `[Subject or action visible in photo], [setting or room], [city/context if natural]` **Reference table for existing assets:** | Asset filename | Recommended `alt` text | |----------------|------------------------| | `diana_photo-min-1-scaled.webp` | Diana, professional female handywoman, HER Home Enhancement and Renovation, San Francisco | | `Group-433.png` | HER — Home Enhancement and Renovation logo | | `painting-1-min.png` | Interior wall painted in a light neutral color, living room renovation, San Francisco | | `painting-3-min.jpg` | White baseboard trim being painted, close-up detail, professional finish | | `painting-5-min.jpg` | Exterior house painting in progress, ladder and brushwork on siding | | `tile-setting-1-min.png` | Floor tile installation in progress, bathroom renovation, San Francisco | | `tile-setting-3-min.png` | Kitchen backsplash tile being installed, white subway tile layout | | `tile-setting-6-min.png` | Finished shower tile surround with grout, clean professional result | | `sheetrocking-1-min.png` | Drywall panels installed and taped in a San Francisco room under renovation | | `sheetrocking-3-min.png` | Drywall joint compound being applied, taping and mudding stage | | `plumbing-2-min.png` | Bathroom faucet being installed on a vanity, plumbing fixture replacement | | `plumbing-5-min.png` | Toilet installation in a San Francisco bathroom, new fixture hookup | | `electrical-1-min.jpg` | Ceiling light fixture installation in a San Francisco home, wiring in progress | | `electrical-3-min.jpg` | Ceiling fan installation, fan attached to mounting bracket | | `grab-bar-min.png` | Stainless steel grab bar installed on bathroom wall, safety upgrade for SF home | | `security-garage-door-min.png` | Garage door security hardware and lock installation, San Francisco home | | `wood-refinishing-1-min.png` | Hardwood floor being sanded and refinished in a San Francisco home | | `wood-refinishing-5-min.png` | Freshly refinished hardwood floor with new stain coat, polished and smooth | | `wood-refinishing-9-min.png` | Wood deck refinishing in progress, sanding on outdoor surface | | `boat-work-min-scaled.jpg` | Boat maintenance and repair work, marine woodwork in the San Francisco Bay | For assets not listed here, apply the same formula. Never use a filename as alt text. **Decorative rule:** If any image is purely decorative (e.g., a visual spacer or background element with no informational content), set `alt=""`. All photo assets in the current library are content images and require descriptive alt text. ### File Naming Convention The existing assets follow a consistent, SEO-friendly naming convention (`[subject]-[sequence]-min.[ext]`). **No renaming is necessary.** When adding new assets, follow the same pattern: - Use lowercase and hyphens only (no spaces, no underscores, no camelCase). - Lead with the descriptive subject: `carpentry-shelf-1-min.jpg`, `boat-teak-1-min.jpg`. - Append `-min` before the extension to indicate it is an optimized/compressed copy. - Never include dimensions in the filename for new assets (the `-768x1165` variant in the library is a WordPress artifact; avoid this pattern going forward). ### Image Sitemap Image sitemap is **out of scope for v1**. The standard `sitemap.xml` is sufficient at launch. Consider an image sitemap in a future iteration if Google Images referral traffic becomes a goal. --- ## 12. Service Area Signals ### On-Page Minimum Requirements Every page must reference **San Francisco** and **Bay Area** at minimum — in the H1, body copy, or service area block. Service detail pages and the Contact page must include a dedicated **"Service Area"** section in the page body (see `33-frontend-spec.md` §5.3, Section 6 and §5.6). **Required service area copy (Homepage and Contact page — full version):** > HER serves San Francisco and the surrounding Bay Area within a 50-mile radius, including Oakland, Berkeley, San Jose, Palo Alto, Daly City, South San Francisco, Burlingame, San Mateo, Redwood City, Menlo Park, Fremont, Alameda, Tiburon, Sausalito, and Marin County. **Service detail pages — condensed version (embed in the "Serving San Francisco & the Bay Area" section):** > Diana serves homeowners and property managers throughout San Francisco and the Bay Area — from Oakland and Berkeley to the Peninsula cities of Palo Alto, Burlingame, and San Mateo, and north into Marin County. ### City Coverage Reference | City / Area | Type | Notes | |-------------|------|-------| | San Francisco | Primary market | Mention on every page | | Oakland | City | East Bay anchor | | Berkeley | City | East Bay | | San Jose | City | South Bay anchor | | Palo Alto | City | Peninsula | | Daly City | City | SF adjacency | | South San Francisco | City | SF adjacency | | Burlingame | City | Peninsula | | San Mateo | City | Peninsula | | Redwood City | City | Peninsula | | Menlo Park | City | Peninsula | | Fremont | City | East Bay | | Alameda | City | East Bay; marina proximity for Boat Work | | Tiburon | City | Marin; marina proximity | | Sausalito | City | Marin; marina proximity; high relevance for Boat Work | | Marin County | County | Use as area label, not a city | ### SF Neighborhood Signals Within San Francisco, weave neighborhood names into 1–2 sentences of body copy on relevant service pages. Do not create separate thin pages per neighborhood. | Neighborhood cluster | High-relevance service pages | |---------------------|------------------------------| | The Mission, Castro, Noe Valley, Bernal Heights | Painting, Flooring (older Victorian and Edwardian housing stock) | | Pacific Heights, Marina, Cow Hollow | Tile Setting, Flooring, Security & Safety (higher-end renovations) | | Outer Sunset, Richmond, Excelsior | General services — all pages | | SoMa, Potrero Hill, Dogpatch, Mission Bay | Electrical, Carpentry (condo and loft renovations) | | South Beach, Marina District | Boat Work (South Beach Harbor, Marina Green proximity) | --- ## 13. Page Speed & Technical SEO Notes These notes apply to the static site implementation and must be observed by the implementor. (→ ADR-001, ADR-003, NFR-3, NFR-6) ### Static HTML — Crawlability Baseline Pages are pre-rendered HTML with no client-side rendering. Content is fully indexable by Googlebot on first request without JavaScript execution. No additional render-budget concerns apply (→ NFR-3). Caddy serves static files directly from disk; no application server latency. TTFB should be well under 200ms on a typical VPS. ### Canonical and Robots Meta (every page's `<head>`) ```html <link rel="canonical" href="https://her-sf.com/[path]/" /> ``` - Use HTTPS, the production domain, and a trailing slash. Matches the URL in the sitemap exactly. - All pages: no `<meta name="robots">` needed (default is `index, follow`). - `/thank-you/` only: add `<meta name="robots" content="noindex, nofollow" />`. ### Google Fonts Two options in priority order: 1. **Self-host (preferred):** Download the WOFF2 files and serve from `/assets/fonts/`. Reference via `@font-face` in the CSS. This eliminates the third-party DNS lookup entirely and improves LCP. 2. **Google CDN with `display=swap`:** Add the following in `<head>` before the stylesheet `<link>`: ```html <link rel="preconnect" href="https://fonts.googleapis.com" /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> ``` Use `&display=swap` on the font URL to prevent render-blocking. This is acceptable but sub-optimal for LCP compared to self-hosting. ### Images Use `<picture>` elements with a WebP source and JPG/PNG fallback. Always include explicit `width` and `height` attributes to allow the browser to reserve layout space and eliminate Cumulative Layout Shift (CLS): ```html <picture> <source srcset="/assets/painting-1-min.webp" type="image/webp" /> <img src="/assets/painting-1-min.png" alt="Interior wall painting, San Francisco home" width="800" height="600" loading="lazy" /> </picture> ``` **Loading strategy:** - **Hero images** (above the fold): omit `loading` attribute or use `loading="eager"`. Add `fetchpriority="high"` to the primary hero `<img>` on each page to improve LCP. - **Gallery and below-fold images:** use `loading="lazy"`. **File size targets:** - Gallery images: < 150 KB per file. - Hero images: < 300 KB per file. - OG images (exported separately): < 200 KB per file. The existing `*-min.*` assets have been through at least one compression pass. Run through [Squoosh](https://squoosh.app/) or `cwebp` to produce WebP variants if not already present. **Note on WebP availability:** The current asset library consists of `.png`, `.jpg`, and one `.webp` file (`diana_photo-min-1-scaled.webp`). WebP variants of all other assets should be generated as part of the build/asset pipeline. If build tooling is unavailable, the existing PNG/JPG files are valid for v1 launch; add WebP generation in the first post-launch update. ### Third-Party Scripts No analytics, ad pixels, tag managers, or external widgets are present in v1 (→ ADR-005, NFR-7). This is a meaningful LCP and Total Blocking Time (TBT) advantage. The AWS form endpoint (→ ADR-002) fires only on form submission and adds zero blocking time to initial page render. Do not introduce any `<script>` loading pattern that blocks the critical rendering path (i.e., no synchronous `<script src="...">` in `<head>` without `defer` or `async`). ### Core Web Vitals Targets | Metric | Target | How achieved | |--------|--------|-------------| | LCP (Largest Contentful Paint) | < 2.5 s (mobile) | `fetchpriority="high"` on hero image; self-hosted fonts; compressed WebP | | INP (Interaction to Next Paint) | < 200 ms | Minimal JS; no heavy client-side framework | | CLS (Cumulative Layout Shift) | < 0.1 | Explicit `width`/`height` on all images; no late-loading layout elements | | TTFB (Time to First Byte) | < 200 ms | Caddy serving static files; no application server | --- ## 14. Requirements Traceability | Spec Section | Requirement / ADR | Description | |-------------|-------------------|-------------| | §1 — URL Structure | NFR-3 | Static HTML; no content behind client-side rendering; all URLs indexable | | §1 — URL Structure | ADR-004 | 9 grouped service pages; slugs established by ADR | | §2 — Title Tags | NFR-4 | Each service page must have unique, descriptive metadata targeting service + location | | §3 — Meta Descriptions | NFR-4 | Unique, descriptive metadata per page | | §4 — Heading Structure | NFR-4 | H1 per page as primary on-page keyword relevance signal | | §5 — Schema.org | NFR-3 | Structured data supports rich results; confirms fully indexable content | | §5.1 LocalBusiness `areaServed` | FR-9 | Site must clearly state service area: SF + 50-mile radius | | §5.3 Person schema | FR-12, FR-18 | About Diana page; highlights experience and credibility | | §6 — Open Graph | NFR-4 | Per-page OG images and descriptions for unique social metadata | | §7 — sitemap.xml | NFR-5 | Site must include a sitemap.xml | | §8 — robots.txt | NFR-5 | Site must include robots.txt; disallow `/thank-you/` | | §9 — Content requirements | ADR-004 | Each grouped page must have sufficient unique content to serve its target keywords | | §9 — Content requirements | NFR-4 | Keyword + location targeting per service; primary + secondary keyword coverage | | §9 — Scope boundaries (Plumbing, Electrical) | FR-11 | Service page content must accurately represent what HER offers | | §10 — Internal linking | NFR-3 | Crawlable link structure ensures all pages are discoverable | | §11 — Image SEO | NFR-6 | Images optimized and appropriately sized; alt text for accessibility and indexability | | §12 — Service area signals | FR-9 | Service area: SF + 50-mile radius stated on every page | | §13 — Page speed | NFR-3 | Static HTML; no rendering issues for crawlers | | §13 — Page speed | NFR-6 | Fast mobile loading; images compressed; no blocking scripts | | §13 — Page speed | ADR-001 | Static site for SEO-friendly, fast, reliable delivery | | §13 — Page speed | ADR-003 | Mobile-first; performance budget mindset throughout | | §13 — No tracking scripts | ADR-005 / NFR-7 | No analytics, no tracking, no cookie consent banner in v1 |