Two articles a day - one in the morning, one in the evening - each with a different search intent, primary keyword, topic and angle. The content plan holds fifty briefed topics, which is about five weeks of material at that rate before new research is needed.
Publishing two thin articles a day is worse than publishing two good ones a week. The cadence is a capacity target, not a quota to fill with filler.
| Step | What happens | Who or what does it |
|---|---|---|
| 1. Research | Pick a briefed topic or identify a new one. Confirm no existing page targets the same intent. Gather sources. | Human, optionally assisted |
| 2. Draft | Write to the brief's outline. Include specific numbers and worked examples. | Human, optionally assisted |
| 3. Fact check | Verify every claim. Gameplay claims against the engine source; historical claims against documented references. | Human - not delegable |
| 4. Human review | Read it in full. Does it answer the question it promises? Is anything overstated? | Human - not delegable |
| 5. SEO review | Title, meta description, heading hierarchy, alt text, internal links. After the content is right, never before. | Human or checklist |
| 6. Build | py _src/build.py --check. Generates HTML, image, JSON
entries, sitemap entries, internal link checks. | Script |
| 7. Deploy | Upload changed files, or push to a git-backed host. | Script or manual |
Steps 1-5 need a human. Steps 6 and 7 do not. A minimal workflow:
name: Build and deploy
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: pip install pillow
- run: python _src/build.py --check
- name: Fail if the build changed tracked files unexpectedly
run: git diff --exit-code || echo "Generated files updated"
- uses: actions/upload-artifact@v4
with: { name: site, path: . }
# then deploy with your host's action (Netlify, Cloudflare Pages, FTP, ...)
--check fails the build if any internal link points at a page that does not exist,
so a broken link cannot reach production.
If you use a language model to help draft, the rules that keep this site honest are:
A workable monthly routine:
Record findings as new briefs in _src/briefs.py using the same structure as the
existing fifty, so the plan stays in one place.
| Trigger | Action |
|---|---|
| A game is retuned | Re-check every article that quotes its numbers; update both the
text and the updated date |
| A correction is reported | Verify, fix, note the change on the page, check whether the error appears elsewhere |
| New historical source found | Update the relevant retro articles and their references |
| Annual review | Read each article; change the updated date only if you
actually changed something |
Both are currently honest placeholders that tell the visitor nothing was sent. To make them real:
render.py's
newsletter() with your provider's endpoint, remove the disclaimer paragraph, and
update the privacy policy to name the provider before you
collect a single address.pages.py's contact entry, and remove the
initContact handler in main.js.