~ 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.