Skip to content

launch: blog — make /blog discoverable (nav link, dynamic sitemap, external validators, announcement) #2975

@matheuspoleza

Description

@matheuspoleza

Umbrella tracking issue for the "launch" work needed to take the blog from shipped to discoverable. #2960 merged the blog as additive routes under packages/landing/blog, /blog/<slug>, /blog/feed.xml, dynamic llms.txt all live today — but the feature is intentionally hidden from the main site's navigation and sitemap.

Without these steps the blog is live but only reachable by someone who already knows the URL.

Scope

Visibility from the main site

  • Nav link. Add Blog to packages/landing/src/components/nav.tsx (and a matching link in footer.tsx if that's the pattern). Pick placement between existing links.
  • Dynamic sitemap entries. Either extend the static packages/landing/public/sitemap.xml with /blog + each post slug, or move sitemap generation into the worker so it stays in sync with published posts. The dynamic worker approach is preferred — tracked alongside blog: scope deferrals but duplicated here because it's launch-critical (Google won't index what it can't find).

External validation

All require a preview-deploy URL, which doesn't exist yet.

  • W3C RSS validatorvalidator.w3.org/feed against /blog/feed.xml
  • Google Rich Results — test the BlogPosting JSON-LD once SSR head injection lands (blocked by the SSR <head> item in blog: scope deferrals)
  • Twitter Card validator — requires per-post OG PNG or at minimum the shared /og.png being linked correctly
  • LinkedIn Post Inspector — same as Twitter
  • Lighthouse audit on /blog and /blog/blog-runs-on-vertz — capture baseline perf / SEO / accessibility scores

Announcement

  • Build-in-public thread — draft already written at ~/vertz-dev/insights/2960-blog-runs-on-vertz.md; post once nav link + sitemap are live and the first post has a permanent URL someone can bookmark.
  • Pick an announcement channel strategy — single Twitter thread, or thread + Hacker News + Discord?

Related

  • #2947 — parent blog feature
  • #2960 — shipping PR
  • plans/post-implementation-reviews/2947-blog.md — retro (section "What went wrong" docs: compiler design plan #7: "Blog is live but unlaunchable as-shipped")

Acceptance

Launch is done when:

  • Someone landing on vertz.dev can click through to /blog without knowing the URL
  • Google can discover every post via sitemap
  • External validators confirm RSS, JSON-LD, and social previews render correctly
  • The build-in-public thread is posted

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1High — should do this sprintenhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions