GitHub Pages publishes a public, git-tracked site to the open web. A private unguessable link delivers a self-contained page to specific people. Here is the honest split — by who reaches it, what the URL is for, and where the work lives — so you pick the right one instead of bending one to fit.
You finished a page and now you need a URL. Both GitHub Pages and a private link will give you one, which is exactly why people reach for whichever is closer to hand and then spend an afternoon bending it to fit. The URL is where these two tools look identical. Everything after the URL is where they split — who finds it, who maintains it, and whether the page is a published thing or a delivered thing.
So this is not a feature shootout. It is a fit question, and the fit is usually obvious the moment you name what the page actually is: a publication, or a delivery.
GitHub Pages is the publish step of a git workflow. You commit static files to a repo, point Pages at a branch, and it serves them at a public address. The URL is permanent, the content is whatever is in the repo, and the natural update loop is git push. That shape is excellent for a specific category of page:
The defining trait: the page is meant to be public, and meant to be maintained from a repo. Pages assumes both. The github.io address is a public address. There is no built-in "only these three people" — public Pages is open to anyone, and private Pages (on paid GitHub plans) gates by GitHub org membership, which means your viewer needs a GitHub account and a seat in your org. That is fine for a teammate. It is friction for a client, a partner, or your CEO.
A private link inverts every one of those assumptions. You drop one self-contained HTML or ZIP and get back an unguessable URL — no repo, no branch, no build step, no public directory. It is no-index by default, so the open web does not surface it. The viewer needs nothing: they open the link in any browser, on a phone or a laptop, optionally type a password you set, and they are in.
The defining trait: the page is meant for specific people, and meant to be handed over rather than maintained. "Anyone can see this" means anyone you sent the link to — not the public. That is the right shape for:
You are not running a pipeline. You are delivering a finished thing to a named audience, and the URL exists so exactly those people can open it — nothing more.
If your page is a finished thing for specific people — a client report, a prototype, an internal dashboard — drop the HTML and get an unguessable, no-index link. No repo, no build, no account for the viewer. Password and expiry are free on every plan.
Skip the feature grid. Answer these in order.
1. Who is supposed to reach this page?
2. Is the page tied to a repo you maintain?
git push update loop is the whole point.3. Should the open web be able to find it?
Three "publics" point at GitHub Pages. Three "specifics" point at a private link. Mixed answers usually mean you have two different pages pretending to be one — the public marketing page belongs on Pages, the gated deliverable belongs behind a private link.
Neither tool runs a server, and pretending otherwise costs you an afternoon. GitHub Pages serves static files from a repo. A private link serves one self-contained page. Both are front-end only: HTML, CSS, JavaScript, CDN libraries, client-side interactivity.
The moment your page writes to a database, authenticates users, or calls a server-side API route, you are past both of them. That is a real deploy job, and the right tools are Vercel or Netlify — they run your server and give you the git-based continuous-deploy loop. If your page is all front-end, you do not need that machinery; if it is not, no amount of static hosting will fake a backend into existence. Name the boundary honestly and you stop fighting the wrong tool.
GitHub Pages does give you one thing a private link deliberately does not: the git-based publish loop for static sites. If you want "edit source, push, site updates" as an ongoing habit, that is Pages' territory. A private link is the opposite habit — you finish, you deliver, you move on.
A few real cases, decided fast:
The pattern underneath every row: a publication with a public audience and a repo behind it is GitHub Pages' job. A delivery to specific people of a finished, self-contained page is a private link's job. When you catch yourself adding noindex tags, gating a public host, or asking a client to make a GitHub account, that is the tool telling you it is the wrong shape. Pick the other one.
Both are coherent in their own direction. The work is just matching the page to the shape — and once you have named who reaches it and whether a repo is behind it, the answer stops being a debate.
Claude Code wrote the file. Now a teammate or a client has to see it working — and the obvious options each solve a different half of that. An honest split across GitHub Pages, Notion, paste-style hosts, an internal server, plain email, and a private link, judged against the five things people actually ask for.
A private link and a public deploy are the two ends of one dial: how findable the page should be. A job-by-job map of where each endpoint fits, plus the in-between cases most real work actually lands in.
Twelve ways to put a single HTML file online for free — GitHub Pages, Netlify, Cloudflare, Vercel, Tiiny, Neocities, Static.app, EdgeOne, host-html, Linkyhost, Wasmer, and a private-link option — with an honest table of which fits which job, public or private.
miinideck turns a single HTML file into an unguessable link with optional password and expiry. Default-private, never indexed.