Framer doesn't let you export your site. unframed fixes that.
It renders every page in headless Chrome, captures the full DOM after Framer's runtime has finished, strips the Framer badge, and writes static HTML files you can host anywhere.
The output is a pixel-perfect copy — all styles, fonts, images, and animations are preserved exactly as they appear on the live site.
npx unframed https://your-site.framer.websiteThat's it. Your site is now in ./unframed-output/.
# Export entire site (auto-discovers pages via sitemap)
npx unframed https://example.framer.website
# Custom output directory
npx unframed https://example.framer.website -o ./my-site
# Single page only
npx unframed https://example.framer.website --single-page
# Higher concurrency for large sites
npx unframed https://example.framer.website -c 5
# Debug mode
npx unframed https://example.framer.website --verbose| Option | Default | Description |
|---|---|---|
<url> |
— | Framer site URL (required) |
-o, --output <dir> |
./unframed-output |
Output directory |
-c, --concurrency <n> |
3 |
Max concurrent page renders |
-t, --timeout <ms> |
120000 |
Per-page timeout |
--single-page |
— | Only convert the given URL |
--viewport <WxH> |
1440x1024 |
Browser viewport size |
--verbose |
— | Enable debug logging |
URL → Discover Pages → Render in Chrome → Capture DOM → Strip Badge → Rewrite Links → Static HTML
- Discover — Fetches
/sitemap.xmlto find all pages. Falls back to crawling homepage links. - Render — Opens each page in headless Chrome and waits for Framer to fully render.
- Capture — Grabs
document.documentElement.outerHTML— the complete rendered DOM, as-is. - Clean — Strips only the Framer badge and editor bar. Everything else stays untouched.
- Rewrite — Internal navigation links are rewritten for static file hosting.
unframed-output/
├── index.html
├── about/
│ └── index.html
└── blog/
├── index.html
└── my-post/
└── index.html
Each page is a self-contained HTML file. Deploy the folder to any static host — Vercel, Netlify, Cloudflare Pages, GitHub Pages, or your own server.
- Images & fonts still load from Framer's CDN — nothing is downloaded locally
- Animations & interactions work because Framer's JavaScript is preserved
- First run downloads Chromium (~170MB) via Puppeteer — subsequent runs are instant
- Works with custom domains and
*.framer.websiteURLs
- Node.js 18+