Closes #26. Most of this was already shipped by 83e455f "feat: launch metadata, favicons, preview cards, privacy and terms": the favicons and apple-touch-icon, the theme-color pair with its media attributes, the 1200x630 social card, and the SoftwareApplication JSON-LD block. This is the remainder.
The structured data restated what the repo already knows
operatingSystem was the literal 'macOS 13 or later' while release.json carries minimumMacOS, and there was no softwareVersion at all. So a search result could quote a floor the download page had moved off, and could never name the version people can actually get. Both derive from release.json now, which the release command writes and CI checks, so they cannot drift.
sameAs points at the repository, which is the one link that tells a search engine the site and the repo are the same project.
What the live site says today, versus after this:
operatingSystem: macOS 13 or later -> macOS 13 or later (same, now derived)
softwareVersion: (absent) -> 0.1.4
sameAs: null -> ["https://github.com/stacksjs/uplink"]Two heads were missing what the shared one has
404.stx had color-scheme and no theme-color; dashboard.stx had neither. A page with its own head is still the same site to the browser chrome around it. dashboard.stx is a fifth head the issue never saw, since it predates the partial.
30 KB of art for error pages this app does not serve
public/svgs/{403,404,500,503}.svg are Laravel 5.7 illustrations, referenced only by the framework's default error views, which config/ui.ts turns off. This app answers a miss with its own 404.stx. Their README says outright that the built-in page inlines its own copies, so neither the files nor the README describe anything here. Deleted.
Two things worth knowing for whoever checks this next
stx build is not a valid way to verify the head. The issue's one untested acceptance criterion is that the rendered ld+json parses. I rendered the views with stx build and found no ld+json, no canonical and no og:image — then checked main without my change and got the same, then checked the live site and found all three present and correct. The SSG path does not resolve the partial's full scope; production does. Verify against the deployed page, not a local render.
stx typecheck reports 7 errors on these files, all pre-existing. Six are site-head.stx reading path, noindex, title and description from the including page's scope, which a standalone check of a partial cannot see. The seventh is an unrelated index-type warning in dashboard.stx. I confirmed main's copies produce exactly the same 7. Nothing in CI runs typecheck:views, so this has never been visible.
Two of the issue's requirements are obsolete and I did not follow them
"No web manifest." One exists, and its objection was that a manifest is a fourth file to hand-maintain. It is generated by buddy generate:images from config/images.ts, so it cannot drift.
"offers at price 0 in USD." Uplink is paid now, and the real Offers come from the same PLANS the pricing page renders. Reverting to a free offer would be a regression.
Verification
- the live
ld+jsonparses, and the derived values are checked above - 163 unit tests,
buddy lintandbuddy typecheckclean
🤖 Generated with Claude Code