1. Cross-Origin (CORS) Protection: Browsers block a page from reading another domain's response via fetch(). To bypass this for research or archiving:
- We route requests through public CORS relays (AllOrigins / CorsProxy / CodeTabs) — fine for testing, not for anything sensitive.
- Or run your own proxy / Cloudflare Worker (use "Custom Proxy" above).
- Or package this tool inside a browser extension with host permissions.
2. File System Access API: On Chromium browsers, "Save to Local Folder" prompts you to pick a directory and writes the folder tree (/css, /images, /fonts, /js) directly, no backend needed.
3. JSZip Fallback: On Safari/Firefox (no directory picker), the whole site is bundled into a .zip.
4. Fonts & background images: when "Fetch CSS, Fonts & BG Images" is on, downloaded stylesheets are scanned for url(...) references and those files are pulled too, then the CSS is rewritten to point at the local copies.
5. Self-Contained File: bakes images, fonts and CSS as base64 data URIs directly into the HTML, so the single index.html works with no supporting files at all.
6. Low-RAM Streaming Mode: normally every downloaded file is kept in memory until you export. On a large site that can use a lot of RAM. Streaming mode instead asks for a save folder before the scrape starts, then writes each file to disk the moment it finishes downloading and immediately frees it from memory — logging progress in small batches ("Flushed 6 files, 2.3 MB") — so memory use stays flat rather than growing with the site. Downloads are also throttled slightly between batches so the disk isn't hit with a flood of writes at once. Because files are cleared from memory as they go, ZIP export, Self-Contained inlining, and Sandbox Preview (which all need every file held at once) aren't available for that run — the folder on disk is the deliverable.