{{ environmentLabel }}
{{ controlStatusLabel }} Viability POC
Resilient live distribution
Validado em containers Smoke real com OBS 32.1.2

Lives que continuam quando um Relay falha.

Distribuição multi-relay, recuperação automática e evidência mensurável — sem refresh e sem fallback oculto.

Resilient live distribution.

30
Viewers ativos
3
Controlled Relays
10
Viewers recuperados
15/15
Distribuição após falha
H.264 + Opus
Mídia real por WHIP/WHEP

Como funciona

O Leap está validando se uma Live pode ser distribuída por múltiplos Relays, com recuperação automática e resultados mensuráveis, sem depender de um único distribuidor central.

01 · Publicação

O Streamer publica pelo OBS

A Live entra por WHIP em um Controlled Ingress — ponto único temporário, assumido como concessão da POC.

02 · Replicação

O Ingress replica antecipadamente

A mídia chega aos três Controlled Relays antes de qualquer Viewer pedir — a falha de um não interrompe a origem dos demais.

03 · Atribuição

Viewers em round-robin determinístico

Cada Viewer recebe um Relay e o endpoint WHEP anunciado pelo próprio Relay. O control plane decide; o frontend apresenta.

04 · Automatic Recovery

Se um Relay falha, a Live continua

Viewers afetados recebem nova atribuição — que exclui o Relay anterior — e criam outra sessão WebRTC automaticamente. Sem refresh. Breve interrupção, nunca escondida.

Um distribuidor central vs. Resilient Distribution

Comparação conceitual de arquitetura. O Leap ainda não mediu custo nem latência comparativa — nenhuma superioridade é afirmada antes da evidência.

Distribuição central única

  • Um distribuidor concentra todas as sessões de Viewers.
  • A falha do distribuidor interrompe todos ao mesmo tempo.
  • Recuperar exige restaurar o mesmo ponto central.

Resilient Distribution

  • Três Controlled Relays recebem a mídia antecipadamente.
  • A falha de um Relay afeta apenas os Viewers atribuídos a ele.
  • Reassignment automático move os afetados para Relays saudáveis — comprovado com 10 Viewers reais.
Validado

Evidência da POC, não promessa

Duas execuções completas do gate em containers: 1 Controlled Ingress, 3 Controlled Relays e 30 Viewers em processos independentes. Falha real por SIGKILL do relay-a (exit code 137).

Números abaixo são evidência observada da POC — não constituem SLO contratual.

Detecção da falha (expiração da lease)4.743–4.829 ms
10 novas atribuições após relay.expired0 ms
Recuperação de mídia após expiração49–69 ms
Recuperação end-to-end desde a falha4.792–4.899 ms

O que estamos medindo agora

A fase atual — Viability POC — expande a evidência antes de qualquer compromisso de produto.

Simulcast validado

Três RIDs medidos e troca na mesma sessão abaixo de dois segundos.

Matriz integral executada

10/13 na primeira passagem; duas causais passaram no rerun. Flutuação ainda aberta.

Perda de host validada

Processo e VM descartável foram interrompidos; o Viewer recuperou a mídia por outro Relay.

Playback resiliente validado

Gate OBS real de 5 min: recovery sem refresh após SIGKILL, em até 22 s.

Do POC à infraestrutura gerenciada

Se a tese for comprovada, o produto pretendido é Managed Streaming Infrastructure para plataformas de terceiros. Esta aplicação é a Reference Application: demonstra, testa e documenta a infraestrutura — sem tentar ser, agora, uma plataforma completa para creators.

Viability POC · atual Harden & Resilient Ingest Managed Streaming Infrastructure

Assistir

Reference Application · playback WHEP

{{ playbackContextLabel }} · live-01 · {{ sourceStatusText }} · {{ playbackModeText }} {{ playbackBadgeText }}

