Freshness signals: the dates a page publishes about itself
squirrel inventories the date signals on a page: the Last-Modified header, schema dates, time elements and Open Graph article dates.
What a freshness signal is
A freshness signal is anything on a page that says when its content was published or last changed. There are four common carriers: the Last-Modified response header, datePublished and dateModified in structured data, a <time datetime> element in the markup, and the Open Graph article:published_time and article:modified_time meta tags.
None of them is required, and a page with none is not broken. They matter on content whose age changes its usefulness, where a visible date helps a reader decide whether to trust what they are reading.
What squirrel checks
The rule runs on every crawled page and emits one check per signal it finds, plus a fallback:
http-last-modifiedpasses when the response carries aLast-Modifiedheader. Message:Last-Modified header present, with the header value.schema-datespasses when any JSON-LD block contains the textdatePublishedordateModified. Message:Date schema markup present.time-elementspasses when the page has anytime[datetime]. Message:3 <time> element(s) found, with the firstdatetimevalue.og-article-datespasses when eitherarticle:published_timeorarticle:modified_timeis present. Message:Open Graph article dates present.freshnessreports info when none of those were found. Message:No freshness signals detected, withConsider adding date schema or Last-Modified headeras the value.
The schema test is a substring match over the script text rather than a parse, so it does not check that the date belongs to the node describing the page. content/date-agreement is the rule that does. Severity info, weight 3.
How to fix it
<time datetime="2026-03-12">12 March 2026</time>Publish the date in the markup and in the structured data, both from the same content timestamp. A <time datetime> element is the piece that is visible to the reader as well as machine-readable.
Update dateModified when you make a substantive change, and leave it alone when you do not. A date that moves on every deploy is not a freshness signal.
| Rule ID | content/freshness |
| Category | Content |
| Scope | Per-page |
| Severity | info |
| Weight | 3/10 |
Enable / disable
Disable this rule
[rules]
disable = ["content/freshness"]Disable all Content rules
[rules]
disable = ["content/*"]Enable only this rule
[rules]
enable = ["content/freshness"]enable replaces the default ["*"], so this is the only rule selected. Leave disable out: a rule that matches any disable pattern is skipped even when enable names it. Only an enabled setting under a rule’s own [rule_options] table overrides both lists.
Related rules
- content/date-agreement: whether those signals agree with each other.
- crawl/sitemap-lastmod-drift: the sitemap date compared against them.
- eeat/content-dates: dates read as a trust signal.
- content/stale-copyright: the footer year, a different claim entirely.
Content findings ship in every audit next to the SEO, performance and agent experience rules. See Fix SEO issues with AI for how an agent works through a report.
References
Check your site
Run squirrel audit https://example.com and open the Content section of the report. Each page is listed with the date signals it carries. Signed-out local audits need no account and cost nothing. Signed-in audits spend credits.