Ir para o conteúdo principal

ActivityPub & O Protocolo Fediverse

Esta página documenta a implementação do ActivityPub dentro do Owncast a nível de protocolo: quais atividades um servidor envia, quais ele recebe, como se identifica, e como assina e verifica requisições. É voltada para desenvolvedores que desejam construir uma aplicação Fediverse que opere com o Owncast, seja isso seguindo um servidor Owncast de outra plataforma, consumindo suas notificações ao vivo, ou construindo ferramentas que compreendam as extensões personalizadas do Owncast.

Se você é um operador do Owncast e apenas quer ativar a federação, veja O Fediverso e Habilitando recursos sociais em vez disso. Esta página assume familiaridade com ActivityPub, ActivityStreams 2.0, JSON-LD e Assinaturas HTTP.

Modelo mental

Um servidor Owncast se federaliza como um único ator do tipo Serviço. Há uma conta por servidor (nome de usuário padrão live), e ela representa a própria transmissão em vez de uma pessoa. Em comparação a um servidor social de propósito geral, o modelo é intencionalmente restrito:

  • O ator envia postagens para seus seguidores (mais importante, uma notificação de "entrar ao vivo") e um "ping" periódico da transmissão.
  • The actor receives follows, likes, boosts (announces), replies and mentions, quote requests, and a handful of server-to-server activities. Inbound posts are only surfaced to the operator and plugins: they are never added to a timeline and never re-federated.
  • Há exatamente um usuário, sem registro aberto, e a coleção following está sempre vazia.

Todos os endpoints de federação retornam 405 Método Não Permitido quando a federação está desativada, então verifique isso primeiro se um servidor parecer inacessível.

Descoberta

Um aplicativo remoto localiza e descreve um ator Owncast através dos mecanismos de descoberta bem conhecidos padrão.

WebFinger

GET /.well-known/webfinger?resource=acct:{username}@{host}

O resource deve ser um URI acct: cujo host corresponda ao host configurado do servidor (caso contrário, a requisição é rejeitada com 501/400). A resposta é servida como application/jrd+json:

{
"subject": "acct:live@owncast.example.com",
"aliases": ["https://owncast.example.com/federation/user/live"],
"links": [
{
"rel": "self",
"type": "application/activity+json",
"href": "https://owncast.example.com/federation/user/live"
},
{
"rel": "http://webfinger.net/rel/profile-page",
"type": "text/html",
"href": "https://owncast.example.com/federation/user/live"
},
{
"rel": "http://webfinger.net/rel/avatar",
"type": "image/png",
"href": "https://owncast.example.com/logo/external"
},
{
"rel": "alternate",
"type": "application/x-mpegURL",
"href": "https://owncast.example.com/hls/stream.m3u8"
}
]
}

O link self é o IRI canônico do ator. Observe o link alternate específico do Owncast do tipo application/x-mpegURL: ele aponta diretamente para a playlist HLS da transmissão, que permite que os clientes descubram o vídeo ao vivo sem precisar raspar a interface web.

host-meta

GET /.well-known/host-meta

Retorna um documento XRD apontando de volta para o endpoint WebFinger, para clientes que inicializam a partir de host-meta:

<?xml version="1.0" encoding="UTF-8"?>
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
<Link rel="lrdd" type="application/json"
template="https://owncast.example.com/.well-known/webfinger?resource={uri}"/>
</XRD>

NodeInfo

O Owncast expõe metadados a nível de servidor através do NodeInfo para que crawlers, diretórios e sites de estatísticas do Fediverse possam descrever a instância.

Descoberta NodeInfoGET /.well-known/nodeinfo:

{
"links": [
{
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.0",
"href": "https://owncast.example.com/nodeinfo/2.0"
}
]
}

NodeInfo 2.0GET /nodeinfo/2.0:

{
"version": "2.0",
"software": {
"name": "owncast",
"version": "0.2.x"
},
"protocols": ["activitypub"],
"services": {
"inbound": [],
"outbound": []
},
"usage": {
"users": {
"total": 1,
"activeMonth": 1,
"activeHalfyear": 1
},
"localPosts": 42
},
"openRegistrations": false,
"metadata": {
"chat_enabled": true,
"federation": {
"username": "live",
"featured_streams": 1
}
}
}

A maior parte disso é NodeInfo padrão, com alguns sinais específicos do Owncast que valem a pena mencionar:

  • software.name é sempre owncast. Esta é a maneira mais confiável de detectar que você está se comunicando com um servidor Owncast.
  • usage.users.total é sempre 1 e openRegistrations é sempre false — uma instância Owncast é um servidor de único ator, não uma comunidade multiusuário.
  • usage.localPosts é a contagem de atividades que o servidor enviou (notificações de ir ao vivo e outras mensagens públicas), que é um proxy útil para quão ativo está o stream.
  • metadata.chat_enabled reflete se o chat embutido do Owncast está habilitado.
  • metadata.federation é o bloco específico do Owncast:
    • username é o nome de usuário preferido do ator (padrão live). Combinado com o host, isso lhe dá o identificador acct: sem uma viagem separada ao WebFinger.
    • featured_streams indica participação no fluxo de streams em destaque / mini-diretório (veja Pings de Stream abaixo). Um valor de 1 significa que o servidor anuncia seu status ao vivo para os seguidores através de atividades Offer periódicas.

x-nodeinfo2GET /.well-known/x-nodeinfo2 fornece as mesmas informações na forma x-nodeinfo2 alternativa usada por alguns diretórios, incluindo um bloco organization (name, contact) e um número de usuário activeWeek. Aqui services.inbound/services.outbound são ambos ["activitypub"].

API da instância MastodonGET /api/v1/instance retorna uma descrição de instância compatível com Mastodon (uri, title, short_description, description, version, thumbnail, stats, e flags de registro) para que ferramentas cientes do Mastodon possam renderizar um cartão de instância familiar. stats.user_count é 1, stats.status_count é a contagem de postagens locais, e registros/aprovações/convites estão todos desativados.

O ator

GET /federation/user/{username}
Accept: application/activity+json

Solicitar o IRI do ator com um cabeçalho Accept do ActivityStreams retorna o documento do ator. O Owncast se representa como um Serviço (não como uma Pessoa). A forma é:

{
"@context": [
"https://www.w3.org/ns/activitystreams",
"https://w3id.org/security/v1"
],
"type": "Service",
"id": "https://owncast.example.com/federation/user/live",
"preferredUsername": "live",
"name": "My Owncast Server",
"summary": "Server description / bio",
"url": "https://owncast.example.com/federation/user/live",
"published": "2023-01-01T00:00:00Z",
"manuallyApprovesFollowers": false,
"discoverable": true,
"inbox": "https://owncast.example.com/federation/user/live/inbox",
"outbox": "https://owncast.example.com/federation/user/live/outbox",
"followers": "https://owncast.example.com/federation/user/live/followers",
"icon": {
"type": "Image",
"mediaType": "image/png",
"url": "https://owncast.example.com/logo/external?uc=..."
},
"image": {
"type": "Image",
"url": "https://owncast.example.com/logo/external?uc=..."
},
"tag": [
{
"type": "Hashtag",
"name": "#owncast",
"href": "https://owncast.directory/tags/owncast"
}
],
"attachment": [
{
"type": "PropertyValue",
"name": "Website",
"value": "<a href=\"...\">...</a>"
}
],
"publicKey": {
"id": "https://owncast.example.com/federation/user/live#main-key",
"owner": "https://owncast.example.com/federation/user/live",
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"
}
}

Pontos-chave para uma implementação interoperável:

  • O layout do IRI do ator é {server}/federation/user/{username}, e as coleções estão ligadas a ele: {actor}/inbox, {actor}/outbox, {actor}/followers.
  • following é solicitado em {actor}/following mas sempre retorna 404 — o Owncast nunca expõe uma lista de seguimentos.
  • manuallyApprovesFollowers reflete se o servidor está em modo de federação privado. Quando true, os follows não são aceitos automaticamente.
  • discoverable é sempre true (usando a semântica do namespace toot:).
  • A chave pública vive em {actor}#main-key, é uma chave RSA-2048 em forma PEM (PKIX), e é o que você usa para verificar as assinaturas HTTP do servidor.

Assinaturas HTTP

O Owncast assina suas requisições enviadas e verifica as recebidas usando o esquema de cabeçalho HTTP "Signature" (draft-cavage Assinaturas HTTP, como usado em todo o Fediverse).

Verificando requisições que o Owncast envia para você

