Any webpage, rebuilt as native Figma layers.
UnHTML converts a page into real frames, text, images, vectors, and true auto-layout, mapped from its actual CSS. Not a flattened screenshot. Drop in a file and edit everything the moment it lands.
UnHTML (unhtml.pro) is a Figma plugin that converts a webpage into native, editable Figma layers: frames, text, images, vectors, and auto-layout mapped from the page's own CSS. It takes a self-contained .html file, a Safari .webarchive, or a scene.json captured by its open-source CLI, and it runs offline by default. It is for designers who need to edit an existing site in Figma instead of tracing a screenshot. The free plugin imports up to 500 layers per page. Pro is $39 one-time per editor with no layer cap, plus components and text styles. Studio is $119 one-time for five editors. Updated
From file to editable canvas in three moves.
No account, no upload step. The plugin renders and measures your page in its own UI, then writes native layers straight onto the canvas.
Drop a file
A self-contained .html, a Safari .webarchive, or a scene.json. It stages as a chip so you can confirm exactly what is loaded.
Set viewport & options
Choose Desktop 1440, Mobile 390, or type a custom width. Toggle auto-layout conversion and, if you need it, opt in to remote fetching.
Get layers + a report
Real editable layers land on your canvas, with an honest report of every font substituted, frame reverted to absolute, and image skipped.
Drop it straight into the plugin
Drag a self-contained file onto the drop zone. The plugin renders it in a real browser context, measures every node, and builds the layers. No CLI, no setup beyond the plugin itself.
Capture with the CLI or bookmarklet
For live sites, remote assets, or JS-built pages, a real headless browser fetches everything with no CORS limits and full-page scroll, then you drop the scene.json.
Built for editing, not just for looking.
Every layer maps to something you can actually change in Figma. When a mapping cannot be reproduced, the plugin degrades on purpose and tells you why.
Real auto-layout
Spacing, padding, wrap, and stretch, mapped from the page's real CSS. A frame that can't reproduce the captured geometry falls back to absolute on its own, so the result is never worse than a pixel-faithful import.
Editable text
Family, weight, size, and color per run, with letter-spacing, line-height, transform, alignment, and decoration, all kept as live text.
Vectors & image fills
SVG becomes native Figma vectors, WebP and AVIF transcode to PNG, background photos become image fills behind their content, and gradients map across.
Fonts substituted, logged
Fonts you don't have are swapped — Inter by default, configurable — and every swap is listed in the report, so nothing changes silently.
Honest report
What was substituted, which frames reverted to absolute, which images were skipped — laid out after every run. A node budget guards against runaway dumps.
Re-rendered DOM
Pages built by JavaScript are re-rendered with scripts on inside a sandboxed frame. Opt-in, because that step needs the network.
Real components PRO
Repetition becomes real components with instances and variants — edit the main and every instance follows. Occurrences that would shift position stay plain frames, so nothing drifts.
Shared text styles PRO
Recurring type becomes shared Figma text styles — change one and every text using it updates, each named by role and size.
By default, nothing leaves your machine.
Zero network requests with default settings. Self-contained files and web archives carry their own assets, so the import needs nothing from the outside.
Markup is sanitized before it renders: scripts, inline event handlers, and javascript: URLs are stripped.
Remote fetching is opt-in. JS-rendered pages run only in a sandboxed frame, and only when you turn it on deliberately.
One-time pricing. No subscription.
The free plugin is the whole importer, auto-layout included. Pro lifts the 500-layer cap and structures what it imports — repeated elements become components, repeated type becomes shared text styles. Pay once; nothing renews.
- Drop HTML, .webarchive or scene.json
- Auto-layout from real CSS flex & grid
- Up to 500 layers per import
- Open-source capture CLI & bookmarklet
- Personal use, community support
- Everything in Free
- Unlimited layers per import — no 500 cap
- Long, dense pages in one pass
- Repeated elements become real components
- Repeated type becomes shared text styles
- Desktop, Mobile & custom viewports
- Import reports & font-substitution log
- Commercial use, one year of updates
- Everything in Pro
- Up to 5 editors
- Priority support
- One year of updates
Launch pricing, and it may change. A purchase you have already made stays at the price you paid.
Straight answers.
What UnHTML does, what it does not, and where its limits are, stated plainly.
.html file or a Safari .webarchive, since both carry their own images, styles, and fonts. For live sites behind the network, remote stylesheets, or pages built by JavaScript, use the CLI or bookmarklet to capture a scene.json, then drop that into the plugin.Stop screenshotting. Start editing.
Bring any page into Figma as layers you can actually work with, and keep it all on your machine while you do.