~ knotless Search/
↑↓ move↵ open⇧↵ all results

grain.social/grain

photography-focused photo sharing platform

grain.social
1 collaborator
0
2
44 lines · 1.8 KB Raw History

Suggested Follows Design

Goal: Show a "Suggested for you" card strip in the feed that recommends grain profiles based on the viewer's bsky follows.

Architecture: Sync app.bsky.graph.follow records via hatk, add an XRPC endpoint that cross-references bsky follows with grain profiles, and render a horizontal card strip in FeedList after the 5th gallery.

Data Layer

Sync bsky follows

Add repo:app.bsky.graph.follow to grainScopes in hatk.config.ts. This auto-syncs bsky follow records from the firehose into an app.bsky.graph.follow table.

XRPC: getSuggestedFollows

Endpoint: social.grain.unspecced.getSuggestedFollows

Parameters: actor (DID), limit (default 10)

Query logic:

  1. Find DIDs where: viewer bsky-follows them AND they have a grain profile AND viewer does NOT grain-follow them
  2. If fewer than limit results, backfill with other grain profiles the viewer doesn't follow (ordered by follower count descending)
  3. Exclude the viewer themselves

Returns: array of profile views (did, handle, displayName, description, avatar, followerCount).

UI Component

SuggestedFollows.svelte

Horizontal scrolling card strip:

  • Header: "Suggested for you"
  • Cards: ~170px wide, avatar (64px), display name, description (2-line clamp), existing FollowButton, dismiss X button
  • Dismiss: session-only (local state array), card removed with animation
  • Hides entirely when all cards dismissed or followed

FeedList integration

After the 5th GalleryCard, render <SuggestedFollows /> if viewer is authenticated. Component fetches its own data via tanstack query. Client-side insertion only — no server feed changes.

Seed data

Add bsky follow records so suggestions appear in dev: alice bsky-follows bob/carol, bob bsky-follows alice. Remove some grain follows so there are suggestions to show.