This site is the demo

301.sh is a blog about what Cloudflare's free plan can really do. It also runs entirely on that free plan — static pages, in-browser search, share cards drawn at build time, a surface built for AI readers, and Workers that post every new article to four social networks. No server, no database, no monthly bill. Here is the whole stack.

The writing has one job: solve a real problem on Cloudflare — redirects, DNS, HTTP headers, the free-plan limits — and check every number against the live documentation, with the date it was checked. Where the native Cloudflare path runs out, that is where 301.st, the platform this blog belongs to, picks up.

The stack

A handful of pieces, each chosen so the whole thing stays free.

Static HTML on the edge

Astro renders every page to plain HTML at build time; Cloudflare serves it from Workers Static Assets. The reader gets HTML and a few kilobytes of CSS — almost no JavaScript runs.

Workers Static Assets · $0 hosting

Content is Markdown in git

No CMS, no database, no login screen. An article is a file, an edit is a pull request, a merge is the deploy — and every Cloudflare figure carries the date it was last checked.

git · no database

Search runs in your browser

Pagefind builds a static index at deploy and searches it client-side with WebAssembly. There is no search server and no per-query cost — the index is just more static files.

Pagefind · client-side

Share cards drawn at build

Every article image — and every social card — is generated from its title and tag: SVG, text traced to outlines, rendered to PNG, one layout per platform. Deterministic and reproducible, with no design tool and no AI.

SVG → PNG · reproducible

A surface for AI readers

An llms.txt index, a Markdown twin of every page, and content negotiation on the Accept header: a thin Worker hands an agent clean source instead of page chrome.

llms.txt · content negotiation

And it publishes itself

Writing the article is the last thing done by hand. When one ships it lands in a small JSON feed, and a separate Cloudflare Worker for each network wakes on a cron schedule, takes the oldest article it has not posted yet, and sends exactly one — the title and link, the right card, the tags as that network’s own hashtags. What has already gone out is remembered in a KV namespace. Each network is its own Worker with its own token and schedule, so when one breaks the rest keep going.

Four networks, four cron Workers, one KV store — all inside the free plan's limits. More are queued behind platform review.

What it covers

Every article is filed under the Cloudflare feature it is really about. Pull a thread: