Vai al contenuto principale

ActivityPub e il protocollo Fediverse

Questa pagina documenta l'implementazione di ActivityPub all'interno di Owncast a livello di protocollo: quali attività un server invio, quale riceve, come si identifica e come firma e verifica le richieste. È destinato agli sviluppatori che desiderano costruire un'applicazione Fediverse che interagisca con Owncast, che questo significhi seguire un server Owncast da un'altra piattaforma, consumando le sue notifiche in tempo reale, o costruire strumenti che comprendano le estensioni personalizzate di Owncast.

Se sei un operatore di Owncast e vuoi solo attivare la federation, consulta Il Fediverso e Abilitare funzionalità sociali invece. Questa pagina presume una familiarità con ActivityPub, ActivityStreams 2.0, JSON-LD e le firme HTTP.

Modello mentale

Un server Owncast federato come unico attore di tipo Service. C'è un solo account per server (nome utente predefinito live), e rappresenta lo stream stesso piuttosto che una persona. Rispetto a un server sociale generico, il modello è intenzionalmente ristretto:

  • L'attore invio messaggi ai propri follower (soprattutto, una notifica "in diretta") e un ping periodico dello stream.
  • 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.
  • C'è esattamente un utente, nessuna registrazione aperta, e la collezione following è sempre vuota.

Tutti gli endpoint di federazione restituiscono 405 Method Not Allowed quando la federazione è disabilitata, quindi controlla prima questo se un server sembra irraggiungibile.

Scoperta

Un'app remota localizza e descrive un attore Owncast attraverso i meccanismi di scoperta standard well-known.

WebFinger

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

Il resource deve essere un URI acct: il cui host corrisponde all'host configurato del server (altrimenti la richiesta viene rifiutata con 501/400). La risposta è servita come 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"
}
]
}

Il link self è l'IRI attore canonico. Nota il link alternate specifico per Owncast di tipo application/x-mpegURL: punta direttamente alla playlist HLS per lo stream, che consente ai client di scoprire il video live senza fare scraping dell'interfaccia web.

host-meta

GET /.well-known/host-meta

Restituisce un documento XRD che punta di nuovo all'endpoint WebFinger, per i client che si avviano da 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

Owncast espone metadati a livello di server attraverso NodeInfo in modo che i crawler, le directory e i siti di statistica del Fediverse possano descrivere l'istanza.

Scoperta 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
}
}
}

La maggior parte di questo è standard NodeInfo, con alcuni segnali specifici di Owncast degni di nota:

  • software.name è sempre owncast. Questo è il modo più affidabile per rilevare di essere in contatto con un server Owncast.
  • usage.users.total è sempre 1 e openRegistrations è sempre false — un'istanza di Owncast è un server a attore unico, non una comunità multi-utente.
  • usage.localPosts è il conteggio delle attività inviate dal server (notifiche di avvio e altri messaggi pubblici), che è un utile indicatore di quanto sia attivo il flusso.
  • metadata.chat_enabled riflette se la chat integrata di Owncast è abilitata.
  • metadata.federation è il blocco specifico di Owncast:
    • username è il nome utente preferito dell'attore (predefinito live). Combinato con l'host, questo ti dà l'handle acct: senza un'altra richiesta WebFinger.
    • featured_streams indica la partecipazione nel flusso di featured-streams / mini-directory (vedi Stream pings qui sotto). Un valore di 1 significa che il server pubblicizza il proprio stato di live ai follower tramite attività Offer periodiche.

x-nodeinfo2GET /.well-known/x-nodeinfo2 fornisce le stesse informazioni nella forma alternativa x-nodeinfo2 utilizzata da alcune directory, inclusi un blocco organization (name, contact) e un valore activeWeek degli utenti. Qui services.inbound/services.outbound sono entrambi ["activitypub"].

API dell'istanza MastodonGET /api/v1/instance restituisce una descrizione di istanza compatibile con Mastodon (uri, title, short_description, description, version, thumbnail, stats, e bandiere di registrazione) in modo che gli strumenti compatibili con Mastodon possano rendere una scheda di istanza familiare. stats.user_count è 1, stats.status_count è il conteggio dei post locali, e le registrazioni/l'approvazione/inviti sono tutti disabilitati.

