Repository navigation
Backport release: generic improvements from new features developed for Scaffold-based websites, plus Node 24 and minor dependency updates.
Before merging
- Node 24 required.
engines.nodeis now>=24.0.0andnetlify.tomlpinsNODE_VERSION = "24". Node 22 reached end of active support; Netlify builds switch over with the pin. Update your local Node (nvm install 24) before runningnpm install. - Dependencies bumped to current minors: Astro 7.4, the Netlify adapter 8.2, React 19.3, Tailwind 4.3, plus
@astrojs/rssas a new dependency. Runnpm installafter merging. If the first build fails withCannot find package '@netlify/blobs', runnpm dedupe— npm occasionally nests that package under the adapter where Astro's session storage can't resolve it. .pages.ymlconflicts are likely if you customised it. New in this version: asettings:block (content merge + commit message templates),seoTitle/seoDescriptionon every content collection, aemailfield in Site Settings, a stricter slug pattern, and theextraInfoperson field is gone. Take Scaffold's version as the base and re-apply yours; the update script re-syncs your category lists afterwards.
Action needed
- Delete
public/robots.txtandpublic/llms.txtif you have them. Both are now generated routes (src/pages/robots.txt.ts,src/pages/llms.txt.ts).public/**is protected, so the update script does not remove them for you. - Slugs must be lowercase and non-empty in the CMS. The permalink/ID pattern changed from
^[a-zA-Z0-9_-]*$to^[a-z0-9_-]+$. Existing content with uppercase permalinks still builds, but Pages CMS will refuse to save that entry until the permalink is lowercased (and the auto-permalink workflow then renames the file). FormField.astroandPageSection.astroare removed. If you imported either in your own components, copy the old file from your git history into your site.- People
extraInfois removed from the schema and the CMS. - Card images in
CardSectionnow havealt=""because the card title follows as a heading (screen readers were reading the title twice). If you put meaningful, non-title imagery in cards, override in your own CardSection.
Changes in behavior
- Page titles get the site name appended (
About | Your Site) unless the title already ends with it. - Preview builds (
PUBLIC_PREVIEW=true) now rendernoindex,nofollow,robots.txtdisallows everything, draft content gets a DRAFT label, and an orange frame with a "Preview" badge is drawn around the page. - Whole cards are clickable (Card, ArticleCard, article index): the title link stretches over the card. Nested links inside a card need
relative z-10to stay clickable; Scaffold's own cards already have it.Card.astrois nowposition: relative, and CardSection's grid uses.cards-gridfromscaffold.css(equal row heights; a lone card or pair is centred —center={false}to opt out). - Table of contents picks the active heading from scroll position instead of an intersection band, and a long TOC scrolls inside the sticky sidebar. TOCs are capped at two levels (h2 + h3).
- Rich search caps results at 10 per category, no longer flashes its skeleton when opened, and the nav search button shows a ⌘ K / Ctrl K hint on
mdand bigger screens. - Sitemap excludes
/api/*,/og/*and non-HTML endpoints, and article URLs carry<lastmod>frompublishedDate.
New bits
- SEO pass.
Head.astroemitsog:type(website/article/profile),og:site_name,og:locale, image type/width/height/alt,article:published_time/article:author/article:section/article:tagon articles, andname="twitter:*"tags. Every page carries a schema.org JSON-LD graph (Organization + WebSite) and detail pages add Article, Person or CreativeWork nodes (@utils/jsonld,atoms/JsonLd.astro). Layouts acceptogType,noindex,jsonLdandarticleprops. seoTitle/seoDescriptionon pages, articles, docs, people, partners and resources override the browser-tab title and meta description;emailin Site Settings feeds structured data andllms.txt.- Fixes:
Headingstyles followleveleven whenasrenders a different tag; the fallback OG image URL is absolute on the site URL (not the request URL); auto-excerpts skip a leading[EmbedLink](…); docs prev/next and sidebar usegetDocUrl; the search index usesgetArticleUrl/getDocUrl; the search legend punctuation. - Feeds:
/rss.xml(published articles),/robots.txt,/llms.txtgenerated from your content;<link rel="alternate">and<link rel="sitemap">in Head. - Navigation: dropdown chevron rotates when open; top-level active links carry
aria-current="page". SectionHeadercompactprop;CallToActionSectionaccepts a default slot (rendered only when used).- Pages CMS:
settings.content.mergekeeps keys the CMS doesn't manage; commits are stamped "(via Pages CMS)"; the pages list shows the permalink column.