Show HN: Convert any website into a React component

chromewebstore.google.com

326 points by alexdanilowicz 8 days ago

Hey HN, we built a Chrome Extension (https://www.magicpatterns.com/extension) that converts a snippet of any website to an isolated React component.

Demo video: https://youtu.be/hutUYDkyE_A

How it works: 1) Iterate through each node in the selected DOM tree, 2) For each element, find any matching CSS selectors / inline styles, 3) Use window.getComputedStyle to get the deterministic values, 4) Construct JSX

It was pretty hard producing the minimal code necessary while maintaining the same visual look. To do this, we implemented things like abstracting out global styles, removing inherited styles, pulling out SVGs, deleting styles with no effect, and condensing styles into their shorthand properties.

We dive into each of those optimizations here for fun: https://www.magicpatterns.com/blog/any-website-to-react-comp...

One of the main reasons we cared so much about condensing down the styles was not only to make it more human-readable, but also to reduce context length for an LLM, so that you can iterate on it with AI. Our extension has a “convert” option that lets you convert the output to Tailwind, Shadcn, or Chakra UI using an LLM. You can also export to Figma.

We're frontend engineers and we built the extension because our core product (https://www.magicpatterns.com/) helps software teams prototype their product ideas. And a huge pain point for users is getting their existing designs into our product, so that they can reference them to generate UIs with their existing aesthetic.

The extension allows you to get existing design context from any website, even localhost. Since launch, the extension has more than 3,000 users and interestingly is most popular in Japan.

Here's some real examples if you're curious what the final output looks like:

A) Hacker News Navbar - https://www.magicpatterns.com/ac9f38e4-5ef0-49e5-8b80-dbc429...

B) ChatGPT Welcome Screen - https://www.magicpatterns.com/7cb3ad12-cb12-4a5b-b32b-eda04d...

C) Cal.com Calendar Component — https://www.magicpatterns.com/a43bac78-134d-458d-8107-811ac7...

D) Stripe.com logo section - https://www.magicpatterns.com/deff1793-7a05-42fe-97f7-945976...

If you have an opinion about the extension, we’re all ears! You can try it for free at: https://www.magicpatterns.com/extension

chis 8 days ago

Your actual product is really slick. Even just with some basic tests I can see that it produces designs with a much higher degree of polish than regular LLM models, and with much more of a design bent. I'll definitely use this for some prototyping this week!

I wonder what changes you've made from standard LLMS to get here? I could imagine trying to put things on guard rails, giving it some components to build off, or just fine tuning based on a really nice corpus of good websites (maybe generated with this tool).

  • alexdanilowicz 8 days ago

    thank you - we're a team of 2 and former full-time frontend engineers so that means a lot to us! You're spot on with the guard rails: we do a lot of post-processing, i.e., after LLM spits something out, we parse the AST, strip out hallucinated imports, add imports that are missing. And yes! We also do a bit of pre-processing (expanding the prompt, feeding relevant examples via a RAG-based approach).

    It feels like everyone is building in the AI space these days, but I gotta say: it's quite fun tweaking it. The non-deterministic nature is simultaneously the worst and best thing.

    • sky2224 7 days ago

      > The non-deterministic nature is simultaneously the worst and best thing.

      This is what always has me asking, "How can you trust it?" with usage of LLMs for some pretty complex tasks, so I gotta know, what kinds of tricks have you employed to identify hallucinations from good output? How do you separate valid output (valid meaning it works but isn't necessarily what's desired) from desired output?

      Additionally, how do you identify the most performant ways of doing things? Have you found that you've recreated portions of websites more efficiently than the real sites you're mimicking?

      • alexdanilowicz 7 days ago

        The nice thing about building a design tool is correct output is defined as “did it render.” We do things like strip out hallucinated imports and parse the ast for errors to help with that.

        “Did it output what I desired?” - we have the classic AI app stuff like thumbs up/down, and many features we’ve built are an attempt to make that answer be a solid yes. For example, we have a “referencing” feature (if you are within a “project” - our version of an infinite canvas) that lets you reference existing designs when doing a prompt for a brand new design. This helps the LLM keep the output consistent.

        Regarding performance: you can download the raw HTML so I suppose that is more performant than a version that loads all the JS, hah. But our product focus is more on the design rather than the generated code, as we’ve seen with our customers that engineers will almost always touch it up.

        To answer your last question: when users are “finished” and it’s deployed (and they share it with me), people don’t really mimic portions of websites. By they time they're done, it’s fully their own, they’ve iterated on it so much. What the imported from the extension ended up being just a base to get the LLM in the right initial context.

