chain-studio/assets/docs/federation.md
flemming-it d0cfa5df05
Some checks failed
Security / Security check (push) Failing after 2s
feat: federation panel + Dart SDK federation methods (0.70.0)
A new 'Föderation' destination (primary side) lists connected
satellites — name, region, version, wire version, advertised
capabilities — and adds them in one step: 'Add satellite' issues a
single-use bootstrap token bundled with the primary CA as a
ready-to-paste satellite config (the bundled CA makes the first
connect tamper-proof). Localized EN + DE, in-app help doc. Uses the
new HubService.listSatellites / issueSatelliteToken wrapping the
SDK's federation methods.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-06-13 14:16:07 +02:00

1.6 KiB

Federation

Federation lets one hub (the primary) run capabilities on another hub (a satellite) — for example to reach a GPU box or to keep data inside a specific location. A flow step opts in with an on: selector; everything else stays exactly like a local step.

This panel is the primary side: it shows the satellites currently connected and lets you enrol new ones.

Add a satellite

  1. Press Add satellite and give it a name (e.g. satellite-a).
  2. The hub issues a single-use bootstrap token and bundles its CA certificate. Copy the shown config into the satellite's config.yaml (one paste) and export the token as FAI_BOOTSTRAP_TOKEN.
  3. Start the satellite. It dials the primary, the CA pin makes the first connect tamper-proof, and the primary signs it a short-lived certificate. It then appears in this list.

How it stays secure

  • The satellite dials outbound — no inbound firewall change.
  • Every connection is mTLS. The first connect is verified against the bundled CA; later connects authenticate with the satellite's own certificate (no token needed).
  • The satellite resolves and runs the capability in its own sandbox — only inputs cross the wire, never code.
  • Each cross-hub call is recorded on both sides (dispatched_to), so the audit trail and replay determinism survive federation.

Using a satellite in a flow

Add an on: selector to a step:

- id: extract
  use: text.extract@^1
  on: region=berlin        # or pin=satellite-a, auto:healthiest, auto:lowest_rtt
  with:
    input: $inputs.doc