A personal site updates twice a year. CMS subscriptions and full deploy pipelines are sized for sites that update twice a week. The middle ground: one HTML file at your own domain.
You ship a project worth showing. You write a short essay you want findable. A recruiter asks for a CV link instead of a PDF attachment. Each of these wants the same thing — a small URL at your own domain, easy to send, showing the current version of your work.
Most ways to do this overshoot. The site updates four times a year; the tooling is sized for sites that update four times a week.
Three properties, in order of how often each one matters:
Your own URL. yourname.com/portfolio reads differently than yourname.notion.site/portfolio or username.github.io. For a designer, a freelancer, anyone whose work is partly judged by how their own surface looks, the URL is the framing.
Renders correctly across devices. Recruiters open the URL on their phone. Clients open it during meetings. The page has to read clean on whatever they're holding.
Easy to update without ceremony. When a new project ships or a role changes, the update should take ten minutes — not "log into the CMS, find the page, navigate the editor, save, deploy."
The lower-priority properties (multi-page navigation, blog, contact form, animations) are nice to have but rarely the deciding factor. Most personal sites work as one page.
| Shape | Custom domain | Setup time | Ongoing cost | Best for |
|---|---|---|---|---|
| Webflow / Squarespace | yes (paid) | half a day | $12-30/mo | Sites that update weekly, multi-page, e-commerce |
| WordPress (self-hosted) | yes | a day | $5-15/mo | Sites that genuinely need a CMS, plugin ecosystem |
| GitHub Pages | yes (free CNAME) | an hour | $0 | Devs comfortable with git, fine with rebuild on push |
| Notion public page | only on paid tier | minutes | $0-10/mo | Quick links, ongoing edits, doesn't mind Notion frame on free |
| Static HTML at private-link host | yes (paid tier) | 30 min | $5-15/mo | One-page sites, infrequent updates, own URL matters |
The last shape covers the case the others don't fit cleanly — a one-page personal site at your own URL, updated by re-uploading the HTML, without a CMS or a deploy pipeline.
For someone starting from "I have nothing":
yourname.com (or www.yourname.com) to the host. The setup walkthrough for custom domains covers the DNS detail; takes 10-15 minutes.When you ship a new project two months later, the update is: edit the HTML (or re-export from Notion / Figma), drop the new file at the same URL, done. No git push, no CMS log-in, no deploy queue.
For people who already keep their portfolio in Notion (write the project descriptions, paste the screenshots, link the case studies):
... menu → Export → HTML (with included subpages if multi-section).The win over Notion's native public page: the URL is yours, the page reads as your work product not as a Notion document, and you keep editing in Notion (which is what most people are already doing for the content).
Test the flow with a one-page draft — drop the HTML, see how the URL behaves, walk through the experience on your own phone. Free, no card, 7-day self-destruct on the anonymous tier (upgrade to permanent before pointing your domain at it).
A few small things, mostly framing:
None of these are dramatic. Together they're the difference between the portfolio reading as your professional surface and reading as a doc you happened to make in a tool.
A static HTML at a private-link host is the wrong shape for sites that genuinely need a CMS:
For the single-page personal portfolio that updates a few times a year, the static-HTML shape covers exactly what's needed without paying for the rest. For time-bound event microsites, the same pattern works with expiry layered on. For something that needs to update weekly with blog posts, the right shape is different.
Solo plan ($4.99/mo) keeps the portfolio permanent and removes the footer. Studio plan ($14.99/mo) adds custom domain so the URL is yourname.com directly. The per-document searchable opt-in that makes the portfolio page indexable is on every tier — one page free, five on Solo, unlimited on Studio — while the rest of your account stays default-private. Password protection — handy for a private CV link aimed at specific recruiters — is free on every account.
Three quick questions:
For most one-page portfolio / about / CV sites, the answers are: yearly, yes, yes. Static HTML at custom domain with searchable opt-in fits all three.
That third answer is the unusual one, and it's worth understanding rather than just switching on: making one document searchable while the rest of the account stays private is an exception to a default, not a mode change — which is exactly right for a portfolio that should be found while the client work behind it stays unlisted.
Recurring reports break in a way one-off deliverables don't: every send produces another address, and the old ones keep working with old numbers in them. Here's the version where the report has one address for the whole engagement.
The writing got fast. The handover didn't. Here's why the last step of client work — getting the finished thing in front of the client — quietly became the slow part, and what a good version of it looks like.
A pricing proposal is read more like a website than a document. Channel options for sending one, and where private-link HTML sits between a PDF attachment and an esignature tool.
miinideck turns a single HTML file into an unguessable link with optional password and expiry. Default-private, never indexed.