Residential and commercial painting, Lakewood Ranch FL

A painting contractor's site, rebuilt to be found.

Moved off a template builder onto 25 prerendered pages with per-page metadata, structured data, and an automated audit that fails the build.

4 The Love of Color is a family business. Nimbus built and maintains the site — this is a family project rather than a client engagement, and the numbers below are measured from the build either way.

The situation

The business was on a hosted site builder, which is a reasonable place to start and a hard place to stay. Every page shared one set of head tags, so each URL told Google it was a duplicate of the homepage — the fastest way to keep a page out of the index regardless of what's written on it.

There was also no separation between services. Interior painting, exterior painting, cabinet refinishing and commercial work were all competing on the same page for four different searches, which meant losing all four.

What was done

  1. One route table, as data

    Every indexable URL — path, title, description, Open Graph image — defined in a single typed file. The page components, the static build and the sitemap all read from it, so the sitemap physically cannot list a page that doesn't exist or omit one that does.

  2. A real HTML file per route

    The build renders each route to static HTML with its own title, description and self-referencing canonical already in the served markup. Google reads those before running any JavaScript, and most AI crawlers never run it at all.

  3. A page per service, and per city that earned one

    Four service pages, four city pages and six city-plus-service pages — each written by hand. No templated matrix: the hand-written city pages measured about 25% text overlap with each other, which is what keeps them from being clustered and ignored.

  4. Structured data that references rather than repeats

    One HousePainter entity declared once with an @id, and every Service and Breadcrumb node on every page points at it instead of restating the business. One place to change a phone number.

  5. An automated gate wired into the build

    Titles, descriptions, canonicals, h1 counts, image alt text, JSON-LD validity, sitemap coverage in both directions, orphan pages, and internal links that don't resolve — all checked on every build, which fails if anything regresses.

  6. Images cut to what a phone needs

    Responsive variants generated at build time so a phone downloads a phone-sized photo, with explicit dimensions on every image to stop the layout jumping as they load.

Measured

Every figure here is reproducible from the site's own build output. Traffic and ranking numbers are deliberately absent — the site had not launched when this was written, and a number nobody measured is a number nobody should print.

25

Pages indexable

Up from a single set of shared head tags across the old site.

25 of 25

Sitemap coverage

Generated from the route table, verified in both directions by the audit.

2.47MB → 576KB

Projects page weight

Responsive image variants; a 77% reduction on the heaviest page.

58 characters

Median title length

Inside the range Google displays rather than rewrites.

0

Audit failures

Across all 25 pages, on every build.

The site is built and passing its own checks. It goes live when the domain moves off the old host — the remaining work is DNS and a Google Business Profile, not code.

Want to know where you actually stand?

Send over your domain and you'll get back a specific list of what's working and what isn't — including when the honest answer is that nothing needs replacing.