One trade, one area, one contractor.
ACMeridian is the company I run with my cousin Michael Cortes. We build and run local referral sites, the kind a homeowner finds by searching Google for a tree service or an appliance repair, and we send each request to one contractor per trade per area, free to try. Our own site has to make that offer to contractors in New Jersey and New York, so it is drawn as the offer: a survey plat of real county lines, with each territory staked in flagging tape. Astro, static output, no bundled JavaScript.
/ the offer · as the site states it
Project breakdown
Tell a contractor the whole deal, plainly.
A contractor already knows how leads usually work: an app sells the same homeowner to several companies, and whoever calls first gets the job. ACMeridian’s offer is the opposite, and the site has to make it believable to someone who has heard every pitch. So it says the whole deal in the order a contractor would ask about it. We check your market first and tell you if there isn’t enough demand. We build and run a referral site for one trade in one area, at our cost. Each request goes to you and nobody else. The first two months from your first request, or the first ten requests, are free; after that you pay per request or a flat monthly rate, at a price agreed up front, or you walk away. No contract, and no fee to leave.
Eleven pages came out of that: the home page, how it works, about, the FAQ, the market check, a page each for tree service and appliance repair leads, privacy and terms, a Google Business Profile guide and a free site audit. Every one of them static.
A whiteprint, a grid, and one colour that means something.
The site is a survey plat. Everything is drawn in ink on a whiteprint sheet with a 32-pixel drafting grid, and there is one fluorescent thing on it: the flagging tape on a stake that marks a claimed territory. That is the offer as a picture, one contractor per trade per area, and the rest of the site is made of the same sheet. The header is a title block, one ruled cell each for the name, the menu, the market check and the phone. The homepage steps are a survey traverse with a station at each step, and every numbered section on the inner pages sits under a station mark. The intro, the two forms and the 404’s message are sheets of notes laid on the plat.
- The map is real. Its county lines are the US Census boundaries from us-atlas, projected by a script when the site builds, and the two claimed territories, Sussex County and Long Island, are the first two referral sites’ own. The drawing has no words on it, no place names and no numbers, and it is hidden from screen readers
- Tape means two things only, a claim and the primary action. Pink
#FF2D6Fis never text, because it holds only 3.3:1 on the paper; where the hue has to carry text or a focus ring it deepens to#C4004A, at 5.5:1 - The headline keeps 14.29:1 or better wherever it crosses the map
- Every drawing on the site is SVG made in code, from real data or plain geometry. None of it is a generated image
- Sign Grotesk Display and Body, self-hosted, with metric-matched fallbacks so the page doesn’t shift when they arrive
Staked as it opens, or simply staked.
The homepage opens on the plat. A stake drops into Sussex County with a small overshoot and its claim spreads out to the county line, and Long Island follows just over half a second later. Each claim is a hatched shape clipped by a circle centred on its stake, and the circle scales from nothing to the territory’s reach, so the claim grows from the point where it was staked. The animation is CSS. A script of about a kilobyte, inline and ahead of the hero, arms it before first paint, and only when it can also play: with reduced motion or no script at all, the class is never added and the plat simply arrives staked. A test holds it to that.
- No bundled JavaScript on any route. The homepage’s inline scripts come to about six kilobytes, the motion arming among them, each pinned by hash in the Content Security Policy
- No inline style attributes on any built page, which is what lets the policy stay that strict. The script Cloudflare inserts for bot detection gets a fresh nonce on every request instead of a loosened policy
- The share card is rendered from the same plat and headline, and its address carries a hash of its own bytes, so a changed card is a new URL rather than a stale cache
527 strings in, 527 strings out.
When the site was redrawn as the plat, the copy was frozen. Every visible string and every page’s word stream, 527 strings across the nine routes the site had then and the 404, was extracted before the redesign and after it, and the two were diffed. The one change the diff shows is order, not wording: in the footer the phone number now comes after the one-line description, because each cell of a title block holds one thing.
The two trade pages came out of Querywright. Their target searches were measured across the US and the plan was approved there on October 17: about 210 searches a month for tree service leads and for appliance repair leads, and 50 for exclusive contractor leads, which the homepage targets. The pages’ copy lives in one data file, word for word and in order, and the build was diffed against the markdown it came from.
/tree-service-leads, written from the plan approved in Querywright and set in the same frame as How it works. Captured from acmeridian.co, 19 October 2026.- Each trade page’s FAQ and breadcrumb structured data is built from the list the page renders, so the schema can’t say what the page doesn’t
- The same record set aside “thumbtack alternative”, because the results for it are consumer apps
- The Organization in the structured data names A&C, LLC and lists the three referral sites it runs
A push that breaks Firefox does not reach production.
Deploys are not run from a machine. A push to main type-checks, lints, checks the copy,
the structured data and the dependencies, builds, and asserts things about the output:
the policy is hash-based with no unsafe-inline, and no inline style
attribute exists. Then it runs eight suites in real Chromium, Firefox and WebKit, with
axe. Only if all of that passes does the release branch fast-forward, and only the
release branch is what Cloudflare Pages builds.
- The degradation suite loads the site with JavaScript off and with reduced motion on, so the plat has to arrive staked in every engine
- On the release that added the trade pages, the page suite passed 150 of 150 in each engine, the head checks 164 of 164 and the contact API 23 of 23
- The market check posts to one Function with a honeypot, Turnstile verified on the server, a hashed-IP rate limit, and the database write before the email, so a request never lives only in an inbox
What I picked, and what I didn’t.
-
01
Staked, over Carbon and Measured.
I asked for the whole site to be redrawn for contractors, with the copy frozen and the direction picked from working prototypes rather than pictures of them. Three were built. Carbon was a carbon-copy work order and Measured was a tape measure. Staked is a picture of the offer itself: a territory claimed for one contractor, which is the thing we actually sell. It also gave the site a map it could make from real boundary data instead of drawing one.
Considered: Carbon, a carbon-copy work order; Measured, a tape measure
-
02
Old addresses answer 410, not a redirect.
Only the addresses that became something on the new site redirect. The other 46 retired URLs answer 410 Gone with the 404 page’s body, from one shared module and one small route file per prefix, never a catch-all on every path. A 410 for an address that never existed would be its own small lie, so a URL under a retired prefix that was never a page still answers 404.
Considered: a map of about 35 redirects to the nearest new page, one catch-all rule
-
03
“Our sites” stayed dark until a site was live.
The section that lists the referral sites was built before any of them launched, and kept dark. One field decides it: a site with no URL renders nowhere, and giving it one turns on the menu item, the homepage section and the footer line together. Each site was checked before it went on for the line that tells homeowners their request goes to an independent local company, as the terms promise.
-
04
The privacy page, read against the running system.
I read the policy against the code and the Cloudflare account and found three things it got wrong. It called Google Analytics the only third-party script, when Cloudflare’s analytics beacon, its bot detection and Turnstile also load. It didn’t say the bot detection sets a cookie on any page. And it didn’t name the services a submission passes through, Resend and Gmail. All three changed in one push, because a policy that is wrong about what runs is not out of date. It is wrong.
Live since October 16, with three sites behind it.
The site went live on October 16, and the trade pages followed the next day. All three referral sites are live and linked from it: Sussex County Tree Help, Long Island Appliance Help and NYC Cleaning Help, each one telling homeowners plainly that it passes their request to an independent local company. Querywright’s Search Console connection covers the company site and all three, so what happens next is kept on the record, dated, from Google’s own reports.
The site is honest about the wait. Its own How it works says a new site takes time to show up on Google: expect months before steady requests, not weeks. What it promises is what the business can show from the first request on: a contractor sees every request we send, and judges the results for themselves.