Skip to content

Session handover — 2026-07-05

SEO fundamentals slice for the CMS path, then swapped the deployed demo to waterfordcountypainters to prove the fix live. Work on master.

Motivation: side-by-side vs live showed the emdash build had page titles but blank meta descriptions and no structured data — the live Wix sites carry both. Not a Fable-worthy problem; a plumbing gap. Fixed it.

What changed — where to look

SEO extraction + render (the slice). Four files, all this session's commit:

  • lib/cms/seed-from-build.js — description now falls back meta[name=description]og:description (Wix uses the OG tag; that was the blank-meta bug). New extractBusiness() flattens the crawled LocalBusiness JSON-LD into an fcr.business global block.
  • apps/cms/src/layouts/Base.astro — head brought to parity with the per-site emit.js (og:type/og:site_name/twitter:*, og:image fallback) and regenerates clean on-domain LocalBusiness JSON-LD from the fcr.business block (not the stale crawled one).
  • apps/cms/src/plugins/marketing-blocks/index.ts — registered fcr.business (Site category) so the globals admin accepts/edits NAP.
  • apps/cms/src/pages/index.astrobug found on deploy: the static homepage route hardcoded the emdash scaffold's demo description and never read seo_description. Now reads it like [slug].astro.

See the three new known-patterns.md entries (2026-07-05): Wix og:description tag, regenerate-JSON-LD-from-fields, and static-route template-SEO leftovers.

Demo swapped garvanbay → wfpainters. Full tenant swap on the deployed demo to show SEO live. Details + restore recipe in known-issues.md "CMS demo swapped garvanbay → wfpainters (2026-07-05)". Garvanbay is recoverable from git + a D1 backup in apps/cms/scripts/.tmp/backup/.

Deployed state

  • Worker replatform-emdash-demo (personal cathaldempsey account), emdash.dcathal.org. Current version d45fc179.
  • Tenant: waterfordcountypainters (D1 reseeded; 95 images uploaded to R2, 0 failed).
  • wrangler is authed to the personal account, not FCR Media Ltd — switch back (wrangler login) when done with the demo.

Verified (live)

Homepage + subpages on emdash.dcathal.org:

  • meta description populated on all pages (was 0/N before) — home and subpages carry real copy.
  • og:type/title/description/url/site_name + twitter:card/title/ description present.
  • LocalBusiness JSON-LD: on-domain url, name, telephone, PostalAddress.

Known gaps opened (see known-issues.md, all 2026-07-05)

  1. Per-site emit.js hardcodes noindex,nofollow — launch blocker for the long-tail static path (CMS path unaffected). Reopen trigger: any production launch of a per-site build.
  2. Logo + Wix transform-suffixed image paths don't migrate to R2 — so og:image/JSON-LD image 404 and some body images are broken on the wfpainters demo. Image-path-normalisation gap in transform-seed-images.mjs, orthogonal to SEO.

Next priorities

  1. Fix the image basename deriver (#2 above) so previews + images resolve — small, own slice; then re-transform + reseed + deploy.
  2. Env-gate the emit.js noindex before any per-site launch (#1).
  3. Prior pt4 priorities still stand: repeater-item image fields, contact form real submission, access-policy tightening, seed-vs-admin source-of-truth policy.