# Monarch Mountain Foundations: I migrated WordPress to Next — DNS still serves PHP

Source: https://www.michaelchurley.com/blog/monarch-mountain-foundations-wordpress-to-next-dns-still-php  
Published: 2026-08-08  
Author: Michael C. Hurley  
Tags: monarch-mountain-foundations, highlands-nc, cashiers-nc, western-north-carolina, concrete-foundations, wordpress-migration, nextjs, vercel, resend, localbusiness-schema, martech, hustle-launch, client-site

![Monarch Mountain Foundations Next rebuild hero. Structural Concrete](/blog/monarch-mountain-foundations-wordpress-to-next-dns-still-php/screenshots/home.png)

## 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`.

![WordPress www vs Next Vercel. Dual hosts](/blog/monarch-mountain-foundations-wordpress-to-next-dns-still-php/screenshots/dual-hosts.png)

What exists in code:

- Full page set: home, about, foundations, driveways + sidewalks, surveying + job site prep, gallery, contact
- Resend contact API (`notify@uncap.us` to `monarchmountainfoundationsinc@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/images` pours 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](https://www.monarchmountainfoundations.com). Pack-day headers: **X-Powered-By: PHP/8.3.33**, LiteSpeed, `x-redirect-by: WordPress`.

Next rebuild: [monarchmountainfoundations-com.vercel.app](https://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.

![Foundations service page on the Next rebuild](/blog/monarch-mountain-foundations-wordpress-to-next-dns-still-php/screenshots/foundations.png)

## 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.

![Commit journey Jan through Aug](/blog/monarch-mountain-foundations-wordpress-to-next-dns-still-php/screenshots/journey.png)

## 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?
