ContextBolt SEO Free for 7 days. Keywords, SERPs, backlinks and AI visibility, inside Claude. SEO data inside Claude. Start free trial
Guide · Framer to Astro

Framer to Astro: Move Your Site Without Losing Rankings

Moving from Framer to Astro means rebuilding the site, because Framer has no code export. Its own help center says Framer “does not offer HTML export for self-hosting.”

The rebuild is the easy half now. Claude Code or Cursor can rebuild a Framer page as an Astro page quickly. The hard half is keeping the Google traffic your Framer site already earned. Change one URL without a redirect, and that page starts over.

We run contextbolt.com, the home of ContextBolt, on Astro. It is about 650 pages, and we move, merge and rename pages on it regularly. These are the steps we use, applied to a Framer move.

Quick answer
  • Framer has no code export. Moving to Astro means a rebuild, then pointing your domain at the new site.
  • List what ranks before you touch anything. Search Console and a ranked-keywords lookup show which pages carry your traffic. ContextBolt SEO pulls both inside Claude Code.
  • Keep every URL exactly. Framer pages have no trailing slash. Astro’s default build adds one, so match it or redirect every old address.
  • Redirect what changes with a 301. On Cloudflare Pages, a rule with no code is a temporary 302.
  • Check Google for a month after. Google says a small site takes a few weeks to move. Compare against the list you made first.

Why people move from Framer to Astro, and when not to

Framer is a good tool. You design on a canvas, press publish, and the site is live. That is why so many founders start there.

People leave for three reasons.

Cost per site: Framer’s pricing page lists Basic at $10 a month and Pro at $30 a month, per site. Pro covers 150 pages and 2,500 CMS items, with paid add-ons past that. A static Astro site can sit on a free hosting plan. Cloudflare Pages’ free plan allows 500 builds a month and up to 20,000 files per site, per its limits page.

Ownership: A Framer site lives on Framer. Framer’s help article explains why there is no export: published sites “are not fully static” and lean on Framer’s servers for pre-rendering, image optimization and caching. An Astro site is a folder of files you can host anywhere.

AI coding tools: This is the new one. A coded site used to mean hiring a developer for every change. Now Claude Code edits an Astro page as easily as you edit a doc. Our whole site is Astro, built and maintained in Claude Code.

Stay on Framer if a designer edits the site visually every week, if the site leans on Framer’s animations, or if nobody on the team wants to open a terminal. Those are real reasons, and Framer does them well.

Still deciding where to go? Astro vs Next.js compares the two frameworks most Framer leavers weigh up, and Astro vs WordPress covers the other common move.

Step 1: list every URL and what it earns

Do this before you build anything. This list is two things at once: your before picture, and your redirect checklist.

Every URL: Open yoursite.com/sitemap.xml. Framer publishes one for you. Save it. Look at how the addresses end, too. Framer-hosted pages usually have no trailing slash, like framer.university/blog. That matters in Step 3.

What each page earns: In Google Search Console, open Performance, switch to the Pages tab, set the range to 12 months and export it. Sort by clicks. The top of that list is what you protect first.

What each page ranks for: Search Console shows your clicks. A ranked-keywords lookup shows the searches behind them, with positions and volume. That is the snapshot you compare against after the move.

ContextBolt SEO runs both inside Claude Code, so the list ends up in the same window you rebuild in. Add it with one command:

claude mcp add --transport http contextbolt-seo \
  https://seo.contextbolt.app/mcp

Open /mcp to sign in, then ask Claude to connect Google Search Console and approve read-only access. Run this before you change a line.

Copy this prompt

I'm moving yoursite.com from Framer to Astro. Before I change
anything:
1. Pull my Search Console pages for the last 12 months, sorted by
   clicks.
2. Run ranked keywords on yoursite.com, 50 results.
3. Save a table to migration/before.md with each URL, its clicks,
   impressions, and the top keywords and positions for it.
Flag any page with clicks that is missing from the sitemap.

Search Console calls are free. The ranked-keywords lookup costs one credit. Keep before.md in the repo. You will need it in Step 5.

Step 2: export your content

Framer content comes out in three kinds of pieces.

CMS collections: Framer’s own CMS Export plugin, from the Framer marketplace, exports any collection as a CSV file. Do one file per collection: blog posts, case studies, changelog, whatever you have.

Static pages: Copy the text of each page, and copy its settings too. Every Framer page has its own title, description and social image in its page settings. Those are SEO decisions you already made. Carry them over word for word.

Images: Framer serves images from its own domain, framerusercontent.com. Check how they come out of the export. If the CSV holds links rather than files, download every image into your repo before you cancel the Framer plan. A broken image link on a ranking page is an easy loss to avoid.

You may see plugins and web tools that “export Framer to code.” They save a copy of the published HTML. Use that as a reference for the rebuild if it helps, but do not ship it as your new site. It still expects Framer’s scripts and servers, which is the point the help article makes.

Step 3: rebuild in Astro with the same URLs

Now the build. Each CSV row becomes one file in an Astro content collection, with its old slug kept exactly. Hand the CSV to Claude Code and say what you want.

Copy this prompt

Convert migration/blog.csv into an Astro content collection at
src/content/blog/. One .md file per row. Keep the slug exactly as
it is in the CSV. Put title, description, date and image in the
frontmatter, and the body as Markdown. Then make
src/pages/blog/[slug].astro render them, so each post keeps its
current Framer URL. List any row where the conversion lost
formatting.

The trailing slash trap: This is the step that quietly changes every URL. Framer serves /blog/my-post. Astro’s default build writes /blog/my-post/index.html. On Cloudflare Pages that page lives at /blog/my-post/, and the old address gets a 308 redirect to it. We see exactly that on our own site.

