Repository navigation
seo: add structured data, social cards and the machine-readable surfaces - #10
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
ElianCodes
force-pushed
the
seo/structured-data-and-social-cards
branch
from
September 26, 2026 20:23
78f160f to
eb3930a
Compare
The marketing site next door publishes a full JSON-LD graph, per-page OG images, a robots.txt with per-bot allows, and an api-catalog that already names docs.getcoral.dev as its service-doc. This site published none of it and never pointed back. Ported from getcoral.dev@main rather than reinvented. What was missing, verified against production before this change: - robots.txt returned 404, so no Sitemap: directive was published anywhere and no crawler directives existed in either direction. - No JSON-LD on any page. - No og:image, while every page shipped twitter:card=summary_large_image — so every share rendered as a blank card. - llms-full.txt 404'd, and llms.txt linked to the *marketing* domain's copy. Added: - src/lib/site.ts — URLs, names and sameAs in one place. Nothing hardcodes a domain now. - src/lib/schema.ts — Organization, WebSite, TechArticle, BreadcrumbList and SoftwareApplication in a single @graph. The Organization and WebSite @ids deliberately point at getcoral.dev so both hosts resolve to one entity rather than two that share a name. No aggregateRating: Google's software rich result effectively requires one, Coral has no real ratings, and inventing them is a manual action. - src/lib/modules.ts — the per-module facts the graph and cards need, including the Shipping/Early/Scaffold status, so a model reading this site cannot present a scaffold as a finished product. - src/components/Head.astro — Starlight has no head hook configured and no component overrides; this is the seam. Also moves the Google Fonts @import out of styles.css, where it blocked render, into a preconnect plus link. - One 1200x630 OG card per page, rasterised at build with sharp, which was already a dependency. The wrap now marks truncation with an ellipsis — documentation descriptions run longer than the marketing taglines this started as, and a card stopping mid-sentence reads as broken. - llms-full.txt, a reciprocal .well-known/api-catalog, and a robots.txt whose Content-Signal sits inside its User-agent group, before Sitemap. - The 404 page is now noindex and emits no graph — it was claiming to be a TechArticle about something. Also replaces the favicon, which was still Astro's stock sparkle, with the Coral mark, and drops the unused houston.webp.
ElianCodes
force-pushed
the
seo/structured-data-and-social-cards
branch
from
September 26, 2026 20:33
eb3930a to
1a5b19d
Compare
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
2 of 3. Stacked on #9 — review that first; this diff is against it, not main.
getcoral.dev@mainalready has all of this. It also publishes a.well-known/api-catalogthat namesdocs.getcoral.devas itsservice-doc— and nothing here ever pointed back. This is a port, not aninvention.
What was missing
Verified against production before the change:
robots.txtContent-Signal@graphog:imagetwitter:card=summary_large_imagellms-full.txtapi-catalogservice-docThe
og:imageone is the quiet cost: every page declared a large-image cardwith no image behind it, so every share anywhere rendered blank.
Added
src/lib/site.ts— URLs, names,sameAs. Nothing hardcodes a domain now.src/lib/schema.ts—Organization,WebSite,TechArticle,BreadcrumbList,SoftwareApplicationin one@graph. TheOrganizationand
WebSite@ids deliberately point atgetcoral.dev, so a crawlerresolves both hosts to one entity rather than two sharing a name.
No
aggregateRating: Google's software rich result effectively requires one,Coral has no real ratings, and inventing them is a manual action.
src/lib/modules.ts— the per-module facts the graph and cards need,carrying the Shipping/Early/Scaffold status from docs: describe the code that actually ships #9 through into JSON-LD and
llms.txt, so a model reading this site cannot present a scaffold asfinished.
src/components/Head.astro— Starlight had noheadhook configured andno component overrides; this is the seam. It also moves the Google Fonts
@importout ofstyles.css, where it blocked render, into a preconnect.sharp(already a dependency — nosatori, no new packages). The text wrap now marks truncation with an ellipsis:
docs descriptions run longer than the marketing taglines this started as, and
a card stopping mid-sentence reads as broken rather than abbreviated.
robots.txt,llms-full.txt, reciprocal.well-known/api-catalog,and
llms.txtpointed at its own domain instead of the marketing site's.noindexand emits no graph. It was claiming to be aTechArticleabout something.plus the icon set and a manifest. Dropped the unused
houston.webp.Verification
pnpm buildclean.dist/containsrobots.txt,llms-full.txt,.well-known/api-catalogand 17og.png.application/ld+jsonblock,og:imagepresent,checked by parsing all 18 built HTML files.
og.pngor/404leaked into it.