The date-stale refresher
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
- Pull and baseline. Run a Specter pull, then commit a git baseline so you can revert per file.
- 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.
- Run the refresh. Paste the refresh prompt below — it only acts on rows you didn’t exclude.
- 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 size | Tokens (scan + refresh) | Cost | Wall-clock |
|---|---|---|---|
| 200 posts | ~300k + ~200k | $0.90 | 25 min |
| 600 posts | ~900k + ~600k | $2.70 | 75 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.