How each person's feed is put together — with no AI model in the way.
When someone opens the app, something has to decide which thirty cards they see, in what order. The rule here is the same one from the map page: AI thinks slowly, code serves fast. All the intelligence — understanding each person's taste, planning for festivals, deciding what to explore — runs overnight in the background. What actually answers the phone in the morning is one small, ordinary scoring function: it adds up a handful of understandable terms per card, pushes apart cards that look alike, and returns the list. No model call, no black box, on a path you can read top to bottom.
The three steps.
Read left to right, slowest to fastest. Step 1 runs once a night and does everything expensive. Step 2 turns that thinking into a ready-made list per person. Step 3 is all that runs when the app is opened — and it's the same scoring function you can drag around in the Feed Lab.
The brain
Overnight, the system builds the day's candidate pools — what's fresh, what's rare, what festival is coming and how hard to push it — and, per active user, an LLM reads their recent behaviour and writes a short plain-language profile of their taste (a person can read it in the console) plus a few search phrases to fetch new candidates with. Every model call in the whole feed lives inside this step.
A ready list per person
Each person's taste is kept as a handful of interest points on the same similarity map the images live in — a grandmother who loves Shiva and also sends her grandson Hanuman cards is two points, not a mushy average. From those, the system leaves a ready-made list of ~50 card ids waiting in fast storage. Cost scales with active users, nothing else.
Filter + score
The live path takes the ready list, drops what she's already seen, scores each card on plain terms — is it good, is it new to her, is today its festival, does it match her taste — adds them up with the current recipe's weights, and pushes near-duplicates apart. The identical function runs on the server, in the Feed Lab on this site, and on the phone.
The objective, stated plainly.
Share-intent, not watch-time
The north star is forwards — a light, safe share-intent signal — not minutes. Appointment mechanics (the morning batch, a designed stop point), no compulsion loops.
Amplify the recipe, not the dish
Novelty and rarity rank; over-circulation costs score. What spreads is the pattern (a deity × language × mood that works), not a single viral card.
One embedding, LLMs offline
Server-side personalisation on one multimodal index (Cohere embed-v4); the LLM writes probes, profiles and policy offline and is never in the request path.
Policy as an artifact
FeedPolicy is a versioned document (draft → staging → production) edited in the Lab; serving reads the production label. The Lab's simulator, the serving Worker and the phone run the identical function.
Where the feed's inputs come from.
Everything step 1 thinks about — what she lingers on, what she skips, what actually gets forwarded — is measured behaviour. The next zoom follows that data: what gets collected, how it flows back into this page's brain every night, and where the privacy lines are drawn.