A ZIP is a moving box: the recipient has to unpack it, find the entry file, and hope their mail provider didn't strip it. A hosted link is the room already set up. When a multi-file build should travel as a link instead of an attachment.
Some builds are more than one file. A page with its stylesheet, its scripts, a folder of images, a couple of data files it loads — the natural way to move all of that at once is to zip it and attach the ZIP to an email. It's tidy, it's one click, and everything's in there. The instinct makes sense.
The trouble is what happens on the other end. A ZIP is a moving box: everything's packed, labeled, sealed — and completely unusable until someone unpacks it. When the box contains files the reader wants as files, that's fine; unpacking is expected. But when the box contains a build meant to be looked at, unpacking is a chore you've handed the one person you were trying to make things easy for. And the chore has three ways to go wrong.
ZIP attachments are one of the most routinely filtered things in email. Mail providers strip or quarantine them because ZIPs are a classic malware vector; corporate mail filters block them outright; some clients silently rename or refuse them. A file that leaves your outbox cleanly can arrive mangled, held for review, or not at all — and you usually don't find out, because the failure happens on the receiving server, not yours. It's the same category of problem as an AI tool's share link that won't open for the person you sent it to: the thing left your side fine and broke on theirs.
Say the ZIP gets through. Now the recipient downloads it, unzips it, opens the folder, and looks for the file to click. Which one is the entry point? index.html, probably — but they have to know that. And when they double-click it, a multi-file page frequently comes up half-broken, because a build made to be served doesn't behave the same as loose files opened from a local folder: browsers apply stricter security rules to local content, relative asset paths can fail, and anything that loads data won't. The page that was pixel-perfect on your machine can look broken on theirs, through no fault of the build — just the environment it got opened in.
A private-link host takes the ZIP as an input and gives back a page as an output. You upload the bundle once; the host unpacks it, serves the entry file, and resolves the internal paths so the CSS, the scripts, and the images all load. What the recipient gets is a URL. They click it, and the build is already assembled and running in their browser — no download, no unzip, no hunting for the entry file, no local-folder rendering quirks. The room is set up before they walk in.
This is the specific job a single-file share can't do. When your build genuinely is several files that reference each other, you don't want to flatten it or send it raw — you want to hand over the bundle and have it come out the other side as one working page.
Got a multi-file build? Drop the ZIP and get a private link to the page, already assembled and running — the recipient opens a URL, no unzip, no account. Same private-by-default link as a single HTML file, just fed a bundle instead.
This isn't "never send a ZIP." A ZIP is exactly right when the recipient wants the files — source they'll edit, raw assets they'll pull into their own project, a batch of documents they'll file away. There the box is the point; they want to unpack it and keep what's inside. Zipping is a fine, universal way to move a pile of files from one place to another.
The line is simply which of those two you're doing:
It's the same distinction that separates a Google Drive link from a private link and a WeTransfer download from a link that renders: file-transfer tools are built to move files, and a build meant to be looked at is not really a file — it's a room. Send the room set up, not the box to unpack.
Private, no-index links and password protection are free on every plan. The ZIP ceiling follows the tier's file cap — 10MB Free, 25MB Solo, 50MB Studio. Solo ($4.99/mo) makes links permanent and adds the access log; Studio ($14.99/mo) adds a custom domain and white-label.
Drop a folder, get a live site in seconds, no account — and a preview that Cloudflare's changelog says stays live for one hour unless you claim it. That's an excellent preview. Here's the line where the thing you're sending stops being a preview.
A Drive link hands someone a file in a filing cabinet — download it, or preview a flattened copy. A private link hands them the finished thing, already open. Where the two diverge on rendering, control, and who the link assumes the reader is.
WeTransfer is a courier: it drops the file and leaves, and the link self-destructs. A private link is a room that stays open. Which fits depends on whether you're moving a file or showing a finished page — and on how big it is.
miinideck turns a single HTML file into an unguessable link with optional password and expiry. Default-private, never indexed.