nicce 8 days ago

I am going to be that person, but how is the copyright for the output of tools like this? Since not all websites include license on their site, yet their looks are replicated, this might be even less clear than with LLMs in general.

  • ysavir 8 days ago

    Judging by the opening post, the intention seems to be to use this on your own IP (hence them pointing out you can use it on localhost) to easily translate existing production material into Figma or similar tools where designers can then iterate on it, without having to replicate the existing interface pixel-for-pixel beforehand. So it's probably a very grey area to use this on other sites, but that's not the suggestion being made.

  • mrieck 7 days ago

    I am the maker of SnipCSS. https://www.snipcss.com

    Just like with other tools such as yt-dlp, the user is required to use it responsibly. As long as you don't copy text/images/svg, the only issue is going to be "trade dress" infringement since CSS styles are not copyrightable. (not a lawyer so this isn't legal advice)

    Strange that this post made it to HN because I'm also releasing a Tailwind conversion this week. https://x.com/SnipCSS/status/1853586090164420639 I believe mine will be much better based on the blog post about this tool.

    • nicce 7 days ago

      > . As long as you don't copy text/images/svg, the only issue is going to be "trade dress" infringement since CSS styles are not copyrightable. (not a lawyer so this isn't legal advice)

      I am not lawyer as well, but this is highly unlikely true.

      It is like saying that C syntax is not copyrightable so I can took their code. What matters is the end result; what did you do with it? And particularly, is monetary gain involved? If you use tools like this to replicate innovative design, and you don't have permission to use it, it is much more complicated. Especially, if you use that in commercial setting.

  • spmurrayzzz 8 days ago

    IANAL but my guess that the output seems likely to be considered a "derivative work" (referring to US law in this case). So you'd need prior authorization from the copyright holder in the absence of a license.

    "Only the owner of copyright in a work has the right to prepare, or to authorize someone else to create, an adaptation of that work. The owner of a copyright is generally the author or someone who has obtained the exclusive rights from the author... The unauthorized adaptation of a work may constitute copyright infringement." [1]

    Some of the examples they give in the referenced document above are pretty close to what this tool outputs. e.g. "A new version of an existing computer program", "A revision of a website", "A drawing based on a photograph", etc

    [1] https://www.copyright.gov/circs/circ14.pdf

  • ibejoeb 7 days ago

    I did almost exactly this job for a company recently. As far as I know, this is what killed the rollout.

  • demarq 8 days ago

    Not sure what would be the difference between this and an “open source airtable/notion” etc

    • szundi 8 days ago

      The people at these open source alternative projects at least type in their version of the copycat designs/whatevers, not using a machine to style-by-style convert it to a component for them keeping everything that can be kept.

    • nicce 8 days ago

      This is completely different case, since extension probably reads content of the copyrighted website with a specific branding and tries to make similar looking version. If you use it, what are the limits of copyright laws for that output?

  • abstractspoon 8 days ago

    Interesting that the author of this extension has not commented on your question...

    • alexdanilowicz 8 days ago

      thanks for the callout — was taking me a second to respond because I wasn't 100% sure. It's a good question. I was actually trying to get the phone with a copyright lawyer to give an accurate answer. I believe (not a legal advice) it depends on the given website's terms of service. There's usually a "fair use" clause. Of course, if you do use the extension and you're reading this: don't use their own trademarks (like logos!) on your own site! Use our convert button and edit it to make it fully your own.

      There are many extensions that grab designs from any website (this is not new tech) - what's different about ours is that we convert it to a React component for the purpose of then editing it with AI to make it your own.

      I'll note it's against our Acceptable Use Policy to use it for impersonation / inauthentic behavior: https://www.magicpatterns.com/docs/documentation/legal/accep...

      • KronisLV 7 days ago

        Props for actually looking into it and giving an answer!