Quando o Owncast POSTa uma atividade para sua caixa de entrada, inclui:

  • Um cabeçalho Signature com keyId="{actor}#main-key", algorithm="rsa-sha256", e a lista de headers assinados.
  • Os cabeçalhos assinados cobrem (request-target), host, date, e digest.
  • Um cabeçalho Digest contendo o digest SHA-256 do corpo da requisição.
  • Content-Type: application/activity+json e um User-Agent da forma {version}; https://owncast.online.

Para verificar: busque o ator em keyId, leia publicKey.publicKeyPem, e verifique tanto a assinatura quanto o digest do corpo.

Assinando requisições que você envia para o Owncast

O Owncast verifica a assinatura em cada atividade entregue à sua caixa de entrada:

  1. Ele analisa keyId e algorithm do seu cabeçalho Signature. O keyId deve ser uma URL https://.
  2. Ele resolve seu ator e busca sua chave pública.
  3. Ele verifica se o domínio que possui a sua chave não está na lista de domínios bloqueados da instância e que o ator em si não está bloqueado.
  4. Ele verifica a assinatura, tentando o algoritmo declarado e depois retrocedendo para rsa-sha256 e rsa-sha512.
  5. Ele verifica o cabeçalho Digest em relação ao corpo da requisição.
  6. If your request carries a parseable Date header, it must be close to the server's clock: a date more than 1 hour in the past or more than 1 hour in the future is rejected. This bounds replay of captured, validly-signed requests. A missing or unparseable Date skips the check.

Na prática, isso significa: assinar (request-target) host date digest com uma chave RSA, publicar essa chave no campo publicKey do seu ator, incluir um Digest SHA-256, e servir seu ator via HTTPS.

Atividades que o Owncast envia (saídas)

Todas as atividades de saída se originam do ator do servidor e são entregues às caixas de entrada dos seguidores (preferindo sharedInbox onde um seguidor anuncia um). Atividades públicas são endereçadas para https://www.w3.org/ns/activitystreams#Public em to com a coleção de seguidores em cc; em modo privado, elas são endereçadas apenas para a coleção de seguidores.

AtividadeObjetoQuandoEnviado para
CreateNoteO stream vai ao vivo (a mensagem de "ir ao vivo"); outras postagens públicasSeguidores (+ Público)
UpdateServiceO perfil do servidor (nome, avatar, resumo, etc.) mudançasSeguidores
Sigairi do atorUm operador segue outro servidor Owncast (fluxo de streams em destaque)O servidor-alvo
Offerurl do servidorPeriodicamente enquanto estiver ao vivo, como um "ping" da transmissãoDiretório de seguidores
AcceptFollow de entradaEm resposta a um Follow recebidoO seguidor
Rejectinbound FollowQuando o operador remove um diretório que estava listando esse servidorEsse diretório
Sairserver URLThe stream ends (the offline counterpart to Offer)Directory followers
UndoSeguirAn operator unfeatures an Owncast server they previously followedThe target server
Accept / Rejectinbound QuoteRequestIn response to a received QuoteRequestThe requester

Create / Note — ir ao vivo

A atividade mais importante. Quando a transmissão vai ao vivo, o Owncast envia um Create envolvendo um Note. O Note contém HTML content (a mensagem de ir ao vivo configurável, título do stream, links de hashtags, e um link de volta para o servidor), tags Hashtag, e — quando disponível — um anexo de Imagem com a pré-visualização do stream (preview.gif ou thumbnail.jpg). Se o servidor estiver marcado como NSFW, o note contém sensitive: true. Hashtags linkam para https://owncast.directory/tags/{tag}, e uma hashtag #owncast é sempre adicionada.

Esta é a atividade que mais interessa aos consumidores: assine seguindo o ator, depois acompanhe a caixa de entrada para atividades Create/Note para saber quando um stream começa.

Oferta / ping da transmissão (saída)

Esta é uma extensão do Owncast que suporta o recurso de streams em destaque / mini-diretório. Enquanto ao vivo, o servidor envia periodicamente uma atividade Offer cujo object é a URL do servidor, levando metadados personalizados do Owncast (status do stream, título, descrição, nome do servidor, logotipo, tags). Isso permite que um diretório receptor mantenha sua lista de streams ao vivo atualizada sem polling. The matching offline signal is the Leave activity, sent when the stream ends. O Owncast envia Offer e Leave apenas para seguidores que se identificaram como um diretório (veja o namespace personalizado), nunca para seguidores fãs comuns.

