How to copy a website (and what "a copy" actually means)
Six real ways to copy a website, what each one keeps and drops, and how to check your copy survives once the original server is gone.
Everyone who searches for this wants one of six different things, and the method that works for one of them fails badly for the others. So before the how: decide which copy you actually need.
- A readable offline snapshot — the page as you saw it, openable on a plane.
- A visual reference — the layout, type scale and spacing, to learn from.
- An editable page — the design in your CMS so you can replace the words.
- A code starting point — markup and styles a developer or coding agent can work from.
- A whole site — every page, as a browsable local mirror.
- A legal-hold record — proof of what a page said on a given day.
Then the uncomfortable part: there is no method that copies "the website". A website is a server, a database, business logic, third-party APIs and a session belonging to whoever is logged in. What you can copy is the thing your browser rendered — the DOM, the computed styles, the fonts and images it downloaded, the canvas pixels it painted. Everything else was never yours to take, and anyone promising otherwise is selling you a screenshot.
The one test that separates a copy from a bookmark
Kill the original.
Almost every "copy" you can make in five seconds is really a set of pointers back to somebody else's server. It looks perfect while you are online and while that server still likes you, and it decays the moment either changes: hotlink protection turns your logos into broken icons, a signed CDN URL expires, an image proxy starts returning 403, the site redesigns and your "archive" silently updates to the new artwork.
So the only honest test is to disconnect the copy from the source and look at it again. That is exactly how we score our own work: every copy in our benchmark is rendered with the original server unreachable and then diffed pixel-by-pixel against the live page. On eight sites over three runs the averages come out as CopyAnySite 98.87%, SingleFile 87.93%, wget -p -k 87.40%, monolith 83.44% — and, more tellingly, monolith and wget leave 365 and 554 requests still aimed at the original site, while ours leaves 4.
Whatever tool you pick, run that test on your own copy. It takes a minute and it is the difference between an archive and a promise.
Method 1 — Ctrl+S ("Webpage, Complete")
Chrome's own save. Free, instant, and mostly fine for a text-heavy article.
What it keeps: the initial HTML, most stylesheets, images the page had already loaded, and a _files folder next to the HTML.
What it drops: anything the page built after load (which on a modern marketing site is most of it), fonts and assets behind CORS rules, srcset variants other than the one it fetched, and every scroll-triggered animation's end state. You also get two objects instead of one file, so it emails and archives badly.
Use it when: the page is an article and you need it in five seconds.
Method 2 — Print to PDF
Underrated for the "legal-hold record" job. It is flat, portable, timestamped by your OS, readable in a decade, and impossible to argue with.
It is also not a website: no links behave, no layout survives at another width, and CSS @media print rules routinely delete half the page before it reaches the PDF. Check what you got rather than assuming.
Method 3 — A single-file browser extension
Extensions that serialise the rendered page into one HTML file (SingleFile is the well-known free one) are a genuine step up from Ctrl+S because they read the page after JavaScript has run and inline the assets as data URIs. One file, no folder, no server.
Where they struggle is the modern visual layer. In our benchmark SingleFile scores 99.84% on a simple agency site and 99.99% on a Wikipedia article — effectively perfect — but 74.64% on a commercial WordPress theme demo, 81.41% on a page built out of SVG filters and 65.55% on stripe.com. Those are the pages where fidelity is decided by webfont loading order, pseudo-elements, masks and layered gradients rather than by markup.
Use it when: you want a free, one-file snapshot of a mostly static page.
Method 4 — wget or HTTrack (the whole-site mirror)
The classic answer, and still the right one for one job: crawling many pages of a server-rendered site.
wget --mirror --page-requisites --convert-links --adjust-extension \
--span-hosts --domains=example.com,cdn.example.com https://example.com/
Both wget and HTTrack fetch the HTML the server sends, not the page your browser builds. On anything React-, Vue- or Astro-hydrated you get a shell. In our runs wget lands 99.24% on a simple site and 96.88% on the Tailwind docs but 66% on a theme demo and 56.86% on stripe.com, and it leaves hundreds of requests pointing back at the origin unless you get the flag soup exactly right.
Use it when: you need many pages of an old-school site and you are comfortable in a terminal.
Method 5 — A screenshot-to-code AI
Paste a URL or an image, get generated markup. This is a genuinely useful category — for inspiration. It looks at pixels and writes plausible code, which means it invents: your spacing is "about right", your font is a Google Font that resembles the real one, your gradient is a guess, and your content is regenerated rather than copied. For a moodboard, great. For "the client wants this page, exactly", it is a rewrite with extra steps.
Method 6 — Read the rendered DOM (what CopyAnySite does)
The path we took, because it is the only one that starts from the truth: the page your browser has already rendered, after JavaScript, after fonts, after animations settle.
The capture walks the live DOM and records the computed style of every element and every pseudo-element, the fonts actually used, SVG symbol sprites, canvas pixels, video posters, the document's quirks mode, the real body width — then downloads and embeds every asset the page referenced, including CSS backgrounds, masks and border-images. Two candidates come out of it: a rebuilt page and a verbatim copy of the settled DOM. The verbatim one is only shipped if it re-renders itself in an isolated frame and proves zero geometry or style drift; otherwise the rebuild wins.
That is why the offline scores hold up on the hard pages — 98.39% on the theme demo, 98.71% on the SVG-filter page, 95.99% on stripe.com — and why the copy is one self-contained file you can email.
The trade is size. Embedding everything means a heavy page stays heavy: our stripe.com copy is 50 MB. A copy that fits in an email but renders wrong is not a smaller copy, it is a different page.
Which method for which job
| You want | Use | Watch out for |
|---|---|---|
| An article, in five seconds | Ctrl+S | JS-built sections missing |
| A record for a dispute | Print to PDF | @media print deleting content |
| A free one-file snapshot | SingleFile | Fonts and effects on design-led pages |
| A local mirror of many pages | wget --mirror, HTTrack | Client-rendered sites; leftover remote links |
| Design inspiration | Screenshot-to-code AI | Everything is a plausible invention |
| A pixel-faithful copy you can edit | CopyAnySite | File size on media-heavy pages |
How to check your copy properly
- Open the copy with the network off, or after blocking the original host in your
hostsfile. Anything that disappears was never in your copy. - Open dev tools on the copy and look for requests to the original domain. Zero is the target.
- Compare at two widths. Fidelity bugs hide at 390px.
- Check the fonts. Right-click a heading, Inspect, Computed,
font-family: if you see a fallback, your copy has different text metrics from the original and every line wraps differently. - Scroll to the bottom before you judge. Lazy-loaded images and scroll-triggered animations are where most copies fall apart.
Is this legal?
Copying a page for reference, offline reading, testing, migration of your own site, or a legal record is normal and routine. Republishing someone else's content or design as your own is not: their HTML, CSS, images, fonts and words are copyrighted, and their trademarks stay theirs. Fonts are the trap people miss — a licence that covers a foundry's webfont on their domain does not cover it on yours.
We wrote the long version of this, including the practical "how to use a copy legitimately" checklist, in is it legal to copy a website.
FAQ
What is the fastest way to copy a website?
Ctrl+S with "Webpage, Complete" is the fastest and needs nothing installed, but it saves a folder plus an HTML file and misses anything the page built with JavaScript. For a one-file copy that survives the original going offline, use a rendered-DOM capture extension instead.
Can I copy a website that requires a login?
You can copy the pages you can already see while logged in, because the capture reads what your browser rendered. You cannot copy the account system itself, other users' data, or anything the server never sent you. Never publish a copy containing personal data.
How do I copy a website into WordPress?
Capture the page, then export it as Gutenberg section blocks rather than pasting HTML: you get editable blocks with the extracted CSS enqueued as a stylesheet, so the layout survives and the text stays editable. The step-by-step is in convert a website to WordPress.
Why do the fonts and logos break in my copy?
Because most tools reference them instead of carrying them. Fonts are frequently CORS-restricted, logos often live in a hidden SVG sprite sheet or a CSS background, and both are commonly served from a CDN with hotlink protection — so the copy looks right online and breaks offline. The fix is embedding the bytes, which is what a capture that reads the rendered page can do.
Does copying a website copy its database or backend?
No. Nothing that runs on a server can be copied from the browser. You get the rendered page — markup, styles, assets, media — not the CMS, the API or the data behind it.
Try it on the page you are looking at
CopyAnySite is a Chrome extension: open any page you can reach, press capture, and take away a standalone HTML file, an editable WordPress page, or a kit a coding agent can build from. The free key needs no card.
Download CopyAnySite