You found a tool that downloads websites, pointed it at a site, and opened the copy. The menu is there, maybe the footer, and the rest of the page is empty. Or every link goes nowhere. If the site was built with React, Next.js, Vue, Svelte or one of the newer site builders, that's the expected result with most website downloaders, and it isn't your fault.
This guide explains what is going on and how to get a copy that works.
Why JavaScript sites come out blank
A traditional website sends your browser a finished page: all the text is in the HTML. A downloader saves that HTML, rewrites the links, and the copy works.
Many modern sites send something closer to an empty frame plus a bundle of JavaScript. Your browser runs the script, which builds the page and then fetches more code and data as you click around. Tools that save only what the server sent, like wget or HTTrack, get the empty frame. HTTrack's own FAQ warns that "intensive Java/Javascript sites" may come out "bogus/incomplete".
Even when the first page looks fine, there is a second trap. Many framework sites do send real HTML for the first view, then "hydrate" it, meaning the JavaScript takes over the page and loads more pieces as it goes. If those pieces weren't saved, the script fails and can wipe the page it was meant to enhance.
Option 1: Save a single page from your browser
For one page, your browser is enough. In Safari, choose File > Save As and pick Web Archive; in Chrome, File > Save Page As and Webpage, Complete. You get the page as it looked after the JavaScript ran. It's one page at a time and links won't lead anywhere, but for keeping a single article it's quick and free.
Option 2: Use a downloader's browser mode
Some downloaders can load each page in a hidden browser before saving it. SiteSucker, for example, has an optional "web views" mode that does this (SiteSucker manual). That handles pages that are fully built once they load. Whether client-side navigation keeps working afterwards depends on the site, so test it on the pages you care about.
Option 3: Record everything the page loads (Oxid SiteMirror)
Oxid SiteMirror is a Mac app built for this case. For each page it:
- Opens the page in a real Chromium engine (your installed Chrome, Edge, Brave or Chromium, or a separate copy it downloads).
- Records every response the page loads while it loads, scrolls and hydrates: scripts, data, fonts, images.
- Saves the rendered page as well as those responses.
It also notices pages that look complete but are about to hydrate, and renders those in the browser rather than saving the bare HTML.
You then open the copy one of two ways:
- Live Mirror serves the copy from your Mac to your own browser. The site's JavaScript runs against the recorded responses, so client-side links and menus can keep working.
- Static Snapshot writes the rendered pages to a folder you can open from Finder or host anywhere. Scripts that would rebuild an already-built page are left out, so the content stays put.
In our own test of 55 real websites (the start page plus up to 12 linked pages each), the Live Mirror passed on 38, was partly complete on 12 and failed on 4, and one site's robots.txt blocked the capture. Framework sites such as react.dev, Linear, Vercel, the Tailwind docs and svelte.dev came out matching the live pages; nextjs.org and vuejs.org were only partly complete, and angular.dev failed in the Live Mirror. So try it on the site you need before relying on it.
What still won't work offline
No offline copy can do what needs a live server: a search box that queries an API, a checkout, a login form, or anything personalised per visitor. A list that loads more items as you scroll will contain what was loaded during the capture. Pages that change on every load, embedded third-party video and very heavy sites can come out incomplete. SiteMirror respects robots.txt by default, so a site that blocks crawlers captures nothing, and it doesn't get past paywalls, CAPTCHAs or bot detection. A good copy keeps what you saw and what you clicked through, not the server behind it.
Step by step in SiteMirror
- Download Oxid SiteMirror (macOS 14 or later).
- Choose New Capture (⌘N), paste the address, and leave JavaScript sites on Automatic.
- Pick the scope: the whole site, one section, or a page and the pages it links to.
- When it finishes, click Open in Browser for the Live Mirror, or Show Files for the plain-files copy.
JavaScript rendering is part of the $19 licence. The free plan captures plain HTTP only (no JavaScript rendering), up to 500 pages per capture, so you can try the app on an ordinary site first, but it won't show you how a JavaScript site comes out.
As with any of these tools, copy only sites you own or have permission to copy.