Conectando à Live…
{{ cs.label }}
A sessão é criada automaticamente — não é necessário atualizar a página.
Recuperando sua Live…
O Relay atual ficou indisponível. Estamos criando uma nova sessão automaticamente.
relay-a relay-b
{{ incidentEyebrow }}
{{ unavailableTitle }}
{{ unavailableDetail }}
{{ retryStatus }}
Conectividade geral {{ infraSummary }} {{ diagInternet.detail }}
Mídia ao vivo · direção do sinalH.264 + Opus · não passa pelo Control Plane
OBS
OBS
{{ mediaOBS.detail }}
Ingress
{{ mediaIngress.detail }}
{{ mediaRelay.label }}
{{ mediaRelay.detail }}
Você
{{ mediaViewer.detail }}
Controle e recuperação · sem mídiaheartbeat · assignment · recovery
Relays
heartbeat
Control Plane
{{ diagControl.detail }}
Player Leap
{{ diagSite.detail }}
LIVE Protegida por Resilient Distribution
{{ mediaSummary }}
Chat, follows e clips — Em breve, fora da Viability POC
{{ connectivityCode }}
{{ connectivityTitle }}
{{ connectivitySummary }}
Caminho atual da mídia
Viewer {{ curRelay }} Controlled Ingress OBS / Streamer
Detalhes da conexão Disponível via API
Viewer ID
{{ viewerId }}
Relay atual
{{ curRelay }}
Relay anterior
{{ prevRelay }}
Endpoint WHEP
{{ whepMaskedViewer }}
PeerConnection
{{ pcState }}
Codec de vídeo / áudio
H.264 / Opus
Atribuição em
{{ assignedAtViewer }}
Recuperações na sessão
{{ recoveriesCount }}
RTT
{{ liveRtt }}
Jitter
{{ liveJitter }}
Perda
{{ liveLoss }}
Frames descartados
{{ liveDropped }}
Bitrate recebido
{{ liveBitrate }}
Log da sessão
{{ l.at }}{{ l.txt }}

Control Room

Somente leitura Disponível via API

Estado real de OBS, Ingress, Relay e sessões WHEP no cenário A. Os cenários B/C continuam demonstrativos. Fault injection pertence ao test harness — esta interface observa, não opera.

Todos os Relays expiraram. Nenhum assignment é possível. Não existe fallback central oculto — Viewers permanecem em indisponibilidade explícita até um relay.healthy.
Control plane
{{ controlStatusLabel }}
Live
{{ liveStatus }}
Relays saudáveis
{{ healthyCount }}/{{ totalRelays }}
Viewers ativos
{{ assignedCount }}
Em recovery
{{ recoveringCount }}
Recuperações na sessão
{{ recoveredTotal }}
Distribuição por Relay
{{ distLabel }}
Sem fallback central último snapshot {{ snapshotAt }} {{ controlDataSourceLabel }}

Topologia viva

OBS
{{ obsPoint.label }}
{{ obsPoint.detail }}
WHIP ↑
Controlled
Ingress
{{ ingressPoint.detail }}
replicação antecipada →
{{ r.id }}
{{ r.statusLabel }}
{{ r.vc }} Viewers · {{ r.media }}
{{ g.label }}
{{ g.sub }}
{{ controlPlaneTopologyLabel }}
╌╌ mídia (Ingress → Relay) ┄┄ entrega WHEP ···· observação / control plane ╌╌ reassignment

Após reassignment, o Relay expirado permanece visível com link interrompido e 0 Viewers — a exclusão do Relay anterior é comportamento validado.

Controlled Relays

{{ r.id }}
Controlled Relay {{ r.statusLabel }}
Viewers
{{ r.vc }}
{{ relayObservationLabel }}
{{ r.hb }}
{{ relayRefreshLabel }}
{{ r.lease }}
Mídia
{{ r.media }}
WHEP · {{ r.whep }}
Camada simulcast · — Em breve

Viewers

{{ viewerCount }} de {{ viewerTotal }}
ViewerRelay atualAnteriorEstadoRec.assignedAt
Timeline individual
{{ tl.at }}{{ tl.txt }}

Event stream

