How a developer should review a converted Framer project

Review a Framer site converted to TypeScript in order. Build, types, notices, dependencies, third-party code, forms, SEO files and visual checks.

Published
Reading time
6 min
Deframer cover: “Review it like inherited code.” Beside it, four tiles, Build, Types, Notices and Visuals, with Types selected
On this page13 sections

Review a converted Framer project the way you'd review any inherited codebase, with one difference: you have the live site to compare against. Start with a clean install and a production build, then check types, read the conversion notices, audit dependencies and third-party scripts, configure and test forms, check the SEO files, and finally compare every route at three widths against the published site. Expect a readable React and TypeScript project, close to the original but not guaranteed to be identical.

This guide assumes the project came from Deframer, which converts a published Framer site to Next.js (the default), TanStack Start, Astro, React Router or Vite. Deframer is an independent tool and is not affiliated with, endorsed or sponsored by Framer. It's meant for sites you own or have permission to convert.

What should you expect to find?

Knowing what's normal makes the review faster. A converted project has:

  • One route per URL, with that page's metadata. In Next.js, src/app/**/page.tsx files are short and render a view from src/views.
  • React components with CSS modules in src/components, in the designer's folders, with readable variant names.
  • Colour styles as CSS variables in src/styles/tokens.ts, text styles as classes, @font-face rules per family.
  • CMS collections as a schema and JSON records in src/cms.
  • The site's own code components and overrides in src/code, marketplace components as source in src/vendor.
  • A small kit in src/lib/deframer that replaces Framer's runtime. There is no Framer runtime in the project.
  • A README with every route and a "Where to edit" table.

The folder-by-folder tour is in what you get in a converted Next.js project.

Step 1: Baseline commit, clean install, production build

Commit the download untouched so every later change is a diff. Then:

sh
npm install
npm run build

Use the Node.js version the project needs: 20.9 or later for Next.js 16, 22.18 or later for TanStack Start, Astro and the Vite build, 22.22 or later for React Router 8. A failed build at this point is information, not a verdict; common conversion issues lists the usual causes.

Dependencies are pinned to exact versions in package.json. Keep them pinned for the review so you're testing what was generated, and update later on a branch of its own.

Step 2: Types

Run the type checker directly:

sh
npx tsc --noEmit

If the site has code components written in Framer, next.config.ts keeps typescript: { ignoreBuildErrors: true } with a comment explaining why. Framer's editor never type-checked that code, so errors in src/code and src/vendor are expected. Record the count, then decide whether to fix them before launch or tighten gradually; code components and overrides in Next.js describes both paths. A project without code components builds with the type check on.

Step 3: Read the conversion notices

The result page lists notices: assets that couldn't be downloaded, components that render only in the browser, redirects that weren't carried over. Ask whoever converted the site for them; they belong in the handoff note. Each one points at a file or a URL. Turn each into an issue or an explicit "accepted".

Step 4: Dependencies and vendored code

Read package.json. Expect the framework, react, react-dom, motion and whatever npm packages the site's own code imported. Then:

sh
npm ls --depth=0
npm audit

src/vendor holds code the site loaded from outside the project, copied in so nothing is fetched at runtime. Review it as third-party code: know what each module is, and note its source if it has a license header. Anything your team wouldn't have chosen is a candidate for replacement later, not a blocker now.

Step 5: Third-party scripts and custom code

Framer's site-level Custom Code (head and body) is carried into the root layout, so analytics tags, chat widgets, consent tools and pixels keep running. Find them in src/app/layout.tsx (or the framework's equivalent document) and list each one with its owner. Questions to settle:

The Deframer verification tag is stripped from the project, so you won't find it here.

Step 6: Forms

Every native Framer form becomes an API route (in Next.js, src/app/api/forms/<form>/route.ts) that delegates to src/lib/forms.ts, which applies a rate limit, a honeypot and field checks, then delivers to a webhook. Copy .env.example to .env.local, set FORMS_WEBHOOK_URL or the per-form variable, and send a real submission. Without a webhook, submissions are only logged by the server. A Vite project has no server, so its forms post to the form service in VITE_FORM_ENDPOINT, or to Netlify Forms. Migrating Framer forms covers delivery and spam.

