Skip to content

Federation

Native plus federated. Same surface.

Federation isn't a bridge — it's a feature. Eternia's posts, profiles, and news mix native and federated identities in one feed, with one resolver and one cache.

Principles

  1. 01

    Federation is a feature, not a bridge

    Native and federated posts sit in the same feed. The renderer doesn't care which is which.

  2. 02

    Profile resolver is shared

    All Bluesky decentralized-identifier reads go through one resolver with TTL cache, dedup, rate-limit.

  3. 03

    No direct AppView calls from widgets

    Federation logic lives in services; the UI consumes resolved entities only.

  4. 04

    RSS and Atom are first-class

    News federation uses the same mental model — sources, hydration, caching.

  5. 05

    Hydration is staged

    Incomplete federated posts are hydrated on demand. The feed never blocks on AppView availability.

ResolvedProfile shape

TypeScript
type ResolvedProfile = {
  publicId: string;          // native publicId or Bluesky decentralized id
  source: 'native' | 'bsky';
  handle: string | null;
  displayName: string | null;
  avatar: { uri: string } | null;
  followers?: number;
  hydrated: 'full' | 'partial' | 'pending';
};

Shape illustrative; canonical contract lives in the launcher's docs/

Programs that plug into this