{{ eventSourceLabel }}
{{ feedNote }}
#{{ e.seq }} {{ e.at }} {{ e.type }} {{ e.detail }}
Estados projetados · control plane offline histórico SSE · etapa posterior snapshot inválido nenhum Relay registrado — reproduzíveis pelo test harness, não por esta UI.

Experimentos

Documentação executável e repositório visual de evidências. Cada execução separa fato observado, limitação, hipótese e próximo teste.

{{ run.name }}

{{ run.id }}

{{ run.scenario }}

Timeline da execução (espaçamento não linear)
{{ e.t }}
{{ e.label }}
Distribuição por Relay
antes
{{ run.distBefore }}
depois
{{ run.distAfter }}
Métricas observadas
{{ m.k }}{{ m.v }}
Assertions
{{ a.txt }}
Limitações (fato ≠ hipótese)
  • {{ l }}

Conclusão. {{ run.conclusion }}

JSON bruto
{"run_id":"run-002","status":"passed","executions":2,
 "failure":{"target":"relay-a","method":"SIGKILL",
   "exit_code":137,"at":"t+180s"},
 "distribution":{"before":[10,10,10],"after":[0,15,15]},
 "metrics_ms":{
   "lease_expiry_detection":[4743,4829],
   "reassignment_after_expired":[0,0],
   "media_recovery_after_expiry":[49,69],
   "end_to_end":[4792,4899]},
 "assertions":{"no_central_fallback":true,
   "previous_relay_excluded":true,
   "recovered_viewers":10}}
Execução ainda não realizada. O design abaixo está pronto para receber os resultados da matriz.

Matriz rápida executada · mídia × rede

12 células comprimidas com payload sintético dimensionado e 30 Viewers. Resultado: 11/12 passaram. É evidência de transporte e recovery; a matriz de 5 minutos com OBS visual continua pendente.

Boa
20 Mbps · 30 ms · 5 ms jit · 0,1%
Mediana
5 Mbps · 80 ms · 15 ms jit · 0,5%
Limitada estática
2,5 Mbps · 150 ms · 40 ms jit · 2%
4G volátil
12→3 Mbps → 800 kbps · rajadas 5% · corte 2 s → 8 Mbps
High single layer
H.264 1080p60 · 6 Mbps
Passou
Passou
Falhou · 6 Mbps
Passou · retry
Baseline
H.264 720p30 · 2,5 Mbps
Passou
Passou
Passou
Passou
Best-case simulcast
~1080p60·6 + 720p60·4 + 360p60·2 Mbps
Passou
Passou
Passou
Passou+ diagnóstica

A diagnóstica best-case × 4G volátil também passou com a falha sobreposta ao estágio severo. Payload sintético não equivale a qualidade visual.

Métricas instrumentadas

A coleta existe nos artefatos do harness; o histórico ainda não é servido por API.

Startup e reconexão
detecção · reconexão · blackout de transporte
Medido no harness
Qualidade de transporte
bitrate · perda · jitter · stalls RTP
Medido no harness
Detecção e recovery
detecção da falha · janelas de recuperação por percentil
Dados demonstrativos
Recursos de máquina
CPU/memória · tráfego de Ingress e Relays
Medido no harness
Latência visual
p50 / p95 / máxima · intervalos de congelamento
Em breve
Simulcast
RID-resolução-bitrate · convergência de troca
Validado com OBS

Tecnologia

O caminho da mídia e o plano de controle, explicados na ordem em que os bits viajam.

OBS / Streamer

O Streamer publica a Live pelo OBS. No smoke real: OBS 32.1.2, H.264 720p30 a 2,5 Mbps e Opus 128 kbps. Validado

↓ WHIP · contrato de mídia (não é um endpoint JSON)
Controlled Ingress

Ponto único que recebe a Live. Concessão temporária da POC: a Phase 3 do roadmap existe para removê-lo como ponto único de falha. Validado

↓ replicação antecipada · a mídia chega aos 3 Relays antes de qualquer Viewer
3 Controlled Relays