L'attore

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

Richiedere l'IRI attore con un'intestazione Accept ActivityStreams restituisce il documento attore. Owncast si rappresenta come un Service di ActivityStreams (non una Person). La 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-----"
}
}

Punti chiave per un'implementazione interoperante:

  • L'IRI dell'attore è {server}/federation/user/{username}, e le collezioni si appoggiano ad esso: {actor}/inbox, {actor}/outbox, {actor}/followers.
  • following è richiesto a {actor}/following ma restituisce sempre 404 — Owncast non espone mai una lista di following.
  • manuallyApprovesFollowers riflette se il server è in modalità di federazione privata. Quando true, i follow non vengono accettati automaticamente.
  • discoverable è sempre true (utilizzando la semantica del namespace toot:).
  • La chiave pubblica si trova a {actor}#main-key, è una chiave RSA-2048 in formato PEM (PKIX), e serve per verificare le firme HTTP del server.

Firme HTTP

Owncast firma sia le proprie richieste in uscita che verifica quelle in ingresso utilizzando lo schema dell'intestazione HTTP "Signature" (draft-cavage HTTP signatures, come utilizzato in tutto il Fediverse).

Verifica delle richieste che Owncast ti invia

Quando Owncast POSTa un'attività al tuo inbox include:

  • Un'intestazione Signature con keyId="{actor}#main-key", algorithm="rsa-sha256", e l'elenco delle intestazioni firmate.
  • Le intestazioni firmate coprono (request-target), host, date, e digest.
  • Un'intestazione Digest contenente il digest SHA-256 del corpo della richiesta.
  • Content-Type: application/activity+json e un User-Agent della forma {version}; https://owncast.online.

Per verificare: recupera l'attore a keyId, leggi publicKey.publicKeyPem, e verifica sia la firma che il digest del corpo.

Firmare le richieste che invii a Owncast

Owncast verifica la firma su ogni attività consegnata al suo inbox:

  1. Analizza keyId e algorithm dalla tua intestazione Signature. Il keyId deve essere un URL https://.
  2. Risolvi il tuo attore e recupera la tua chiave pubblica.
  3. Controlla che il dominio di possesso della tua chiave non sia nella lista di domini bloccati dell'istanza e che l'attore stesso non sia bloccato.
  4. Verifica la firma, provando l'algoritmo dichiarato e poi tornando a rsa-sha256 e rsa-sha512.
  5. Verifica l'intestazione Digest rispetto al corpo della richiesta.
  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.

In pratica questo significa: firma (request-target) host date digest con una chiave RSA, pubblica quella chiave nel campo publicKey del tuo attore, includi un Digest SHA-256, e serve il tuo attore tramite HTTPS.

Attività che Owncast invia (in uscita)

Tutte le attività in uscita originano dall'attore del server e vengono consegnate agli inbox dei follower (preferendo sharedInbox dove un follower pubblicizza uno). Attività pubbliche sono indirizzate a https://www.w3.org/ns/activitystreams#Public in to con la collezione dei follower in cc; in modalità privata sono indirizzate solo alla collezione dei follower.

AttivitàOggettoQuandoInviato a
CreaNotaLo stream va live (il messaggio "vai in diretta"); altri post pubbliciFollower (+ Pubblico)
AggiornaServizioIl profilo del server (nome, avatar, riassunto, ecc.) cambiaFollower
Seguiactor IRIUn operatore segue un altro server Owncast (flusso di featured-streams)Il server di destinazione
OffertaURL del serverPeriodicamente mentre è live, come un ping dello streamDirectory followers
Accettafollow inbound FollowIn risposta a un Follow ricevutoIl follower
Rifiutainbound FollowQuando l'operatore rimuove una directory che stava elencando questo serverQuella directory
Lasciaserver URLThe stream ends (the offline counterpart to Offer)Directory followers
UndoSeguiAn operator unfeatures an Owncast server they previously followedThe target server
Accept / Rejectinbound QuoteRequestIn response to a received QuoteRequestThe requester

Crea / Nota — andare in diretta

