Bosca / Feeds

Serving & subscriptions

Following for everyone, For-you for each one

Feeds owns the serving surface and stays out of the ranking business — the chronological feed is assembled from what a reader follows, and the personalized feed is ranked by the Recommendations subsystem.

Subscriptions

Follow a source, own a source

A subscription links a reader's profile to a source. Together with the sources they own outright, it defines what their Following feed contains.

  • subscribe(sourceId) is idempotent — calling it twice is safe and returns the subscribed source either way.
  • unsubscribe(sourceId) is honest — it returns false when the caller wasn't subscribed.
  • mySubscriptions lists the caller's subscribed sources, newest subscription first; mySources lists the ones they own.
  • User-owned sources contribute to their owner's feed automatically — no self-subscription needed.
subscribe
mutation Subscribe($sourceId: UUID!) {
  feeds {
    mySubscriptions {
      subscribe(sourceId: $sourceId) {
        id
        name
      }
    }
  }
}

Serving surfaces

Three feeds, one content model

Every surface returns items as content records — so a client reads the normalized body, the attributes, and the featured-image relationship the same way it reads any other content.

  • myFeed — the assembled Following feed: items from subscribed and owned sources, newest first.
  • forYou — the personalized feed, ranked by the Recommendations subsystem for this reader.
  • recommended(metadataId) — item-context recommendations for a given article, re-ranked for the caller.
  • Ordering is preserved through resolution — render items in the order the server returns them; items whose content no longer exists are dropped.
read the feeds
query MyFeeds {
  feeds {
    myFeed(offset: 0, limit: 25) {
      id name attributes
    }
    forYou(offset: 0, limit: 25) {
      id name attributes
    }
  }
}

The ranking seam

Feeds serves, Recommendations ranks

The boundary is deliberate: ingested items become recommendable through the standard content lifecycle events, and the personalized surfaces delegate to the recommendations service.

  • forYou and recommended hand ranking to the Recommendations subsystem, then resolve the resulting ids back to content.
  • There's no feeds-specific wiring to configure — recommendations reacts to the same lifecycle events all content emits.
  • For inspection, feeds.items(sourceId) lists a source's ingested items newest-first, gated on the feeds admin group.
  • Studio's Preview page is a reader over that surface — pick a source, browse its items, and see each stored body rendered exactly as it will be served.
connected
myFeed → subscribed + owned, newest first
forYou → ranked by Recommendations
recommended(id) → related, re-ranked
Studio → Feeds → Preview reader

Keep exploring

More on Feeds