What “Save page as” actually saves
Chrome's Webpage, Complete writes the current DOM to an .html file and a _files folder with the resources it has already loaded. That last clause is the whole problem. A Framer page at the moment you press Ctrl+S has not loaded the images below the fold (they are lazy), has not fetched the srcset variants for widths you have not viewed, has not imported the modules an animation would pull in on scroll, and still references fonts through url() inside CSS that the save may or may not rewrite. Open the result and you get the header, a few images, and a lot of empty rectangles.
View Source is worse for a different reason: it is the initial HTML before hydration, which on Framer is a skeleton plus <script type="module"> tags. The page assembles itself in the browser. Copying the source copies the instructions to fetch the page, not the page.
Source: Google Chrome Help — Download a page · MDN — Lazy loading · MDN — <img>: srcset and sizes
Five ways to copy a site, against the things a Framer page needs
| Ctrl+S / View Source | wget --mirror / HTTrack | Capture (LayerPort) | |
|---|---|---|---|
| Rendered DOM, not the initial skeleton | Ctrl+S yes, View Source no | No -- fetches HTML as served | Yes -- the painted page |
| ES modules imported at runtime | Only what had loaded | No -- import() is not a link | Yes -- graph walked to closure, ≤1,500 modules |
| Every srcset / lazy image variant | Only what had loaded | srcset partly; lazy never triggers | Yes -- every referenced variant |
| Fonts referenced from CSS url() | Sometimes | With -p, usually | Yes, and rewritten |
| Three breakpoints | The one you were viewing | All markup, untested | Reviewed at desktop, tablet, phone |
| Editable, versioned, resyncable | No | No | Yes |
| Authorization required | No | No | Yes -- a recorded per-site confirmation |
The wget everybody pastes
wget --mirror --page-requisites --convert-links \
--adjust-extension --no-parent --span-hosts \
--domains=example.com,framerusercontent.com \
https://example.com/Source: HTTrack — FAQ
What defeats the mirror tools
A published Framer page is a React application that hydrates. Its behaviour lives in ES modules under framerusercontent.com/modules/… and framer.com/m/…, which import further modules -- the appear effect imports the motion library, the motion library imports helpers -- and some of those imports are import() calls decided at runtime. HTTrack's own FAQ is candid about this: it lists “intensive Java/Javascript sites” among the cases it cannot yet handle, and says they “might be bogus/incomplete”. wget does not run JavaScript at all. So they mirror the entry points and miss the graph.
The second trap is breakpoints. Framer renders every breakpoint's layout into the DOM and hides all but one with media queries listed in <script id="__framer__breakpoints">. A mirror gets that markup but has never *seen* the tablet layout, so a broken tablet image goes unnoticed until a client opens it on an iPad. A capture that reviews at three widths finds it on day one.
LayerPort's capture starts from the rendered page, walks the module graph until every import resolves locally, pulls every image variant and font, and rewrites references across HTML, CSS, JS, MJS, JSON, SVG, XML, TXT and web manifests. Then a portability check reads the result and refuses anything that would only resolve on the machine that made it. Where a reference could not be resolved, the manifest says so.
Three numbers from the capture pipeline
- 3 layouts a Framer page carries -- desktop, tablet, phone -- reviewed on every capture
- 1500 module ceiling per site when closing the import graph; a marketing site uses a fraction
- 9 text formats searched for references and rewritten to local paths
The four-minute test for any copy
Serve it, do not open it
Double-clicking
index.htmlloads it fromfile://, where ES modules and fonts are blocked by the browser regardless of whether the copy is good. Runpython3 -m http.server 8080in the folder and open it over HTTP.Go offline and hard-reload
DevTools → Network → throttle Offline → Cmd/Ctrl+Shift+R. A real copy renders completely. A saved page shows the shape of the failure: which images, which fonts, which animations.
Look for foreign hosts
Back online, filter the Network panel with
-domain:127.0.0.1. Every remaining row is a dependency on someone else's server. Analytics you added deliberately are fine;framerusercontent.comis not.Resize to three widths
1280, 1024, 390. Framer's tablet layout is the one nobody checks. Open the phone menu.
Source: Chrome DevTools — Network reference · MDN — Cross-Origin Resource Sharing
Whose site is it?
The question no mirroring tool asks
Confirming authorization records what you told us — that the site is yours or that you have permission. It is not, and could not be, a determination of legal copyright ownership: no technical signal settles that question, so we do not claim to have settled it.