rriley 8 days ago

This is a very useful browser extension. Really love the fact that you are even able to convert the styles to TailwindCSS. Very clever.

  • alexdanilowicz 8 days ago

    thank you! Given Tailwind's conciseness, it's interesting seeing how "LLM-friendly" it is. Less tokens needed to style more!

    But if you want to start with an existing design: first deterministically grabbing the styles via our extension helps a lot to get that initial prompt for the AI to even do the conversion in the first place

rahimnathwani 7 days ago

Although the tool isn't designed for this, it's a nice way to get a clean, printable HTML copy of a section on a page. For example, the Claude web UI doesn't allow you to print a whole chat transcript. It only prints what's visible on the screen.

With this tool, you can select a point between two chat bubbles, and this will select the whole transcript.

I built a simple Chrome extension to do something similar, but my output isn't as high fidelity: https://news.ycombinator.com/item?id=42043881

  • alexdanilowicz 7 days ago

    Hearing about use cases that the extension wasn't designed for is always fun: thanks for sharing and cool extension! They aren't easy to build! We use Plasmo.

TheRealPomax 8 days ago

Next step: turn it into a web native custom element instead, and then trivially have a React version of that too by making a component that just correctly wraps the custom element.

robertlagrant 8 days ago

I'm not sure if I did it wrong, but going to the Hacker News bar and looking at the font of the Hacker News logo, it's different.

Original is: Verdana, Geneva, sans-serif

Yours is: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"

It looks cool, but I don't see why that sort of thing would happen?

sech8420 7 days ago

This is absolutely fantastic. I love it. Works great on about 80% of the website elements I've tried across about 10 websites now.

I tried it on our site, and was able to completely replicate some of our most esteemed components.

A few sites wont allow the selection. I activate the select mode then hover over elements, and it won't pick up on anything. Not that is has me wondering how I could have our own site prevent people from copying it as well.

Great work. I will be a long time user of this.

  • alexdanilowicz 7 days ago

    > I activate the select mode then hover over elements, and it won't pick up on anything.

    Did you have these pages (the tab itself) open before you installed the extension? Try refreshing the page and seeing if that works, so that Chrome knows the extension is now available on that page.

    If that doesn't fix it, I would love to know what sites don't allow selection at all, I actually haven't seen that before: alex [at] magicpatterns.com

    And finally, thanks for the kind words!! Here to help if you need anything.

    • sech8420 7 days ago

      I tried again, and still no luck after full refreshes and what not!

      I will shoot you an email with the one site I was having trouble with.

      But the reliability so far today has been more than I'd be happy with.

hipadev23 7 days ago

This is cool. I hate that frotnend development is such a shitshow these days this sort of tooling is necessary. I miss the days of view-source and single style.css.

  • alexdanilowicz 7 days ago

    The fun thing about working on this extension is that it reminds me that everything you see still just boils down to HTML + CSS at the end of the day. Despite all the modern frontend tooling we have: it's all the same in the browser!

urbandw311er 8 days ago

I like how people are putting “magic” in inverted quotes. You know, just so it’s not confused with real magic.

  • alexdanilowicz 8 days ago

    > Any sufficiently advanced technology is indistinguishable from magic.

    - Arthur C. Clarke

    (one of my favorite quotes!)

ape4 8 days ago

