Migrate Your Framer Site to a Static Site
Open your Framer site in Chrome DevTools and look at the Network tab. You will see a React runtime loading, JavaScript bundles executing, and a hydration process running — all to display a marketing page that shows the same content to every visitor.
This is the Framer paradox. You are paying $15-$45/month for a platform that renders static content through a JavaScript framework, locked into proprietary infrastructure, with no option to export or self-host. The content does not change between visitors. There is no user authentication, no dynamic data, no personalization. It is a marketing page — the purest use case for static HTML served from a CDN edge node.
A static site does the same thing, with better performance, zero hosting cost, and full code ownership. This guide explains why and how to make the switch.
What “static” actually means (and why it matters)
A static site is a collection of pre-built HTML, CSS, and JavaScript files that are ready to serve the moment a visitor requests them. There is no server processing each request. No database query. No React runtime that needs to download, parse, and execute before the visitor sees content.
When you visit a static site hosted on Cloudflare Pages, here is what happens:
- Your browser requests the page
- Cloudflare’s nearest edge node (there are 300+ worldwide) serves the pre-built HTML file
- The browser renders it immediately
- CSS applies styling
- Optional JavaScript runs for interactive elements
When you visit a Framer site, here is what happens:
- Your browser requests the page
- Framer’s server responds with a minimal HTML shell and React bundles
- React downloads and parses (~80KB+ of framework JavaScript, gzipped)
- React renders the page content in the browser
- The page “hydrates” — React attaches event listeners and takes control of the DOM
- The visitor finally sees the fully interactive page
Framer does server-side render for SEO (so search engines see the content), which puts it ahead of platforms like Wix that rely entirely on client-side rendering. But visitors still download and execute a React runtime for pages that do not need React at all. The visual output is identical. The performance cost is not.
Performance comparison: Framer vs static
The performance difference is measurable and significant, especially on mobile devices and slower connections.
Lighthouse scores. A well-built static site consistently scores 95-100 on Google Lighthouse across all metrics (Performance, Accessibility, Best Practices, SEO). Framer sites typically score 70-90 on Performance due to the JavaScript overhead. The other metrics are comparable.
First Contentful Paint (FCP). This measures how quickly the first content appears on screen. Static sites on CDN edge nodes typically achieve 0.5-1.0 seconds. Framer sites typically show 1.0-2.5 seconds because the React runtime must load and execute first.
Time to Interactive (TTI). This measures when the page becomes fully interactive. For a static marketing page with minimal JavaScript, TTI is nearly the same as FCP — under 1 second. For a Framer site, TTI is delayed until React hydration completes, typically 2-4 seconds.
Total Transfer Size. A static marketing page built with Astro and Tailwind CSS typically transfers 50-150KB total (HTML, CSS, images aside). A comparable Framer page transfers 200-500KB due to the React runtime, Framer’s rendering engine, and associated JavaScript.
These differences matter more than most people think. Google uses Core Web Vitals as a ranking signal. Pages that load faster have lower bounce rates. On mobile connections in emerging markets, the difference between 1 second and 3 seconds can determine whether a visitor stays or leaves.
A note on honesty: Framer’s performance is not terrible. It is better than Wix, better than Squarespace, and competitive with Webflow. Framer’s server-side rendering and relatively clean code output put it in the upper tier of website builders. But it cannot match a static site that ships zero JavaScript by default, because the static site has fundamentally less work to do.
The CDN edge delivery advantage
Static files are uniquely suited for CDN (Content Delivery Network) edge delivery, and this is where the hosting cost equation becomes absurd.
Cloudflare Pages, Vercel, and Netlify all offer free hosting for static sites. Not “free trial” — genuinely free, with generous or unlimited bandwidth. The reason they can do this is that serving pre-built files from edge cache is extremely cheap. There is no server compute, no database query, no runtime processing. Just serving files.
| Host | Bandwidth (free tier) | Edge locations | Custom domain | SSL |
|---|---|---|---|---|
| Cloudflare Pages | Unlimited | 300+ | Free | Free |
| Vercel | 100GB/month | 100+ | Free | Free |
| Netlify | 100GB/month | 100+ | Free | Free |
| GitHub Pages | 100GB/month | N/A (GitHub CDN) | Free | Free |
Framer charges $15-$45/month to serve your site from their infrastructure. A static version of the same site can be served for $0/month from a global CDN with more edge locations and better geographic coverage.
Over 5 years:
| Framer Pro | Static site | |
|---|---|---|
| Year 1 | $360 | $0 |
| Year 3 | $1,080 | $0 |
| Year 5 | $1,800 | $0 |
| After leaving | Start over (no export) | Keep everything |
This is not a minor difference. It is $1,800 for a less performant delivery mechanism versus $0 for a faster one, and at the end, you own nothing with Framer versus owning everything with static files.
Framer animations on a static site
The number one concern people have about going static: “I will lose my animations.”
You will not. Here is a practical breakdown of how Framer animations translate to static sites.
Animations that are pure CSS (zero JavaScript)
Most Framer animations are CSS animations with a visual editor on top. The underlying technology is identical:
Hover effects. Framer’s hover scale, color transitions, and shadow changes are CSS transitions:
.card {
transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.card:hover {
transform: scale(1.04);
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.15);
}
Fade-in and slide-up on scroll. Framer’s “animate while scrolling” effects use IntersectionObserver:
.reveal {
opacity: 0;
transform: translateY(24px);
transition: opacity 0.6s ease, transform 0.6s ease;
}
.reveal.is-visible {
opacity: 1;
transform: translateY(0);
}
<script>
const observer = new IntersectionObserver(
(entries) => entries.forEach(e => {
if (e.isIntersecting) e.target.classList.add('is-visible');
}),
{ threshold: 0.15 }
);
document.querySelectorAll('.reveal').forEach(el => observer.observe(el));
</script>
Page transitions. If you use Astro, View Transitions are built in and work with zero JavaScript. The browser handles the animation natively. This is actually better than what Framer offers, because it works across full page navigations without loading an entire React router.
Smooth scrolling, parallax, gradient animations. All achievable in CSS:
html { scroll-behavior: smooth; }
.parallax { transform: translateZ(-1px) scale(2); }
@keyframes gradient-shift {
0% { background-position: 0% 50%; }
100% { background-position: 100% 50%; }
}
Animations that need a small JavaScript library
For physics-based spring animations, gesture-driven interactions, and complex orchestrated sequences, the motion library (formerly Framer Motion) is the answer. This is the exact same animation engine that powers Framer’s visual editor — it is open source and works in any project.
On a static site built with Astro, you use motion in React “islands” — small interactive components that load only when needed. The rest of the page stays as zero-JavaScript static HTML:
// src/components/AnimatedFeature.tsx
import { motion } from "motion/react"
export function AnimatedFeature({ title, description }) {
return (
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ type: "spring", stiffness: 80, damping: 20 }}
viewport={{ once: true }}
>
<h3>{title}</h3>
<p>{description}</p>
</motion.div>
)
}
The key insight: on a static site, you choose the animation strategy per component. Simple animations use zero-JS CSS. Complex animations use the motion library only where needed. Framer uses a React runtime for everything, regardless of whether the animation warrants it.
How to migrate: every realistic approach
Framer has no export functionality of any kind. From their help center:
“Framer does not offer HTML exporting functionality for self-hosting.”
Every migration approach works from the published output — the rendered pages that visitors see.
AI coding agents (most common, most efficient)
AI coding agents have made this migration dramatically faster than it used to be. You point an agent at your published Framer site, describe what you want, and it generates a static site.
Claude Code works in the terminal. Point it at your Framer URL, tell it to extract the content and rebuild as a static site with Astro and Tailwind CSS, and it generates the entire project. It handles content extraction, component generation, responsive layouts, and basic animation implementation.
Cursor and Windsurf work in the IDE. Screenshot your Framer pages at desktop and mobile sizes, paste them into the agent chat, and describe what you want. The agent generates components that match the visual design. Preview in your browser, iterate, refine.
Cline runs as a VS Code extension. It can autonomously browse your Framer site, extract content, and create the project file by file.
Real-world example: a typical 5-page Framer marketing site (homepage, about, services, blog, contact) can be rebuilt as a static Astro site in a few hours of AI-assisted work. The agent handles the grunt work — extracting text, identifying layout patterns, generating responsive CSS — while you focus on reviewing and polishing.
Time: Hours to a couple of days.
Cost: $20-50/month agent subscription or under $20 in API costs.
AI app builders (best for non-developers)
Bolt.new generates complete static sites from descriptions and screenshots. Upload your Framer screenshots, describe the site, and get a deployable project in the browser. You can preview and edit without touching a terminal.
v0.dev generates individual components from screenshots. Good for recreating specific sections and assembling them into a project.
Lovable and Replit Agent offer similar workflows — describe or screenshot what you want, iterate in the browser, export the code.
These tools are ideal if you do not want to use a terminal or code editor. The output is a real codebase you can deploy to any static host.
Time: A few hours.
Cost: $20-30/month.
Hire a developer
Share your Framer URL with a developer and ask for a static site built with Astro, Hugo, Eleventy, or your preferred static site generator. Many freelancers specialize in this exact migration.
Freelancers: $1,000-$5,000 for a typical marketing site. 1-2 weeks turnaround.
Agencies: $5,000-$25,000 for larger, more complex sites.
Ask the developer to deploy to Cloudflare Pages or Vercel with automatic deployments from a Git repo. Request that they set up your content as markdown files so you (or an AI agent) can make content changes without needing to write code.
Automated migration services
BrowserCat Migrate automates the crawl-extract-rebuild pipeline. It renders your Framer site in a browser, extracts the content and structure, and generates a deployable static site. Other automated tools work the same way. Good for skipping the manual extraction, though the output benefits from some refinement.
Manual rebuild
The most time-consuming but also the most controlled approach. Document every page of your Framer site (screenshots, text content, animations, responsive behavior), then rebuild from scratch using your preferred static site generator.
Recommended stack: Astro + Tailwind CSS. Astro is the most natural static site generator for marketing sites, with built-in support for content collections (replacing Framer’s CMS), View Transitions (replacing Framer’s page animations), and component islands (for interactive sections that need JavaScript).
Time: 2-6 weeks depending on complexity.
Cost: $0 beyond your time.
Framer CMS vs static content files
Framer’s CMS is one of the primary reasons teams upgrade to paid plans:
| Plan | Collections | Items per collection | Monthly cost |
|---|---|---|---|
| Free | 1 | 20 | $0 |
| Mini | 2 | 100 | $15 |
| Pro | 10 | 1,000 | $30 |
| Business | 30 | 10,000 | $45 |
A static site using markdown files has no limits. Create as many content types as you want. Store as many items as you need. Each blog post, case study, or team member is a markdown file in your project:
---
title: "Our Design Process"
date: 2025-09-12
author: "Jane Smith"
image: "./images/design-process.jpg"
tags: ["design", "process"]
---
Your content here. No collection limits.
No monthly fee for more content types.
Written in markdown -- the simplest possible format.
If you are paying for Framer Pro or Business primarily because you need more CMS collections, switching to a static site eliminates that recurring cost entirely.
What Framer does well (give credit where it is due)
Framer is not a bad tool. It is a good tool with a significant trade-off (lock-in) and an architecture mismatch (React runtime for static content).
What Framer genuinely excels at:
- Rapid prototyping. A designer can go from blank canvas to published site in an afternoon.
- Visual animation design. The animation timeline and interaction editor are genuinely excellent tools for designing motion.
- Design exploration. Being able to visually experiment with layouts, spacing, and typography is valuable during the design phase.
- Template quality. Framer’s community templates and marketplace consistently produce good-looking starting points.
The question is not “is Framer bad?” The question is “is a React-rendered, platform-locked, $30/month website the right long-term architecture for content that does not change between visitors?” For most marketing sites, the answer is no. Static files on a free CDN deliver the same visual result with better performance, zero cost, and full ownership.
When to stay on Framer
Not every site should migrate:
- Short-lived campaigns. If the site will exist for 3-6 months, the migration effort is not worth it.
- Pure design teams. If nobody on your team wants to touch code (even through AI agents), Framer’s visual editor is a legitimate choice.
- Active prototyping. If you are still iterating on the design and the site is not yet “final,” stay in Framer until the design stabilizes.
- Simple single-page sites on the free tier. If Framer’s free plan covers your needs and you are not paying anything, the cost argument does not apply.
The case for migration is strongest when: the site is a long-term business asset, you are paying $30+/month, you have CMS content that could be simpler as markdown, or you want AI agents to help maintain and improve the site over time.
The bottom line
A Framer marketing site and a static site look identical to visitors. The same design, the same animations, the same content. The difference is invisible to users but significant to the site owner:
- Performance: Static is faster (no React runtime to download and execute)
- Cost: Static is free to host (CDN edge delivery costs nothing)
- Ownership: Static files are yours (no lock-in, no export restrictions)
- Flexibility: Static deploys anywhere (not locked to one platform)
- Editability: Static files work with AI agents (code is scriptable, canvases are not)
The migration takes effort because Framer offers no export. But with AI coding agents, the rebuild is faster than it used to be. A few hours of AI-assisted work can replace a $30/month subscription with a $0/month static site that loads faster and that you actually own.
Automate Everything.
Tired of managing a fleet of fickle browsers? Sick of skipping e2e tests and paying the piper later?
Sign up now for free access to our headless browser fleet…