Common Framer to Next.js conversion issues and how to fix them

Framer to Next.js conversion issues and their fixes: verification, oversized sites, Deframer's notices, build errors and hydration warnings.

Published
Updated
Reading time
6 min
Deframer cover: “Hit a snag? Here’s the fix.” Beside it, a list of Verification, Build errors, Hydration and After deploy with Build errors selected
On this page8 sections

Most problems when converting a Framer site to Next.js with Deframer fall into five groups: the site can't be read (it isn't a published Framer site), the conversion doesn't fit (too large or too slow, usually fixed by turning "Include assets locally" off), the result page lists notices that need a follow-up in the code, the download stays locked (your verification code isn't on the live page), or the Next.js App Router project shows build errors or hydration warnings on your machine. This guide goes through each one, what it means and what to do.

Deframer is an independent tool and isn't affiliated with Framer; everything below concerns the converted project, not your Framer account, which Deframer never touches.

Before the conversion starts

"Not a published Framer site"

Deframer checks the page for Framer's generator tag or its site bundle. If neither is there, there is nothing to convert. Check:

  1. You pasted the published address, what visitors open (yoursite.framer.website, yoursite.framer.app or your custom domain), not the editor link (framer.com/projects/…).
  2. The site is actually published. Open the address in a private browser window and confirm it loads.

Rate limits and queueing

You can start up to 5 conversions per 10 minutes, with up to 2 running at once. When the service is busy, your conversion waits in line and shows its place. The limits section of the FAQ lists the current defaults.

During the conversion

The site is too large, or the conversion took too long

A conversion can run for up to 10 minutes and produce a project of up to 1 GB. Image- and video-heavy sites with "Include assets locally" turned on are the usual cause of hitting either limit, because every asset and every responsive variant is downloaded into public/.

What to do:

  1. Retry with "Include assets locally" off. Assets stay on Framer's CDN, the download is smaller and the conversion faster. See CDN vs. local assets for the trade-offs.
  2. Don't worry about credits. Converting is free, so a conversion that fails or is interrupted costs nothing.

Notices on the result page

The result page lists notices about the conversion. They aren't failures; they tell you where to look. The common ones:

Notice

What it means

What to do

Files that couldn't be downloaded

The site imports these files, but they didn't download

An asset that fails stays remote. Check the code that uses them in the preview, or with npm run dev

Components that render only in the browser

They need the browser to load or render, so they appear after the page loads

Expected for browser-only code. Check they appear, and that layout doesn't jump

Packages upgraded to support React 19

A package needing React 18 was moved to the closest version that accepts React 19

Test the components that use it

Components built for React 18 that may not render

They bundle parts of React 18 that React 19 doesn't accept

Check them in the preview, or with npm run dev; replace any that don't show up

A redirect wasn't carried over

A redirect from the site's settings isn't in the project

Add it to redirects() in next.config.ts

Page metadata that couldn't be computed

A page's title, description or social image couldn't be worked out

Set metadata in that page's route file before you publish

Framer features replaced by placeholders

A feature the project doesn't implement yet is a placeholder that only renders its content

Rebuild that behavior in code, or accept the simpler version

Packages not found on npm

No npm release matches, so npm install may fail

Pick a published version in package.json

Imports that couldn't be resolved

The import is left as written and may fail to build

Fix the import path or remove the import

Downloads from other sites were blocked

The converter only downloads from the site, Framer and package CDNs

Add anything you need from other hosts yourself

For a missing redirect, Next.js 16 expects this shape in next.config.ts:

ts
async redirects() {
  return [{ source: "/old-work", destination: "/projects", permanent: true }];
},

If the project already has a redirects() list, add the entry to it rather than declaring a second one. SEO when moving off Framer covers redirects and metadata in more detail.

Before you download

The verification code isn't found

