ditto.site - Clone any website into clean code. Free & open source

byโ€ข
Point Ditto at any public URL and get a faithful copy as clean, componentized Next.js or Vite code, in minutes. It's fully deterministic, so it's fast, cheap, and consistent. Components, tokens, interactions & hover states included. Free REST API + MCP server, open source.

Add a comment

Replies

Best
Hey Product Hunt ๐Ÿ‘‹ We're the team behind ion.design, and today we're open-sourcing ditto.site. Ditto takes any website and gives you back a clean copy in Next.js or Vite. We extract actual components, sections, design tokens, and an editable content model. We even do our best to get hover states, focus states, dropdowns, accordions, declaritive motion, web fonts, SEO metadata, lottie animations, and responsive layout. Ditto is fully deterministic, so it is fast, cheap, and consistent. An AI-based approach can't deliver this. Why open source? We've been running a version of ditto inside ion.design since the start of the year and it's a bit too useful to keep to ourselves. ditto is an extremely valuable starting point for AI builders, because you can get a ready-to-go clone of a customer's website as soon as they sign up rather than a blank canvas. What you get: ๐Ÿงฉ Clean, componentized Next.js or Vite + TypeScript. Optional Tailwind styling. ๐ŸŽฏ Deterministic. no AI guesswork, byte-stable output. ๐Ÿ”Œ Free hosted REST API + MCP server, or self-host for best speed. ๐ŸŽจ Tokens, interactions, hover states, fonts, SEO preserved. ๐Ÿชช MIT licensed, fully open source. Try it: Star us: We're around all day! Give it a spin, tear it apart, tell us what you want, and use the hell out of it. We're all in this together, let's create user value. ๐Ÿ’š - The ion.design team

How can you defend the fact that the page was copied? I often see people then start to argue about who is copying whom.

ย We're a tool, i don't condone people stealing other people's stuff.

the main use case for ditto (which we use it for) is migration from locked website platforms. So a customer gets a clone of their own stuff they can port anywhere.

The interesting constraint with deterministic cloning is that it only sees the rendered DOM, so anything gated behind auth, scroll triggers or JS state never gets captured. Curious how you handle client-rendered sections that only appear after interaction.

Really cool though - congrats on the launch!

ย Yea JS is way harder, we didn't write a decompiler or anything. We are able to infer some stuff by capturing DOM diffs at different states (timing for intro animations, after clicks for menus/accordians)

we're just doing the max we can deterministically. in prod we run an agent on teh output of this to get even closer.

Back in the '90s, we used a program called Teleport to clone websites, and we were absolutely amazed by how powerful it was. Time really fliesโ€”and so do technologies.

But honestly, this is a brilliant idea. Now we can just send every client who says, "I want exactly the same thing, just with my own logo," straight to you. ๐Ÿ˜‚

ย Yeaaaa i have heart of teleport! Great name :)

ahahaha yea interesting use case. We typically do this for migrations from other website platforms but getting an inspired starting point works!

Can confirm this thing works amazing. Even nailed a complicated Lottie interaction and some complicated layouts.

ย Heck yes thank you Adam!!!

Congrats on open sourcing this! For a marketing site with a few dozen pages, does Ditto crawl and clone the whole site graph in one pass, or is it strictly one URL at a time and I'd need to loop it myself? That can change the real time/API cost of an actual migration job!

ย Yep we have a parameter for single page vs multi page clones.

in prod we start with single page so we can show the customer something fast, and do multipage in teh background.

for repeatsed patterns (cms blogs, products, etcc) we recognize that and just make one of those entries at random. Soon we have a CMS extractor coming too :)

ย That background multi-page flow makes sense for speed! On the repeated-pattern sampling, how does Ditto decide two pages share the same template rather than just look similar? curious if there's a confidence threshold, or if it can silently pick the wrong page as the template for the whole set.

ย we do it based on URL patterns (blog/*)

ย simpler than I expected! Makes sense as a starting point, curious to see how that evolves once the CMS extractor ships. Thanks for walking through all of this!

Tried Ditto on a few landing pages and the output was surprisingly clean. One thing that would make this indispensable for me is if it could also extract and map the original pageโ€™s Google Fonts or custom font stack into the generated project automatically. Having to manually re-add fonts after cloning breaks the flow a bit.

ย will look into this!

ย ah yea, it may have hit an edge case on font extraction. we'll look into it and make a PR

Would love a "rebrand swap" mode where I paste a palette and font choice and ditto restyles every component in the generated output, so I can skip the tedious find-and-replace pass after cloning a competitor's layout. Would be a killer add for solo builders migrating inspiration into their own brand.

ย Smart idea. ya try making this as a pr!

Seriously amazing that it can extract all sorts of states including hover + focus. We could only dream of such a thing a year ago! And it's open-source?! wild!!

ย hell ya thanks for the support Teddy!

the deterministic angle is the part that stands out to me, most "clone a site" tools I've tried lean on an AI guess and you get slightly different output every run. one thing I didn't see covered in the thread yet: if the source site gets updated after I've cloned it, is there a way to re-sync or diff against the new version, or is this meant to be a one-time snapshot you then own and diverge from?

ย Yea this is meant to be a one time snapshot to migrate customers to a new platform!

ย makes sense for the migration use case, that's honestly the more common job anyway. good to know the scope so I'm not expecting sync behavior that isn't there

ย appreciate! Enjoy using it!

123
โ€ขโ€ขโ€ข
Next
Last