
Who
I build for operators in the mountains. Monarch Mountain Foundations pours structural concrete in Highlands, Cashiers, and the surrounding Western North Carolina ridge lines: footings, foundation walls, slabs, driveways, sidewalks, surveying and job-site prep.
The contractor needed a lead surface that matched the job sites: Angi / Chamber / BBB trust, a phone that actually rings, a quote form that lands in email. Homeowners and builders needed to see real pours, not a stock theme.
I am the builder under Hustle-Launch. The concrete is theirs. The stack is mine to keep honest, including when DNS and git disagree.
If you ship local-business sites, MarTech lead paths, or WordPress exits: this is the field notes on a migration that finished in the repo and not at the nameserver.
What
I rebuilt monarchmountainfoundations.com as a private Next.js App Router site.
Stack on the box: Next.js ^16.1.6, React 19, Tailwind v4, Bun, Resend, Sentry, PostHog provider, Radix, Zod/RHF on forms. README still says Next 15.5.6. Package 0.1.0. Repo: Hustle-Launch/monarchmountainfoundations.com.

What exists in code:
- Full page set: home, about, foundations, driveways + sidewalks, surveying + job site prep, gallery, contact
- Resend contact API (
notify@uncap.ustomonarchmountainfoundationsinc@gmail.com+ customer thank-you) - Schema.org LocalBusiness JSON-LD (phone 828-508-3602, Highlands geo, service offers)
- SEO files (
sitemap.ts,robots.ts,manifest.ts), CSP / HSTS / Permissions-Policy, Sentry configs - Job-site gallery categories with real
public/imagespours and slabs - Gold/navy contractor chrome, fixed bottom bar, Angi 2025 / Chamber / BBB trust row
What is declared but empty or unused:
- Convex in package.json.
convex/is a.gitkeep - Clerk in package.json. No Clerk routes or wrappers in
app//components/ - Gallery page exists; not listed in
sitemap.ts - Google Search Console verification string is still the placeholder
Homepage video still points at live WordPress uploads:
https://www.monarchmountainfoundations.com/wp-content/uploads/Monarch-Post-FX.m4v
Same for the rock-drilling GIF. The rebuild depends on the old host for motion assets.
Where
Customer DNS today: www.monarchmountainfoundations.com. Pack-day headers: X-Powered-By: PHP/8.3.33, LiteSpeed, x-redirect-by: WordPress.
Next rebuild: monarchmountainfoundations-com.vercel.app. Headers: Vercel, CSP, HSTS preload, X-Robots-Tag: index, follow. vercel.json has deploymentEnabled for main/master set to false.
Canonical metadata, sitemap, and LocalBusiness @id all name https://monarchmountainfoundations.com, the host that still serves PHP.
Audience sits with Highlands–Cashiers construction buyers and with builders watching WNC client cutovers next to Mack's / Barbque-style apex-live sites.

When
2026-01-08. Init. Next.js, Convex slot, Tailwind. OPPORTUNITIES.md and PLAN.md the same day. Four January commits. Scaffolding, not the migration.
2026-01-31. Chore sync.
2026-02-06. Upgrade to Next 16 / React 19. Tailwind v4 @import fix. Then the load-bearing commit: ba2a761, full WordPress to Next.js migration, all pages, images, content.
2026-02-09–11. Resend contact form. Compressed video backgrounds. Foundations page 1:1 polish, white navbar, fixed bottom bar. SEO and production polish. TypeScript manifest / sitemap / robots.
2026-02-21–28. LocalBusiness structured data. Tailwind-first CSS. Sentry. Gallery with categorized photos. Kebab-case components. lib/constants.ts. Hero email fix. Strict tsconfig / next.config / Sentry PR. Build gate. Launch-week TypeScript fixes. Remove GitHub Actions. Vercel called out as CI. Security headers PR (HSTS, CSP, Permissions-Policy). Densest month: 24 commits.
2026-05. shipprep install, revert, ignore local M4V drops, then shipprep observability + Blacksmith deploys. Main Git auto-deploy stays off.
2026-08-08 6:55 AM ET. c7e4e30, set X-Robots-Tag to index, follow on Vercel. HEAD. Thirty-three commits on main.
That is the clock from empty client repo to a hardened Next rebuild that is not what www serves.

Why
WordPress exits fail two ways: a pretty Vercel URL nobody's DNS points at, or a DNS flip with a half-ported theme. I did the hard content port (page parity, Resend leads, Schema, gallery, security headers), then left the apex on LiteSpeed PHP while the rebuild sat on a project alias with main auto-deploy disabled.
sitrep.md still says PROTOTYPE and "last commit January 31." ROADMAP says Production. PLAN still has homepage unchecked. The tree and the Aug HEAD are the tie-breaker: the product pages exist; the cutover does not.
Sibling context: Mack's Shack and Barbque Wagon are WNC food clients whose apex already speaks Next. This one is the concrete contractor where git moved and DNS did not.
If you run a WordPress local-business site in the mountains, would you flip DNS the week the Next rebuild matches content 1:1, or keep WordPress live until every wp-content hotlink is gone?
