Holy wall of text, Batman!
Ditch the DIY Drama: Why Use Fedify Instead of Building ActivityPub from Scratch?
Submitted 1 week ago by cm0002@lemmy.world to fediverse@lemmy.world
https://hackers.pub/@hongminhee/2025/why-use-fedify
Comments
arotrios@lemmy.world 1 week ago
mutual_ayed@sh.itjust.works 1 week ago
The Allure of the Fediverse and the Challenges of ActivityPub Implementation
The fediverse—a decentralized social web powered by protocols like ActivityPub—is an exciting space to explore. If you’re considering building the next great federated app, connected to platforms like Mastodon, Lemmy, Pixelfed, and more, you might be tempted to implement ActivityPub from scratch. While this approach offers total control, it’s a daunting task due to the complexity of the standards involved.
The Challenge: Data Modeling with ActivityStreams & JSON-LD
At its core, ActivityPub relies on ActivityStreams 2.0 vocabulary and JSON-LD syntax. This combination introduces significant complexity:
-
Understanding ActivityStreams Vocabulary:
You need to model actions and objects (e.g., posts asNote
orArticle
, profiles asPerson
orOrganization
, and actions likeCreate
,Follow
,Like
,Announce
) using the precise terms defined in the specification. -
JSON-LD Specifics:
JSON-LD has unique rules that complicate direct JSON manipulation:- Missing vs. Empty Arrays: A property being absent is often semantically identical to it being present with an empty array.
// No name property { "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": "…"} // Equivalent to: { "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "name": [], "content": "…"}
- Single Value vs. Array: A property can hold a single value or an array.
// Single value { "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": "Hello"} // Equivalent to: { "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": ["Hello"]}
- Object References vs. Embedded Objects: Properties can contain either embedded objects or URI references.
// Embedded object { "@context": "https://www.w3.org/ns/activitystreams", "type": "Announce", "actor": { "type": "Person", "id": "http://sally.example.org/", "name": "Sally" }, "object": { "type": "Arrive", "id": "https://sally.example.com/arrive", /* ... */ } } // Equivalent to: { "@context": "https://www.w3.org/ns/activitystreams", "type": "Announce", "actor": "http://sally.example.org/", "object": "https://sally.example.com/arrive" }
- Missing vs. Empty Arrays: A property being absent is often semantically identical to it being present with an empty array.
Fedify: Simplifying ActivityPub Development
Fedify, a TypeScript framework, abstracts the complexity of ActivityPub development. It handles the heavy lifting, allowing you to focus on what makes your app unique.
Example Code with Fedify
Fedify simplifies federation logic:
// Handle follow federation.on(Follow, async (ctx, follow) => { // Implement follow logic }); // Handle post activity federation.on(Create, async (ctx, activity) => { // Implement post activity logic });
Web Interface and Logs
When running your app:
Web interface available at: http://localhost:8000/
Logs example:
.lhr.life/r/2 | ╰─────────────────┴───────────────────────────────────────╯
Conclusion
Building a federated app with ActivityPub is challenging, but tools like Fedify make the process manageable. By abstracting away the complexity of JSON-LD and ActivityStreams, Fedify allows developers to focus on creating innovative applications for the fediverse.
-
rimu@piefed.social 1 week ago
Because outsourcing your core business processes is a bad idea. A fediverse app that relies on a library to do all the fediverse stuff is going to have a bad time. Not straight away, but eventually.
tofu@lemmy.nocturnal.garden 1 week ago
I’m not sure about that. Sometimes it’s more about properly applying libraries. Thinking of database handling or cryptography
rimu@piefed.social 1 week ago
Imagine you want to write a competitor to PostgreSQL and you start out by importing SQLite into your project and building on top of that. To you it seems like a good idea because you've never written a DB app before and the only DB you've ever seen before is SQLite. You'll get a prototype real fast but you'll never build a PostgreSQL equivalent because you never learned the foundational knowledge of how a DB works and because SQLite forecloses all the pathways you need to get there.
Same thing.
Nighed@feddit.uk 1 week ago
It looks like an open source project. Makes a hell of a lot more sense to implement using that than rolling your own? If it’s missing something you need, write it for them.
Writing your own implementation is extremely unlikely to differentiate your app/product. There is a spec, either you implement it and it works, or you don’t and it doesn’t. Using a maintained library is by far the better option.
Focus your time on the product you are building not the tech.