#fediDev
First talk today at the Social Web Devroom we have @pfefferle talking about the state of WordPress's fediverse integration
#fosdem #activitypub #fedidev
January 31, 2026 at 9:45 AM
Wafrn App can now finally edit your public profile and private options

On our way to the first complete version #WafrnDev #FediDev
December 13, 2024 at 1:45 AM
Great news for the wafrn app !!

As a culmination of the big journey of the past weeks, the Wafrn App is now listed in the official @unifiedpush documentation as one of the apps that support UnifiedPush

Check it at https://unifiedpush.org/users/apps/ #WafrnDev #FediDev #UnifiedPush #De-G[...]
See complete post at app.wafrn.net
app.wafrn.net is a Wafrn server. Wafrn is a federated social media inspired by Tumblr, join us and have fun!
app.wafrn.net
May 5, 2025 at 12:42 PM
Link Previews coming to the wafrn app soon!

Also a little something new in the three dots menu! #WafrnDev #FediDev #Automatic-update #no-need-to-download-anything
April 18, 2025 at 10:40 PM
yeah it was pretty bad

but whats worse that the activitypub developer community was already kinda shattered. the fedidev matrix channel is now also seeing less and less usage, and is kinda dead

so this is also losing another shared space for AP dev
October 30, 2025 at 1:39 PM
I was scrolling @pixelix and discovered @ghostbyte is getting the instance statistic data from new fediverse tracker they built called https://fedisea.surf

Also open source with their own crawler https://github.com/ghostbyte-dev/fedisea-web #fedidev #fediverse #activitypub
FediSea
Homepage of FediSea
fedisea.surf
September 20, 2026 at 12:15 PM
Had my first taste of dealing with debugging other AP softwares weird activities and I can see how working full time on FediDev would lead to The Horrors
March 1, 2026 at 7:02 AM
like, its that spaces like the fedidev matrix channel are much quieter and smaller, and that the devs of the main platforms (mastodon, peertube, lemmy) simply dont talk with each other at all

but its also how conversations on feeds go, and who participates, and thats hard to describe
October 30, 2025 at 3:17 PM
We've just added an English homepage for FediDev KR, a community of fediverse developers living in Korea or using the Korean language.

If you're interested in connecting with Korean-speaking fediverse developers, feel free to check it out: https://fedidev.kr/en/.
FediDev KR — Korean Fediverse Developers
A community of fediverse developers living in Korea or using the Korean language.
fedidev.kr
March 7, 2026 at 2:42 AM
RE: https://mastodon.social/@fediversereport/116178002926045553

Laurens Hof is at it again highlighting the problems of our lack of an adequate ActivityPub API and the hurdles that are to come in it getting adoption.
#fedidev
new from me: FR#156 - Share Where?

on @Mastodon 's new Share button, the Mastodon API and protocol ownership

https://connectedplaces.online/reports/fr156-share-where/
connectedplaces.online
March 5, 2026 at 7:24 PM
[Wafrn app development]
Very soon... Real android notifications are coming to the wafrn app #WafrnDev #FediDev #react-native
February 22, 2025 at 1:49 AM
If I had a nickle for every time someone was driven away from AP development by the incomplete specifications and unwelcoming leadership/community...

#activitypubmeta #activitypub #fedidev

RE: https://not-brain.d.on-t.work/notes/appcnvut7075wfgg
not-brain.d.on-t.work
August 9, 2026 at 1:08 PM
this will happen alongside upping the `api_version` `net.iceshrimp.bites` to `2`. the old endpoint will exist in iceshrimp.net for existing clients, but will not be documented in v2 (so wafrn can expose it and save client devs from feature detection hell)

#mastoDev #fediDev
September 22, 2026 at 7:59 PM
혹시 개발하시는 분이나 개발 안하시더라도

마스토돈/미스키 등의
페디버스 클라이언트에 관심 있으시다던가

아니면 블스 - 페디 브릿지 같은 것에 관심있다던가 하면