L'attività più importante. Quando lo stream va live, Owncast invia un Create che avvolge un Note. Il Note contiene il content HTML (il messaggio di avvio configurabile, il titolo del stream, i link sugli hashtag, e un link di ritorno al server), i tag Hashtag, e - quando disponibili - un'allegato di tipo Image con l'anteprima dello stream (preview.gif o thumbnail.jpg). Se il server è contrassegnato come NSFW, il note porta sensitive: true. Gli hashtag linkano a https://owncast.directory/tags/{tag}, e un hashtag #owncast è sempre appeso.

Questa è l'attività che interessa di più i consumatori: iscriversi seguendo l'attore, quindi tenere d'occhio l'inbox per attività Create/Note per sapere quando inizia uno stream.

Offerta / ping dello stream (in uscita)

Questa è un'estensione di Owncast che supporta la funzione featured-streams / mini-directory. Mentre è live, il server invia periodicamente un'attività Offer il cui object è l'URL del server, portando metadati personalizzati di Owncast (stato del stream, titolo, descrizione, nome del server, logo, tag). Consente a una directory ricevente di mantenere fresca la sua lista di stream live senza fare polling. The matching offline signal is the Leave activity, sent when the stream ends. Owncast invia Offer e Leave solo ai follower che si identificano come directory (vedi il namespace personalizzato), mai a follower normali.

Aggiorna, Segui, Accetta

  • Update dell'attore Service viene inviato ai follower quando i metadati del profilo del server cambiano, così le cache remote si aggiornano.
  • Follow viene inviato quando un operatore segue un altro server Owncast. Il server poi si aspetta un Accept (o Reject) di ritorno.
  • Accetta viene inviato automaticamente in risposta a un Follow in modalità pubblica (approvazione automatica).

Attività ricevute da Owncast (in entrata)

Consegna questi tramite POST di un'attività firmata alla inbox dell'attore. 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.

AttivitàGestione
FollowArchivia il follower; approva automaticamente e restituisce Accetta in modalità pubblica (tenuto in attesa di approvazione in modalità privata). Un follow che porta il marker ns#directory è sempre tenuto per approvazione manuale indipendentemente dalla modalità e non emette l'evento follow. Altrimenti emette un evento FediverseEngagementFollow.
AnnullaSeguiRimuove il follower.
Mi piaceRegistra un impegno contro un oggetto locale. Emette FediverseEngagementLike.
AnnunciaBoost/repost di un oggetto locale. Registra un impegno ed emette FediverseEngagementRepost.
AccettaSeguiSegna un server remoto Owncast che abbiamo seguito come accettato (flusso di stream in primo piano).
RifiutaSeguiSegna il nostro follow di un server remoto come rifiutato.
OffertaUn ping di stream da un altro server Owncast. Se porta streamStatus: "live", Owncast segna quel server online nella sua tabella dei server federati e memorizza i metadati dello stream.
LeaveL'equivalente offline dell'Offerta: segna lo stream del server remoto Owncast come offline.
UpdatePersonAggiorna i metadati memorizzati (nome visualizzato, inbox, inbox condivisa, avatar) per un follower esistente. 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.

Due importanti guardie:

  • Limite di età dell'impegno. Le attività Mi piace e Annuncia vengono registrate solo se l'oggetto di riferimento ha al massimo 36 ore di vita. Gli impegni più vecchi vengono ignorati. Questo mantiene le notifiche di impegno legate a stream recenti.
  • Blocco e SSRF. Le attività in entrata da domini/attori bloccati vengono rifiutate durante la verifica della firma. Le consegne in uscita rifiutano gli URL delle inbox non HTTPS e interne/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.

Attività server-to-server

Offerta, Lascia, Accetta e Rifiuta insieme formano il protocollo "stream in primo piano" da Owncast a Owncast. Se stai costruendo un diretto o un aggregatore che desidera partecipare, il modello è:

  1. Invia un Segui che imposta il marker ns#directory (vedi il namespace personalizzato) all'attore del server Owncast. L'operatore lo approva manualmente, quindi aspettati un Accetta.
  2. Ricevi periodiche attività Offerta (con metadati Owncast) mentre il server è attivo.
  3. Ricevi un Lascia quando lo stream termina.

Puoi consumare solo i post di avvio standard Crea/Nota se non hai bisogno di ping di attualità in tempo reale.

Namespace personalizzato di Owncast