Atualizar, Seguir, Aceitar

  • Update do ator Service é enviado para seguidores quando os metadados do perfil do servidor mudam, para que caches remotos atualizem.
  • Follow é enviado quando um operador segue outro servidor Owncast. O servidor então espera um Accept (ou Reject) de volta.
  • Aceitar é enviado automaticamente em resposta a um Seguir quando o servidor está em modo público (auto-aprovar).

Atividades que o Owncast recebe (entrada)

Entregue isso POSTando uma atividade assinada na inbox do ator. The inbox returns 202 Accepted immediately and processes the activity asynchronously, so a 202 only means the activity was queued, not that it was acted on. Owncast signature-verifies and dispatches each one from that queue.

AtividadeManipulação
FollowArmazena o seguidor; auto-aprova e retorna Aceitar em modo público (mantido para aprovação em modo privado). Um follow com o marcador ns#directory é sempre mantido para aprovação manual, independentemente do modo, e não emite o evento follow. Caso contrário, emite um evento FediverseEngagementFollow.
DesfazerSeguirRemove o seguidor.
CurtirRegistra um engajamento contra um objeto local. Emite FediverseEngagementLike.
AnunciarImpulsionar/repostar um objeto local. Registra um engajamento e emite FediverseEngagementRepost.
AceitarSeguirMarca um servidor remoto do Owncast que seguimos como aceito (fluxo de streams destacados).
RejeitarSeguirMarca nosso follow de um servidor remoto como rejeitado.
OfertaUm ping de stream de outro servidor Owncast. Se levar streamStatus: "live", o Owncast marca aquele servidor como online na tabela de servidores federados e armazena os metadados do stream.
LeaveO contraparte offline de Oferta: marca o stream do servidor Owncast como offline.
UpdatePersonAtualiza os metadados armazenados (nome exibido, inbox, inbox compartilhada, avatar) de um seguidor existente. Updates with any other object type are ignored.
CreateNoteAccepted when the object is a single Note attributed to the signing actor and the note is either a reply to a post this server published or addressed to the actor (a mention). Raised as an event for the operator and plugins, not added to any timeline. See inbound posts.
QuoteRequestA FEP-044f request to quote one of the server's posts. Accepted only for locally authored posts while federation is public and quotes are enabled. Answered with Accept or Reject. See quote requests.

Dois guardas importantes:

  • Limite de idade do engajamento. Atividades Curtir e Anunciar são registradas somente se o objeto referenciado tiver no máximo 36 horas. Engajamentos mais antigos são ignorados. Isso mantém as notificações de engajamento vinculadas a streams recentes.
  • Bloqueio & SSRF. Atividades de entrada de domínios/atores bloqueados são rejeitadas durante a verificação de assinatura. Entregas de saída rejeitam URLs de inbox não-HTTPS e internas/loopback.

Inbound posts (Create)

Inbound fediverse posts require Owncast v0.3.0

Earlier releases rejected every inbound Create. Owncast 0.3.0 accepts the narrow cases described here.

Owncast accepts a Create whose object is exactly one Note attributed to the same actor that sent it. It keeps two kinds of notes: replies to a post the server itself published, and notes that address the actor directly (mentions). Everything else is ignored. An accepted post is raised as a reply or mention event for the operator's integrations and plugins. It is not added to a timeline, is not shown to viewers, and is never re-federated, so there is still no public conversation surface on an Owncast server.

Quote requests (FEP-044f)

Quote requests require Owncast v0.3.0

QuoteRequest handling is new in Owncast 0.3.0.

A remote user asking permission to quote one of the server's posts sends a FEP-044f QuoteRequest whose object is the post being quoted and whose instrument is the quote post itself. Owncast accepts the request only when the quoted object is a post this server authored, federation is in public mode, and the operator has quoting enabled. On accept it stores a QuoteAuthorization stamp as a dereferenceable object and replies with an Accept whose result is the stamp's IRI, so any server can fetch the stamp to verify the quote was approved. Every other case gets a Reject, which clears the pending quote on the remote end.

Atividades de servidor para servidor

Oferta, Sair, Aceitar e Rejeitar juntos formam o protocolo "streams destacados" do Owncast. Se você está construindo um diretório ou agregador que deseja participar, o padrão é:

  1. Envie um Seguir que define o marcador ns#directory (veja o namespace personalizado) para o ator do servidor Owncast. O operador aprova manualmente, então espera um Aceitar.
  2. Receba atividades periódicas Oferta (com metadados do Owncast) enquanto o servidor estiver ao vivo.
  3. Receba um Sair quando o stream terminar.