관련 한국 디코가 있어요!
discord.gg/fP7fvH24

블친분들도 환영해요!
FediDev KR Discord 서버에 가입하세요!
Discord에서 FediDev KR 커뮤니티를 확인하세요. 169명과 어울리며 무료 음성 및 텍스트 채팅을 즐기세요.
discord.gg
September 3, 2024 at 12:05 PM
Today, I had lunch with @Yohei_Zuho and @kur0den0010 from FediLUG Japan, along with @nebuleto from FediDev KR, and it looks like something exciting is going to happen at @COSCUP 2026! Stay tuned!
Fediverse Linux Users Group
fedilug.y-zu.org
March 6, 2026 at 9:03 AM
Had a wonderful time today at our second FediDev KR #sprint (@sprints.fedidev.kr) gathering at Turing's Apple (@TuringAppleDev) in #seoul!

We spent the day contributing to various #fediverse open source projects including @fedify@hollo.socikal, @hollo, and […]

[Original post on hollo.social]
May 24, 2025 at 11:24 AM
Don't build #activitypub from scratch! It's complex. See why using the #fedify framework is the smarter way to develop for the Fediverse in my new post:

https://hackers.pub/@hongminhee/2025/why-use-fedify

#fedidev
Ditch the DIY Drama: Why Use Fedify Instead of Building ActivityPub from Scratch?
So, you're captivated by the Fediverse—the decentralized social web powered by protocols like ActivityPub. Maybe you're dreaming of building the next great federated app, a unique space connected to Mastodon, Lemmy, Pixelfed, and more. The temptation to dive deep and implement ActivityPub yourself, from the ground up, is strong. Total control, right? Understanding every byte? Sounds cool! But hold on a sec. Before you embark on that epic quest, let's talk reality. Implementing ActivityPub correctly isn't just one task; it's like juggling several complex standards while riding a unicycle… blindfolded. It’s _hard_. That's where **Fedify** comes in. It's a TypeScript framework designed to handle the gnarliest parts of ActivityPub development, letting you focus on what makes _your_ app special, not reinventing the federation wheel. This post will break down the common headaches of DIY ActivityPub implementation and show how Fedify acts as the super-powered pain reliever, starting with the very foundation of how data is represented. ## Challenge #1: Data Modeling—Speaking ActivityStreams & JSON-LD Fluently At its core, ActivityPub relies on the ActivityStreams 2.0 vocabulary to describe actions and objects, and it uses JSON-LD as the syntax to encode this vocabulary. While powerful, this combination introduces significant complexity right from the start. First, understanding and correctly using the vast ActivityStreams vocabulary itself is a hurdle. You need to model everything—posts (`Note`, `Article`), profiles (`Person`, `Organization`), actions (`Create`, `Follow`, `Like`, `Announce`)—using the precise terms and properties defined in the specification. Manual JSON construction is tedious and prone to errors. Second, JSON-LD, the encoding layer, has specific rules that make direct JSON manipulation surprisingly tricky: * **Missing vs. Empty Array:** In JSON-LD, a property being absent is often semantically identical to it being present with an empty array. Your application logic needs to treat these cases equally when checking for values. For example, these two `Note` objects mean the same thing regarding the `name` property: // 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:** Similarly, a property holding a single value directly is often equivalent to it holding a single-element array containing that value. Your code must anticipate both representations for the same meaning, like for the `content` property here: // 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 Reference vs. Embedded Object:** Properties can contain either the full JSON-LD object embedded directly or just a URI string referencing that object. Your application needs to be prepared to fetch the object's data if only a URI is given (a process called _dereferencing_). These two `Announce` activities are semantically equivalent (assuming the URIs resolve correctly): { "@context": "https://www.w3.org/ns/activitystreams", "type": "Announce", // Embedded objects: "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", // URI references: "actor": "http://sally.example.org/", "object": "https://sally.example.com/arrive" } Attempting to manually handle all these vocabulary rules and JSON-LD variations consistently across your application inevitably leads to verbose, complex, and fragile code, ripe for subtle bugs that break federation. Fedify tackles this entire data modeling challenge with its comprehensive, **type-safe Activity Vocabulary API**. It provides TypeScript classes for ActivityStreams types and common extensions, giving you autocompletion and compile-time safety. Crucially, these classes internally manage all the tricky JSON-LD nuances. Fedify's property accessors present a consistent interface—non-functional properties (like `tags`) always return arrays, functional properties (like `content`) always return single values or null. It handles object references versus embedded objects seamlessly through **dereferencing accessors** (like `activity.getActor()`) which automatically fetch remote objects via URI when needed—a feature known as **property hydration**. With Fedify, you work with a clean, predictable TypeScript API, letting the framework handle the messy details of AS vocabulary and JSON-LD encoding. ## Challenge #2: Discovery & Identity—Finding Your Actors Once you can model data, you need to make your actors discoverable. This primarily involves the WebFinger protocol (RFC 7033). You'd need to build a server endpoint at `/.well-known/webfinger` capable of parsing resource queries (like `acct:` URIs), validating the requested domain against your server, and responding with a precisely formatted JSON Resource Descriptor (JRD). This JRD must include specific links, like a `self` link pointing to the actor's ActivityPub ID using the correct media type. Getting any part of this wrong can make your actors invisible. Fedify simplifies this significantly. It **automatically handles WebFinger requests** based on the actor information you provide through its `setActorDispatcher()` method. Fedify generates the correct JRD response. If you need more advanced control, like mapping user-facing handles to internal identifiers, you can easily register `mapHandle()` or `mapAlias()` callbacks. You focus on defining your actors; Fedify handles making them discoverable. // Example: Define how to find actors federation.setActorDispatcher( "/users/{username}", async (ctx, username) => { /* ... */ } ); // Now GET /.well-known/webfinger?resource=acct:username@your.domain just works! ## Challenge #3: Core ActivityPub Mechanics—Handling Requests and Collections Serving actor profiles requires careful content negotiation. A request for an actor's ID needs JSON-LD for machine clients (`Accept: application/activity+json`) but HTML for browsers (`Accept: text/html`). Handling incoming activities at the inbox endpoint involves validating `POST` requests, verifying cryptographic signatures, parsing the payload, preventing duplicates (idempotency), and routing based on activity type. Implementing collections (`outbox`, `followers`, etc.) with correct pagination adds another layer. Fedify streamlines all of this. Its core request handler (via `Federation.fetch()` or framework adapters like @fedify/express) manages content negotiation. You define actors with `setActorDispatcher()` and web pages with your framework (Hono, Express, SvelteKit, etc.)—Fedify routes appropriately. For the inbox, `setInboxListeners()` lets you define handlers per activity type (e.g., `.on(Follow, ...)`), while Fedify **automatically handles validation, signature verification, parsing, and idempotency checks** using its KV Store. Collection implementation is simplified via dispatchers (e.g., `setFollowersDispatcher()`); you provide logic to fetch a page of data, and Fedify **constructs the correct`Collection` or `CollectionPage`** with pagination. // Define inbox handlers federation.setInboxListeners("/inbox", "/users/{handle}/inbox") .on(Follow, async (ctx, follow) => { /* Handle follow */ }) .on(Undo, async (ctx, undo) => { /* Handle undo */ }); // Define followers collection logic federation.setFollowersDispatcher( "/users/{handle}/followers", async (ctx, handle, cursor) => { /* ... */ } ); ## Challenge #4: Reliable Delivery & Asynchronous Processing—Sending Activities Robustly Sending an activity requires more than a simple POST. Networks fail, servers go down. You need robust failure handling and retry logic (ideally with backoff). Processing incoming activities synchronously can block your server. Efficiently broadcasting to many followers (fan-out) requires background processing and using shared inboxes where possible. Fedify addresses reliability and scalability using its **`MessageQueue` abstraction**. When configured (highly recommended), `Context.sendActivity()` enqueues delivery tasks. Background workers handle sending with **automatic retries** based on configurable policies (like `outboxRetryPolicy`). Fedify supports various queue backends (Deno KV, Redis, PostgreSQL, AMQP). For high-traffic fan-out, Fedify uses an **optimized two-stage mechanism** to distribute the load efficiently. // Configure Fedify with a persistent queue (e.g., Deno KV) const federation = createFederation({ queue: new DenoKvMessageQueue(/* ... */), // ... }); // Sending is now reliable and non-blocking await ctx.sendActivity({ handle: "myUser" }, recipient, someActivity); ## Challenge #5: Security—Avoiding Common Pitfalls Securing an ActivityPub server is critical. You need to implement HTTP Signatures (draft-cavage-http-signatures-12) for server-to-server authentication—a complex process. You might also need Linked Data Signatures (LDS) or Object Integrity Proofs (OIP) based on FEP-8b32 for data integrity and compatibility. Managing cryptographic keys securely is essential. Lastly, fetching remote resources risks Server-Side Request Forgery (SSRF) if not validated properly. Fedify is designed with security in mind. It **automatically handles the creation and verification of HTTP Signatures, LDS, and OIP** , provided you supply keys via `setKeyPairsDispatcher`. It includes key management utilities. Crucially, Fedify's default document loader **includes built-in SSRF protection** , blocking requests to private IPs unless explicitly allowed. ## Challenge #6: Interoperability & Maintenance—Playing Nicely with Others The Fediverse is diverse. Different servers have quirks. Ensuring compatibility requires testing and adaptation. Standards evolve with new Federation Enhancement Proposals (FEPs). You also need protocols like NodeInfo to advertise server capabilities. Fedify aims for **broad interoperability** and is actively maintained. It includes features like `ActivityTransformer`s to smooth over implementation differences. NodeInfo support is built-in via `setNodeInfoDispatcher`. ## Challenge #7: Developer Experience—Actually Building Your App Beyond the protocol, building _any_ server involves setup, testing, and debugging. With federation, debugging becomes harder—was the message malformed? Was the signature wrong? Is the remote server down? Is it a compatibility quirk? Good tooling is essential. Fedify enhances the developer experience significantly. Being **built with TypeScript** , it offers excellent type safety and editor auto-completion. The **`fedify` CLI** is a powerful companion designed to streamline common development tasks. You can quickly scaffold a new project tailored to your chosen runtime and web framework using `fedify init`. For debugging interactions and verifying data, `fedify lookup` is invaluable. It lets you inspect how any remote actor or object appears from the outside by performing WebFinger discovery and fetching the object's data. Fedify then displays the parsed object structure and properties directly in your terminal. For example, running: $ fedify lookup @fedify-example@fedify-blog.deno.dev Will first show progress messages and then output the structured representation of the actor, similar to this: // Output of fedify lookup command (shows parsed object structure) Person { id: URL "https://fedify-blog.deno.dev/users/fedify-example", name: "Fedify Example Blog", published: 2024-03-03T13:18:11.857Z, // Simplified timestamp summary: "This blog is powered by Fedify, a fediverse server framework.", url: URL "https://fedify-blog.deno.dev/", preferredUsername: "fedify-example", publicKey: CryptographicKey { id: URL "https://fedify-blog.deno.dev/users/fedify-example#main-key", owner: URL "https://fedify-blog.deno.dev/users/fedify-example", publicKey: CryptoKey { /* ... CryptoKey details ... */ } }, // ... other properties like inbox, outbox, followers, endpoints ... } This allows you to easily check how data is structured or troubleshoot why an interaction might be failing by seeing the actual properties Fedify parsed. Testing _outgoing_ activities from your application during development is made much easier with `fedify inbox`. Running the command starts a temporary local server that acts as a publicly accessible inbox, displaying key information about the temporary actor it creates for receiving messages: $ fedify inbox ✔ The ephemeral ActivityPub server is up and running: https://<unique_id>.lhr.life/ ✔ Sent follow request to @<some_test_account>@activitypub.academy. ╭───────────────┬─────────────────────────────────────────╮ │ Actor handle: │ i@<unique_id>.lhr.life │ ├───────────────┼─────────────────────────────────────────┤ │ Actor URI: │ https://<unique_id>.lhr.life/i │ ├───────────────┼─────────────────────────────────────────┤ │ Actor inbox: │ https://<unique_id>.lhr.life/i/inbox │ ├───────────────┼─────────────────────────────────────────┤ │ Shared inbox: │ https://<unique_id>.lhr.life/inbox │ ╰───────────────┴─────────────────────────────────────────╯ Web interface available at: http://localhost:8000/ You then configure your developing application to send an activity to the `Actor inbox` or `Shared inbox` URI provided. When an activity arrives, `fedify inbox` **only prints a summary table** to your console indicating that a request was received: ╭────────────────┬─────────────────────────────────────╮ │ Request #: │ 2 │ ├────────────────┼─────────────────────────────────────┤ │ Activity type: │ Follow │ ├────────────────┼─────────────────────────────────────┤ │ HTTP request: │ POST /i/inbox │ ├────────────────┼─────────────────────────────────────┤ │ HTTP response: │ 202 │ ├────────────────┼─────────────────────────────────────┤ │ Details │ https://<unique_id>.lhr.life/r/2 │ ╰────────────────┴─────────────────────────────────────╯ Crucially, the **detailed information** about the received request—including the full headers (like `Signature`), the request body (the Activity JSON), and the signature verification status—**is only available in the web interface** provided by `fedify inbox`. This web UI allows you to thoroughly inspect incoming activities during development. The Fedify Inbox web UI is where you view detailed activity information. When you need to test interactions with the live Fediverse from your local machine beyond just sending, `fedify tunnel` can securely expose your entire local development server temporarily. This suite of tools significantly eases the process of building and debugging federated applications. ## Conclusion: Build Features, Not Plumbing Implementing the ActivityPub suite of protocols from scratch is an incredibly complex and time-consuming undertaking. It involves deep dives into multiple technical specifications, cryptographic signing, security hardening, and navigating the nuances of a diverse ecosystem. While educational, it dramatically slows down the process of building the actual, unique features of your federated application. Fedify offers a well-architected, secure, and type-safe foundation, handling the intricacies of federation for you—data modeling, discovery, core mechanics, delivery, security, and interoperability. It lets you **focus on your application's unique value and user experience.** Stop wrestling with low-level protocol details and start building your vision for the Fediverse faster and more reliably. Give Fedify a try! Getting started is straightforward. First, **install the Fedify CLI** using your preferred method. Once installed, create a new project template by running `fedify init your-project-name`. Check out the Fedify tutorials and Fedify manual to learn more. Happy federating!
hackers.pub
April 14, 2025 at 12:58 AM
Mastodon now has a table with size limits in its `FEDERATION.md`:

https://github.com/mastodon/mastodon/blob/main/FEDERATION.md#size-limits

Very good idea. I am going to do the same.

#fedidev
April 30, 2026 at 3:59 PM
If you'd like to support the development of @fedify or @hollo, you can sponsor me on GitHub!

https://github.com/sponsors/dahlia

#fedidev
Sponsor @dahlia on GitHub Sponsors
I usually write open source software libraries and small CLI programs, which means their consumers are mostly software engineers. My interests are: fediverse & CJK languages.
github.com
November 30, 2024 at 9:13 AM
im high as fuck and have a github release in my backpack

beeline v0.2.8

you could consider this an early beta of sorts! if anyone were to install this i would love to hear their thoughts

#misskey #mastodon #linux #fedidev #kotlin #android #tusky #fedilab #pleroma #pixelfed
September 17, 2026 at 6:25 AM