Across the whole account, not per page. Resets daily.
You can host a page for nothing, and it takes about a minute
Cloudflare Drop does one thing: it takes a folder of static files and puts them on Cloudflare's global network. Its own description is "deploy static sites to Cloudflare's global network instantly, with no account required to start." That last clause is the interesting bit — you can ship something before you've decided whether you care about it.
There are two ways in. Drag a folder or a .zip onto the page, or run one command:
npm exec --yes wrangler@latest -- deploy ./dist \
--name my-static-site \
--temporary \
--compatibility-date 2026-07-30
Either way you get a live workers.dev URL. The folder has to contain an index.html — which, if you have been writing single-file HTML, you already do.
An unclaimed drop is temporary. You have 60 minutes to claim the deployment if you want to keep it. Miss that window and the URL is not yours any more. Fine for a throwaway preview; a genuine trap if you paste the link into a document and walk away.
What "free" actually means
Drop deploys to workers.dev, so it inherits the Workers free plan. The published limits:
Irrelevant for static files. It matters the moment you add logic.
Cloudflare states there are no additional charges for egress or throughput.
It's 100,000 requests, not visits. Close enough for a single self-contained HTML file — one visit is roughly one request — but they diverge fast the moment you add images, fonts or a favicon. Each of those is its own request. A page with five assets burns five.
And past the limit, requests fail with an error. They are not queued or gracefully degraded. If you are going to put something in front of a real audience, that ceiling is a cliff, not a slope.
Custom domains
This part holds up. A custom domain can be attached from the dashboard, from wrangler with custom_domain = true, or over the API — and the domain has to be on an active Cloudflare zone that you own. That is precisely why it feels instant when the domain is already on the same account: Cloudflare creates the DNS record and issues an Advanced Certificate for you, so there is nothing to copy-paste between dashboards.
You cannot attach a Custom Domain to a hostname that already has a CNAME record on it, or to a zone you do not own. And the docs publish no timing figure — "about fifteen seconds" is a lived observation, not a documented SLA. It's believable precisely because both the DNS record and the certificate are automated, but it isn't a number Cloudflare promises.
Markdown is where documents go to not be read
The argument in The unreasonable effectiveness of HTML is narrower than "HTML is good". It's that for anything a human is meant to read, HTML should be the default output and Markdown the exception. The honesty that makes it land:
I tend to not actually read more than a 100-line Markdown file.
Using Claude Code — the unreasonable effectiveness of HTML
Which is true of most people, and quietly damning if your work habitually arrives as a 400-line .md. The post's case breaks into four claims.
| Claim | What it means in practice |
|---|---|
| Information density | Tables, CSS, inline SVG, spatial layout, real interactive elements. Markdown reaches for ASCII diagrams and Unicode box-drawing because it has nothing better. |
| Visual clarity | Structure, tabs and illustrations make a long specification survivable. The same content as flat prose does not get read. |
| Sharing | A file you can upload and link. Markdown needs a renderer, which in practice means an attachment or a platform that happens to display it. |
| Interactivity | Two-way. A slider that adjusts a design, an export button that turns what the reader changed back into a prompt. The loop stays tight instead of ending at "here is the document". |
There's a fifth point that's easy to skim past and is arguably the most useful: the same document can synthesise sources that don't otherwise meet — the filesystem, connected tools like Slack or Linear, git history, browser history — into one report. That isn't a formatting upgrade. It's a different kind of artifact.
Where it earns its keep
- Specs and exploration — several design directions side by side rather than described in sequence.
- Code review — annotated diffs with the reasoning next to the change.
- Design prototypes — parameters the reader can actually move.
- Reports — several data sources joined into one page.
- Custom editing interfaces — where the reader's edits export back out as instructions.
If the output is destined for a person and would otherwise exceed roughly a hundred lines of Markdown, write HTML. If it's destined for a tool, or lives next to source code, leave it as Markdown. READMEs stay READMEs.
The default aesthetic is the problem
The companion piece, prompting for frontend aesthetics, starts from an uncomfortable premise: left alone, a model converges on whatever is most "on distribution". In frontend work that produces a recognisable house style people have started calling AI slop — and recognising it is most of the fix.
The remedy is three strategies: direct each design dimension deliberately, reference a specific existing aesthetic rather than asking for "nice", and name the defaults you don't want out loud.
Skip Arial, Inter, Roboto, system stacks. Pick something with character and use extreme weight contrast — 200 against 800, not 400 against 600.
CSS variables, one cohesive story. The line to remember: dominant colours with sharp accents outperform timid, evenly-distributed palettes.
One well-orchestrated page load with staggered reveals creates more delight than scattered micro-interactions. Spend the budget on the entrance.
Flat fill is the tell. Layer gradients, use a geometric pattern, add something contextual. Atmosphere, not a colour swatch.
- Inter, Roboto, Arial, system fonts
- Purple gradients on a white background
- Predictable layouts, cookie-cutter components
- Timid palettes spread evenly across everything
- Flat solid backgrounds
- IDE themes as a palette source — Nord, Dracula, Gruvbox, Catppuccin, Tokyo Night
- Cultural aesthetics — solarpunk, brutalist, newsprint, Y2K
- Display faces with real personality
- One dominant colour, one or two sharp accents
- Layered gradients and pattern for depth
Space Grotesk appears in the cookbook's own font suggestions and in its list of overused choices. That isn't a contradiction, it's the whole lesson: the moment a distinctive pick becomes the standard escape from the default, it becomes the new default. Anything prescribed widely enough stops being a differentiator. Pick deliberately each time, and expect this list to age.
What this page is doing, so you can judge whether it worked
A page arguing for handmade HTML should show its own workings. Here is every choice it committed to.
| Dimension | The commitment |
|---|---|
| Design system | The house ghibli-brief-manager system — the same one every other document in this folder uses. A deliberate trade, explained below. |
| Typeface | Figtree for headings and body — no separate display face. Hierarchy comes from weight and size: 700 headings against 400 body, 300 for the lede. JetBrains Mono is confined to the instrument layer — eyebrows, labels, numbers, code. |
| Palette | Cornflower blue #3a6ea5 on a blue-tinted wash #f0f5f9 with white cards. Teal, coral and gold appear only where they carry meaning — good, bad, pending. Never as decoration. |
| Background | Two soft radial gradients at 6% and 5% alpha. Never a flat fill, never a grid — the grid belongs to the dark sibling system. |
| Motion | One staggered entrance on load, per panel. No hover theatre. |
| Tabs | Pure CSS, using :target and :has(). No JavaScript. |
Tab 03 argues for committing to a distinctive aesthetic per artifact, and warns that anything prescribed widely enough becomes the new default. This page then uses the same house system as every other document in the folder. That is exactly the trade the cookbook warns about, made on purpose.
The reasoning: these documents are read as a set, by the same people, often in the same sitting. A reader who has learned that coral means blocked and teal means live shouldn't have to relearn it per page. Consistency is worth more than novelty within a set — and worth less than novelty across unrelated one-offs. If this page were going out on its own to strangers, the argument would flip.
A tab system built on display:none toggled by JS hides its content from Ctrl-F and from the printer — so a reader who searches the page, or prints it, silently gets a quarter of the document. Doing it in CSS keeps every panel in the DOM. Search finds text in tabs you haven't opened, and printing lays all four out in order with their headings restored.
Try it: search this page for a word you only saw on another tab.
No webfonts, no CDN, no scripts from anywhere. Figtree and JetBrains Mono are named first in the font stacks and used when a reader has them installed; otherwise the system stack carries the same intent. The page opens from a USB stick.
That also happens to matter for tab 01: hosted on Drop, this file costs one request per visit rather than five. Against a 100,000-request daily ceiling, a self-contained page buys roughly five times the audience of one that pulls fonts and a favicon.
Put this page on the internet
Drop this file into a folder as index.html and run:
# from the folder containing index.html
npm exec --yes wrangler@latest -- deploy . \
--name html-field-notes \
--temporary \
--compatibility-date 2026-07-30
# then claim it within 60 minutes, or it's gone
Every factual claim here was read from the primary source on 30 July 2026. Two things in the brief this was written from did not survive that check: "100,000 visits" is 100,000 requests, account-wide, and requests fail hard past it; and "15 seconds" for a custom domain is an observation rather than anything Cloudflare publishes. The 60-minute claim window wasn't in the brief at all and is the thing most likely to bite.
Numbers get quoted onward. It seemed worth being exact about which ones are documented and which ones are somebody's Tuesday.
Everything this page was built from
Two skills shaped it, two blog posts are summarised in it, and three Cloudflare pages supplied every number in tab 01. All of it is public.
The skills that built this page
| Skill | Where | Used here |
|---|---|---|
| plan-boardStructure: one self-contained file, standalone comprehensibility, CSS-only tabs, no marketing dressing | apsolut/apsolut-skills → meta/plan-board | yes |
| ghibli-brief-managerDesign: the blue wash, cornflower hero, Figtree + mono split, honest badges, print rules | apsolut/apsolut-skills → reports/ghibli-brief-manager | yes |
| ghibli-designThe token source of truth the report skill draws its palette and type scale from | apsolut/apsolut-skills → design/ghibli-design | yes |
| visual-planLayout discipline — the rule about preferring two-dimensional layouts over single-axis chains | BuilderIO/skills → skills/visual-plan | yes |
| visual-plan → document-quality.mdThe specific paragraph borrowed: prefer paired panels, layered diagrams, swimlanes, matrices or grouped regions; do not default to a linear sequence | BuilderIO/skills → …/references/document-quality.md | yes |
Its canvas.md and wireframe.md describe a hosted canvas renderer — artboards, board units, MCP patches, UI mockups. None of that is portable to a single file, and the skill's own routing rule says non-visual documents should have no canvas at all. Only the document-quality half crossed over.
Neighbours in the same repos, not used here
| Skill | Where | Used here |
|---|---|---|
| gruvbox-brief-managerThe dark sibling of the design above — same anatomy, terminal mood. Pick by audience | apsolut/apsolut-skills → reports/gruvbox-brief-manager | no |
| design-dnaThe other half of the design folder | apsolut/apsolut-skills → design/design-dna | no |
| apsolut-judge-init · apsolut-judge-careThe review-gate pair living alongside plan-board | apsolut/apsolut-skills → meta/ | no |
| Both repositories, wholeBrowse everything rather than one folder at a time | github.com/apsolut/apsolut-skills github.com/BuilderIO/skills |
— |
The two posts summarised in tabs 02 and 03
| Piece | Link |
|---|---|
| Using Claude Code — the unreasonable effectiveness of HTMLThe Markdown-doesn't-get-read argument. Summarised in tab 02 | claude.com/blog/using-claude-code-the-unreasonable-effectiveness-of-html |
| Coding & prompting for frontend aestheticsThe four dimensions and the AI-slop anti-patterns. Summarised in tab 03 | platform.claude.com/cookbook/coding-prompting-for-frontend-aesthetics |
Where every number in tab 01 came from
| Claim | Source |
|---|---|
| What Drop is · the wrangler command · the 60-minute claim window | cloudflare.com/drop |
| 100,000 requests/day · 10 ms CPU · no egress charges · requests fail past the limit | developers.cloudflare.com/workers/platform/pricing |
| Custom domain requires an active zone you own · DNS record and certificate created automatically · no existing CNAME | developers.cloudflare.com/workers/configuration/routing/custom-domains |
Every link above was opened and read on the day of writing rather than recalled. That is why tab 01 corrects two numbers and adds a third the original note never mentioned — documentation moves, and a page that quotes figures should say when it last looked.