Depends on Phase 2 (classifier + event_tags). Delivers a complete, shippable personalized feed with no AI — keyword ranking only.
Build steps
- Write
server/lib/scoring.ts — combines interest match, popularity (save/rsvp/view/click counts), timeliness, and featured boost; apply a seen penalty per user (optional, see notes)
- Implement feed endpoints:
GET /feed/home — Upcoming section + one carousel per bucket the user has selected
GET /feed/explore — All events ranked by popularity + timeliness
GET /feed/bucket/:id — Events for a single bucket, personalized rank
- Wire Home and Explore screens in the app to the new endpoints
- Delete stale client-side taxonomy logic in
home.tsx
Notes
- This is the early-launch cut line — a complete feed ships here with no AI dependency
- Seen penalty is weak signal until scroll-level impressions are tracked; treat as optional for now
- Test: logged-in user sees personalized carousels, ranked correctly
Depends on Phase 2 (classifier + event_tags). Delivers a complete, shippable personalized feed with no AI — keyword ranking only.
Build steps
server/lib/scoring.ts— combines interest match, popularity (save/rsvp/view/click counts), timeliness, and featured boost; apply a seen penalty per user (optional, see notes)GET /feed/home— Upcoming section + one carousel per bucket the user has selectedGET /feed/explore— All events ranked by popularity + timelinessGET /feed/bucket/:id— Events for a single bucket, personalized rankhome.tsxNotes