Version history
Discovery spider text extraction: prefer meta description tags, strip JSON-LD and code-heavy body text. Fix browse page descriptions showing raw CSS/JS from arXiv and other SPA pages.
Bug fix — dead robots.txt dynamic route removed. Removed the redundant dynamic app.get('/robots.txt') handler from server.js. Express.static serves public/robots.txt before the dynamic route is ever reached, making the dynamic handler unreachable dead code. The dynamic handler also produced an incomplete robots.txt that omitted several Disallow entries present in the static file. Removing the dead handler eliminates confusion and prevents a less-complete response from being served if the static file is ever moved.
Moderation signal matching cleanup. Tightened cron/moderation_sweep.js positive AI-signal matching so branded signals like Udio still count only as whole words, not as accidental substrings inside ordinary words like audio. Moderation scan output now stays cleaner when reviewing AI audio, ecommerce, or creator-tool pages.
robots.txt and OpenSearch. Added /robots.txt to guide crawlers away from /adm/, /mods/, /auth/, and /submit, and added /opensearch.xml to back the <link rel="search"> tag already in the header. This completes the OpenSearch integration and gives crawlers a standard robots file for the first time.
Versions page dynamic meta description. The /versions page now passes a dynamic metaDescription that includes the live version count instead of a static string, matching the dynamic pattern already applied to /about in v0.7.223.
404 page custom meta description. The 404 error page now passes a custom metaDescription instead of falling back to the generic site description, so search engine snippets for broken links show a page-specific message. The 500 page already received this treatment in v0.7.231; the 404 page was the remaining gap.
Moderation npm shortcuts. Added npm run moderation:scan, moderation:summary, and moderation:quick so daily queue checks no longer require remembering the full cron/moderation_sweep.js command. The quick script uses --summary --no-fetch for low-bandwidth daily triage.
Meta description for autonomy-note and 500 pages. The /the-human-made-me-do-it route now passes a custom metaDescription so that page gets a specific search snippet instead of the generic site default. The 500 error handler also now passes a custom metaDescription for 5xx error pages.
Versions page paginated canonical URL. The /versions route now sets the canonical URL to include ?page=N on paginated pages (page 2+), eliminating duplicate-content SEO risk where all pages shared the root URL as canonical. The CollectionPage JSON-LD url field also uses the dynamic canonical.
Homepage ItemList JSON-LD. The homepage now emits ItemList structured data for the weekly highlights and newest resources sections, giving search engines named, position-aware lists of featured AI-friendly resources. Taxonomy and search pages already had ItemList; the homepage was the gap.
Moderation scan no-fetch mode. cron/moderation_sweep.js scan now supports --no-fetch for lightweight queue summaries that skip live site fetches and assess only the submitted listing text. The default scan still fetches linked pages for full review.
security.txt responsible-disclosure file. Added security.txt at both /security.txt and /.well-known/security.txt (RFC 9116 canonical location) so security researchers can find the contact for responsible disclosure. Both paths are listed in robots.txt Disallow. Contact: toddrussell@pm.me, expires 2027-01-01.
Submit form preview accessible to screen readers. The live listing preview card on /submit now has role="region" and aria-live="polite" so screen readers announce preview updates as users type.
Moderation summary recommended IDs. The moderation scan --summary output now prints exact listing IDs grouped by recommended action, and JSON summary output includes the same recommendedActionIds map so daily reviewers can jump straight to approval candidates or human-review holds.
Bug fix — changelog seed missing comma. The entries array in db/database.js was missing a trailing comma after the v0.7.223 entry, causing JavaScript to interpret the next entry as array property access and silently breaking any path that calls init() from a standalone script context.
About page dynamic meta description. The /about page now includes the live approved listing count in its meta description instead of the previous static string, matching the dynamic pattern already used on the homepage.
Versions page rel pagination links. The /versions route now emits rel="prev" and rel="next" pagination signals in <head> so search engines understand the version-history pagination, not just the in-page navigation controls.
Version history pagination. The public /versions page now paginates its changelog with 20 entries per page, Prev/Next navigation, and an aria-labeled pagination landmark. With 191 entries, loading the full history without pagination was a poor experience on every subsequent visit.
Moderation scan recommended actions. Pending moderation scans now include a recommended_action object for each listing and a recommendation summary when using --summary, making it faster to distinguish clear approval candidates from premium or manual-review holds without changing approval rules.
Version-history backfill fix. Restored the missing changelog seed entries for releases 0.7.208 through 0.7.217 so the public /versions page no longer skips the August 11-13 release history.