Cada Relay renova sua lease por heartbeat (2 s / lease de 6 s, configuráveis) e anuncia o próprio endpoint WHEP — devolvido ao Viewer na atribuição. Um Relay não é necessariamente um Viewer. Validado

↓ WHEP · contrato de mídia separado do WHIP
Viewers

Distribuídos em round-robin determinístico. Se o Relay ativo falhar, recebem nova atribuição — excluindo o Relay anterior — e criam outra sessão WebRTC automaticamente, sem refresh. Se nenhum Relay estiver saudável, a indisponibilidade é explícita. Validado

Control plane (Go)

  • Leases renovadas por heartbeat — saúde nunca é decidida no frontend.
  • Atribuição round-robin determinística e recovery que exclui o Relay anterior.
  • Falha detectada pela expiração da lease: 4.743–4.829 ms observados.

Fronteira web

  • HTTP/OpenAPI para snapshots e operações.
  • SSE com snapshot inicial e eventos em tempo real; ao reconectar, novo snapshot.
  • O frontend consome contratos e apresenta fatos — nada além disso.
Sem fallback central. Não existe SFU central escondida atrás dos Relays — nem como rota de emergência. Indisponibilidade é mostrada, nunca mascarada.

Evidência

Validado · 2 execuções positivas

Relatório do gate de recuperação em containers. Cada seção distingue fato observado, limitação, hipótese e próximo teste. Nenhum número aqui é SLO contratual.

Cenário e condições iniciais

Topologia
1 Ingress · 3 Relays · 30 Viewers
Isolamento
containers/processos independentes
Distribuição inicial
10 / 10 / 10
Mídia
H.264 720p30 · 2,5 Mbps + Opus 128
Heartbeat / lease
2 s / 6 s (configuráveis)
Ação de falha
SIGKILL no relay-a · exit 137

Timeline observada

03:00.000relay.failure_requested — SIGKILL emitido pelo test harness
03:04.743relay.expired — lease de 6 s não renovada · detecção em 4.743–4.829 ms
03:04.74310× viewer.assigned — novas atribuições aplicadas em 0 ms nas execuções observadas
03:04.792viewers.media_recovered — mídia H.264 + Opus de volta em 49–69 ms após a expiração

Fato observado

  • Distribuição 10/10/10 → 0/15/15 nos sobreviventes.
  • 10 Viewers recuperados com recovered: true e previousRelayId: relay-a.
  • Recuperação end-to-end: 4.792–4.899 ms desde a solicitação de falha.
  • Nenhuma rota escondida por SFU central.

Limitação · hipótese · próximo teste

Limitação. Rede local sem degradação; um único domínio de falha; Viewers sintéticos.

Hipótese. O piso de ~4,8 s é dominado pela lease de 6 s; leases menores e probes ativos devem reduzi-lo.

Próximo teste. Matriz mídia × rede (12 células + diagnóstica) e playback integrada da Reference Application.

Roadmap

Progresso real por fases — sem porcentagens inventadas. Concluído é o que foi validado; o resto é atual ou próximo.

Phase 0 — Recover and Specify

Concluída
  • ✓ Fonte de verdade e monorepo estabelecidos
  • ✓ Contratos HTTP/OpenAPI e SSE definidos
  • ✓ Auditoria dos códigos antigos

Phase 1 — Automatic Recovery

Fase atual
  • ✓ Gate de recuperação em containers (2 execuções positivas)
  • ✓ Smoke real com OBS por WHIP
  • ● Playback integrada na Reference Application — em andamento
  • ● Operator dashboard somente leitura — em andamento
  • ○ Matriz mídia × rede (12 células + diagnóstica)
  • ○ Múltiplos domínios de falha além do SIGKILL

Phase 2 — Harden Recovery

Próxima

Health scoring, active probes, RTCP/TWCC, histerese de decisão, testes de carga e tempestades de reconexão.

Phase 3 — Resilient Ingest

Planejada

Remover o Controlled Ingress como ponto único de falha — o compromisso que encerra a maior concessão da POC.

Phase 4 — Evaluate Continuity Strategies

