squirrelscan
GitHub

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-modified passes when the response carries a Last-Modified header. Message: Last-Modified header present, with the header value.
  • schema-dates passes when any JSON-LD block contains the text datePublished or dateModified. Message: Date schema markup present.
  • time-elements passes when the page has any time[datetime]. Message: 3 <time> element(s) found, with the first datetime value.
  • og-article-dates passes when either article:published_time or article:modified_time is present. Message: Open Graph article dates present.
  • freshness reports info when none of those were found. Message: No freshness signals detected, with Consider adding date schema or Last-Modified header as 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 IDcontent/freshness
CategoryContent
ScopePer-page
Severityinfo
Weight3/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.

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.

Type to search…

↑↓ navigate↵ openesc close