FEDERATION.md
This document describes how Owncast federates with other ActivityPub servers, following FEP-67ff.
Owncast servers present as a single Service actor (not Person). Each Owncast instance has one actor representing the live stream.
The actor profile includes:
icon: Server logo/avatarimage: Profile banner imagesummary: Server description (HTML)attachment: Array of PropertyValue objects containing social links and metadatatag: Hashtags describing the server contentmanuallyApprovesFollowers: true if the server operates in private modediscoverable: Always trueOwncast actors do not follow other actors. The following collection endpoint returns 404.
| Activity | Object | Send | Receive | Notes |
|---|---|---|---|---|
Create | Note | Yes | No | Sent on go-live and manual fediverse posts. Incoming posts are ignored. |
Update | Service | Yes | No | Sent when server profile changes. |
Update | Person | No | Yes | Updates cached follower profile information. |
Follow | - | No | Yes | Queued for approval if private mode is enabled. |
Accept | Follow | Yes | No | Sent automatically unless in private mode. |
Undo | Follow | No | Yes | Removes the follower. |
Like | Note | No | Yes | Optionally displayed in live chat. |
Announce | Note | No | Yes | Optionally displayed in live chat. |
Owncast is a broadcast-only service. It does not follow other actors or accept incoming posts.
Posts from Owncast are Note objects with:
content: HTML-formatted text with linked hashtagsattachment: Image object with stream thumbnail (for go-live posts)tag: Array containing Hashtag and Mention objectssensitive: true if the stream is marked NSFWWhen a stream starts, Owncast sends a Create(Note) containing:
Hashtags use toot:Hashtag type and link to https://directory.owncast.online/tags/{tag} for discovery across Owncast instances.
Public posts are addressed to:
{
"to": ["https://www.w3.org/ns/activitystreams#Public"],
"cc": ["{actor}/followers"]
}
Owncast supports sending direct messages to specific actors (used for replying to engagement). These include the recipient in cc with a corresponding Mention tag for Mastodon compatibility.
Outbound: All POST requests are signed using RSA-SHA256. Signed headers: (request-target), host, date, digest.
Inbound: All POST requests to the inbox must have a valid signature. Unsigned requests are rejected.
GET requests to actor, outbox, and followers endpoints do not require signatures.
Actor discovery via /.well-known/webfinger?resource=acct:{username}@{domain}
Response links include:
self (application/activity+json): Actor documenthttp://webfinger.net/rel/profile-page: Web profilehttp://webfinger.net/rel/avatar: Profile imagealternate (application/x-mpegURL): HLS stream URLThe HLS stream link allows clients to discover the live stream URL directly from WebFinger.
Available at /.well-known/nodeinfo with NodeInfo 2.0 at /nodeinfo/2.0.
Additional endpoints:
/.well-known/x-nodeinfo2: Extended format/api/v1/instance: Mastodon-compatible instance information/.well-known/host-meta: WebFinger discoveryOwncast can operate in private mode where:
manuallyApprovesFollowers is true on the actorAccept is only sent after manual approvalOwncast supports blocking at the domain and individual actor level. Blocked entities:
Service actor type, not Personfollowing collection (Owncast does not follow accounts)Create from remote actors is ignored)Like, Announce) can be displayed in the live chat if enabledsensitive flag indicates NSFW content for the entire stream