---
title: "Framer to Astro + Sanity: why we moved our site | AGR Studio"
description: "We moved agr.studio from Framer to Astro and Sanity on 16 October 2026: why, how the migration went, what we gave up, and when to stay on Framer."
url: https://agr.studio/blog/framer-to-astro-sanity
language: en
---

[Blog](https://agr.studio/blog) 10 min read

# Why we moved our own site from Framer to Astro and Sanity (and still build on Framer)

Category: Web

Updated: Oct 25, 2026

On 16 October 2026 we moved agr.studio from Framer to Astro and Sanity. Why, how the migration went, what it cost us, and when to stay on Framer.

![Artyum Grebenyuk, founder of AGR Studio](https://cdn.sanity.io/images/coun0bog/production/4fbb7eca2741ad92fd54139f4e615213db80970f-352x352.png?w=160&q=82&auto=format) Artyum Grebenyuk Founder, AGR Studio

TLDR:

We moved agr.studio, about 300 pages in English and Hebrew, from Framer to Astro, Sanity and Vercel on 16 October 2026, because we wanted structured content and full control of the code for AI and agent features. We gave up on-canvas editing: design changes now need a developer and a deploy. For most marketing sites Framer is still the faster choice, and we still build client sites on it.

On 16 October 2026 we moved agr.studio from Framer to Astro, with Sanity as the CMS and Vercel as the host. The site has about 300 indexable pages: English plus a full Hebrew mirror. The reason in one sentence: we wanted our content in structured form and full control of the code, so we could build AI and agent features that a visual builder leaves out. We still build client sites on Framer, and for most marketing sites it's still the fastest route.

Our bias, stated once: we build on Framer, Webflow, WordPress, Next.js and Astro, we're an Official Framer Expert, and our own site now runs on Astro and Sanity. This is the story of one site, not a verdict on Framer. For the wider picture, see our [website platform comparison for 2026](https://agr.studio/blog/website-platform-comparison-2026).

## What changed when we moved from Framer to Astro?

Content editing stayed self-serve. Layout work moved from a canvas to code. Here is the before and after, as of October 2026.

|  | Before: Framer | After: Astro + Sanity on Vercel |
| --- | --- | --- |
| Layout changes | A designer edits the canvas and publishes | A developer changes code, then a build of one to two minutes and a deploy |
| Content editing | On the canvas and in Framer's CMS | Sanity Studio, a form-based editor at /studio |
| Rendering | Server-rendered by Framer: busiest pages at publish, the rest on first request | Every page prerendered to static HTML at build time |
| Hebrew | Framer's localization | One Sanity document per language, hreflang in every page head and the sitemap |
| Structured data | Sitewide JSON-LD added as custom code | JSON-LD on every page type, generated from the content |
| AI and agent access | llms.txt can be uploaded as a file | /llms.txt, Markdown versions of every page, an inquiry API with an OpenAPI file, /ai-check |
| Redirects | Framer's redirect settings | 91 rules in a config file in our repository |

## Why leave Framer if we still recommend it?

Because our own site stopped being a typical marketing site. Framer is still our first suggestion where design and launch speed matter most and the team wants to edit visually. Hosting is included, editors work on the page itself, and a designer can publish a change without a developer. Hebrew alone isn't a reason to leave: we built [Baladi](https://agr.studio/projects/baladi), a bilingual Hebrew and English site for a public food importer, on Framer in three weeks.

Three things made our site different:

-   **Size, in two languages.** About 300 pages, with a full right-to-left Hebrew mirror at /he/ and hreflang between each English page and its Hebrew twin. Framer's localization ran our Hebrew pages until the switch. At this size we wanted the pairs, hreflang and sitemap generated from our own data, in code we can test.
-   **Structured content.** We wanted projects, posts, services and testimonials as typed records, not content attached to page designs. In Sanity a case study is one document per language. It feeds its own page, the homepage work rows, the projects index, its JSON-LD and its Markdown version.
-   **AI and agent features that need our own code.** JSON-LD on every page type; [/llms.txt](https://agr.studio/llms.txt); a Markdown version of every page (add .md to any address); a JSON inquiry endpoint described by an OpenAPI file, so an AI assistant can send us an inquiry; and a live [AI visibility check](https://agr.studio/ai-check) that fetches a site and reports what AI crawlers can read.

Framer covers the basics. Its [SEO features](https://www.framer.com/seo/) include JSON-LD through custom code and an uploaded llms.txt, and its [MCP server](https://www.framer.com/help/articles/getting-started-with-framer-mcp/) lets AI agents create pages and manage CMS content. That's agents working on a Framer site. We also wanted agents reading and using ours, through a build step that converts every page to Markdown, an endpoint that stores inquiries and a tool that checks other sites. That's code running on our side, which is where a codebase beats a builder.

## Why did we choose Astro over Next.js?

Because ours is a content site, and Astro's default output is static HTML with no client-side runtime. Next.js can prerender pages too. We didn't need what it adds on top.

There was a detour. On 5 January 2026 we started a rebuild on Next.js and Sanity. It never launched, and the Framer site stayed live. In October we restarted on Astro, kept Sanity, and launched.

-   **Static by default.** Astro's docs: "[By default, your entire Astro site will be prerendered](https://docs.astro.build/en/guides/on-demand-rendering/)." Every page on agr.studio is HTML built ahead of time. Only the embedded Sanity Studio and three API endpoints (the inquiry form, the design check and the AI check) run on demand. Opting out is one line in each endpoint:

```
// src/pages/api/inquiry.ts
export const prerender = false; // runs on request; every page stays static
```

-   **No React runtime for motion.** Astro components [render to static HTML with no client-side runtime](https://docs.astro.build/en/concepts/islands/). Our motion is GSAP, with Lenis for smooth scrolling, as plain scripts, so no page loads React to animate a headline. React is still in the project, inside the Studio, the one part of the site that is an app.
-   **Sanity fits in.** The Studio runs at /studio through Sanity's [official Astro integration](https://docs.astro.build/en/guides/cms/sanity/), in the same repository. The stack: Astro 7, Sanity 6, Tailwind CSS 4, GSAP and Lenis, on Vercel.

To be fair to Next.js: pages are [Server Components by default](https://nextjs.org/docs/app/getting-started/server-and-client-components), and routes that use no dynamic APIs are [prerendered at build](https://nextjs.org/docs/app/guides/self-hosting). A Next.js marketing site can be static and fast. We pick Next.js when the site is part of a product (logged-in areas, app-like features, heavy personalisation) or when the team already runs it. Neither applied here. The longer comparison is in [Astro vs Next.js](https://agr.studio/blog/astro-vs-nextjs).

## How did we migrate without losing search traffic?

We moved the content by script, ported the redirects, and compared old and new page by page before touching DNS. The full checklist is in [how to migrate a website without losing SEO](https://agr.studio/blog/website-migration-without-losing-seo). Much of the implementation was done by AI coding agents (Claude Code) under our direction and review.

### Content

A crawler read all 284 live pages in English and Hebrew. An importer turned them into Sanity documents, kept each page's exact title and meta description, and linked each English page to its Hebrew twin. One catch: right after a publish, some pages came back as a JavaScript shell, because Framer [renders less visited pages on first request](https://www.framer.com/help/articles/guide-to-framer-hosting-infrastructure/). Our crawler re-fetched until every page returned full HTML.

### Redirects

About 80 rules for old Framer URLs went live with the switch: old /work, /portfolio, /case-studies and /blogs paths, renamed services and solutions, in English and Hebrew. Patterns keep the list short:

```
{ "source": "/:dir(work|works|portfolio|case-studies)/:slug", "destination": "/projects/:slug", "permanent": true }
```

We tested 458 old URLs (from the crawl, the Wayback Machine's list, and English and Hebrew variants) against both Framer and the new site. Every URL that worked on Framer landed on the same page on the new one. The file holds 91 rules today, after we renamed and retired a few pages.

### Page-by-page comparison

Before the switch, all 284 URLs existed on the new site, and 279 had identical titles, descriptions and canonical URLs. The other five we rewrote on purpose. No internal link was broken.

### The switch

DNS moved from Framer to Vercel at 23:11 UTC on 16 October. Framer kept serving the old site as long as the domain stayed connected there, so rollback was a DNS change. Twelve minutes later we sent all 289 URLs to IndexNow, and the next day the sitemap went to Google Search Console and Bing Webmaster Tools.

## How did we get layout shift from 0.19 to 0?

With font fallbacks that match the web font's metrics, reserved space for every image, and animations that use transforms instead of reflowing text. The 0.19 was our new build, measured on load before launch, not the Framer site. Google calls a CLS of [0.1 or less good and above 0.25 poor](https://web.dev/articles/cls), so 0.19 needed work.

-   **Fonts.** Our sans-serif, Ploni, is self-hosted. Its fallback is Arial with `size-adjust` and ascent, descent and line-gap overrides, so text takes the same space before and after the web font arrives.
-   **Images.** Sanity puts each image's pixel size in its asset ID (`image-<hash>-1600x900-png`). We read it at build time and give every cover, gallery and inline image its `width` and `height`, so the browser reserves the space before the file loads.
-   **Headlines.** Headlines split into lines and rise into view. Splitting before the web font loaded, then again after, made them jump, so we wait for `document.fonts.ready`. A letter-spacing animation that re-wrapped lines now animates a transform instead, which doesn't move the layout. Hebrew needed its own split: GSAP's line detection assumes left-to-right text, so we split by word and regroup by visual line.

More on finding and fixing shifts in [why your website jumps while you scroll](https://agr.studio/blog/website-jumps-while-scrolling).

## What did we give up?

On-canvas editing and instant publishing by a designer.

-   **No on-canvas editing.** Editors work in Sanity's form-based Studio. Sanity offers [Visual Editing](https://www.sanity.io/docs/visual-editing/introduction-to-visual-editing), with an Astro quickstart, on all plans, but it takes front-end work to set up.
-   **Design changes are code changes.** A new section or a spacing fix goes through code, a build of one to two minutes on our machine, and a deploy. Some copy lives in code too: navigation, footer and homepage sections sit in two copy files, English and Hebrew, not in the CMS.
-   **A developer for layout work.** We have one in-house. A marketing team without one needs a retainer or a partner, the main reason we don't move clients off builders by default.
-   **More moving parts.** A framework, a CMS and a host instead of one product with one bill. Dependency updates, failed builds and environment variables are now our job.

## What does each setup cost to run?

Platform fees are small on both sides. The cost that differs is who makes layout changes. List prices as of October 2026, in USD per month, excluding tax. We're not saying which plans we're on.

| Cost line | Framer | Astro + Sanity on Vercel |
| --- | --- | --- |
| Builder or framework | Basic $10 (30 pages) or Pro $30 (150 pages) | Astro is free (MIT licence) |
| Second language | A paid localization add-on, per locale | Sanity: no per-locale fee (unlimited locales on all plans); routing and hreflang are your code |
| Editors | $20 per extra full editor, $10 per content editor | Sanity Free: up to 20 seats, two roles. Growth: $15 per seat, five roles |
| Hosting | Included | Vercel Hobby is free but non-commercial only; Pro is $20 with one deploying seat, $20 per extra deploying seat |
| Layout changes | Designer time on the canvas | Developer time, then build and deploy |

Sources: [Framer pricing](https://www.framer.com/pricing), [Sanity pricing](https://www.sanity.io/pricing), [Vercel's fair use guidelines](https://vercel.com/docs/limits/fair-use-guidelines) and [Vercel's Pro plan](https://vercel.com/docs/plans/pro-plan).

What the table doesn't show:

-   **Vercel Hobby is out for a company site.** Vercel counts as commercial any deployment made for financial gain, "including a paid employee or consultant writing the code".
-   **Sanity Free is meant for small projects.** Sanity calls it "for individuals and hobbyists working on smaller projects", with 10,000 documents and public-only datasets. Growth adds private datasets, 25,000 documents, and comments, tasks and scheduled drafts.
-   **An estimate of the floor.** Assuming two languages, one developer who deploys and Sanity's Free plan, a commercial Astro and Sanity site on Vercel starts at $20 a month, or $20 plus $15 per seat on Sanity Growth. A Framer Pro site starts at $30 a month, plus the localization add-on and editor seats. Neither includes the work, which decides the total.

## What have we seen on client projects?

Our own move doesn't change what most clients need. In 101 client conversations from January to October 2026, platform choice came up in 46%, and Framer was named in 34 of them.

-   **Why teams pick Framer.** The marketing team can edit without a developer, hosting is included, and the editor feels like Figma. Those are exactly the things we gave up on our own site, which is why our stack isn't our default advice.
-   **The Framer watch-out we flag.** Framer's native components are server-rendered. Custom React code components are the risk: if one skips pre-rendering, Framer's help centre says ["The component's content won't be accessible to search engines."](https://www.framer.com/help/articles/how-to-fix-cannot-set-properties-of-undefined-optimization-error/) Google says ["not all bots can run JavaScript"](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics), so we keep important content out of code components.
-   **AI visibility is a newer ask.** It came up in 8% of conversations, mostly from August to October. A cybersecurity SaaS migrating five languages asked for "SEO and LLM optimisation"; its site had no structured data, and its per-language metadata needed generating, not typing by hand.
-   **Migrations start with the old CMS.** We've moved sites from Craft, Squarespace, WordPress, React and Webflow. We ask for CMS access or a full URL export, because it finds hidden pages and existing redirects that a crawl misses.

## Should you do the same?

Probably not, unless most of the conditions for moving are true for you.

**Stay on Framer or Webflow if:**

-   Your marketing team changes layouts, not just copy, and has no developer on call.
-   You need to launch in weeks rather than months.
-   JSON-LD in custom code and an uploaded llms.txt cover what you need for AI search.
-   The site fits the plan. Framer Pro includes 150 pages and 2,500 CMS items, and up to 700 pages and 40,000 items with add-ons.

**Move to a framework and a headless CMS if:**

-   Someone owns the code, in-house or a partner, and your team accepts that design changes go through a build and deploy.
-   Your content is structured and reused: case studies feeding several pages, two languages kept in sync, hundreds of pages.
-   You need code running on your side: your own form API, integrations, tools, Markdown versions for agents.
-   You want the HTML, the structured data and the code in your own repository.

A quick test: if you can't name one thing your builder stops you from doing, stay where you are. The general trade-offs are in [headless CMS vs website builder](https://agr.studio/blog/headless-cms-vs-website-builder).

To see what AI tools can read on your site today, before deciding anything, run it through our [AI visibility check](https://agr.studio/ai-check).

## FAQ

### Why did AGR Studio move its website from Framer to Astro?

We moved agr.studio to Astro, Sanity and Vercel on 16 October 2026 because we wanted structured content and full control of the code. The site has about 300 pages in English and Hebrew, and we wanted AI and agent features such as a Markdown version of every page, a JSON inquiry API and a live AI visibility check. We still build client sites on Framer and recommend it for most marketing sites.

### Is Astro better than Framer for SEO?

Not automatically. Framer delivers pre-rendered HTML and its native components are server-rendered; the gaps are content inside code components that skip pre-rendering, and overlays, which aren't in the HTML. Astro prerenders every page to static HTML by default and gives you control of every tag, which helps with structured data and multilingual setups. Rankings still depend more on content, links and a clean migration than on the platform.

### How much does it cost to run an Astro and Sanity website?

Astro is free under the MIT licence. As of October 2026, a commercial site on Vercel needs the Pro plan at $20 a month, because Hobby is for non-commercial personal use only. Sanity's Free plan is $0 with 10,000 documents and public-only datasets, and Growth is $15 per seat a month. The larger cost is developer time, because layout changes are code changes.

### Can Framer handle Hebrew and right-to-left websites?

Yes. We built Baladi, a bilingual Hebrew and English site, on Framer in three weeks, and our own Hebrew pages ran on Framer until October 2026. Framer's localization is a paid add-on, with up to 20 locales on its Basic and Pro plans as of October 2026. We moved for structured content and code control, not because Framer couldn't do Hebrew.

### How do you migrate from Framer without losing SEO?

Crawl every live page in every language, move the content with its exact titles and meta descriptions, and map every old URL to a new one with permanent redirects. Before switching DNS, compare titles, descriptions and canonicals on the old and new sites, and keep the Framer site connected so rollback is a DNS change. After the switch, submit the sitemap to Google Search Console and Bing Webmaster Tools.

### Do you need a developer to run an Astro and Sanity site?

For content, no: editors add posts, projects and copy in Sanity Studio and publish them themselves. For layout, yes: new sections, design changes and anything not modelled in the CMS live in code and go through a build and deploy. If your team changes layouts often and has no developer, a builder like Framer or Webflow is the better fit.

Blog

## Continue reading our latest blogs

[See all articles](https://agr.studio/blog)

-   ![Illustration: a shortlist of agencies, the reviewed ones ticked](https://cdn.sanity.io/images/coun0bog/production/e582c831242e586865b0fe3dc1232c51a6a654d1-2400x1800.jpg?w=1000&q=82&auto=format)
    
    Guides 11 min read
    
    ### 8 Best Astro Agencies for B2B Websites (2026)
    
    Read article
    
    → https://agr.studio/blog/best-astro-agencies-b2b-2026
    
-   ![Illustration: a shortlist of agencies, the reviewed ones ticked](https://cdn.sanity.io/images/coun0bog/production/da64ccc8781100392805d435b09b33ce25e848a1-2400x1800.jpg?w=1000&q=82&auto=format)
    
    Guides 10 min read
    
    ### 8 Best Next.js Agencies for B2B Websites (2026)
    
    Read article
    
    → https://agr.studio/blog/best-nextjs-agencies-b2b-2026