Planejada

Comparar Preserve PeerConnection, Warm/Hot Standby e Replicated Relay State — com evidência, não preferência.

Post-POC

Condicionada à tese

Managed Streaming Infrastructure e primeiro piloto externo — apenas se a Viability POC comprovar a tese.

API & Integrações

O frontend não decide saúde, assignment nem política de recovery — essas regras pertencem ao control plane em Go. A API entrega fatos; a interface os apresenta.

WHIP e WHEP são contratos separados de mídia — não se misturam com os endpoints JSON abaixo.

GET/healthzSaúde do control plane.
GET/v1/snapshotEstado corrente: relays e assignments.
GET/v1/eventsSSE best-effort — começa com snapshot; ao reconectar, busque o snapshot novamente.
POST/v1/relays/{relayId}/heartbeatRenova a lease do Relay.
POST/v1/viewers/{viewerId}/assignmentSolicita atribuição de Relay para um Viewer.
POST/v1/viewers/{viewerId}/recoverySolicita recovery — a resposta exclui o Relay anterior.

Contratos atuais

type Relay = {
  id: string
  whepEndpoint: string
  healthy: boolean
  lastSeenAt: string
  leaseExpiresAt: string
  viewerCount: number
}

type Assignment = {
  viewerId: string
  relayId: string
  whepEndpoint: string
  previousRelayId?: string
  recovered: boolean
  assignedAt: string
}
type Snapshot = {
  generatedAt: string
  relays: Relay[]
  assignments: Assignment[]
}

type ControlEvent = {
  sequence: number
  type: string
  at: string
  relayId?: string
  viewerId?: string
  previousRelayId?: string
}

Em breve

Autenticação API keys Ambientes · staging · produção SDKs Webhooks Histórico de métricas Configuração operacional persistida Adapter gRPC

Visão futura

Página editorial, separada da operação. Nada aqui é produto confirmado — os estágios preservam hipóteses sem confundi-las com o que existe hoje.

Expansão de operadores

Controlled Relays

Atual

Operados pela equipe do Leap durante a POC. São a base de toda a evidência atual.

Professional Relay Operators

Em breve

Organizações externas admitidas e monitoradas, operando Relays profissionalmente.

Community Relays

Pesquisa futura

Relays operados por participantes externos. Hipótese preservada, sem compromisso de produto.

Viewer Nodes · opt-in

Pesquisa posterior

Dispositivo de Viewer que também distribui capacidade — sempre opt-in. Assistir nunca transforma alguém em Relay automaticamente.

Como Professional Relay Operators seriam admitidos — visão, não produto

  • Capacidade reservada comprovada antes de receber tráfego.
  • Tráfego entregue e verificado pelo control plane.
  • Qualidade e disponibilidade como gates de elegibilidade.
  • Compensação futura em moeda fiduciária, por política configurável e versionada.

Sem token, stablecoin, staking, airdrop ou carteira — nada disso é produto confirmado.

Funcionalidades de plataforma preservadas

Em breve — fora da Viability POC

A visão completa existe — mas nenhum destes itens é funcional hoje, e nenhum domina a proposta atual.

Canais
Página do Streamer com Lives e histórico.
Follows
Acompanhar Streamers e receber avisos de Live.
Chat
Conversa em tempo real ao lado do player.
Clips
Trechos curtos gerados pelos Viewers.
VODs
Gravações disponíveis após a Live.
Recomendações
Descoberta de Lives relevantes.
Anúncios
Inserções controladas pela plataforma parceira.
Moderação
Ferramentas de segurança para chat e canais.
Monetização
Modelos de receita para Streamers e plataformas.

Autenticação e perfis — Em breve. Esta Reference Application não simula login.

Leap Resilient live distribution.
Viability POC · dados demonstrativos onde indicado
Modo de demonstração

Alterna fixtures locais para apresentar o frontend. Não é um controle operacional — nenhuma infraestrutura é afetada.

A sequência reproduz a evidência do gate: falha do relay-a, reassignment e recuperação de mídia.