feat(seo): public crawlable snapshots, social cards, oEmbed & sitemap#36
Merged
Conversation
Add an opt-in `?with_user=true` query param to the member list and search endpoints. When set, each member carries its public `user` object, resolved for the whole page in a single batched query, so clients no longer have to fetch users one at a time after listing members. Default behavior is unchanged (no embedded `user`), and the embedded object is the PublicUser shape — sensitive fields (is_admin, mfa_enabled, disabled, flags) are stripped. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Server-render public spaces, channels, and forum posts for crawlers (the Flutter web client is CanvasKit and invisible to bots), and emit rich social-card metadata when links are pasted into chat/social apps. - Per-server sitemap.xml + robots.txt enumerating public spaces/channels/posts - Full meta tags: description, Open Graph, Twitter Card with banner→splash→icon image fallback, canonical, and article published/modified/author on posts - Structured data: DiscussionForumPosting, BreadcrumbList, CollectionPage - oEmbed provider endpoint (/oembed) + discovery links on every page - Gating: any non-hidden channel in a public space is crawlable - docs/seo.md documents URL structure, gating, meta, structured data, oEmbed Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
5 tasks
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
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.
Summary
daccord://redirect landing page. Gating is "public space = public": any non-hidden channel in a public space is rendered.<meta name="description">, Open Graph + Twitter Card with abanner → splash → iconimage fallback, absolute canonical/og:url, andarticle:published_time/modified_time/authoron posts.DiscussionForumPosting,BreadcrumbList,CollectionPage./sitemap.xml,/robots.txt, and an/oembed?url=...&format=jsonprovider with<link rel="alternate" ... +oembed>discovery on every page.docs/seo.mddocuments URL structure, gating, meta tags, structured data, oEmbed, and the client share-link mapping.Notes for reviewers
feat(members): embed user objectscommit; the SEO work is thefeat(seo): ...commit on top.url_seg/url_unseground-trip,cdn_urlnormalisation,space_social_imagefallback order,twitter_card,xml_escape,iso_datetime,resolve_post_title, hidden-channel exclusion) — 10 tests pass.Test plan
cargo clippy --all-targetsis cleancargo test --lib seo::passescurl -A Googlebot /s/{slug}/{channel}/{post}returns an HTML snapshot with OG/Twitter/JSON-LDcurl /sitemap.xml,/robots.txt,/oembed?url=...&format=jsonreturn expected output🤖 Generated with Claude Code