Skip to content

v2.2.0 — create-astro-fleet CLI, Keystatic CMS, SEO hardening

Latest

Choose a tag to compare

@vairi vairi released this 17 Apr 19:19
d7f9179

Highlights

create-astro-fleet CLI (#8)

Scaffold a new fleet or add a site to an existing one without cloning the repo:

bunx create-astro-fleet              # new fleet, interactive
bunx create-astro-fleet add acme.com saas   # add a site

Two subcommands (init + add), interactive prompts via @clack/prompts, giget-based template fetch, non-interactive flags (--domain, --preset, --template, --keep-demos). Cross-platform — replaces the bash-only new-site.sh for first-time users (the script stays for compatibility).

Keystatic CMS in the Meridian demo (#8)

Meridian now ships a working editable insights content collection with a Keystatic admin UI at /keystatic in dev. Content is Markdoc stored in git; production builds stay fully static. New docs/adding-a-cms.md covers the Meridian pattern, how to replicate it on any other site, the monorepo access-control caveat, and alternatives (Sanity, Directus, Decap, Payload, Tina) with guidance on when each is the right pick.

SEO hardening across the shared layer (#9)

packages/shared-ui/src/components/SEOHead.astro:

  • Emits full robots directives (max-snippet:-1, max-image-preview:large, max-video-preview:-1) on indexable pages
  • Suppresses canonical when noindex=true
  • og:image now includes width/height/alt; only emits when an image is actually provided (no more broken fallback)
  • twitter:card defaults to summary_large_image when an image is present
  • Drops meta keywords emission (prop retained with @deprecated)
  • Declares <link rel="icon" href="/favicon.svg">
  • Auto-emits a linked WebSite + Organization JSON-LD @graph from siteName, Astro.site, logoSrc, and socialLinks (as sameAs). User-supplied structuredData merges into the same graph so @id refs resolve. Opt out per-page with skipAutoJsonLd.
  • New pass-through props on BaseLayout: ogImageAlt, ogType, twitterHandle, noindex, rssUrl, skipAutoJsonLd

Site-level SEO infra (#9)

  • public/_headers on every site: 1-year immutable cache on /_astro/* (covers JS, CSS, and fonts under /_astro/fonts/); No-Vary-Search on / to strip UTM + ad-click params from the CDN cache key
  • RSS feed for Meridian insights at /rss.xml, advertised via <link rel="alternate" type="application/rss+xml">
  • Insight detail pages emit og:type=article

New docs

  • docs/adding-a-cms.md — Keystatic pattern + alternatives
  • docs/seo-recipes.md — optional P2 add-ons (per-page OG images with Satori+Sharp, git-based sitemap lastmod, llms.txt, markdown alternates, IndexNow, FuzzyRedirect, view transitions, schema endpoints, NLWeb, build-time validation)

CI fix

Removed duplicate .github/workflows/build.yml that was running in parallel with ci.yml without setting up Node 22. It always failed (Astro 6 requires Node ≥ 22.12) while ci.yml passed, producing the "fails first, works second" flakiness on every commit.

Breaking changes

None.

Deprecations

  • keywords prop on BaseLayout / SEOHead is accepted but no longer emitted as <meta name="keywords"> — ignored by all major engines. Safe to remove from call sites at your leisure.

Upgrade notes

  • bun install picks up the new create-astro-fleet package and Meridian's Keystatic deps.
  • Auto JSON-LD is on by default. Pages that emit a full custom @graph can opt out with skipAutoJsonLd.
  • Existing call sites passing structuredData continue to work — their nodes now merge into the auto-generated graph (with @context stripped on merge to avoid duplication).
  • _headers ships per-site. First deploy after upgrade will serve the immutable cache headers; no action required on Cloudflare Pages.

What's Changed

  • feat: create-astro-fleet CLI + Keystatic CMS example in Meridian (#8)
  • feat: SEO hardening — P0 meta fixes, auto JSON-LD, _headers, RSS, recipes docs (#9)

Full Changelog: v2.1.0...v2.2.0