How to import a live website into Figma as editable layers

Three steps, about a minute. Works on production, staging, localhost and pages behind a login.

To import a website into Figma, save the page as a self-contained file — in Chrome or Edge, File → Save Page As → Webpage, Single File gives you one .mhtml with every asset embedded — then run the html2figma plugin in Figma and drop that file on it. The page is rebuilt as native frames, real text, Auto Layout, components and variables. Because you save the page from your own browser, this works on staging, localhost and anything behind a login.

The workflow: a live page in your browser is saved as a self-contained file, the file is dropped on the html2figma plugin, and the page arrives in Figma as editable layers. Live page in your browser Saved file .mhtml, .html or .zip html2figma drop it in Figma real layers The save step is what makes login-walled, staging and localhost pages work.

Step 1 — save the page as a self-contained file

A web page isn't one file. It's markup plus stylesheets plus fonts plus images, scattered across paths and CDNs. "Saving" it means collapsing all of that into something that still renders on its own. Two formats do this properly.

Option A — a single .mhtml file

In Chrome or Edge: File → Save Page As… → Webpage, Single File. You get one .mhtml (or .mht) with the HTML, the CSS and every image packed inside it. This is the least fiddly option and the one to reach for first.

Option B — a .zip of a complete save

Save as Webpage, Complete instead. You get an .html file plus a folder of assets beside it. Zip the two together and drop the .zip on the plugin. It is unpacked in-plugin and every relative reference resolves — including URLs inside linked stylesheets and @imported CSS, which resolve against the stylesheet rather than the page.

Avoid

Saving a bare .html on its own. A lone HTML file has no folder to resolve against, so every relative src and url() in it points at nothing. The page imports with its structure intact and its images missing. If you only have a bare .html, that's fine — just expect to place images by hand.

Pages behind a login, on staging, or on localhost

This is where a file-based workflow quietly wins. Your browser is already authenticated, already on the VPN, already pointed at localhost:3000. Whatever you can see, you can save — and whatever you can save, you can import. No tool needs network access to your private environment.

Step 2 — drop the file on the plugin

In any Figma file, run html2figma and drag the saved file onto the drop zone. If you'd rather not deal with files at all, the plugin also takes pasted markup: a whole page, or a fragment with its <style> block.

The plugin renders the page in a real browser engine, reads each element's final geometry and computed style, and rebuilds that as Figma nodes. It never re-interprets your CSS, which is why flex, grid, floats and absolute positioning all survive — the browser already did the layout, and the plugin just copies the answer.

Step 3 — pick your viewports

Tick any combination of Desktop, Laptop, Tablet and Mobile and each is rendered and imported separately, side by side on the canvas. Media queries genuinely apply per viewport, so a flex row that stacks on mobile arrives as a vertical Auto Layout frame there and a horizontal one on desktop. One import, the full responsive set.

What arrives in Figma

Where it gets awkward

Three things account for most disappointing imports. All three are fixable before you convert.

CSS that is generated at runtime

The plugin deliberately never executes the page's JavaScript. That keeps pasted or downloaded markup from running inside the plugin, and it means the layout is read statically. The cost: a page whose styles are produced by a script at load time — the Tailwind CDN build is the common one — imports unstyled. The plugin warns you before it happens. The fix is to save the page from the browser after it has rendered, which bakes the computed styles into the save, or to use a build with compiled CSS.

Lazy-loaded images and content

Anything that hasn't loaded when you hit save isn't in the file. Scroll the whole page to the bottom first, let the images populate, then save.

Fonts

Fonts map to the closest font installed in Figma, with Inter as the fallback. If the brand face matters, install it in Figma before importing rather than fixing text layers afterwards.

What people actually use this for

Importing a website into Figma: common questions

Can I just paste a URL into html2figma?

Not yet — the plugin is file-based. Save the page first, then drop the file.

Does this work on a page that requires a login?

Yes — it is the main advantage of a file-based workflow. Your browser is already signed in, so whatever you can see, you can save and import. The same applies to VPN-only staging and localhost.

Why did my page import with no styling?

Almost always because the page generates its CSS at runtime with JavaScript — the Tailwind CDN build being the usual culprit. The plugin never executes page JavaScript, so those rules never exist. Save the page from your browser after it has rendered, or use a build with compiled CSS.

Why are my images missing?

You most likely saved a bare .html with no asset folder, so its relative paths resolve to nothing. Use Webpage, Single File for an .mhtml with assets embedded, or zip the complete save with its folder.

Is the imported page editable, or just a picture?

Fully editable. Text is real text, frames are real frames with fills and effects, inline SVG becomes vectors, and uniform stacks become Auto Layout. Nothing is flattened.

Can I import desktop and mobile in one go?

Yes. Tick several viewports and each is rendered separately, side by side on the canvas, with media queries applied per viewport.

Does my page get uploaded anywhere?

No. The conversion runs inside the plugin on your machine. Images referenced by absolute URL are still fetched from where they live, and the plugin sends anonymous usage counts — never page content — which you can switch off.

How large a page can it handle?

There is no fixed limit and no import quota. Very large pages make very large layer trees, so importing a long page in sections is often easier to work with than one enormous frame.

html2figma is a free Figma plugin that converts HTML and CSS into editable Figma layers. If you use this workflow, let me know what breaks. The failure cases are what I fix first.

[email protected]