0
100
200
300
400
500
600
700
800
900
1000
1100
1200
1300
1400
1500
1600
1700
1800
1900
2000
2100
2200
2300
2400
2500
2600
2700
2800
2900
3000
3100
3200
3300
3400
3500
3600
3700
3800
3900
4000
4100
4200
4300
4400
4500
4600
4700
4800
4900
5000
5100
5200
5300
5400
5500
5600
5700
5800
5900
6000
6100
6200
6300
6400
6500
6600
6700
6800
6900
7000
7100
7200
7300
7400
7500
7600
7700
7800
7900
8000
8100
8200
8300
8400
8500
8600
8700
8800
8900
9000
9100
9200
9300
9400
9500
9600
9700
9800
9900
10000
10100
10200
10300
10400
10500
10600
10700
10800
10900
11000
11100
11200
11300
11400
11500
11600
11700
11800
11900
12000
12100
12200
12300
12400
12500
12600
12700
12800
12900
13000
13100
13200
13300
13400
13500
13600
13700
13800
13900
14000
14100
14200
14300
14400
14500
14600
14700
14800
14900
15000
15100
15200
15300
15400
15500
15600
15700
15800
15900
16000
16100
16200
16300
16400
16500
16600
16700
16800
16900
17000
17100
17200
17300
17400
17500
17600
17700
17800
17900
18000
18100
18200
18300
18400
18500
18600
18700
18800
18900
19000
19100
19200
19300
19400
19500
19600
19700
19800
19900

Your Framer site is slow. Here's what's actually causing it.

Your Framer site is slow. Here's what's actually causing it.

Your Framer site loads like it's on dial-up

You compressed the images. You uploaded WebP. Lighthouse still hates you.

Good news: the problem is almost never the thing people tell you to fix.

I audit Framer sites every week. The same five things come up every time, and none of them are image sizes.

The blur problem

Blur values above 10 kill performance. Most designers don't know this because it looks fine on their M-series Mac. Open the same site on a client's 2019 Intel laptop or a mid-range Android and it stutters like a slideshow.

Glassmorphism heroes are the worst offender. A blur of 40 on a 1600px wide frame with anything animating behind it will drop a 60fps animation to 24fps on mid-range hardware.

The fix is ugly but it works. Wrap the blurred element in a frame, export it as a PNG at 2x or 3x, drop it back in. You keep the look. You lose the frame drops.

Rule of thumb: if a blur value needs to go above 10, it's not a blur anymore, it's an image. Treat it like one.

Appear vs Scroll animations in the fold

Appear effects load before JavaScript. Scroll Animation effects don't.

If you're using Scroll Animations for anything above the fold, your LCP tanks. The browser has to download, parse, and execute JavaScript before your hero text shows up. That's 800ms to 1.2s of your visitor staring at blank space on a 3G connection.

The rule:

  • Appear effects for anything in the first viewport

  • Scroll Animation for everything below the fold

I've done this swap on client sites and watched LCP drop from 3.1s to 1.6s with zero other changes. Free performance.

Third-party scripts are quietly destroying your site

HubSpot form. Intercom widget. Spline embed. Google Tag Manager. Hotjar. Every one of them adds weight. A site with four of these loading on every page is carrying 800KB of JavaScript before your own content shows up.

The fix isn't ripping them out. It's loading them where they belong.

Site Settings → Code is for scripts that need to run on every page. Analytics, GTM, cookie banners. That's it.

Page Settings → Code (on each individual page) is for scripts that only one page needs. A HubSpot form on /contact. A Calendly embed on /book. A Stripe script on /pricing.

Most Framer sites I audit have everything dumped into Site Settings. The HubSpot script is loading on the homepage, the blog, the 404, the about page. It's only used on one page. That's 200KB of wasted weight on every single page load.

Then there's the script type:

  • async loads in parallel, executes as soon as it arrives. Use this for scripts that need to run fast.

  • defer loads in parallel, waits for the page to finish parsing before executing. Use this for scripts that aren't urgent.

  • Neither blocks the page while it loads. Never use this. It will tank your LCP.

Framer's built-in script embed gives you the placement (end of <head> or end of <body>). Put non-critical scripts at the end of <body>. Put scripts that need to modify the head (structured data, meta tags) at the end of <head>.

Quick audit: open Site Settings → Code right now. For each custom script, ask: "Does every page need this?" If no, move it to the page that actually uses it. I've seen this one change drop LCP by 600ms.

Videos are not optimized by Framer

This one catches everyone. Framer fetches your video. It doesn't optimize it. A 50MB hero video is a 50MB hero video.

You have three options.

Option 1: YouTube or Vimeo embed. They adapt quality to network speed and screen size. Mobile user on 4G gets a 480p version. Desktop on fiber gets 1080p. You do nothing. Downside: the player is theirs, the branding is theirs, and mobile autoplay is limited.

Option 2: Bunny.net. This is what I use when a client needs high quality video without the YouTube look. Upload to Bunny Stream, get a clean embed URL, drop it into Framer. Bunny transcodes the video into multiple resolutions automatically and serves the right one based on the viewer's connection and screen. You keep full control of the player, no third-party branding, and the CDN is fast everywhere. Works out of the box with Framer's video component or a standard HTML5 video tag in an embed. For a 4K hero video or a product demo that needs to look sharp, this is the right call.

