# ECP-0038: Share Links (every.channel://watch) and UI Share Controls

Status: Draft

## Problem

Sharing currently exposes a raw MoQ bundle (endpoint addr JSON, broadcast, track) which is copy/paste friendly for developers but awkward for regular users. We also need explicit UI controls for:

- Sharing via a single link.
- Sharing to nearby nodes (mDNS).
- Sharing publicly (DHT address lookup), while still requiring explicit gossip bootstrap peers.

## Decision

Introduce a compact share link format:

`every.channel://watch?...`

and add UI affordances to copy and consume this link.

The link is a convenience wrapper around existing MoQ parameters. No new trust model is introduced here.

## Link Format (v1)

Scheme and path:

- `every.channel://watch`

Query parameters:

- `remote` (required): iroh `EndpointAddr` JSON string (or id-only string when discovery is enabled).
- `broadcast` (required): MoQ broadcast name.
- `track` (optional): MoQ track name (default remains `chunks` in the app).
- `stream_id` (optional): key id override (rare; for debugging).
- `secret` (optional): network secret hex (only when the publisher used one).
- `discovery` (optional): comma-separated discovery modes, currently `mdns`, `dht`, `dns`.

## UI (user-facing language)

- Share card includes:
  - Copyable share link.
  - Copyable node id.
- Viewer panel exposes:
  - "Nearby (same Wi-Fi)"
  - "Public (internet)"
  - "Show in directory"
  - optional "directory contacts" and "sharing key"
- "Watch a link" accepts a share link and can parse it to fill hidden advanced fields.

## Consequences

- Sharing becomes one-string shareable without asking recipients to understand the underlying bundle structure.
- Public announcements still require bootstrap peers; DHT only provides address lookup.

## Follow-ups

- Add an explicit public bootstrap peer list mechanism (governance-controlled).
- Add optional signing of share links (identity binding) once stream signing is enforced.
