← How it works

Step three

Setting it up

Four files to edit, one command to run, and a scheduled job that never needs you again.

There is no install step because there is nothing to install. The whole system is three Python files, and Python's standard library is the only dependency. No package.json, no lockfile, no framework, nothing that can rot while you are not looking. The one npm call is npx wrangler at upload time, and only if you deploy to Cloudflare.

That is a deliberate trade. A generated site could do more if it pulled in a toolchain. It would also break in eighteen months, on a machine you no longer have, for reasons in a dependency you never chose.

Edit four things

Open site.json. Put in your site's name, its URL, the line under the wordmark and the timezone you publish in. That file is the entire configuration surface: nothing about your site is hardcoded in the generator, and the generator refuses to run if what you gave it does not make sense.

Then styles.css, where the top block holds every colour and typeface on the site. Change the six values and the whole thing moves. There is a check that stops any colour appearing anywhere else, which is the only reason a six-colour palette stays a six-colour palette.

Run one command

Then python3 build.py --all to build everything including the queue, and python3 -m http.server 8000 to look at it. The --all matters: without it you see only what has actually come due, which is what your readers see and usually not what you want while writing.

Hand it the keys once

Deployment is a Cloudflare Pages project and two repository secrets. After that the scheduled workflow owns it: every night it builds what is due, verifies it, commits the result and uploads. If nothing came due, it deploys nothing and costs nothing.

The one rule worth internalising is that the schedule commits its own work. If you deploy from a checkout that is behind the remote, you rebuild an older, smaller site and un-publish whatever the schedule already released. The deploy script fetches and refuses outright rather than let you. That guard exists because the failure happened.

••••••

No. 3 in How It Works, a series of 3.