πŸ“š Node [[federation]] β˜†
Agora nodes contain community contributions with titles or topics that match your search. x
πŸ“œ federation.md (contribution by @flancian) β˜† πŸ“Ž οΈπŸ”— ✍️ β›Ά

FederationΒ§

πŸ“œ federation.md (contribution by @neil) β˜† πŸ“Ž οΈπŸ”— ✍️ β›Ά

federationΒ§

πŸ“œ app/federation.py (contribution by @agora-server) β˜† πŸ“Ž β›Ά

(Python code, output might appear as a push if this Agora supports it.)

πŸ“œ FEDERATION.md (contribution by @agora-server) β˜† πŸ“Ž β›Ά

Agora FederationΒ§

The Agora supports a basic level of ActivityPub federation, allowing users from other federated platforms (like Mastodon, Pleroma, etc.) to follow and receive updates from users within the Agora.

This document outlines the current implementation.

Key EndpointsΒ§

WebFingerΒ§

  • Endpoint: /.well-known/webfinger?resource=acct:<user>@<domain>
  • Purpose: Allows users on other servers to discover Agora users. When a remote user searches for @<user>@<your.agora.domain>, their server queries this endpoint.
  • Implementation: The Agora checks if the requested user exists. If they do, it returns a JSON response containing a link to the user’s ActivityPub profile (actor) URL.

Actor ProfileΒ§

  • Endpoint: /users/<username> (also aliased to /u/<username>)
  • Purpose: Provides the ActivityPub actor profile for an Agora user. This is a machine-readable JSON object that describes the user.
  • Implementation: The profile includes:
    • The user’s unique id.
    • Their preferredUsername.
    • Links to their inbox and outbox.
    • A link to their human-readable Agora profile page (/u/<user>).
    • A public key (publicKeyPem) for verifying signed requests.

InboxΒ§

  • Endpoint: /u/<user>/inbox (POST)
  • Purpose: Receives activities from other servers.
  • Implementation:
    • Handles Follow, Like, Create (Reply), and Announce (Boost) activities.
    • Incoming requests are verified using HTTP Signatures.
    • Follow: Adds the follower to the database and sends an Accept activity back.
    • Reactions: Stores Likes, Replies, and Boosts in the reactions table in SQLite.

OutboxΒ§

  • Endpoint: /u/<user>/outbox (GET)
  • Purpose: Shows a collection of the user’s recent public activities.
  • Implementation:
    • It returns an OrderedCollection of the user’s 20 most recent subnodes, formatted as Create activities wrapping a Note object.
    • Each Note object has a stable, unique ID (/u/<user>/note/<path>) that returns the ActivityPub JSON representation, ensuring compatibility with Mastodon and other platforms.

Federation LogicΒ§

Following a UserΒ§

  1. A user on a remote server follows an Agora user.
  2. The remote server sends a Follow activity to the Agora user’s inbox.
  3. The Agora validates the activity (HTTP Signature) and adds the follower to its database.
  4. The Agora sends an Accept activity back to the remote server.
  5. Immediately after sending the Accept, the Agora sends the new follower the 5 most recent subnodes from the followed user. This is to populate the new follower’s timeline with some initial content.

Sending Posts (Federating)Β§

  • Initial Posts: As described above, the 5 most recent posts are sent to new followers.
  • Worker Process: To automatically push new content to existing followers, you must run the Federation Worker.
  • Tracking: The Agora tracks which subnodes have been federated in a dedicated SQLite table (federated_subnodes). This prevents sending the same subnode to the same follower multiple times.

Running the Federation WorkerΒ§

The federation worker is a separate process that polls the Git repositories for new commits and broadcasts them to followers.

Manual Run (Single Pass):

uv run python3 scripts/federation_worker.py --once

Continuous Loop (Default Interval: 5 minutes):

uv run python3 scripts/federation_worker.py

Systemd Service: It is recommended to run this as a systemd service (e.g., agora-federation.service) to ensure it runs continuously in the background.

SecurityΒ§

  • Keys: The Agora automatically generates a private.pem and public.pem key pair on first run if they don’t exist.
  • Signed Requests: All outgoing activities (like Accept and Create) are signed with the user’s private key. Remote servers can fetch the public key from the actor profile to verify that the requests are legitimate.
  • Incoming Verification: The Inbox strictly validates HTTP Signatures on incoming requests to prevent spoofing.