Você também pode consumir apenas os padrões Criar/Nota de publicações ao vivo se não precisar de pings de liveness em tempo real.

Namespace personalizado do Owncast

O Owncast adiciona um pequeno conjunto de propriedades JSON-LD personalizadas sob o namespace https://owncast.online/ns#. As propriedades de metadados de stream aparecem como campos adicionais de nível superior em atividades Oferta (e relacionadas a servidor-para-servidor) e permitem que um receptor preencha uma entrada de diretório a partir de uma única atividade. O marcador ns#directory aparece em um Seguir e identifica o remetente como um diretório. Todos são opcionais e seguros para ignorar se você se importar apenas com o ActivityPub padrão.

PropriedadeTipoSignificado
https://owncast.online/ns#streamStatusstring"live" ou "offline". Sempre presente em atividades de servidor-para-servidor.
https://owncast.online/ns#streamTitlestringTítulo do stream atual, quando definido.
https://owncast.online/ns#streamDescriptionstringResumo/descrição do servidor.
https://owncast.online/ns#serverNamestringNome de servidor legível por humanos.
https://owncast.online/ns#logoUrlstringURL absoluta para o logo do servidor.
https://owncast.online/ns#thumbnailUrlstringURL absoluta para a miniatura do stream atual.
https://owncast.online/ns#streamTagsarray de stringsTags de metadados do servidor.
https://owncast.online/ns#directorybooleanDefinido como true em um Seguir para identificar o remetente como um diretório.

Um diretório se identifica definindo ns#directory como true no Seguir que envia. Esse marcador, e apenas esse marcador, faz o Owncast tratar o follow como uma listagem de diretório: ele mantém o follow para o operador aprovar, e uma vez aprovado, entrega o Oferta e pings de Sair para aquele seguidor. Os campos de metadados de stream acima são apenas descritivos e não, por si só, identificam um diretório.

Construindo um diretório de streams do Owncast

As atividades de servidor-para-servidor que impulsionam o próprio recurso de streams destacados do Owncast estão abertas para você consumir. Se você quiser executar um diretório ou agregador que rastreia quais servidores Owncast estão ao vivo, você segue cada servidor da maneira que qualquer ator do Fediverse faria e, em seguida, reage aos sinais de liveness que ele envia.

Para uma referência de exemplo completa e executável, veja o repositório owncast-directory-example. É uma pequena aplicação em Python que implementa tudo nesta seção: um ator publicado, o follow ns#directory, o manuseio de Oferta/Sair/Rejeitar, e uma página web que lista os servidores ao vivo. Trate-a como um ponto de partida e não como um serviço de produção.

Você precisa de um ator publicado e solicitações assinadas, assim como qualquer seguidor (veja Assinaturas HTTP). A partir daí:

  1. Envie um Seguir assinado que define https://owncast.online/ns#directory como true (veja o namespace personalizado) para o ator de cada servidor. Esse marcador identifica você como um diretório, que é o que faz o servidor entregar seus pings de stream para você, e faz com que a inclusão na listagem seja por opção: um servidor Owncast sempre mantém um follow de diretório para seu operador aprovar manualmente, não importa como a privacidade da federação do servidor está configurada. Você não receberá nenhum status até que o operador aprove, então espere que as entradas permaneçam pendentes até que cada uma opte por entrar. Um Seguir sem o marcador é tratado como um follow comum: pode ser auto-aceito, mas nunca receberá os pings de Oferta/Sair.
  2. Enquanto um servidor está ao vivo, ele posta uma Oferta em sua inbox aproximadamente a cada 5 minutos, levando os metadados personalizados do Owncast: status do stream, título, descrição, nome do servidor, logo, miniatura e tags. Crie ou atualize a entrada do diretório daquele servidor a partir desses campos.
  3. Quando o stream termina de maneira limpa, o servidor posta um Sair. Marque a entrada como offline.
  4. Se o operador do servidor remover seu diretório do lado deles, o servidor posta um Rejeitar do seu original Seguir. Elimine a entrada: você não está mais autorizado a listar aquele servidor, e ele deixará de enviar pings para você.

