Skip to content

Recommendation Feed

Status: Shipped

The recommendation feed is the primary discovery surface for the Featured page. It presents a sectioned discovery layout built on the current interim recommendation model (see model.md):

  • Recommended: personalized or fallback-ranked feed, paginated
  • Popular: short-list preview of what is getting the most attention
  • Upcoming: short-list preview of near-term opportunities

Users can filter each section by type.

Returns the Recommended feed section.

ParamTypeDefaultDescription
limitInt20Number of items to return
offsetInt0Pagination offset
typeEventType?nullFilter by EVENT or GIG. Null returns both (blended)
searchString?nullNon-semantic keyword filter applied before pagination

Returns { items, meta }, where items is an array of Event objects ranked by recommendation score. meta includes total, limit, offset, and rankingMode.

rankingMode values:

  • PERSONALIZED
  • POPULARITY_FALLBACK

Returns the Popular Featured preview section. Supports limit, offset, and type.

Supports limit, offset, type, and search.

Response shape: { items, meta }, where meta includes total, limit, and offset.

Returns the Upcoming Featured preview section. Supports limit, offset, and type.

Response shape: { items, meta }, where meta includes total, limit, and offset.

When no type filter is applied, events and gigs are ranked together in a single list by recommendation score. The model does not impose a fixed ratio between events and gigs.

When type=EVENT is specified, only events are returned. When type=GIG, only gigs. The ranking within the filtered set is still personalized.

For new users with no interactions and no interests, the feed falls back to a popularity-based ranking (events sorted by total interaction count, then by recency).

The Featured page may pass a keyword search query to the recommendation section endpoints. Keyword search is non-semantic and does not depend on embeddings. It narrows the Recommended, Popular, and Upcoming recommendation sections before pagination while preserving each section’s ranking model. The social Following lane is not part of keyword search because it is an activity feed rather than a recommendation endpoint.

The Featured page loads the three recommendation endpoints independently so the personalized feed, popularity preview, and upcoming preview can fail or update independently without collapsing into a single blended response.

GIVEN user A has interactions with both events and gigs
WHEN user A sends GET /recommendations
THEN the response contains a mix of events and gigs
AND items are ordered by personalized recommendation score
GIVEN user A sends GET /recommendations?type=EVENT
THEN the response contains only items with type EVENT
AND items are ordered by personalized recommendation score
GIVEN user A sends GET /recommendations?type=GIG
THEN the response contains only items with type GIG
GIVEN user A has 50 recommended items
WHEN user A sends GET /recommendations?limit=10&offset=20
THEN the response contains items 21-30
AND meta.total is 50
GIVEN user A has no interactions and no interests
WHEN user A sends GET /recommendations
THEN the response contains events sorted by popularity (interaction count) then recency
Section titled “S-FEED-11: Featured loads sectioned recommendation surfaces”
GIVEN the authenticated user opens Featured
WHEN the page loads recommendation data
THEN the page renders Recommended, Popular, and Upcoming sections
AND each section can be filtered by type without changing the underlying interim ranking model
Section titled “S-FEED-12: Featured keyword search narrows recommendation sections”
GIVEN the authenticated user is on Featured
WHEN the user enters a keyword search query
THEN Recommended, Popular, and Upcoming reload with the query
AND ranking, pagination, empty states, and error states remain scoped per section
AND the search does not use semantic embeddings

S-FEED-6: Cache hit [WIP — deferred to custom model phase]

Section titled “S-FEED-6: Cache hit [WIP — deferred to custom model phase]”
GIVEN user A's recommendations were computed within the cache TTL
WHEN user A sends GET /recommendations
THEN the response is served from cache

S-FEED-7: Cache invalidation on interaction [WIP — deferred to custom model phase]

Section titled “S-FEED-7: Cache invalidation on interaction [WIP — deferred to custom model phase]”
GIVEN user A's recommendations are cached
WHEN user A records a new interaction
THEN the cache is invalidated
AND the next GET /recommendations recomputes the ranking

See test-cases/recommendations/feed.md for the full test case registry (TC-FEED-001 through TC-FEED-016), including automated Featured-section coverage and manual UI verification.