πŸ“œ federation.md (contribution by @agora@botsin.space) β˜† πŸ“Ž β›Ά
πŸ“œ FEDERATION.md (contribution by @agora@botsin.space) β˜† πŸ“Ž β›Ά
πŸ“œ Federation.md (contribution by @agora@botsin.space) β˜† πŸ“Ž β›Ά
πŸ“œ federation.md (contribution by @an_agora@twitter.com) β˜† πŸ“Ž β›Ά
πŸ“œ Federation.md (contribution by @an_agora@twitter.com) β˜† πŸ“Ž β›Ά
πŸ“œ federation.md (contribution by @anagora.bsky.social) β˜† πŸ“Ž β›Ά
πŸ“œ federation.md (contribution by @anagora@matrix.org) β˜† πŸ“Ž β›Ά
πŸ“œ Federation.md (contribution by @flancian@social.coop) β˜† πŸ“Ž β›Ά
πŸ“œ federation.md (contribution by @flancian@twitter.com) β˜† πŸ“Ž β›Ά

RT @dakkar@s.thenautilus.net CW: meta, #federation explanation

Aha! Finally found a clear and complete diagram of activity dissemination in #ActivityPub! It uses Mastodon-specific terms, but the logic works and matches both the code and the behaviour I’ve seen. From (1/2)


πŸ“œ Federation.md (contribution by @flancian@twitter.com) β˜† πŸ“Ž β›Ά

A #Flancian believes it is through a [[re evolution]] ~ #reevolution of the #base and [[super structure]] that we will unlock the true potential of humanity and our allies in the #Commons and its #Federation.


@elonmusk btw you worry about Mastodon when you should be embracing the overall [[Federation]], have you considered skating where the buck is going


Loading pushes...

✨ AI Synthesis Mistral Gemini ChatGPT Claude x

Expanding this section will automatically generate an AI synthesis of the contributions in this node.

🌌 Agora context for [[federation]]

Rendering context...

πŸ“š Node [[commons]] (pulled by user) x
πŸ“š Node [[fediverse]] (pulled by user) x
πŸ“š Node [[agora federation]] (pulled by the Agora)
πŸ“œ anagora.bsky.social/agora federation.md (contribution by @bluesky) β˜† πŸ“Ž
πŸ“š Node [[anarchist federation]] (pulled by the Agora)
πŸ“œ anagora.bsky.social/Anarchist Federation.md (contribution by @bluesky) β˜† πŸ“Ž
πŸ“œ agora@social.agor.ai/Anarchist Federation.md (contribution by @mastodon) β˜† πŸ“Ž
πŸ“š Node [[confederation]] (pulled by the Agora)
πŸ“œ confederation.md (contribution by @flancian) β˜† πŸ“Ž οΈπŸ”— ✍️
πŸ“œ confederation.md (contribution by @agora@botsin.space) β˜† πŸ“Ž
πŸ“œ confederation.md (contribution by @an_agora@twitter.com) β˜† πŸ“Ž
πŸ“š Node [[confederation and federation]] (pulled by the Agora)
πŸ“œ confederation-and-federation.md (contribution by @neil) β˜† πŸ“Ž οΈπŸ”— ✍️

Confederation and federationΒ§

πŸ“š Node [[coop cloud federation]] (pulled by the Agora)
πŸ“œ pages/coop cloud federation.md (contribution by @vera) β˜† πŸ“Ž
  • An initiative by [[autonomic coop]]
    • they want to get consensus on changes so that everyone is happy
    • also a distributed funding model
πŸ“š Node [[forge federation]] (pulled by the Agora)
πŸ“œ forge federation.md (contribution by @anagora@matrix.org) β˜† πŸ“Ž
πŸ“š Node [[forgefederation]] (pulled by the Agora)
πŸ“œ ForgeFederation.md (contribution by @agora@botsin.space) β˜† πŸ“Ž
πŸ“š Node [[gitea federation]] (pulled by the Agora)
πŸ“œ gitea_federation.myco (contribution by @melanocarpa) β˜† πŸ“Ž οΈπŸ”— ✍️

Gitea is a forge that is going to join the Fediverse very soon.

2022-07-03 I entered the Forge Federation Matrix channel and asked this question:

What are the thoughts on wiki federation? I know that it's on the roadmap