Converting doesn't need it, but the download stays locked until your code is on the live page, and no credit is used until it's found. Work through these in order:

  1. Copy the whole tag: <meta name="deframer-verification" content="dfv_…">, with all 24 characters after dfv_.
  2. Paste it in Site Settings → Custom Code, at the end of the <head> (the body works too).
  3. Publish. Saving in the editor isn't enough; the code has to be on the published page.
  4. Click Check again. If you just published, give it a moment and try again.

The code is checked before each new project is downloaded, so if someone removed it, further downloads of that site's projects stop until it's back. Verifying Framer site ownership covers checking the right domain, agencies and removing the tag afterwards.

Build errors

npm install fails

  1. Check Node.js. Next.js 16 needs Node.js 20.9 or later: node -v.
  2. Look for "Packages not found on npm" in the notices, and set a published version in package.json.
  3. Delete node_modules and try again with a clean install.

npm run build fails on types

If the site has Framer code components, next.config.ts sets typescript: { ignoreBuildErrors: true }, with a comment explaining why: that code was written in Framer's editor, which never type-checks it. Those projects build even when npx tsc --noEmit reports errors.

A project without code components builds with Next's type check on, so errors you introduce while editing will stop the build. Read the first error, fix it, and rebuild. Code components and overrides in Next.js explains how to tighten types gradually.

"Module not found"

Usually the same file as an "Imports that couldn't be resolved" notice. Open the file in the error, correct or remove the import, and rebuild. Code a site imports from other URLs is copied into src/vendor/, so look there before reinstalling anything.

Hydration warnings

A hydration warning means the HTML rendered on the server differs from what React rendered first in the browser. The converted project already handles the most common causes: browser-only components load after hydration (via next/dynamic, overrides via the kit's lazyOverride), and <html> and <body> accept attributes the site's own scripts may add before hydration.

If you still see one:

  1. Rule out browser extensions. Reproduce in a private window with extensions off.
  2. Compare dev and production. Run npm run build && npm run start; some warnings appear only in development.
  3. Find the component named in the warning, and look for values that differ between server and browser during render: dates, random numbers, window or localStorage.
  4. Move browser-only values into an effect, or load the component only in the browser from a client component:
tsx
"use client";
import dynamic from "next/dynamic";

const Clock = dynamic(() => import("@/components/clock"), { ssr: false });

Here @/components/clock stands in for your own component.

After you deploy

  • Social images or canonical URLs point at the old domain. Update metadataBase in the root layout to your production domain.
  • robots.txt and sitemap.xml show the old domain. They're copied as published; edit them in public/.
  • Forms don't arrive. By default submissions are only logged. Set FORMS_WEBHOOK_URL or the form's own variable on your host, not just in .env.local.

FAQ

Do I lose a credit if a conversion fails?

No. Converting is free, so a conversion that fails or is interrupted costs nothing. A credit is used only when you first download a converted project.

Why does my converted site need "Include assets locally" off?

It doesn't always. Turning it off only helps when a site is too large or too slow to convert with every asset downloaded; assets then keep loading from Framer's CDN.

Are notices errors?

No. Notices point to parts of the project worth checking or finishing by hand. Some need no action; others, like a missing redirect or uncomputed metadata, are quick edits.

Why does a component appear a moment after the page loads?

It needs the browser to load or render, so it's loaded after hydration instead of being rendered on the server. The result page lists these under "Components that render only in the browser".

Keep reading

All posts
  • Deframer cover: “To Next.js, step by step.” Beside it, a list of Framer, Next.js, TypeScript and Deploy anywhere with Next.js selected

    Migration6 min read

    How to export a Framer site to Next.js

    Export a Framer site to Next.js step by step: convert, compare, verify ownership and download an App Router TypeScript project, then check it.

  • Deframer cover: “Growing fast? Time to move?” Beside it, four tiles, Team skills, Backend, Content and Cost, with Backend selected

    Strategy5 min read

    Framer vs. Next.js for growing sites

    Framer vs. Next.js for a growing site: when to stay and when to move, judged on team skills, backend needs, content workflow and cost.