Stale Content Detector logo

Stale Content Detector

Organization
respira-press
stale-content-detector

Use when the user says 'find old content', 'what is stale', 'what needs refreshing', or 'what should i archive'. Categorizes pages and posts as fresh, aging, stale, or archive-candidate by age, traffic signal, and internal link count, with a refresh, redirect, or archive call per item.

Overview

Publisherrespira-press
Repositoryagent-skills-wordpress
Skill namestale-content-detector
Stars
50
Forks
8
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by respira-press on GitHub. Read the source before you install it.

Installation

Install the Stale Content Detector AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/respira-press/agent-skills-wordpress/tree/main/skills/stale-content-detector
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/respira-press/agent-skills-wordpress.git /tmp/agent-skills-wordpress
mkdir -p .claude/skills
cp -r /tmp/agent-skills-wordpress/skills/stale-content-detector .claude/skills/stale-content-detector
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Stale Content Detector in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Stale Content Detector on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Stale Content Detector is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Stale Content Detector

Version: 1.0.0 Updated: 2026-05-24 Category: audit Status: stable Requires: Respira for WordPress plugin 7.1+ + MCP server


Description

Find pages and posts that haven't been updated in a long time, categorize them as fresh / aging / stale / archive-candidate, and suggest action per item: refresh, redirect, archive, or leave alone. Stale content is an SEO drag and a credibility tax — if your "2023 trends" article still ranks but nobody's touched it since 2023, you're losing trust the day a reader notices the date.

This skill is intentionally focused. It's not a content audit (use SEO & AEO Amplifier for that). It's the "what's old" question, answered fast.


What it categorizes

BucketAge since last updateSuggested action
Fresh< 6 monthsleave alone
Aging6–12 monthsreview the headline + opening paragraph; if still accurate, leave; if outdated, refresh the date
Stale12–24 monthsrefresh the content meaningfully (new data, new examples), update the modified date
Archive-candidate24+ months and low traffic / orphanarchive, redirect, or 410 — depends on if anything links to it

Plus an "evergreen" override: pages tagged as evergreen (/about/, /contact/, /pricing/, /privacy/) skip the staleness check entirely.


When to Use

  • Quarterly content review
  • Migrating a site and trying to decide what to bring vs leave behind
  • After a content team change — find the inherited backlog of old work
  • Before publishing the next batch of new content (so the old stuff doesn't drag the rankings of the new stuff)
  • After a Google update that emphasizes "freshness" signals

Trigger Phrases

  • "find old content"
  • "what's stale"
  • "what needs refreshing"
  • "audit my content age"
  • "find content to update"
  • "stale content scan"
  • "what should i archive"

Execution Workflow

Step 1 — Confirm site

Call respira_get_active_site + respira_get_site_context.

Step 2 — Pull pages and posts

Call:

  • respira_list_pages(per_page=100) for pages
  • respira_list_posts(per_page=100, status=publish) for posts
  • respira_list_custom_posts(post_type=<each non-default CPT>, per_page=100) for any CPT detected via respira_list_post_types

Each result includes modified and date. Sort by modified ascending — oldest first.

Step 3 — Identify evergreen pages

Pull the list of pages and check each against the evergreen list (/about, /contact, /pricing, /privacy, /terms, /legal, /imprint, /faq, /support). If the URL or slug matches, flag as evergreen and skip the staleness check.

Also check if the post type has has_archive=false and a single URL pattern matching contact/legal/utility — those are usually evergreen.

Step 4 — Compute staleness

For each non-evergreen page or post, compute days-since-modified. Bucket:

  • 0–180 days → fresh
  • 181–365 days → aging
  • 366–730 days → stale
  • 731+ days → archive-candidate (further filtering in Step 5)

Step 5 — Add traffic + orphan signals (archive-candidate filter)

For items in the archive-candidate bucket, we need to know if anyone is reading them or linking to them. Two signals:

  1. Internal link count. Call respira_find_element with the page's URL as a search term. Count incoming internal links. If zero, the page is an orphan.
  2. External traffic (if available — depends on whether the site has Plausible / GA4 / similar wired to Respira). If not available, skip.

Recompute:

  • Archive-candidate + orphan + no traffic → archive (or 410)
  • Archive-candidate + has internal links + no traffic → archive + redirect (preserve link equity)
  • Archive-candidate + has traffic → refresh (downgrade from archive-candidate to stale)

Step 6 — Output the report

markdown
## Content age audit for {site_url}

Scanned {n_pages} pages + {n_posts} posts + {n_custom} custom posts ({n_total} total). Evergreen pages skipped: {n_evergreen}.

### Summary

| Bucket | Count | % |
|---|---|---|
| Fresh (<6mo) | {n_fresh} | {pct_fresh}% |
| Aging (6–12mo) | {n_aging} | {pct_aging}% |
| Stale (12–24mo) | {n_stale} | {pct_stale}% |
| Archive-candidate (24+mo) | {n_archive} | {pct_archive}% |

### Stale (12–24 months)

| Title | Last modified | Action |
|---|---|---|
| {title} | {modified} ({days_ago}d) | refresh |
| ... | | |

### Archive-candidate (24+ months)

| Title | Last modified | Internal links | Suggested action |
|---|---|---|---|
| {title} | {modified} ({days_ago}d) | {link_count} | {action} |
| ... | | | |

### What I'd refresh first (top 5 by traffic or link equity)

1. **{title}** ({days_ago}d old) — {one-line reason: high incoming link count / high traffic / topical relevance to current focus}
2. ...

Step 7 — Offer to act on a chosen item

Ask: "Want me to refresh one of these now? I can pull the existing content, suggest updates, create a duplicate with the refresh applied, and you review."

If yes, route to the SEO & AEO Amplifier skill or directly compose respira_create_page_duplicate + targeted updates.


Hard rules

  • Never delete a page directly. Even archive-candidates get a recommendation, not a deletion. The user decides. Use respira_delete_page only if the user explicitly asks for deletion of a specific named page.
  • The evergreen list is opinionated but overridable. Output the list at the top of the report so the user can see what got skipped and add/remove items.
  • Don't conflate stale with bad. A 2-year-old page that still has 1,000 monthly views is not a problem. The "refresh" recommendation is based on age, not quality.
  • Modified date is canonical. Don't read date (published) as a staleness signal. A 2018 post updated last month is fresh.
  • Custom post types matter. Case studies, podcast episodes, properties — these often need different staleness windows. If the user runs a podcast and the latest episode is 6 months old, that's stale for podcast content even though "fresh" for blog posts. Offer to set per-CPT windows on a v1.1 of this skill.

Telemetry

Records: site URL hash, n_pages / n_posts / n_custom counted, bucket distribution, success/failure, total duration. No page titles, no URLs, no decisions sent.

Endpoint: POST https://www.respira.press/api/skills/track-usage

Frequently asked questions

What does the Stale Content Detector AI skill do?

Use when the user says 'find old content', 'what is stale', 'what needs refreshing', or 'what should i archive'. Categorizes pages and posts as fresh, aging, stale, or archive-candidate by age, traffic signal, and internal link count, with a refresh, redirect, or archive call per item.

Why use Stale Content Detector on TypingMind?

Because you install it once and use it with any model. Stale Content Detector is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Stale Content Detector in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/respira-press/agent-skills-wordpress/tree/main/skills/stale-content-detector. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Stale Content Detector?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Stale Content Detector?

As many as you like. As long as a model supports skills, you can use Stale Content Detector with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Stale Content Detector AI skill free?

Yes. It is published on GitHub by respira-press under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