The problem is not writing. It is the daily.
Miss three days and the habit is gone. Miss ten and the site is dead, except that it does not look dead, because a static site with nothing new on it looks exactly like a static site that is doing fine.
So Cadence separates the writing from the publishing. Every post carries a
publish: date. The build writes out only what has been released. Everything
else sits in the queue, on disk, in git, invisible until its night comes.
# content/posts/my-first-piece.txt slug: my-first-piece title: My first piece standfirst: One line. Meta description and index blurb. period: 1975 # left column: what it is ABOUT publish: 2026-09-14 # the entire scheduler --- <p>Body HTML, indented six spaces.</p>
A productive Sunday buys a quiet month.
On a static site, the expensive failures are silent.
Nothing throws. Nothing 500s. Nobody gets paged.
A post builds. It renders correctly. The typography is right, you read it twice and it
is good. It is also absent from sitemap.xml, because of a one-character
mistake in a slug three weeks ago. Nothing anywhere will tell you. The page is perfect and
nobody will ever see it.
verify.py is four hundred assertions and a refusal. Not a warning.
$ python3 verify.py FAILED — 3 problem(s): post missing from sitemap.xml: the-queue internal link points at a redirect: posts/setting-it-up.html .deployignore does not list NOTES.md (it would go live)
Every check in that file exists because something went wrong once. The list is not a specification somebody designed. It is a scar record, and that is the only kind worth having.
Machine-assisted prose drifts. Always the same direction.
Measured across four batches of five posts on the blog this kit was built for, against its own baseline corpus:
| Batch | What happened | Baseline |
|---|---|---|
| 1 | variance 58 | 83 |
| 2 | median 14, only 14% of sentences under 7 words | 12, 26% |
| 3 | variance 56 | 83 |
| 4 | mean 15.9, short-sentence rate 12%, 470 words | 13.8, 23%, 750 |
Four batches, four drifts, every one the same way: longer sentences, more uniform rhythm, under length. Each individual piece looks fine, which is exactly why you cannot catch this by rereading. It only shows up against the baseline.
$ python3 voicecheck.py piece-one piece-two piece-three batch corpus delta mean 15.0 13.6 +1.4 ok median 14.0 12.0 +2.0 ok var 60.4 66.5 -6.1 ok short 8.7 18.8 -10.1 DRIFT words 346.0 327.0 +19.0 ok
What is in the box
build.py
The generator. One content file per post, out comes the site: pages, series, index, sitemap, feed, robots, structured data.
verify.py
Four hundred pre-deploy assertions. Exits non-zero on any problem, so the deploy stops rather than shipping it.
voicecheck.py
Measures a new batch against your committed corpus and prints the deltas.
deploy.sh
Build, verify, commit, upload. Refuses outright to deploy from a checkout behind the remote.
The nightly workflow
GitHub Actions. Dual cron, because a UTC-only scheduler cannot express “6pm local, year round.”
FIELD-NOTES.md
Eleven things that went wrong building it, and what each one changed in the code you get.
Any static host
Every page is written as a directory index, so extensionless URLs work on Cloudflare, GitHub Pages, Netlify, S3 or plain nginx without host-specific rewriting.
What I cannot tell you
This kit will not get you traffic, and I am not going to pretend otherwise.
The blog it was built for has a correct sitemap, valid structured data on every page, extensionless canonicals, an RSS feed, a strict CSP, and it serves 200 to Googlebot. The homepage is indexed. Two weeks in, the individual posts were still “unknown to Google” and the sitemap read “Couldn’t fetch.”
The diagnosis was not technical. Zero inbound links means zero crawl signal. No amount of correct markup substitutes for somebody else linking to you.
Getting the technical layer right stops you being penalised. It does not get you discovered. This kit gives you the first thing and cannot give you the second, and anyone selling you the second is selling you something else.
There are no testimonials on this page because there are no customers yet. You would be early.
Pricing
The kit
$39
- Everything above, as a zip
- SETUP.md: thirty minutes to published
- FIELD-NOTES.md: the eleven lessons
- Unlimited sites, including client work
- No subscription. No expiry.
Kit and an hour
$99
- Everything in the kit
- A live call while you stand it up
- Cloudflare, secrets, cron hours, all of it
- You leave the call with a blog that publishes
Done for you
$249
- I stand the whole thing up on your domain
- Your palette, your typefaces, your structure
- Hosting, repo, secrets, scheduled publish, all configured and proven
- Your first three posts loaded into the queue and dated
- You get a working blog and the keys to it
Payment is a Stripe invoice, sent by hand, usually within the hour. If it does not do what this page says, email me and I refund it. No form, no argument.
Questions people actually ask
Why not Astro, Hugo or 11ty? They are free.
They are, and they render better than this does. None of them ship the release queue, the pre-deploy verifier, the drift guard, or the field notes. If what you want is a static site generator, use one of those. If what you want is a machine that publishes every day without you and tells you when it is about to stop, that is what this is.
Is this AI slop?
The kit is code and documentation, written and tested by hand. On content: yes, this
system is designed to be run with AI assistance, and voicecheck.py plus
VOICE.md exist precisely because machine-assisted prose degrades in a
measurable, predictable direction if nothing is watching. Disclosing the assistance once,
on your About page, is the recommendation in the docs.
Do I need to know Python?
No. You need to edit one JSON file and write posts. You need Python 3.9 installed, which on a Mac or Linux machine you already have.
What if I want to move off Cloudflare?
The output is a directory of plain HTML. Point any static host at it. The only
Cloudflare-specific pieces are _headers and one line in the deploy script.
Can I use it for client sites?
Yes, unlimited, including commercially. You cannot resell or redistribute the kit itself. Full terms in LICENSE.md.
Is there a refund?
Yes. Email mughal.dutch@gmail.com and I refund it. No form and no argument, and you keep the files.