Setting a Publishing Cadence You Can Actually Keep

Pick a sustainable publishing cadence with a real 8-week measurement, batch workflow, and backlog-tracker script you can drop into your repo.

Most indie content sites die not from bad content but from inconsistent shipping. A 12-week burst followed by 4 months of silence is worse than half the volume on a steady schedule, because Google treats sudden silence as a signal the site is dying. The goal of cadence is not maximum output; it is predictability — and you measure it from your actual git log, not your hopes.

Background

Google does not literally reward a “post every Tuesday” pattern, but it does reward sites that keep getting fresh, relevant content over time. More importantly, you yourself need a cadence to stay in the habit. Without one, content gets pushed to “later” indefinitely. A measurable cadence + a small backlog + a weekly publish-day check is the smallest system that actually holds.

How to tell

  • You have published in waves — fast weeks followed by silence.
  • You set a target cadence months ago and have not held it.
  • You feel guilty about publishing rate (a sign your target is wrong, not you).
  • Your last 8 weeks publishing count averages well below the public commitment you made.

Quick verdict

Pick the lowest cadence you are 90% sure you can hit for 12 months straight, even on bad weeks. That is your real cadence. Everything above it is bonus.

Before you start

  • You have an editorial-control surface (git log, content folder).
  • You can spend 30 min to set up the measurement script below.
  • You’re willing to commit to a number publicly only after the math works.

Step by step

  1. Measure honestly from git log: published dates are in frontmatter, but the git log proves when you actually shipped:
# articles added/modified in last 8 weeks, by week
git log --since="8 weeks ago" --pretty=format:'%ai' --name-only -- 'src/content/articles/' \
  | grep '\.mdx$' | awk -F/ '{print $NF}' | sort -u | wc -l
# total unique articles touched

git log --since="8 weeks ago" --pretty=format:'%ai' --diff-filter=A --name-only \
  -- 'src/content/articles/' \
  | grep '\.mdx$' \
  | awk -F/ '{print $NF}' | sort -u | wc -l
# total NEW articles added (A = added)

Or even simpler from frontmatter:

grep -rh '^publishedAt:' src/content/articles \
  | awk '{print $2}' \
  | awk -F- '{print $1"-"$2}' | sort | uniq -c
# articles per year-month, last few months tell the truth
  1. Multiply by 0.8 — that is your sustainable floor. If you shipped 16 in 8 weeks, your true cadence is 16 × 0.8 / 8 = 1.6 articles/week. Round down to a clean schedule (1/week, 2/week, etc.).

  2. Pick fixed publishing days. Tuesday + Friday is a common pattern. Write the schedule into CONTENT.md:

# Publishing cadence
- Target: 2 articles/week
- Days: Tuesday 10:00 ET, Friday 10:00 ET
- Backlog buffer: 2-3 articles ready at all times
- Reassess quarterly; no mid-quarter adjustments
  1. Build a small backlog buffer. A simple drafts/ folder with articles ready to ship:
ls drafts/*.mdx | wc -l
# warn if < 2:
[ "$(ls drafts/*.mdx 2>/dev/null | wc -l)" -lt 2 ] && echo "WARN: backlog below 2"

Add to your weekly checklist; the warning before the warning is the warning.

  1. Track only “published this week, yes/no”. Don’t track word count or hours — they don’t correlate with outcomes. A tiny tracker:
# scripts/cadence-check.mjs
import { execSync } from 'node:child_process';
const since = new Date(Date.now() - 7 * 86400 * 1000).toISOString().slice(0, 10);
const out = execSync(
  `git log --since="${since}" --diff-filter=A --name-only -- 'src/content/articles/'`
).toString();
const newArticles = out.split('\n').filter(l => l.endsWith('.mdx')).length / 2; // en + zh
console.log(`This week: ${newArticles} new articles`);
if (newArticles === 0) console.log('STREAK BROKEN');

Run as a weekly cron or a Friday-morning manual ritual.

  1. Reassess quarterly. A 13-week summary:
grep -rh '^publishedAt:' src/content/articles \
  | awk '{print $2}' \
  | awk -F- '{print $1"-W"int(($2*30+$3)/7)}' \
  | sort | uniq -c | tail -13

If the cadence felt easy for 12 weeks, raise it by one article/month. If it felt hard, lower it. Don’t adjust mid-quarter.

  1. Don’t front-load. A 20-article launch week followed by 8 weeks of silence is worse than 2/week steady. Spread across at least the first quarter.

Implementation checklist

  • 8-week baseline measured from git log, not memory.
  • Public cadence is at or below 0.8 × measured.
  • Fixed publish days documented in CONTENT.md.
  • Backlog buffer of 2+ articles maintained.
  • Weekly “did I publish?” check is automated or ritualized.

After-launch verification

  • 12 weeks in: streak count from git log matches target.
  • Backlog never went below 1 article.
  • Search Console “new pages discovered” is steady, not spiky.

Common pitfalls

  • Setting cadence based on “what other indie sites do”. You are not them, your life is not theirs.
  • Front-loading the first month. A 20-article launch week looks great and then 8 silent weeks. Spread it out.
  • Skipping the backlog. Without it, one bad week breaks the streak.
  • Using a complicated content calendar tool. A Google Sheet or Notion table works fine; the tool is not the bottleneck.
  • Tracking input metrics (words written, hours) instead of output (articles published). Inputs are not commitments.

FAQ

  • Is two articles a week enough?: Yes, if you can hold it for a year. A consistent 2/week beats an unsustainable 5/week almost every time on indie sites.
  • What if I miss a week?: Publish from your backlog. If the backlog is empty, publish a short article the next available day — don’t skip to “next week”.
  • Should I batch-write months in advance?: Some batching helps, but don’t batch beyond 4-6 weeks. The market and your interests shift and stale-batched content reads stale.
  • Does posting time of day matter?: For SEO, no. For social and email amplification, your audience’s timezone matters slightly. Don’t over-optimize.
  • How do I handle holidays / travel?: Pre-publish from backlog. Schedule the deploy if your stack supports it (publishedAt in the future + a daily build cron).

Tags: #Indie dev #Content ops #SEO #Website planning #Workflow