Migrate a site built on a website builder (Webflow, Framer, Squarespace, Wix, Carrd, etc.) to a self-hosted static site. Uses wget to mirror the published site, then cleans up assets, URLs, and platform-specific artifacts so it's ready to deploy anywhere.
npx skills add stevysmith/website-builder-migrate-skill/plugin marketplace add stevysmith/website-builder-migrate-skill
/plugin install website-builder-migrate@website-builder-migrate-skill
After installation, the /website-builder-migrate skill is available in Claude Code.
/website-builder-migrate https://www.example.com/
Pass the URL of a live, publicly accessible builder-hosted site. The skill will:
- Mirror the full site including CDN-hosted assets (images, CSS, JS)
- Consolidate into a clean
site/directory structure - Rewrite all asset URLs to local paths
- Fix common builder-export issues (SRI integrity blocks, missing webpack chunks, mangled inline styles, double-encoded URLs, broken forms)
- Verify all asset references resolve correctly
- Deploy to Render, Netlify, Vercel, or any static host
The Phase 1–7 workflow is platform-agnostic, with a per-platform notes table for CDN domains, chunk patterns, and common gotchas:
| Platform | Notes |
|---|---|
| Webflow | Battle-tested. Multiple CDN site IDs, webflow.achunk.* webpack chunks, heavy SRI tags. |
| Framer | React SPA with dynamic route bundles. Verify hydration in the browser. |
| Squarespace | Heavy template JS, server-side image transforms. |
| Wix | Hardest case — extremely SPA-driven; works only for static template sites. |
| Carrd | Trivial — single inlined HTML; full workflow is overkill. |
For unfamiliar platforms, the skill includes a diagnostic checklist (CDN domain / SRI tags / chunk map) to drive the workflow.
- Multiple CDN site IDs (site assets vs CMS content)
- Inline
background-image:url()assets thatwgetmisses - Mangled URLs from
wget --convert-linksin inline styles - Double-encoded CMS filenames (
%2520,%252B,%2526) - Subdirectory page structures (blog posts, career pages, etc.)
- SRI
integrityattribute blocks — the most common cause of a blank-rendered migration;--convert-linksmodifies CSS bytes so the SHA-384 hash no longer matches - Dynamically-loaded webpack chunks —
webflow.achunk.*and equivalents thatwgetdoesn't catch - CSS-internal
url(../font.ttf)paths that break when assets are reorganized - Platform metadata attribute cleanup (
data-wf-*,data-framer-*, generator meta tags) - In-browser verification step (catches what static asset checks miss)
site/
index.html
about.html
blog.html
post/ # blog posts
careers/ # career pages
assets/
css/ # stylesheets
js/ # builder runtime + chunks
images/ # all media (images, SVGs, videos)
wgetmust be installed (comes with macOS/Linux)- The site must be published and publicly accessible
- Optional:
agent-browserskill for visual verification
| Platform | Command |
|---|---|
| Stacktree | (cd site && zip -qr ../site.zip .) && curl -F "file=@site.zip" https://api.stacktr.ee/sites — no account; returns a private preview URL |
| Render | Publish path: ./site |
| Netlify | npx netlify-cli deploy --dir=./site --prod |
| Vercel | npx vercel ./site --prod |
Tip: deploy to Stacktree first to verify the migration on a private, unguessable URL before pointing DNS anywhere — anonymous uploads need no signup and last 24 hours.
- JavaScript interactions — the builder's runtime continues to work but is monolithic (Webflow ~500KB; Framer per-route bundles)
- CMS content — captured as static HTML at time of mirroring; won't update dynamically
- Forms — builder forms won't work without their backend; use Formspree, Netlify Forms, Basin, etc.
- Site search — native search won't work; use Algolia, Pagefind, or similar
- Wix and other heavily-SPA builders — wget mirroring may produce incomplete output for client-rendered content
- skills.sh — Discover more Claude Code skills