Recipe

The date-stale refresher

By Axel Antas-Bergkvist Published June 1, 2026
Time ~30 min for 200 posts
Cost ~$1 in tokens
Risk Low

Freshness is a real ranking factor for a lot of queries, and most blogs accidentally signal the opposite. A post a reader opens in 2026 that says “as of 2023” or “currently” tells search engines the content is frozen, and a modified date that hasn’t moved in eighteen months on a topic where competitors update yearly compounds the problem. These stale markers accumulate quietly across an archive, and each one nudges a page toward looking abandoned. A short refresher pass can reverse impression decline across dozens of pages — and unlike most SEO work, the changes are small and surgical.

What you need

  • Specter synced to your blog
  • An AI assistant you already use
  • Optional: web search enabled, so the assistant can fact-check refreshed numbers

The recipe

  1. Pull and baseline. Run a Specter pull, then commit a git baseline so you can revert per file.
  2. Scan first, no edits. Run the scanner prompt to list every dated reference into a CSV. Spot-check ten rows and exclude any historical posts where the old date is the point.
  3. Run the refresh. Paste the refresh prompt below — it only acts on rows you didn’t exclude.
  4. Dry-run and push. Preview the diff with a Specter dry-run, then push.

The prompt

The scanner is read-only and produces the CSV; the refresh then acts on your reviewed rows:

You are refreshing dated references across the posts in this folder, using the
reviewed CSV of stale references. Today's date is given.

For each row, edit the corresponding .md file:
1. "in 2023" → current year IF still factually true; otherwise rewrite the
   sentence to be year-agnostic.
2. "last year" / "currently" → anchor to a specific year that's verifiable, or
   make it evergreen.
3. Dated headers ("Top 10 Tools in 2023") → update to the current year and add a
   short "Updated for <year>" note under the H1.
4. If web search is available, verify time-bound numbers (prices, stats, versions)
   against a reputable source and update them.

Also update frontmatter: set the modified date to today, update dateModified in
any schema field, and do NOT change the original published date.

Write a summary of posts updated, stats refreshed (old → new), and anything you
couldn't safely update. Do not "improve" copy beyond the dated references.

Cost and time

Blog sizeTokens (scan + refresh)CostWall-clock
200 posts~300k + ~200k$0.9025 min
600 posts~900k + ~600k$2.7075 min

Pitfalls

  • Don’t fake updates. Bumping the modified date with no real change is freshness spam, and search engines are getting good at spotting it. The prompt forces a real edit alongside the date bump.
  • Historical content. A post titled “Why I quit my job in 2022” should keep its date — make sure the scanner marked it leave.
  • Source trust. Web search can return outdated or biased numbers for pricing and stats. Keep a tight allowlist of trustworthy domains.

Where to go next

This is the easiest recipe to put on a schedule — paired with a cron job and Specter’s JSON dry-run output, it becomes a self-running freshness loop. It also combines well with programmatic pages, whose year- and price-stamped content ages fastest of all.