Owncast aggiunge un insieme ridotto di proprietà JSON-LD personalizzate sotto il namespace https://owncast.online/ns#. Le proprietà dei metadati dello stream appaiono come campi extra a livello superiore nelle attività Offerta (e relative server-to-server) e consentono a un destinatario di popolare una voce di directory da una singola attività. Il marker ns#directory appare su un Segui e identifica il mittente come directory. Tutti sono opzionali e possono essere ignorati se ti interessa solo l'ActivityPub standard.

ProprietàTipoSignificato
https://owncast.online/ns#streamStatusstringa"live" o "offline". Sempre presente sulle attività server-to-server.
https://owncast.online/ns#streamTitlestringaTitolo attuale dello stream, quando impostato.
https://owncast.online/ns#streamDescriptionstringaDescrittivo del server / descrizione.
https://owncast.online/ns#serverNamestringaNome del server leggibile dagli esseri umani.
https://owncast.online/ns#logoUrlstringaURL assoluto al logo del server.
https://owncast.online/ns#thumbnailUrlstringaURL assoluto alla miniatura corrente dello stream.
https://owncast.online/ns#streamTagsarray di stringheTag di metadati del server.
https://owncast.online/ns#directorybooleanoImpostato su true su un Segui per identificare il mittente come directory.

Una directory si identifica impostando ns#directory su true nel Segui che invia. Quel marker, e solo quel marker, fa sì che Owncast tratti il follow come un elenco di directory: tiene il follow in attesa per l'approvazione dell'operatore e, una volta approvato, consegna Offerta e Lascia ai ping dello stream a quel follower. I campi dei metadati dello stream sopra sono solo descrittivi e non identificano, di per sé, una directory.

Costruire una directory di stream di Owncast

Le attività server-to-server che alimentano la funzione di stream in primo piano di Owncast sono aperte per te da consumare. Se vuoi gestire una directory o un aggregatore che tiene traccia di quali server Owncast sono attivi, segui ogni server come farebbe qualsiasi attore del Fediverse e poi reagisci ai segnali di attualità che invia.

Per un riferimento completo ed eseguibile, vedere il repository owncast-directory-example. È una piccola applicazione Python che implementa tutto in questa sezione: un attore pubblicato, il follow ns#directory, la gestione di Offerta/Lascia/Rifiuta, e una pagina web che elenca i server attivi. Considerala come un punto di partenza piuttosto che un servizio di produzione.

Hai bisogno di un attore pubblicato e di richieste firmate, come qualsiasi follower (vedi Firme HTTP). Da lì:

  1. Invia un Segui firmato che imposta https://owncast.online/ns#directory su true (vedi il namespace personalizzato) all'attore di ciascun server. Quel marker ti identifica come directory, che è ciò che fa sì che il server consegni i suoi ping di stream a te, e rende l'inserimento su richiesta: un server Owncast tiene sempre un follow di directory in attesa dell'approvazione manuale del suo operatore, indipendentemente da come sono configurate la privacy della federazione del server. Non riceverai alcuno stato finché l'operatore non approva, quindi aspettati che le voci rimangano in attesa fino a quando ciascuna non opta per l'inserimento. Un Segui senza il marker è trattato come un normale follow da fan: potrebbe essere auto-accettato, ma non riceverà mai i ping Offerta/Lascia.
  2. Mentre un server è attivo, pubblica un Offerta nella tua inbox circa ogni 5 minuti, portando i metadati personalizzati di Owncast: stato dello stream, titolo, descrizione, nome del server, logo, miniatura e tag. Crea o aggiorna la voce di directory di quel server da quei campi.
  3. Quando lo stream termina in modo pulito, il server pubblica un Lascia. Segna la voce come offline.
  4. Se l'operatore del server rimuove la tua directory dal proprio lato, il server pubblica un Rifiuta del tuo originale Segui. Elimina la voce: non sei più autorizzato a elencare quel server, e smetterà di inviarti ping.