Não há fluxo embutido para um servidor Owncast solicitar um lugar em seu diretório, então montar a lista é trabalho de seu lado. Uma maneira simples de deixar os operadores optarem por participar é colocar um formulário de submissão em seu diretório onde um operador insere a URL de seu servidor. Você e seu diretório decidem quais submissões listar e quais rejeitar. Quando você aceita uma, siga aquele servidor da mesma forma que acima. O operador aprova o follow, que um remetente estará esperando fazer, e o follow, aceitar e fluxo de pings lista seu stream.

Trate os pings como um sinal de vida. Se um servidor parar de enviar atividades Oferta sem um Sair, porque caiu, perdeu conectividade ou foi bloqueado por firewall, nada informa ativamente a você que ele ficou offline. Expire qualquer entrada de que você não ouviu em alguns intervalos de ping. O próprio diretório do Owncast marca um par offline após dois pings perdidos, cerca de 11 minutos, e executa essa verificação de obsolescência uma vez por minuto.

Algumas coisas que valem a pena acertar:

  • Os campos de metadados vêm do servidor remoto, então trate-os como entrada não confiável. Limite os comprimentos e confirme que qualquer URL é http ou https antes de renderizá-la. O valor que você pode confiar é a URL do servidor que você escolheu seguir, não o nome exibido que o servidor envia.
  • As URLs da miniatura e do logo são estáveis, então o navegador as armazenará em cache. Anexe uma consulta que força a atualização ao atualizar uma entrada se você quiser que a prévia permaneça atual.
  • Você não precisa usar os pings. Se você só precisa saber que um servidor ficou ao vivo, em vez de manter uma visão ativa de quem está ao vivo agora, siga o ator e fique de olho nas postagens de Criar/Nota de publicações ao vivo como qualquer outro consumidor do Fediverse.

Para que seu serviço seja reconhecido como um diretório, defina https://owncast.online/ns#directory como true no Seguir que você envia. Um servidor que o vê mantém o follow para seu operador e, uma vez aprovado, envia seus pings de stream para você.

Referência do endpoint

Todos os caminhos são relativos à URL base do servidor. Cada endpoint retorna 405 quando a federação está desativada.

CaminhoMétodoPropósito
/.well-known/webfingerGETResolver acct: → ator IRI
/.well-known/host-metaGETPonteiro XRD para WebFinger
/.well-known/nodeinfoGETDocumento de descoberta NodeInfo
/nodeinfo/2.0GETMetadados do servidor NodeInfo 2.0
/.well-known/x-nodeinfo2GETmetadados do servidor x-nodeinfo2
/api/v1/instanceGETDescrição da instância compatível com Mastodon
/federation/user/{username}GETO documento ator Serviço
/federation/user/{username}/inboxPOSTEntregar atividades ao servidor
/federation/user/{username}/outboxGETColeção de atividades que o servidor enviou
/federation/user/{username}/followersGETColeção de seguidores paginada
/federation/user/{username}/followingGETSempre 404 (sem lista de seguidos)
/federation/{object-id}GETBuscar um único objeto ActivityPub armazenado

Construindo uma aplicação compatível — lista de verificação

Para seguir e consumir um stream do Owncast de sua própria aplicação:

  1. Resolva o handle com WebFinger (acct:live@host) para obter o ator IRI, depois busque o ator com Accept: application/activity+json.
  2. Publique seu próprio ator com uma publicKey, servido via HTTPS, com uma inbox acessível.
  3. Envie um Follow assinado para a inbox do ator. Assine (request-target) host date digest com RSA e inclua um Digest SHA-256.
  4. Lide com o Accept que o Owncast envia de volta para sua inbox (modo público) — ou aguarde aprovação manual (modo privado).
  5. Ouça por postagens go-live: atividades Create/Note chegando na sua inbox informam que o stream começou; o link WebFinger alternate/application/x-mpegURL fornece a URL HLS para reprodução.
  6. Opcionalmente atue como um diretório: defina https://owncast.online/ns#directory como true em seu Follow, faça o operador aprová-lo, então consuma os pings Offer/Leave e os metadados https://owncast.online/ns#* para presença em tempo real e entradas de diretório mais ricas.
  7. Verifique a assinatura de tudo que o Owncast lhe envia em relação ao #main-key do ator.

Owncast accepts replies and mentions only as notifications for the operator and plugins: they are never threaded, displayed, or re-federated, and the server exposes no following list. Design your integration around following + notifications + likes/boosts rather than two-way conversation.


Improve this page

See something missing or incorrect? Edit this page and improve the documentation for everyone.

Contributors to this documentation