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 NodeInfo — GET /.well-known/nodeinfo:
{
"links": [
{
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.0",
"href": "https://owncast.example.com/nodeinfo/2.0"
}
]
}
NodeInfo 2.0 — GET /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è sempreowncast. Questo è il modo più affidabile per rilevare di essere in contatto con un server Owncast.usage.users.totalè sempre1eopenRegistrationsè semprefalse— 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_enabledriflette se la chat integrata di Owncast è abilitata.metadata.federationè il blocco specifico di Owncast:usernameè il nome utente preferito dell'attore (predefinitolive). Combinato con l'host, questo ti dà l'handleacct:senza un'altra richiesta WebFinger.featured_streamsindica la partecipazione nel flusso di featured-streams / mini-directory (vedi Stream pings qui sotto). Un valore di1significa che il server pubblicizza il proprio stato di live ai follower tramite attivitàOfferperiodiche.
x-nodeinfo2 — GET /.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 Mastodon — GET /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}/followingma restituisce sempre404— Owncast non espone mai una lista di following.manuallyApprovesFollowersriflette se il server è in modalità di federazione privata. Quandotrue, i follow non vengono accettati automaticamente.discoverableè sempretrue(utilizzando la semantica del namespacetoot:).- 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
SignatureconkeyId="{actor}#main-key",algorithm="rsa-sha256", e l'elenco delle intestazioni firmate. - Le intestazioni firmate coprono
(request-target),host,date, edigest. - Un'intestazione
Digestcontenente il digest SHA-256 del corpo della richiesta. Content-Type: application/activity+jsone unUser-Agentdella 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:
- Analizza
keyIdealgorithmdalla tua intestazioneSignature. IlkeyIddeve essere un URLhttps://. - Risolvi il tuo attore e recupera la tua chiave pubblica.
- 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.
- Verifica la firma, provando l'algoritmo dichiarato e poi tornando a
rsa-sha256ersa-sha512. - Verifica l'intestazione
Digestrispetto al corpo della richiesta. - If your request carries a parseable
Dateheader, 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 unparseableDateskips 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à | Oggetto | Quando | Inviato a |
|---|---|---|---|
Crea | Nota | Lo stream va live (il messaggio "vai in diretta"); altri post pubblici | Follower (+ Pubblico) |
Aggiorna | Servizio | Il profilo del server (nome, avatar, riassunto, ecc.) cambia | Follower |
Segui | actor IRI | Un operatore segue un altro server Owncast (flusso di featured-streams) | Il server di destinazione |
Offerta | URL del server | Periodicamente mentre è live, come un ping dello stream | Directory followers |
Accetta | follow inbound Follow | In risposta a un Follow ricevuto | Il follower |
Rifiuta | inbound Follow | Quando l'operatore rimuove una directory che stava elencando questo server | Quella directory |
Lascia | server URL | The stream ends (the offline counterpart to Offer) | Directory followers |
Undo | Segui | An operator unfeatures an Owncast server they previously followed | The target server |
Accept / Reject | inbound QuoteRequest | In response to a received QuoteRequest | The 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
Updatedell'attoreServiceviene inviato ai follower quando i metadati del profilo del server cambiano, così le cache remote si aggiornano.Followviene inviato quando un operatore segue un altro server Owncast. Il server poi si aspetta unAccept(oReject) di ritorno.Accettaviene inviato automaticamente in risposta a unFollowin 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 |
|---|---|
Follow | Archivia 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. |
Annulla → Segui | Rimuove il follower. |
Mi piace | Registra un impegno contro un oggetto locale. Emette FediverseEngagementLike. |
Annuncia | Boost/repost di un oggetto locale. Registra un impegno ed emette FediverseEngagementRepost. |
Accetta → Segui | Segna un server remoto Owncast che abbiamo seguito come accettato (flusso di stream in primo piano). |
Rifiuta → Segui | Segna il nostro follow di un server remoto come rifiutato. |
Offerta | Un 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. |
Leave | L'equivalente offline dell'Offerta: segna lo stream del server remoto Owncast come offline. |
Update → Person | Aggiorna i metadati memorizzati (nome visualizzato, inbox, inbox condivisa, avatar) per un follower esistente. Updates with any other object type are ignored. |
Create → Note | Accepted 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. |
QuoteRequest | A 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 piaceeAnnunciavengono 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)
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)
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 è:
- Invia un
Seguiche imposta il markerns#directory(vedi il namespace personalizzato) all'attore del server Owncast. L'operatore lo approva manualmente, quindi aspettati unAccetta. - Ricevi periodiche attività
Offerta(con metadati Owncast) mentre il server è attivo. - Ricevi un
Lasciaquando 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à | Tipo | Significato |
|---|---|---|
https://owncast.online/ns#streamStatus | stringa | "live" o "offline". Sempre presente sulle attività server-to-server. |
https://owncast.online/ns#streamTitle | stringa | Titolo attuale dello stream, quando impostato. |
https://owncast.online/ns#streamDescription | stringa | Descrittivo del server / descrizione. |
https://owncast.online/ns#serverName | stringa | Nome del server leggibile dagli esseri umani. |
https://owncast.online/ns#logoUrl | stringa | URL assoluto al logo del server. |
https://owncast.online/ns#thumbnailUrl | stringa | URL assoluto alla miniatura corrente dello stream. |
https://owncast.online/ns#streamTags | array di stringhe | Tag di metadati del server. |
https://owncast.online/ns#directory | booleano | Impostato 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ì:
- Invia un
Seguifirmato che impostahttps://owncast.online/ns#directorysutrue(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. UnSeguisenza il marker è trattato come un normale follow da fan: potrebbe essere auto-accettato, ma non riceverà mai i pingOfferta/Lascia. - Mentre un server è attivo, pubblica un
Offertanella 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. - Quando lo stream termina in modo pulito, il server pubblica un
Lascia. Segna la voce come offline. - Se l'operatore del server rimuove la tua directory dal proprio lato, il server pubblica un
Rifiutadel tuo originaleSegui. 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
httpohttpsprima 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/Notacome 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.
| Percorso | Metodo | Scopo |
|---|---|---|
/.well-known/webfinger | GET | Risolvi acct: → attore IRI |
/.well-known/host-meta | GET | Puntatore XRD a WebFinger |
/.well-known/nodeinfo | GET | Documento di scoperta NodeInfo |
/nodeinfo/2.0 | GET | Metadati del server NodeInfo 2.0 |
/.well-known/x-nodeinfo2 | GET | metadati del server x-nodeinfo2 |
/api/v1/instance | GET | Descrizione dell'istanza compatibile con Mastodon |
/federation/user/{username} | GET | Il documento attore Servizio |
/federation/user/{username}/inbox | POST | Consegna attività al server |
/federation/user/{username}/outbox | GET | Collezione di attività che il server ha inviato |
/federation/user/{username}/followers | GET | Collezione di follower paginati |
/federation/user/{username}/following | GET | Sempre 404 (nessun elenco di seguiti) |
/federation/{object-id} | GET | Recupera un singolo oggetto ActivityPub memorizzato |
Costruire un'applicazione compatibile — checklist
Per seguire e consumare uno stream di Owncast dalla tua applicazione:
- Risolvi il gestore con WebFinger (
acct:live@host) per ottenere l'attore IRI, quindi recupera l'attore conAccept: application/activity+json. - Pubblica il tuo attore con una
publicKey, servita su HTTPS, con unainboxraggiungibile. - Invia un
Followfirmato allainboxdell'attore. Firma(request-target) host date digestcon RSA e includi unDigestSHA-256. - Gestisci l'
Acceptche Owncast restituisce alla tuainbox(modalità pubblica) — oppure attendi l'approvazione manuale (modalità privata). - Ascolta i post di go-live: le attività
Create/Noteche arrivano nella tuainboxti informano che lo stream è iniziato; il link WebFingeralternate/application/x-mpegURLti fornisce l'URL HLS da riprodurre. - Facoltativamente agisci come un directory: imposta
https://owncast.online/ns#directorysutruenel tuoFollow, fai approvare l'operatore, poi consuma i pingOffer/Leavee i metadatihttps://owncast.online/ns#*per la liveness in tempo reale e voci di directory più ricche. - Verifica la firma su tutto ciò che Owncast ti invia rispetto alla
#main-keydell'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.
