No server
Every page, CMS items included, is an HTML file in dist/, styled before its scripts run, then hydrated in the browser. Links open the next page in the same document with React Router, and the layout template two pages share stays mounted.
Framer to code
Paste your Framer site's address and get a static Vite and React site in TypeScript: every page prerendered into dist/ at build time, React components with CSS modules, your CMS as JSON. Upload dist/ to any static host.
Pick Vite in the converter's framework menu. Free to convert.
What you get
src/routes.tsx lists the routes, and scripts/prerender.ts writes each page's HTML where a static host looks for its URL. The pages, components and styles are the same as in every other framework.
src/
routes/ Route modules: one index.tsx per URL, with its <PageHead>
routes.tsx Each URL pattern and its module, loaded on demand
root.tsx Each page in its layout template, the 404 page
main.tsx The browser's entry: hydrates the prerendered page
entry-server.tsx A page's HTML at build time
views/ Pages, each with its .module.css
layouts/ Layout templates: navigation and footer
components/ Components, in the design project's folders
cms/ CMS collections: <collection>.ts + <collection>.json
lib/deframer/ The small kit that replaces Framer's runtime
scripts/
prerender.ts Every page into dist/: about.html for /about, 404.html
public/ _redirects, robots.txt, sitemap.xml, assets kept in the project
index.html The document every page is written into
vercel.json Vercel: clean URLs and the site's redirects
vite.config.ts
scripts/prerender.tssrc/routes/**/index.tsxpublic/_redirects, vercel.jsonsrc/site/forms.tsRun and deploy
A Vite site is its dist/ folder: upload it to any static host, such as Netlify, Cloudflare Pages, Vercel, GitHub Pages or an S3 bucket behind a CDN. Nothing runs on a server, and production needs no Node.js.
npm installInstalls Vite 8, React Router 8, React 19, motion and the packages the site's own code uses.
npm run devRuns vite: edit a view in src/views and the page updates.
npm run buildBuilds with Vite and prerenders every page into dist/, on Node.js 22.18 or later; npm run preview serves dist/ as a static host does.
Only in Vite
Every page, CMS items included, is an HTML file in dist/, styled before its scripts run, then hydrated in the browser. Links open the next page in the same document with React Router, and the layout template two pages share stays mounted.
The site's redirects come as public/_redirects for Netlify and Cloudflare Pages and vercel.json for Vercel, and, for hosts with neither such as GitHub Pages, as a page at each old URL that sends the browser on.
The same in every framework
Next.js, TanStack Start, Astro, React Router and Vite projects share everything below. Only the routes, the document, the server and the build differ.
Pages, layout templates and design components are React components in src/views, src/layouts and src/components, each with its CSS module. Components keep the designer's folders, variants and hover states.
Colour styles become CSS variables in src/styles, shared text styles become classes, and every font family gets its @font-face rules.
Each Framer CMS collection becomes a schema (src/cms/<collection>.ts) and its records as JSON (src/cms/<collection>.json).
Native Framer forms post to the project's own API route, with a rate limit, a honeypot and field checks, and deliver submissions to webhooks you set in environment variables. A Vite site, which has no server, posts them to a form service.
Animations and interactions run on motion, the open-source animation library. No Framer runtime: a small, readable kit in src/lib/deframer replaces it.
Every page keeps its title, description and social image. The site's redirects, robots.txt and sitemap.xml come with it, and a README lists every route.
Limits
Plain facts before you convert.
FAQ
Limits, files and verification are in the main FAQ, credits on the pricing page.
Yes. Deframer converts a published Framer site into a static Vite and React site written in TypeScript, which you download as a .zip and own: npm run build prerenders every page into dist/, with the same animations, interactions and CMS content, and any static host serves it.
Anywhere that serves static files: Netlify, Cloudflare Pages, Vercel, GitHub Pages or an S3 bucket behind a CDN. Each page is an HTML file at its URL (about.html for /about); Netlify, Cloudflare Pages and GitHub Pages serve it at /about, and the project's vercel.json turns that on for Vercel.
Each native form posts its fields to a form service, such as Formspree or Basin, whose URL you set in VITE_FORM_ENDPOINT (or a form's own variable) when you build. On Netlify, set it to netlify and Netlify Forms receives them.
Redirects come as public/_redirects (Netlify, Cloudflare Pages), vercel.json (Vercel) and a redirect page at each old URL for hosts with neither. A split test needs a server to pick each visitor's variant, so the static site ships the tested page's original version.
Converting is free. Downloading the code is for your own site, or one whose owner allows it: verify the site for a 1-credit download, or confirm you own it or have permission and download for 10 credits. See pricing.
Get started