Sharing the course catalog
Share /Store/Catalog/Catalog?category=Education to open the Store's course selection.
Its preview says Courses, describes hands-on learning, and uses the dedicated
1200 × 630 image at /api/content/Edu/content/courses-og-card.png.
How the preview resolves
The initial anonymous HTML response is produced by SeoHead in the portal GUI.
The Education catalog route (including /Store/Catalog/area/Catalog?category=Education)
selects Edu/Courses as its metadata node through CourseCatalogSeo. The existing
SeoResolver still checks anonymous access before returning any metadata. An absent or
private metadata node yields the generic head. The canonical and og:url remain the
filtered Store URL, so sharing does not lose the Education selection.
Edu/Courses.json owns the title, description, icon and content.ogImage;
CourseCatalogContent.OgImage preserves the image when content is materialized as a
typed record. The image is a file in Edu's root content collection, hence the URL's
/api/content/Edu/content/ prefix. Edu's publicSegments explicitly includes Courses.
The original URL resolved to the Store/Catalog NodeType, since the resolver received
only the path and never the category query. On 2026-09-09 the anonymous response advertised
og:title=Catalog, an internal NodeType description, og:url=/Store/Catalog, and
og:image=/api/og/Store/Catalog. Replacing Edu's existing module image alone could not
fix that: the request never resolved Edu at all. The module's own og-card.png continues
to describe the course-building infrastructure.
Verification and delivery
Fetch the filtered URL anonymously and inspect its initial head: title Courses, the
learner-facing description, the filtered canonical URL, and the absolute image URL above.
Fetch the image without authentication and verify HTTP 200, image/png, and 1200 × 630
dimensions. Other Store categories must keep their existing metadata resolution.
The change requires both the Edu package (metadata, content record and image) and the portal GUI module (route selection). A local file change does not update the live portal; publish both through the normal release pipeline. Chat applications may retain an older preview until they scrape the link again.
CourseCatalogSeoRenderingTest renders the anonymous initial head on a real local mesh and
asserts the resolved course node, description, filtered canonical and Open Graph URL, and
absolute image URL. A non-Education category asserts the ordinary catalog metadata.