Release 2.5.0
2 Oct 2026 · pinned package [email protected]
seo.feedXml(feed, { format })takes items as{ title, link, guid?, description?, content?, author?, published, updated? }and the feed'slanguageandselfUrl. RSS adds<language>, anatom:link rel="self"and alastBuildDatethat is always present. Atom addslink rel="alternate"/rel="self",xml:lang,<content type="html">and an<updated>that is always present. Withoutupdated, both use the newest item date, or now when there are no items. Text is escaped withesc, so'becomes'. The 2.4.0url,idandsummarystill work.seo.llmsFulltakesbaseand sections ofpages: [{ title, url, text | html }]: each page renders as### title,URL: …and its full text (HTML stripped), in input order, andmaxBytesends the file with a(truncated: N more pages at <base>/llms.txt)line. The 2.4.0{ url, body }sections render unchanged.seo.pageSummarynow converts to an HTML string —<meta name="ai-summary">, WebPage JSON-LD and, with stringfacts, a<noscript><section data-ai-summary>block — and has.head/.body; itsmeta,jsonLdandhtmlare unchanged.templates/siteserves/llms-full.txtand puts the summary in its head.perf-budgetmeasures Core Web Vitals (plan T11).measure({ browser })opens the page in Chrome throughbrowser-harnessafter the byte pass, clicks once, and addscwv: { lcpMs, inpMs, cls }.check()acceptslcpMs,inpMsandclsbudgets and throws when they are used withoutcwv;format()prints acwv:line. Withoutbrowser, measurement is unchanged and needs no Chrome.
- The asset pipeline adds
hashAsset(bytes), generated AVIF and WebP srcsets frompicture({ src, widths, ... }), andopenvibe-build-assetsto copy files to hashed names with amanifest.jsonlookup. The builder does not transcode images.
openvibe-shared/assets(plan T11): content-addressed asset URLs and responsive<picture>markup for a product page.hash(bytes)is the estate's sha256 truncated to 12 hex;url(src, hash)appends?v=, replaces an old one and leaves the path unchanged when there is no hash;srcset(entries)builds a srcset;picture({ src, hash?, alt, width, height, sizes, sources })emits AVIF before WebP before the fallback<img>(any other type ranks after WebP), renders a plain<img>when there is nothing to choose between, and renders nothing without asrc. Formats come from the caller: this package does not transcode images, so it only emits the AVIF/WebP variants a site's own build produced.
Rules90 Assets are addressed by their content, so people always get the current one.