Somehow it seems roundabout to use computed styles (which aren't human friendly) then to use an LLM to convert that back into something human friendly. Maybe that's the only reasonable way.

  • alexdanilowicz 8 days ago

    Totally agree with you it feels roundabout. The really challenging part was converting the computed styles to output that is as human-friendly as possible. And what's interesting these days: human-friendly means LLM-friendly...

    We do a few optimizations to make it as human-friendly as possible. Details in the blog post linked above, but to summarize:

    1. We abstract global styles — don't want to include boxSizing: 'border-box' on every div! 2. Remove inherited styles — no need to have styles that are already inherited from the parent. 3. Pull out SVGs — lots of icons on the internet, which can just be their own imports. 4. Condense padding, margin, border to their shorthand properties

bkyan 8 days ago

On the pricing page, there is a highlighted bullet point for "Private generations" under the Pro tier. How does that differ from the other tiers?

santa_boy 7 days ago

Yet to try but is there a way to support vanilla JS? Most of my nowadays are pure HTML/JS/CSS (using Alpine mostly)

  • alexdanilowicz 7 days ago

    If you don't use the "convert" feature, you can download the pure HTML directly by clicking on the three dots in the menu bar, on the right side. (No JS though, because we handle the interactivity / state management in React, and candidly haven't found a good way to convert the React to HTML.)

wordpad25 7 days ago

Would this work on my own Framer pages so I can finally host them myself?

  • alexdanilowicz 7 days ago

    When every website on the internet is your possible input set, there are some bugs, but it should work on most framer sites. That said, the extension is WAY BETTER at smaller components (sections of a given site) versus the entire site. The entire webpage is often just far too big.

skylovescoffee 7 days ago

Nice job! Are there any plans to make it compatible with Firefox?

  • alexdanilowicz 7 days ago

    We used Plasmo to build the extension, so I think should be easy to publish it to the Firefox Add-ons store too. To be honest, no one has ever asked this before! Will look into it!

frays 7 days ago

Very useful way to get the HTML and CSS for a website!

instagary 8 days ago

Great demo video, will try this out!

  • alexdanilowicz 7 days ago

    Hey thanks that means a lot, the last time I posted a Show HN (year+ ago now), someone also commented that they liked the demo video for that project! It's far from perfect, but I think a key is explaining what, who, why and aiming to keep it under 2 mins.

javed6542 7 days ago

should help in generating data for LLM training

davedx 7 days ago

Can I use this on Figma designs I need to implement for work? ;)

superb_dev 8 days ago

Oh cool, theft as a service!

  • alexdanilowicz 8 days ago

    so interestingly, one of the most popular URLs imported from the extension is actually localhost:3000, meaning people use it to import their own design context and iterate on it.

    It pains me that people jump to the worst use case (copying). This is why we push the conversion/editing so hard, so that folks make it their own. Clearly we still need to do a better job of that.

    • itronitron 8 days ago

      If someone runs this on localhost to try it out, is any of the generated output sent to your system?

      >> "Generations that aren't private may be featured in our public, community catalog"

      • rasso 8 days ago

        That would also interest me

      • teddarific 8 days ago

        hey! other co-founder here — yeah, it does go through our backend systems for processing. We also store it in our db so people can iterate on it further in our web app. At the moment, no designs created via our extension are actually featured in our public catalog, but we do also support a private option for those folks who need private designs!

  • Zopieux 8 days ago

    There are already 34 companies using this tool to create high quality login form clones for phishing purposes.

  • CM30 7 days ago

    Feels more like a potentially useful testing tool for folks planning to convert their site to an SPA or something.

    If I wanted to say, convert my CMS driven site to a React SPA, this could let me get mockup versions of the components there to slot in while the rest is being developed, and preview how it'd all fit together.

  • recursive 7 days ago

    Is a camera a theft-accessory device? A tape recorder? Do you think this has any legitimate uses? Where do you personally draw the line? Should we ban things that can be used in bad faith?

  • itronitron 8 days ago

    Think of it more as a feature that provides accessibility to people that either don't have the ability, the time, or that simply can't be bothered to work it out themselves.

mushufasa 8 days ago

How does this compare to cursor composer?

  • alexdanilowicz 8 days ago

    Hey, cursor composer (an IDE that lets you pair-program with AI)is awesome! I use it myself. Our extension is very different: its use case is for getting design context from any website, and then feeding that into our AI design tool - Magic Patterns - as existing "context."

    In the first step, no AI is involved: we deterministically grab the styles on the webpage and then construct that into JSX. Then, you can optionally "convert" that JSX to use the component library of your choice using our AI + or update it using our chat editor to make it your own. For example, prompting: "make it green" (even if the existing HTML you grabbed is purple.)