What is the overall approach? I am a wiki engine developer and I want to join a federation one day, and this one might be a good choice. Currently, in the wiki world there are two approaches to federation: the classic primitive interwiki and FedWiki. I am implementing the first one and highly sceptical of the second one.

Here are the answers:

ta180m: In Gitea, wikis are just normal Git repositories. Therefore we will be federating wikis using ForgeFed exactly the same way that we federate repo source code.

circlebuilder: There was this interesting discussion on FedWiki and how federation with ActivityPub would fit in. Lotsa fascinating points but ultimately talk went to technology and how they would fit together. But without asking why you would do all that i.e. without exploring needs, functionality, opportunities. So, I decided to write down some notes. All in all I think there's a very interesting case for the Fediverse. In all the microblogging chatter good potential wiki knowledge is continuously lost. I recently moved my topic from SocialHub to #SocialCoding:matrix.org and it is at: https://discuss.coding.social/t/semmy-social-knowledge-fabrics/76

dachary.org: wellcome! Forges, as you surely know, store wiki in a DVCS and there seems to be a consensus that a hierarchy of MD files is good enough. The rendering of these files varies though. My feeling is that it is rather primitive, even compared to the less evolved wiki engine. In a nutshell wiki federation as I see it is essentially based on DVCS mirroring and not much else.

Overall, Gitea won't have wiki federation as a first-class citizen. I'll have to proceed with Mycoverse.

What has to be done for the federation.

πŸ“š Node [[idiosyncratic federation]] (pulled by the Agora)
πŸ“œ idiosyncratic federation.md (contribution by @anagora.bsky.social) β˜† πŸ“Ž
πŸ“š Node [[in my flancia we cooperate our way to an international liquid democratic federation]] (pulled by the Agora)
πŸ“œ in my flancia we cooperate our way to an international liquid democratic federation.md (contribution by @flancian) β˜† πŸ“Ž οΈπŸ”— ✍️

In my Flancia we cooperate our way to an international liquid democratic federationΒ§

πŸ“š Node [[jura federation]] (pulled by the Agora)
πŸ“œ jura-federation.md (contribution by @neil) β˜† πŸ“Ž οΈπŸ”— ✍️

Jura FederationΒ§

πŸ“š Node [[knowledge federation]] (pulled by the Agora)
πŸ“œ knowledge federation.md (contribution by @flancian) β˜† πŸ“Ž οΈπŸ”— ✍️
πŸ“œ knowledge federation.md (contribution by @agora@botsin.space) β˜† πŸ“Ž
πŸ“œ knowledge federation.md (contribution by @an_agora@twitter.com) β˜† πŸ“Ž
πŸ“š Node [[mastodon simplified federation]] (pulled by the Agora)
πŸ“œ mastodon simplified federation.md (contribution by @agora@botsin.space) β˜† πŸ“Ž
πŸ“œ Mastodon simplified federation.md (contribution by @agora@botsin.space) β˜† πŸ“Ž
πŸ“œ mastodon simplified federation.md (contribution by @an_agora@twitter.com) β˜† πŸ“Ž
πŸ“š Node [[mediawiki federation]] (pulled by the Agora)
πŸ“œ mediawiki federation.md (contribution by @agora@botsin.space) β˜† πŸ“Ž
πŸ“š Node [[p2pfederation]] (pulled by the Agora)
πŸ“œ p2pFederation.md (contribution by @agora@botsin.space) β˜† πŸ“Ž
πŸ“š Node [[reset federation]] (pulled by the Agora)
πŸ“œ scripts/reset_federation.py (contribution by @agora-server) β˜† πŸ“Ž

(Python code, output might appear as a push if this Agora supports it.)

πŸ“š Node [[retry federation]] (pulled by the Agora)
πŸ“œ scripts/retry_federation.py (contribution by @agora-server) β˜† πŸ“Ž

(Python code, output might appear as a push if this Agora supports it.)

πŸ“š Node [[the federation]] (pulled by the Agora)
πŸ“œ the federation.md (contribution by @flancian) β˜† πŸ“Ž οΈπŸ”— ✍️

The FederationΒ§

πŸ“œ the federation.md (contribution by @vera) β˜† πŸ“Ž
πŸ“š Node [[threads federation]] (pulled by the Agora)
πŸ“œ Threads Federation.md (contribution by @agora@botsin.space) β˜† πŸ“Ž
πŸ“œ Threads Federation.md (contribution by @flancian@social.coop) β˜† πŸ“Ž