# ECP-0068: Iroh Control To Web Directory Bridge

Status: Implemented

## Decision

Add a first-class bridge from iroh control gossip to the public website directory:

1. `ec-node control-bridge-web`:
- subscribes to control announcements on `every.channel/control/v1`,
- selects relay transports (`relay_url` + `broadcast_name` + `track_name`),
- upserts them into the website API (`/api/stream-upsert`).

2. Extend the Cloudflare Worker API with:
- `POST /api/stream-upsert` (optional bearer token auth),
- `GET /api/public-streams` (read-only list for browsers).

3. Extend the web watcher UI to render `Live Now` from `/api/public-streams`, with one-click watch.

## Motivation

The site currently requires manual broadcast names even when streams are already announced over iroh control gossip. This bridge makes `every.channel` discoverable from published control state and gives browser users a single “open site and click watch” flow.

## Scope

In scope:
- Control gossip -> web directory bridge command.
- Worker storage/API for public stream entries.
- Browser UI list and refresh loop.
- Control gossip join behavior updated to work without bootstrap peers (`subscribe` without blocking join).

Out of scope:
- Browser-native iroh direct playback.
- Signed/authenticated control announcements.
- Replacing relay playback with direct iroh in browsers.

## Alternatives considered

- Keep manual stream naming/link entry on the website. Rejected because it blocks one-click discovery.
- Bridge directly from browser clients instead of a node command. Rejected because browser trust/availability constraints are higher.

## Rollout / Reversibility

- Additive change; existing `/api/directory` and watch-by-link behavior remain intact.
- Bridge can be disabled by stopping `control-bridge-web`.
- Public listing auth can be tightened by setting `EC_STREAM_UPSERT_TOKEN`.