Non c'è un flusso integrato per un server Owncast per richiedere un posto nella tua directory, quindi assemblare l'elenco è compito tuo. Un modo semplice per consentire agli operatori di partecipare è mettere un modulo di invio sulla tua directory dove un operatore inserisce l'URL del proprio server. Tu e la tua directory decidete quali invii elencare e quali rifiutare. Quando ne accetti uno, segui quel server esattamente come sopra. L'operatore approva il follow, che un mittente si aspetterà di fare, e il follow, l'accettazione e il flusso di ping elenca il loro stream.

Considera i ping come un battito cardiaco. Se un server smette di inviare attività Offerta senza un Lascia, perché è andato in crash, ha perso connettività o è stato bloccato, niente ti dice attivamente che è andato giù. Scadenza di qualsiasi voce di cui non hai avuto notizie in un paio di intervalli di ping. La directory di Owncast segna un peer come offline dopo due ping mancati, circa 11 minuti, e esegue quel controllo di staleness una volta al minuto.

Alcune cose importanti da fare bene:

  • I campi dei metadati provengono dal server remoto, quindi trattali come input non attendibili. Limita le lunghezze e conferma che qualsiasi URL sia http o https prima di visualizzarlo. Il valore di cui puoi fidarti è l'URL del server che hai scelto di seguire, non il nome visualizzato che il server invia.
  • Gli URL della miniatura e del logo sono stabili, quindi il browser li memorizzerà nella cache. Aggiungi una query che cambia per invalidare la cache quando aggiorni una voce se desideri che l'anteprima rimanga attuale.
  • Non è necessario utilizzare affatto i ping. Se hai solo bisogno di sapere che un server è andato live, piuttosto che mantenere una visuale su chi è attualmente attivo, segui l'attore e osserva i post di avvio standard Crea/Nota come qualsiasi altro consumatore del Fediverse.

Per far riconoscere il tuo servizio come directory, imposta https://owncast.online/ns#directory su true nel Segui che invii. Un server che lo vede tiene il follow per il suo operatore e, una volta approvato, ti invia i suoi ping di stream.

Riferimento dell'endpoint

Tutti i percorsi sono relativi all'URL di base del server. Ogni endpoint restituisce 405 quando la federazione è disabilitata.

PercorsoMetodoScopo
/.well-known/webfingerGETRisolvi acct: → attore IRI
/.well-known/host-metaGETPuntatore XRD a WebFinger
/.well-known/nodeinfoGETDocumento di scoperta NodeInfo
/nodeinfo/2.0GETMetadati del server NodeInfo 2.0
/.well-known/x-nodeinfo2GETmetadati del server x-nodeinfo2
/api/v1/instanceGETDescrizione dell'istanza compatibile con Mastodon
/federation/user/{username}GETIl documento attore Servizio
/federation/user/{username}/inboxPOSTConsegna attività al server
/federation/user/{username}/outboxGETCollezione di attività che il server ha inviato
/federation/user/{username}/followersGETCollezione di follower paginati
/federation/user/{username}/followingGETSempre 404 (nessun elenco di seguiti)
/federation/{object-id}GETRecupera un singolo oggetto ActivityPub memorizzato

Costruire un'applicazione compatibile — checklist

Per seguire e consumare uno stream di Owncast dalla tua applicazione:

  1. Risolvi il gestore con WebFinger (acct:live@host) per ottenere l'attore IRI, quindi recupera l'attore con Accept: application/activity+json.
  2. Pubblica il tuo attore con una publicKey, servita su HTTPS, con una inbox raggiungibile.
  3. Invia un Follow firmato alla inbox dell'attore. Firma (request-target) host date digest con RSA e includi un Digest SHA-256.
  4. Gestisci l'Accept che Owncast restituisce alla tua inbox (modalità pubblica) — oppure attendi l'approvazione manuale (modalità privata).
  5. Ascolta i post di go-live: le attività Create/Note che arrivano nella tua inbox ti informano che lo stream è iniziato; il link WebFinger alternate/application/x-mpegURL ti fornisce l'URL HLS da riprodurre.
  6. Facoltativamente agisci come un directory: imposta https://owncast.online/ns#directory su true nel tuo Follow, fai approvare l'operatore, poi consuma i ping Offer/Leave e i metadati https://owncast.online/ns#* per la liveness in tempo reale e voci di directory più ricche.
  7. Verifica la firma su tutto ciò che Owncast ti invia rispetto alla #main-key dell'attore.

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