Case study

Client website re-platform, Webflow to Astro on Cloudflare Pages

A portfolio client's 128-page marketing website rebuilt after diagnosing a 37% organic-click decline against improving rankings. Built on an unindexed preview without touching DNS, forms, or tag management, verified against production with a visual-diff harness, and delivered with a cutover runbook.

Built and verified ahead of cutover

Role
Sole engineer, from diagnosis through runbook
Scope
128 pages, 17 CMS collections, 735 assets
Stack
Astro static build, Cloudflare Pages, GitHub with PR preview deploys and protected main
Pipeline
22-script Python migration pipeline: extract, convert, verify
Status
Built, QA complete, merged. Cutover pending one external access grant. Not live.

Why

Organic clicks had fallen 37% while average ranking improved, and almost all remaining organic traffic was branded. That is a page-experience and click-through problem, not a content problem, and the platform was the cause: a render-blocking payload of shared CSS, the hosted runtime, and jQuery on every page. The client also wanted text edits to take minutes in a pull request instead of days in a designer-only tool. The re-platform was justified by the diagnosis, not by a preference for a newer stack.

Constraints I worked inside

Engineering

  1. ExtractEvery page, collection, and asset pulled through the source platform's API. Images recovered at original quality rather than the lossy converted versions the platform served.
  2. Convert17 CMS collections mapped to Astro content collections with validated schemas.
  3. VerifyA visual-diff harness screenshots every page on both sites and compares them against a measured noise floor, so a real regression is distinguishable from rendering jitter. 384 comparisons. 12,629 internal links checked. Redirect coverage and metadata verified across all 128 pages.
  4. Cut weightjQuery, the hosted runtime, third-party plugins, and consent and tag scripts removed from the render path. Homepage transfer fell from 1,437 KB to 838 KB.
  5. Protect the repoProtected main with required review and no force-push, tested deliberately by trying to break it.

Delivery

Numbers

Pages128
CMS collections17
Assets re-hosted735
Migration pipeline22 scripts
Screenshot comparisons against production384
Internal links verified12,629
Forms byte-matched to the live DOM7
Homepage transfer1,437 KB to 838 KB
Organic-click decline that prompted the work37%
Rollback timefive minutes, one DNS record
All figures appear on my resume. The site is built and verified, not launched. Cutover waits on an external access grant.

This portfolio site is on the same stack: Astro static build on Cloudflare Pages, no client-side JavaScript.