Home services, 2026. Architect and builder, as MantelMarketing's first client. Live.

All Raingutter Systems

I rebuilt a roofing and gutter contractor's website and the app its office uses to handle estimate requests.

The full All Raingutter Systems site, top to bottom, inside a laptop screen

Scroll inside the screen to read the whole site. Or open the live site in a new tab.

What happened.

97

pages, each checked 84 ways before it can go live

All Raingutter Systems, measured at commit 5337e32, 15 September 2026

  • Three trades across twenty-five towns, with 38 passages about specific homeowner concerns and 30 town-to-town references assigned so no two pages share a paragraph
  • The office's app, which follows a request from lead to estimate to job to invoice, with a customer portal and a crew view, covered by 363 automatic checks
  • Went live on its own domain, allrainguttersystems.net, in September 2026

Where it started

A family roofing, seamless-gutter, and skylight contractor in Brentwood, California, whose old site didn't agree with itself. Years in business, whether the company was insured, the names on the reviews. Different pages said different things.

The rebuild is a new website the office can edit themselves, with an app behind it that takes the estimate requests and follows each one through the office. It was the first real client on MantelMarketing, so it also had to prove the platform's premise. A small-business site that says only what the business can defend.

What made it hard

  • A fact the owner hasn't confirmed doesn't appear. The years-in-business figure is on file marked unconfirmed, so the About page is written without it, and if the review rating slips, the stars come off the site on the next build.
  • Three trades across twenty-five towns must not read as copies of each other, and the check for that is strict enough to stop the build when they do.
  • The estimate form is a separate app, but it appears at the site's own address, so a homeowner never leaves the site to fill it in.
  • The office edits the site in Stacki, a visual editor, so custom sections are built as reusable pieces with settings, or they stop being editable.

What I built

Pages use only the details the owner confirmed

One document names what each type of page has to contain, who owns each business fact, the rules for search, the limit on how alike two pages can be, and the claims the company isn't allowed to make. Sixteen sets of automatic checks read the finished pages and stop the build on a violation. A page that's still short of copy is recorded as a known debt rather than quietly waved through. Facts come only from the owner's confirmed list; nothing is typed from memory.

The field notebook

Every section is ruled paper. Anything the reader acts on sits on a white sheet, photographs are taped prints, only confirmed facts get stamped, steps and symptoms are checklists. The one bold thing is a gutter cross-section drawn to scale, with rain that answers the scroll. All of it settles into a good static page for readers who prefer reduced motion.

The estimate request lands in the office's app

The site hands the estimate wizard to the operations app while staying at the same address, so the homeowner sees one site from start to finish. Until launch, a single maintenance switch kept the review copy and the live copy apart. Only the exact value "off" opens the full site.

What isn't measured

  • Which Google searches the town pages show up for. The site launched days ago and Search Console has nothing yet. On the owed list.
  • No figure for how many estimate requests become jobs. The app records each step; nobody has pulled the ratio.
  • The years-in-business figure is still marked unconfirmed and appears nowhere. Directories disagree with each other, so nobody has been asked to pick one.
  • The company's old .com domain still redirects to a dead address. The site lives on the .net.

Built with

AstroLumosStackiCloudflare WorkersNext.jsCloudflare D1

See for yourself

The live site. The office's app behind it is private.

Notes

For the build: the site is Astro on the Lumos framework, edited by the office in Stacki, and deployed as a Cloudflare Worker. The estimate app is a second Worker. The site Worker forwards anything under one path to it through a service binding, so the wizard runs on the same origin as the page that opens it and the app’s frame policy holds.

The rule I keep coming back to on this one: a fact with no owner has no business on a page. The list still holds one fact the owner hasn’t confirmed, and rather than round it into something plausible, the About page is written so it doesn’t need it.

Cameron Ameigh

Tell me what you're working on.

Send me a little about your project or the role you're hiring for. I'll tell you whether it sounds like a fit.