0.32.0: profile pages search engines can read #75

Merged
backmeupplz merged 1 commit from seo-profiles into main 2026-10-28 04:43:38 +00:00
Owner

Search Console (last 24 h): 2,572 impressions, 20 clicks (0.8% CTR), avg position 10.3, nearly all on /u/ pages, which served a generic image, a raw bio as description and an empty #app.

  • Head: title <Name> (@user) on Farcaster · Quilcast; description/og/twitter = bio + follower count + "Read @user's latest casts on Quilcast." (≤160, cut between words); og:type profile; og/twitter image = new 1200×630 profile card /og/u/<fid>.png (rendered with resvg like cast cards, cached, rate-limited); ProfilePage + Person JSON-LD (alternateName, identifier, description, image, sameAs farcaster.xyz + verified X, follower/following counters). Canonical goes to /u/<fname> (so /u/<fid> and case variants collapse).
  • Body: profile header + latest 10 casts (date + link to /c/) as plain HTML inside #app using the app's own classes; app.tsx clears it in the same frame it first renders (Preact 11 left it in place otherwise). Local A/B Lighthouse on /u/dwr: same performance score with and without it (LCP there is a lazy cast image from the app, pre-existing), CLS 0.058 both.
  • Caching: profile + casts kept 10 min server-side (misses too), failures not cached and fall back to the plain app.
  • 404 for unknown names (by-username 404 + no exact search hit, or empty FID); noindex on /u/x/following|followers, taken-down FIDs (removed.json) and nameless accounts. No Lumen, no private data (mutes stay per-account).
  • No profile sitemap (no cheap source for most-followed accounts).
  • Tests: server test for head/JSON-LD/body/card/404/noindex, unit test for description clipping.

🤖 Generated with Claude Code

Search Console (last 24 h): 2,572 impressions, 20 clicks (0.8% CTR), avg position 10.3, nearly all on /u/<username> pages, which served a generic image, a raw bio as description and an empty #app. - **Head:** title `<Name> (@user) on Farcaster · Quilcast`; description/og/twitter = bio + follower count + "Read @user's latest casts on Quilcast." (≤160, cut between words); og:type profile; og/twitter image = new 1200×630 profile card `/og/u/<fid>.png` (rendered with resvg like cast cards, cached, rate-limited); ProfilePage + Person JSON-LD (alternateName, identifier, description, image, sameAs farcaster.xyz + verified X, follower/following counters). Canonical goes to `/u/<fname>` (so `/u/<fid>` and case variants collapse). - **Body:** profile header + latest 10 casts (date + link to /c/<hash>) as plain HTML inside #app using the app's own classes; `app.tsx` clears it in the same frame it first renders (Preact 11 left it in place otherwise). Local A/B Lighthouse on /u/dwr: same performance score with and without it (LCP there is a lazy cast image from the app, pre-existing), CLS 0.058 both. - **Caching:** profile + casts kept 10 min server-side (misses too), failures not cached and fall back to the plain app. - **404** for unknown names (by-username 404 + no exact search hit, or empty FID); **noindex** on /u/x/following|followers, taken-down FIDs (removed.json) and nameless accounts. No Lumen, no private data (mutes stay per-account). - No profile sitemap (no cheap source for most-followed accounts). - Tests: server test for head/JSON-LD/body/card/404/noindex, unit test for description clipping. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
0.32.0: profile pages search engines can read
All checks were successful
CI / check (pull_request) Successful in 33s
bda6ee7e57
/u/<name> now gets its own head and body from the server: the title says
Farcaster, the description is the bio plus followers within 160 characters,
the share image is a 1200x630 profile card (/og/u/<fid>.png), and a
ProfilePage + Person JSON-LD block. The profile header and latest ten casts
(each linking to its cast page) are plain HTML inside #app, which the app
clears in the same frame it first renders. Lookups are kept ten minutes,
unknown names are a 404, following/followers lists and taken-down or
nameless accounts are noindex.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
backmeupplz deleted branch seo-profiles 2026-10-28 04:43:38 +00:00
Sign in to join this conversation.
No description provided.