A 308 is a permanent redirect, so Google will follow it. But every URL you own has just changed, and every old link now passes through a hop. If you want the addresses to stay exactly as they are, set two options in astro.config.mjs:

// astro.config.mjs
export default defineConfig({
  site: 'https://yoursite.com',
  build: { format: 'file' },  // writes my-post.html, not my-post/index.html
  trailingSlash: 'never',     // the dev server enforces the same form
});

With format: 'file', Astro writes my-post.html. Cloudflare’s serving rules say it serves that file at /blog/my-post and redirects /blog/my-post.html to the clean address. Netlify and Vercel have their own rules, so check yours.

Carry the SEO over: Put every page’s old title and description into its frontmatter, and render them from one Head component with a canonical tag. The full setup, with code for the head tags, sitemap and structured data, is in Astro SEO: the setup we run on a 650-page site.

Change one thing at a time: Launch day is not the day to rewrite your copy or rename your pages. If rankings dip and you changed the platform, the URLs and the words at once, you will not know which one did it. Move first. Improve later.

Step 4: redirect everything that changed

Compare your new build against before.md. Any old URL that does not exist in the new site needs a redirect. Ask Claude Code to do the comparison:

Copy this prompt

Build the site, then compare every URL in migration/before.md and
the old Framer sitemap against the built pages in dist/. For each
old URL with no matching page, suggest the closest new page and
write the rule to public/_redirects as a 301. Show me the list
before you save it.

Three rules make the difference.

Always write the 301: On Cloudflare Pages and Netlify, redirects live in a _redirects file in public/, one per line. Cloudflare’s redirects docs say a line with no status code defaults to 302, which is temporary.

# public/_redirects
/blog/old-post  /blog/new-post  301
/pricing-old    /pricing        301

Never send everything to the home page: Google’s site move guide says not to redirect many old URLs to “one irrelevant single URL destination, such as the home page,” because it “might be treated as a soft 404 error.” Send each old page to its closest match. If nothing matches, a real 404 is more honest than a redirect.

Keep the rules: The same guide says to keep redirects “for as long as possible, generally at least 1 year.” Write a comment above each rule saying why it exists. A rule that looks pointless in six months is the one still carrying traffic.

Do not use Astro’s own redirects setting for this. On a static site, Astro’s docs say it writes a meta refresh page and “does not support status codes.” The host file sends a real 301.

Step 5: switch the domain and check Google

Point your domain at the new host. The domain stays the same, so Google’s Change of Address tool is not needed. The guide says it is only for moves between domains or subdomains.

Then work through four checks on launch day.

  1. Open your top ten pages from before.md on the live domain. Each one should load, with the old title.
  2. Request ten old URLs that changed. Each should return a 301 to the right page, in one hop.
  3. Submit the new sitemap in Search Console. With @astrojs/sitemap it is sitemap-index.xml.
  4. Inspect your top pages with Search Console’s URL Inspection, so Google recrawls them sooner.

Then wait, and do not panic in week one. Google says “a small to medium-sized website can take a few weeks for most pages to move,” and that visibility “may fluctuate temporarily during the move.”

After four weeks, run the comparison.

Copy this prompt

It's been four weeks since the move. Pull my Search Console pages
for the last 28 days and run ranked keywords on yoursite.com again.
Compare both against migration/before.md. List pages that lost
clicks or positions, pages that 404 in the Pages indexing report,
and any old URL that still has no redirect.

A page that dropped and has no redirect is your fix list. A page that dropped but redirects fine usually comes back as Google settles. If pages sit in “Discovered, currently not indexed” for weeks, read what that status means before you change anything.

What the move costs

Framer: $10 to $30 a month per site on the plans listed today, which stops when you cancel.

Hosting: Free for most small static sites, within the host’s limits.

The rebuild: Your time, plus an AI coding tool if you use one. A small marketing site with a blog can be a weekend of work with Claude Code. A site with hundreds of CMS items takes longer, mostly in checking the conversion.

The SEO checks: ContextBolt SEO is $35 a month after a 7-day free trial with 100 credits. The whole migration above uses a handful of credits: one ranked-keywords check before and one after. Search Console calls are free, and your research saves to your private SEO Dashboard, so the before picture is still there in a month.

The move itself is not the risk. The risk is changing URLs nobody wrote down. Make the list first, and the rest is a checklist.

Frequently asked questions

Something else on your mind? Get in touch.

Can you export a Framer site to code?

Not officially. Framer's help center says it does not offer HTML export for self-hosting, because published sites depend on Framer's servers for things like pre-rendering and image optimization. Third-party plugins can save a copy of the HTML, but treat that as a reference for the rebuild, not as your new site.

Will I lose SEO moving from Framer to Astro?

Not if the URLs stay the same or every changed URL gets a 301 to its closest new page. Google says a small to medium site can take a few weeks for most pages to move, and rankings may fluctuate during that time. Keep titles, descriptions and content the same on day one so the only change is the platform.

How do I keep Framer URLs without a trailing slash in Astro?

Set build.format to 'file' in astro.config. Astro then writes about.html instead of about/index.html, and Cloudflare Pages serves it at /about with no slash. With the default 'directory' format, Cloudflare Pages redirects /about to /about/, which changes every URL.

Do I need Search Console's Change of Address tool?

Only if the domain changes. Google says the tool is not needed for moves on the same domain, so a Framer to Astro switch that keeps yoursite.com only needs the redirects, a fresh sitemap and some checking.

Is Astro cheaper than Framer?

Usually. Framer site plans list at $10 a month for Basic and $30 a month for Pro, per site. A static Astro site can sit on a free hosting plan within its limits. Cloudflare Pages' free plan allows 500 builds a month and up to 20,000 files per site. The real cost is time, or an AI coding tool you already pay for.