Step 7: URLs, redirects and SEO files

Check how URLs behave before anything else touches routing:

  • src/proxy.ts gives each page the URL form the site publishes (with or without a trailing slash) and redirects the other with a 308. Redirects from the published site are in next.config.ts.
  • public/robots.txt and public/sitemap.xml are copies of what the site published. They name the current domain.
  • The root layout's metadataBase is the published URL. Change it when the domain changes.

Try a handful of URLs with curl -I against the production build: the home page, a CMS detail page, a URL with and without a trailing slash, an old redirected URL and a missing page, which should return 404.

Step 8: Visual comparison

Open every route in the README's routes table at about 1440, 768 and 390 pixels wide, next to the live site. Breakpoints are separate layouts per variant, so a page can be right on desktop and off on phone. If live previews are on, the compare view does this side by side; otherwise run the project locally. For anything you'll maintain, automate it: visual regression tests with Playwright shows how to use the live site as the baseline. Known causes of differences are in fixing layout differences.

Step 9: Performance and accessibility, once

Run a Lighthouse or PageSpeed Insights pass on the production build. Note that next.config.ts sets images: { unoptimized: true }, so images are served as they are; that's a deliberate starting point, and performance tuning covers what to change. Run an automated accessibility check too, using the accessibility audit as a guide. Record the numbers so later changes can be compared.

A review template

Paste this into the review issue and fill it in.

Area

Check

Result

Build

npm run build passes on the right Node.js

Types

npx tsc --noEmit error count, ignoreBuildErrors status

Notices

Each resolved or accepted

Dependencies

npm audit, vendored code listed

Scripts

Each third-party script has an owner and a decision

Forms

Test submission delivered

URLs

Trailing slashes, redirects, 404 behave

SEO files

robots, sitemap, metadataBase plan for the new domain

Visuals

Every route at 1440, 768, 390

Baselines

Lighthouse and accessibility numbers recorded

What not to do in the review

  • Don't refactor while reviewing. Renaming folders or converting CSS modules to another approach mixes judgement calls with findings. Do it later, on its own branch.
  • Don't remove the kit. src/lib/deframer plays animations, variants, breakpoints and routing for the generated code. You can change it, but read what imports it first.
  • Don't upgrade everything at once. Update dependencies in a separate pull request, after the baseline works.

FAQ

How long does a review take?

It depends on the number of routes and how much custom code the site had. The steps that grow with the site are the visual comparison and the code components; the rest is roughly fixed.

Is the generated code meant to be edited by hand?

Yes. Props and variants keep human names, CSS classes are named after layers, files are formatted and unused code is removed. It's a normal project you own.

Why is image optimization turned off?

The converted site serves images the way the published site did, so the first build matches the original. Turning on your framework's image optimization is a separate decision with its own trade-offs.

Should we fix every type error before launch?

Not necessarily. Errors in code components were already there in Framer. Many teams launch with ignoreBuildErrors on and fix types file by file afterwards, with tsc --noEmit in CI to stop new errors.

What if the site isn't ours?

Then get the owner's permission first. Downloading the code requires verification by whoever can publish the site, or an explicit confirmation of ownership or permission.

Keep reading

All posts
  • Deframer cover: “Hand it over as real code.” Beside it, a list of Published site, Git repo, Handoff note and Developers with Handoff note selected

    Workflow6 min read

    How to hand off a Framer site to developers

    Hand off a Framer site to developers as a real codebase. What to convert, what to write down, which decisions to make first and what developers check.

  • Deframer cover: “Static files, on Pages.” Beside it, four tiles, Convert, Pages, Redirects and Forms, with Pages selected

    Cloudflare6 min read

    How to host a Framer site on Cloudflare Pages

    Host a Framer site on Cloudflare Pages: convert it to a static Vite site, build into dist/, deploy from Git or Wrangler, keep redirects and move the domain.