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
- 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.
- 02
Profile resolver is shared
All Bluesky decentralized-identifier reads go through one resolver with TTL cache, dedup, rate-limit.
- 03
No direct AppView calls from widgets
Federation logic lives in services; the UI consumes resolved entities only.
- 04
RSS and Atom are first-class
News federation uses the same mental model — sources, hydration, caching.
- 05
Hydration is staged
Incomplete federated posts are hydrated on demand. The feed never blocks on AppView availability.
ResolvedProfile shape
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/