Option 3: self-host directly in Framer. Under 5MB. Muted. Looped. No controls. No autoplay on mobile. Any of those missing and you're shipping a 20MB file to someone on a train tunnel connection. Only do this for short decorative loops.

A client had a 1-minute hero video at 42MB self-hosted. Moved it to Bunny. LCP went from 4.2s to 1.8s. Same video. Higher quality on desktop. Zero design changes.

Rule: short decorative loop under 5MB, self-host. Anything longer or higher quality, Bunny. Anything where you don't care about the player, Vimeo or YouTube.

The code component crash nobody explains

Open your published site. You see "We detected a problem in one of your code components/overrides." Your dev tools show nothing useful. You stare at the override you wrote in ChatGPT last week.

It's almost always one thing. A useEffect returning something that isn't a function.

Broken:

useEffect(() => counterRef.current++, [someState])

The arrow function with no curly braces returns the result of the expression. In this case, a number. React expects either nothing or a cleanup function. It gets a number. It crashes.

Fixed:

useEffect(() => {
  counterRef.current++
}, [someState])

Curly braces. Now the function returns undefined, which is what React wants.

If your component pulls from window, document, or navigator, wrap those calls in a useEffect too. Framer server-side renders your pages and those APIs don't exist on the server. Access them on mount, not during render.

The 10-minute audit

Go do this right now.

  1. Open Menu → Site Settings → Versions. Is the latest version marked Optimized? If not, republish.

  2. Search your canvas for any blur above 10. Export as PNG. Replace.

  3. Check your hero section. Is anything using Scroll Animation? Swap to Appear.

  4. Audit Site Settings → Code. Any script that only one page needs? Move it to Page Settings.

  5. Check every self-hosted video. Over 5MB? Move to Bunny or Vimeo.

Five checks. Ten minutes. Usually worth 20-30 Lighthouse points.

When none of this works

Most "Framer is slow" takes are wrong. Framer isn't slow. Sites get built slow.

If you've done everything above and your site is still dragging, the problem is deeper. Usually architecture. Too many CMS collection queries on one page. Overrides fighting each other. Custom fonts loading before Framer's own CSS. That's the stuff you can't fix in ten minutes.

That's what I do.

Work with me →

New to Framer? Get 3 months free on the Pro plan when you sign up yearly with my referral link: framer.link/framerexpert

Frequently Asked Questions

Most Framer projects move from discovery to launch within 2 to 4 weeks. This includes high-fidelity design, interactive prototyping, and final development. Timelines vary based on the complexity of custom animations and CMS requirements.

Yes. While Framer is a powerful no-code tool, I often implement custom React components and overrides to achieve specific functionality or complex data integrations that aren't available out of the box.

Once the project is finalized and approved, I transfer the Framer project directly to your account. I provide a recorded walkthrough of the CMS and site settings so your team can manage content with zero friction.

Absolutely. I offer monthly retainers for high-growth brands that need continuous updates, new landing pages, and ongoing performance optimisation. Priority availability, ongoing Framer support, and a dedicated expert in your corner.

Frequently Asked Questions

Most Framer projects move from discovery to launch within 2 to 4 weeks. This includes high-fidelity design, interactive prototyping, and final development. Timelines vary based on the complexity of custom animations and CMS requirements.

Yes. While Framer is a powerful no-code tool, I often implement custom React components and overrides to achieve specific functionality or complex data integrations that aren't available out of the box.

Once the project is finalized and approved, I transfer the Framer project directly to your account. I provide a recorded walkthrough of the CMS and site settings so your team can manage content with zero friction.

Absolutely. I offer monthly retainers for high-growth brands that need continuous updates, new landing pages, and ongoing performance optimisation. Priority availability, ongoing Framer support, and a dedicated expert in your corner.

subscribe for more

0
100
200
300
400
500
600
700
800
900
1000
1100
1200
1300
1400
1500
1600
1700
1800
1900
2000
2100
2200
2300
2400
2500
2600
2700
2800
2900
3000
3100
3200
3300
3400
3500
3600
3700
3800
3900
4000
4100
4200
4300
4400
4500
4600
4700
4800
4900
5000
5100
5200
5300
5400
5500
5600
5700
5800
5900
6000
6100
6200
6300
6400
6500
6600
6700
6800
6900
7000
7100
7200
7300
7400
7500
7600
7700
7800
7900
8000
8100
8200
8300
8400
8500
8600
8700
8800
8900
9000
9100
9200
9300
9400
9500
9600
9700
9800
9900
10000
10100
10200
10300
10400
10500
10600
10700
10800
10900
11000
11100
11200
11300
11400
11500
11600
11700
11800
11900
12000
12100
12200
12300
12400
12500
12600
12700
12800
12900
13000
13100
13200
13300
13400
13500
13600
13700
13800
13900
14000
14100
14200
14300
14400
14500
14600
14700
14800
14900
15000
15100
15200
15300
15400
15500
15600
15700
15800
15900
16000
16100
16200
16300
16400
16500
16600
16700
16800
16900
17000
17100
17200
17300
17400
17500
17600
17700
17800
17900
18000
18100
18200
18300
18400
18500
18600
18700
18800
18900
19000
19100
19200
19300
19400
19500
19600
19700
19800
19900

Get in Touch

© 2026 Portfolio

Get in Touch

© 2026 Portfolio