<p>๐ Big thanks to <span class="h-card"><a href="https://hackers.pub/@2chanhaeng" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>2chanhaeng</span></a></span> for his first contribution to <a href="/tags/fedify/" rel="tag">#Fedify</a>! He implemented the new <a href="https://unstable.fedify.dev/cli#fedify-webfinger-looking-up-a-webfinger-resource" rel="nofollow">fedify webfinger</a> command in <a href="https://github.com/fedify-dev/fedify/pull/278" rel="nofollow">PR #278</a>, which allows isolated <a href="/tags/webfinger/" rel="tag">#WebFinger</a> lookups for testing configurations. This addresses the need for developers to test WebFinger functionality without performing comprehensive object retrieval.</p><p>The contribution includes:</p><p>A new fedify webfinger <handle> command that accepts @user@domain format handles or URIs<br>Clean JSON output of WebFinger JRD results<br>Proper error handling for invalid handles and lookup failures<br>Complete <a href="/tags/cli/" rel="tag">#CLI</a> integration with help text and usage examples</p><p>This was originally filed as <a href="https://github.com/fedify-dev/fedify/issues/260" rel="nofollow">issue #260</a> and marked as a <a href="https://github.com/fedify-dev/fedify/issues?q=sort%3Aupdated-desc+state%3Aopen+label%3A%22good+first+issue%22" rel="nofollow">good first issue</a>โperfect for newcomers to learn the codebase structure while contributing meaningful functionality. The PR has been merged and will be included in the upcoming Fedify 1.8.0 release.</p><p>We appreciate all first-time contributors who help make Fedify better for the entire <a href="/tags/fediverse/" rel="tag">#fediverse</a> community. Welcome aboard, ChanHaeng!</p><p><a href="/tags/opensource/" rel="tag">#opensource</a> <a href="/tags/fedidev/" rel="tag">#fedidev</a></p>
fedidev
<p>We're thrilled to highlight five outstanding contributions from the Korean Open Source Contribution Academy (<a href="/tags/ossca/" rel="tag">#OSSCA</a>) program participants who have been working on <a href="/tags/fedify/" rel="tag">#Fedify</a>! Their dedication and effort have significantly enhanced our <a href="/tags/activitypub/" rel="tag">#ActivityPub</a> server framework.</p><p>First up is <span class="h-card"><a href="https://hackers.pub/@nyeong" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>nyeong</span></a></span> with his monumental <a href="/tags/318 pr/" rel="tag">#318 PR</a>, implementing a SQLite-based keyโvalue store to address <a href="/tags/274/" rel="tag">#274</a>. This contribution adds the SqliteKvStore class with full cross-runtime support for Node.js, Deno, and Bun through the new @fedify/sqlite package. His implementation includes atomic operations, TTL support, comprehensive test coverage, and careful attention to SQL injection prevention. This enables developers to use SQLite as a persistent storage backend while maintaining compatibility with Fedify's existing KvStore APIโa crucial feature for production deployments!</p><p>Next, <span class="h-card"><a href="https://hackers.pub/@crohasang" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>crohasang</span></a></span> delivered an excellent quality-of-life improvement with <a href="/tags/341 pr/" rel="tag">#341 PR</a>, fixing <a href="/tags/257/" rel="tag">#257</a>. He enhanced the CLI to properly respect TTY status and the NO_COLOR environment variable, implementing intelligent color control across all CLI commands. The solution involved switching from @cliffy/ansi/colors to @std/fmt/colors, creating a helper function using Deno.inspect() to handle object formatting, and ensuring colors are correctly disabled when output is redirected to files. This makes the CLI much more pipe-friendly and suitable for automated workflows!</p><p><span class="h-card"><a href="https://hackers.pub/@menele" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>menele</span></a></span> contributed a thoughtful enhancement with <a href="/tags/342 pr/" rel="tag">#342 PR</a>, addressing <a href="/tags/191/" rel="tag">#191</a>. She updated the fedify inbox command to display not just the activity type, but also the type of object contained within each activityโtransforming output like "Create" into the more informative "Create(Note)" or "Undo" into "Undo(Follow)". This seemingly simple change required making the display function asynchronous to fetch the enclosed objects, significantly improving the debugging experience for developers!</p><p><span class="h-card"><a href="https://hackers.pub/@woaol" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>woaol</span></a></span> tackled an important developer experience issue with <a href="/tags/329 pr/" rel="tag">#329 PR</a>, solving <a href="/tags/306/" rel="tag">#306</a>. Previously, the fedify init command would often install outdated versions of Fedify packages like @fedify/redis because version numbers were hardcoded in the CLI. They created a getLatestVersion() function that dynamically retrieves package versions from local metadata files, ensuring that developers always get the latest versions of all Fedify packages when initializing a new project. This improvement includes comprehensive test coverage and eliminates the frustration of starting a project with outdated dependencies!</p><p>Finally, <span class="h-card"><a href="https://hackers.pub/@kodingwarrior" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>kodingwarrior</span></a></span> made a significant contribution with <a href="/tags/309 pr/" rel="tag">#309 PR</a>, implementing <a href="/tags/269/" rel="tag">#269</a>โNestJS integration! They created the @fedify/nestjs package with a FedifyModule that seamlessly integrates Fedify into NestJS applications. This includes proper middleware implementation, dependency injection support through NestJS's module system, and compatibility with both CommonJS and ESM environments. This opens up Fedify to the large NestJS developer community, making it easier than ever to build ActivityPub-enabled applications with this popular enterprise framework!</p><p>These contributions showcase the incredible talent and dedication of the OSSCA participants. From core infrastructure improvements to developer experience enhancements, each contribution makes Fedify better for the entire community. Thank you all for your hard work and welcome to the Fedify contributor family! ๐</p><p>We're looking forward to seeing more amazing contributions from the OSSCA program and the broader community. If you're interested in contributing to Fedify, check out our <a href="https://github.com/fedify-dev/fedify" rel="nofollow">GitHub repository</a> and join us in building the future of federated social web! ๐</p><p><a href="/tags/opensource/" rel="tag">#opensource</a> <a href="/tags/fedidev/" rel="tag">#fedidev</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a></p>
<p>๐ Huge shoutout to two amazing contributors from Korea's <a href="/tags/ossca/" rel="tag">#OSSCA</a> program who've made excellent contributions to <a href="/tags/fedify/" rel="tag">#Fedify</a>!</p><p>๐ <span class="h-card"><a href="https://yuri.garden/@gaebalgom" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>gaebalgom</span></a></span> tackled a tricky terminal compatibility issue in <a href="https://github.com/fedify-dev/fedify/pull/282" rel="nofollow">PR #282</a>, fixing the fedify node command's favicon display on terminal emulators without truecolor support (<a href="/tags/168/" rel="tag">#168</a>). His solution elegantly detects terminal capabilities and falls back to 256-color mode when neededโensuring a great experience across different environments.</p><p>๐ <span class="h-card"><a href="https://hackers.pub/@joonnot" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>joonnot</span></a></span> enhanced Fedify's <a href="/tags/webfinger/" rel="tag">#WebFinger</a> functionality in <a href="https://github.com/fedify-dev/fedify/pull/281" rel="nofollow">PR #281</a> by adding a configurable maxRedirection option to the lookupWebFinger() function (<a href="/tags/248/" rel="tag">#248</a>). He transformed a hardcoded limitation into a flexible, user-customizable parameter while maintaining perfect backward compatibility.</p><p>Both delivered thoughtful, well-implemented solutions that showcase the quality of contributions coming from the OSSCA program. Welcome to the Fedify community! <img src="https://neodb.social/media/emoji/hollo.social/fedify.png" class="emoji" alt=":fedify:" title=":fedify:"></p><p><a href="/tags/activitypub/" rel="tag">#ActivityPub</a> <a href="/tags/opensource/" rel="tag">#opensource</a> <a href="/tags/fedidev/" rel="tag">#fedidev</a></p>
<p>๐ฃ Exciting news! <a href="https://unstable.fedify.dev/cli#using-homebrew-on-macos-and-linux" rel="nofollow">Fedify CLI is now available via Homebrew!</a></p><p>If you're using <a href="/tags/homebrew/" rel="tag">#Homebrew</a> on macOS or <a href="/tags/linuxbrew/" rel="tag">#Linuxbrew</a> on Linux, you can now install our CLI toolchain with a simple command:</p><p>brew install fedify</p><p>This makes it even easier to get started with building your federated server app. Try it out and let us know what you think!</p><p><a href="/tags/fedify/" rel="tag">#Fedify</a> <a href="/tags/activitypub/" rel="tag">#ActivityPub</a> <a href="/tags/fedidev/" rel="tag">#fedidev</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a></p>
<p>If youโre interested in viewing the sessions from Fedicon, follow <span class="h-card"><a href="[{'type': 'Link', 'href': 'https://spectra.video/a/fedicon/video-channels', 'mediaType': 'text/html'}, {'type': 'Link', 'href': 'https://spectra.video/a/fedicon', 'mediaType': 'text/html'}, {'type': 'Link', 'href': 'https://spectra.video/accounts/fedicon', 'mediaType': 'text/html'}]" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>fedicon</span></a></span></p><p>Itโs been less than 24 hours and the first session is already listed!</p><p><a href="https://spectra.video/w/eg35Kne91oEHcgyfvQWMhM" rel="nofollow" class="ellipsis" title="spectra.video/w/eg35Kne91oEHcgyfvQWMhM"><span class="invisible">https://</span><span class="ellipsis">spectra.video/w/eg35Kne91oEHcg</span><span class="invisible">yfvQWMhM</span></a></p><p><a href="/tags/fedicon/" rel="tag">#Fedicon</a> <a href="/tags/fedicon2025/" rel="tag">#FediCon2025</a> <a href="/tags/fedidev/" rel="tag">#FediDev</a></p>
Edited 245d ago
<p>The <a href="/tags/fedify/" rel="tag">#Fedify</a> monorepo has grown to <a href="https://github.com/fedify-dev/fedify#packages" rel="nofollow">16 packages</a>!</p><p>We've been working hard to make Fedify more modular and easier to integrate with your favorite tools and platforms. From the core framework to database drivers, from CLI tools to web framework integrationsโwe've got you covered.</p><p>Our packages now include:</p><p>Core framework and CLI tools<br>Web framework integrations: Express, Hono, H3, Elysia, NestJS, Next.js, SvelteKit<br>Database drivers: PostgreSQL, Redis, SQLite, AMQP/RabbitMQ<br>Platform integrations: Cloudflare Workers, Deno KV<br>Testing utilities</p><p>Each package is available on JSR and/or npm, making it easy to pick exactly what you need for your ActivityPub implementation.</p><p>What integration would you like to see next? Let us know!</p><p><a href="/tags/activitypub/" rel="tag">#ActivityPub</a> <a href="/tags/fedidev/" rel="tag">#fedidev</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a> <a href="/tags/opensource/" rel="tag">#OpenSource</a> <a href="/tags/typescript/" rel="tag">#TypeScript</a></p>
<p>Lots of talk about Ghost today, and rightly so, but donโt forget that a little open source framework <span class="h-card"><a href="https://hollo.social/@fedify" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>fedify</span></a></span> made the ActivityPub plugin possible. </p><p>Support open source!</p><p><a href="https://ghost.org/changelog/6/" rel="nofollow"><span class="invisible">https://</span>ghost.org/changelog/6/</a></p><p><a href="/tags/activitypub/" rel="tag">#ActivityPub</a> <a href="/tags/fedidev/" rel="tag">#FediDev</a></p>
<p>I've been considering what to add in the next version of <a href="https://botkit.fedify.dev/" rel="nofollow">BotKit</a> (v0.2.0) and wanted to share my current plans. After reviewing feedback and examining the <a href="/tags/activitypub/" rel="tag">#ActivityPub</a> ecosystem, I've identified three key features that would significantly enhance the framework's capabilities:</p><p><p>Custom emoji support. This would allow bots to use server-defined custom emojis in their messages, making communication more expressive and allowing better integration with instance culture.</p><br><p>Emoji reactions. I plan to implement both sending and receiving emoji reactions to messages. This provides a lightweight interaction model that many users prefer for simple acknowledgments or responses. This would manifest as new event handlers (like Bot.onReaction) and methods (like Message.react()).</p><br><p>Quote posts. The ability to reference other posts with commentary is an important discourse feature in the fediverse. Supporting both sending quotes and detecting when bot posts have been quoted would enable more sophisticated conversational patterns.</p></p><p>These additions should make <a href="/tags/botkit/" rel="tag">#BotKit</a> more capable while maintaining its simple, developer-friendly API. I expect implementation to involve extending the <a href="https://botkit.fedify.dev/concepts/message" rel="nofollow">Message</a> class and adding new <a href="https://botkit.fedify.dev/concepts/text" rel="nofollow">Text</a> processing capabilities, all while keeping backward compatibility with existing bots. Having built both <a href="https://docs.hollo.social/" rel="nofollow">Hollo</a> and <a href="https://hackers.pub/" rel="nofollow">Hackers' Pub</a>, I already have deep familiarity with how various ActivityPub implementations handle these features across the fediverse. I welcome any community feedback on priorities or implementation details before I begin coding.</p><p><a href="/tags/fedidev/" rel="tag">#fedidev</a></p>
<p>In case you weren't aware, <a href="/tags/fedify/" rel="tag">#Fedify</a> has both <a href="/tags/discord/" rel="tag">#Discord</a> and <a href="/tags/matrix/" rel="tag">#Matrix</a> communities where you can get help, discuss features, or just chat about <a href="/tags/activitypub/" rel="tag">#ActivityPub</a> and federated social networks.</p><p>Matrix space: <a href="/tags/fedify:matrix.org/" rel="tag">#fedify:matrix.org</a><br>Discord server: <a href="https://discord.gg/bhtwpzURwd" rel="nofollow"><span class="invisible">https://</span>discord.gg/bhtwpzURwd</a></p><p>Feel free to join either community based on your preference. Both channels have active discussions about Fedify and federation topics.</p><p><a href="/tags/fedidev/" rel="tag">#fedidev</a></p>
<p>We're excited to introduce <a href="https://botkit.fedify.dev/concepts/message#reacting-to-a-message-with-an-emoji" rel="nofollow">emoji reactions</a> in the upcoming <a href="/tags/botkit/" rel="tag">#BotKit</a> 0.2.0 release!</p><p>With the new <a href="https://jsr.io/@fedify/[email protected]+c997c6a6/doc/message/~/Message.react" rel="nofollow">Message.react()</a> method, your bot can now react to messages using standard Unicode <a href="/tags/emojis/" rel="tag">#emojis</a>:</p><p>await message.react(emoji`๐`);</p><p><a href="/tags/custom_emoji/" rel="tag">#Custom_emoji</a> support is also included, allowing your bot to react with server-specific emojis:</p><p>const emojis = bot.addCustomEmojis({ // Use a remote image URL: yesBlob: { url: "<a href="https://cdn3.emoji.gg/emojis/68238-yesblob.png" rel="nofollow" class="ellipsis" title="cdn3.emoji.gg/emojis/68238-yesblob.png"><span class="invisible">https://</span><span class="ellipsis">cdn3.emoji.gg/emojis/68238-yes</span><span class="invisible">blob.png</span></a>", mediaType: "image/png", }, // Use a local image file: noBlob: { file: `${import.meta.dirname}/emojis/no_blob.png`, mediaType: "image/webp", },});await message.react(emojis.yesBlob);</p><p>Reactions can be removed using the <a href="https://jsr.io/@fedify/[email protected]+c997c6a6/doc/reaction/~/AuthorizedReaction.unreact" rel="nofollow">AuthorizedReaction.unreact()</a> method:</p><p>const reaction = await message.react(emoji`โค๏ธ`);await reaction.unreact();</p><p>Want to try these features now? You can install the development version from <a href="https://jsr.io/@fedify/[email protected]+c997c6a6" rel="nofollow">JSR</a> today:</p><p>deno add jsr:@fedify/[email protected]+c997c6a6</p><p>We're looking forward to seeing how your bots express themselves with this new feature!</p><p><a href="/tags/emoji_reaction/" rel="tag">#emoji_reaction</a> <a href="/tags/fedidev/" rel="tag">#fedidev</a> <a href="/tags/activitypub/" rel="tag">#ActivityPub</a></p>
<p>RE: <a href="https://mastodon.social/@reiver/112133984854710390" rel="nofollow" class="ellipsis" title="mastodon.social/@reiver/112133984854710390"><span class="invisible">https://</span><span class="ellipsis">mastodon.social/@reiver/112133</span><span class="invisible">984854710390</span></a></p><p>"A guide to implement ActivityPub in a static site (or any website)" by <span class="h-card"><a href="https://hachyderm.io/@mapache" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>mapache</span></a></span> </p><p><a href="https://maho.dev/2024/02/a-guide-to-implement-activitypub-in-a-static-site-or-any-website/" rel="nofollow" class="ellipsis" title="maho.dev/2024/02/a-guide-to-implement-activitypub-in-a-static-site-or-any-website/"><span class="invisible">https://</span><span class="ellipsis">maho.dev/2024/02/a-guide-to-im</span><span class="invisible">plement-activitypub-in-a-static-site-or-any-website/</span></a></p><p><a href="/tags/activitypub/" rel="tag">#ActivityPub</a> <a href="/tags/activitystreams/" rel="tag">#ActivityStreams</a> <a href="/tags/fedidev/" rel="tag">#FediDev</a> <a href="/tags/fedidevs/" rel="tag">#FediDevs</a> <a href="/tags/fediverse/" rel="tag">#Fediverse</a></p>
<p>Hey folks! We're excited to share a preview of a new API coming in <a href="/tags/fedify/" rel="tag">#Fedify</a> 1.6 that should make structuring larger federated apps much cleaner: <a href="https://unstable.fedify.dev/manual/federation#builder-pattern-for-structuring" rel="nofollow">FederationBuilder</a>.</p><p>As your Fedify applications grow, you might encounter circular dependency issues when registering dispatchers and listeners across multiple files. The new <a href="https://unstable.fedify.dev/manual/federation#builder-pattern-for-structuring" rel="nofollow">FederationBuilder</a> pattern helps solve this by separating the configuration phase from instantiation.</p><p>Instead of this:</p><p>// federation.tsimport { createFederation } from "@fedify/fedify";export const federation = createFederation<AppContext>({ kv: new DbKvStore(), queue: new RedisMessageQueue(), // Other options...});// Now we need to import this federation instance in other files// to register dispatchers and listeners...</p><p>You can now do this:</p><p>// builder.tsimport { createFederationBuilder } from "@fedify/fedify";export const builder = createFederationBuilder<AppContext>();// other files can import and configure this builder...</p><p>// actors.tsimport { builder } from "./builder.ts";import { Person } from "@fedify/fedify";builder.setActorDispatcher("/users/{handle}", async (ctx, handle) => { // Actor implementation});</p><p>// inbox.tsimport { builder } from "./builder.ts";import { Follow } from "@fedify/fedify";builder.setInboxListeners("/users/{handle}/inbox", "/inbox") .on(Follow, async (ctx, follow) => { // Follow handling });</p><p>// main.ts โ Only create the Federation instance at startupimport { builder } from "./builder.ts";// Build the Federation object with actual dependenciesexport const federation = await builder.build({ kv: new DbKvStore(), queue: new RedisMessageQueue(), // Other options...});</p><p>This pattern helps avoid circular dependencies and makes your code more modular. Each part of your app can configure the builder without needing the actual Federation instance.</p><p>The full documentation will be available when 1.6 is released, but we wanted to share this early with our community. Looking forward to your feedback when it lands!</p><p>Want to try it right now? You can install the development version from <a href="https://jsr.io/@fedify/[email protected]+1206cb01" rel="nofollow">JSR</a> or <a href="https://www.npmjs.com/package/@fedify/fedify/v/1.6.0-dev.777" rel="nofollow">npm</a>:</p><p># Denodeno add jsr:@fedify/[email protected]+1206cb01# Node.jsnpm add @fedify/[email protected]# Bunbun add @fedify/[email protected]</p><p><a href="/tags/activitypub/" rel="tag">#ActivityPub</a> <a href="/tags/fedidev/" rel="tag">#fedidev</a></p>
<p>Fedify 2.0.0 is here!</p><p>This is the biggest release in Fedify's history. Here are the highlights:</p><p>Modular architecture โ The monolithic @fedify/fedify package has been broken up into focused, independent packages: @fedify/vocab, @fedify/vocab-runtime, @fedify/vocab-tools, @fedify/webfinger, and more. Smaller bundles, cleaner imports, and the ability to extend ActivityPub with custom vocabulary types.<br>Real-time debug dashboard โ The new @fedify/debugger package gives you a live dashboard at /__debug__/ showing all your federation traffic: traces, activity details, signature verification, and correlated logs. Just wrap your Federation object and you're done.<br>ActivityPub relay support โ First-class relay support via @fedify/relay and the fedify relay CLI command. Supports both Mastodon-style and LitePub-style relay protocols (FEP-ae0c).<br>Ordered message delivery โ The new orderingKey option solves the โzombie postโ problem where a Delete arrives before its Create. Activities sharing the same key are guaranteed to be delivered in FIFO order.<br>Permanent failure handling โ setOutboxPermanentFailureHandler() lets you react when a remote inbox returns 404 or 410, so you can clean up unreachable followers instead of retrying forever.</p><p>Other changes include content negotiation at the middleware level, @fedify/lint for shared linting rules, @fedify/create for quick project scaffolding, CLI config files, native Node.js/Bun CLI support, and many bug fixes.</p><p>This release includes significant contributions from Korea's OSSCA participants. Huge thanks to everyone involved!</p><p>This is a major release with breaking changesโplease check the migration guide before upgrading.</p><p>Full release notes: <a href="https://github.com/fedify-dev/fedify/discussions/580" rel="nofollow" class="ellipsis" title="github.com/fedify-dev/fedify/discussions/580"><span class="invisible">https://</span><span class="ellipsis">github.com/fedify-dev/fedify/d</span><span class="invisible">iscussions/580</span></a></p><p><a href="/tags/fedify/" rel="tag">#Fedify</a> <a href="/tags/activitypub/" rel="tag">#ActivityPub</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a> <a href="/tags/fedidev/" rel="tag">#fedidev</a> <a href="/tags/typescript/" rel="tag">#TypeScript</a></p>
<p>I was looking though a feed on a random Friendica instance and recognized an icon that I designed and instantly realized that Friendica is now using my <a href="https://iconography.fediverse.info" rel="nofollow"><span class="invisible">https://</span>iconography.fediverse.info</a> project as an icon source for many pieces of software that federate to them!<br><a href="/tags/fedidev/" rel="tag">#fedidev</a></p>
<p>๐ Huge shoutouts to two amazing contributors from Korea's <a href="/tags/ossca/" rel="tag">#OSSCA</a> program who just made <a href="/tags/fedify/" rel="tag">#Fedify</a> even better!</p><p>First, <span class="h-card"><a href="https://hackers.pub/@z9mb1" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>z9mb1</span></a></span> delivered <a href="https://github.com/fedify-dev/fedify/pull/321" rel="nofollow">PR #321</a>, adding a handy -o/--output option to fedify lookup. Now you can save lookup results directly to files instead of just printing to terminalโa nice quality-of-life improvement for analysis and scripting workflows.</p><p>But the real showstopper is <span class="h-card"><a href="https://hackers.pub/@joonnot" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>joonnot</span></a></span>'s incredible <a href="https://github.com/fedify-dev/fedify/pull/283" rel="nofollow">PR #283</a>, which introduces the brand new @fedify/testing package! This massive contribution (2,014 lines across 20 files) brings MockFederation and MockContext classes that completely transform how we test federated applications. No more complex setups or actual network requestsโjust clean, straightforward unit testing with activity tracking, inbox simulation, and queue-aware testing capabilities.</p><p>These contributions solve real pain points and showcase the amazing talent emerging from the OSSCA program. Both features will be available in the upcoming Fedify 1.8 release. The future of federated software development just got a lot brighter! ๐</p><p><a href="/tags/activitypub/" rel="tag">#ActivityPub</a> <a href="/tags/fedidev/" rel="tag">#fedidev</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a> <a href="/tags/opensource/" rel="tag">#opensource</a></p>
<p><a href="/tags/apx/" rel="tag">#APx</a> ActivityPub toolkit consists of two packages: <a href="https://docs.rs/apx_sdk/latest/apx_sdk/" rel="nofollow">apx_sdk</a> (the main package) and <a href="https://docs.rs/apx_core/latest/apx_core/" rel="nofollow">apx_core</a>.</p><p>The second one contains the most basic building blocks: keys, signatures, URIs, DIDs and encodings. It can be useful even if you already have a mature ActivityPub application and don't want to import the whole SDK. For example, there are implementations of <a href="https://docs.rs/apx_core/0.15.0/apx_core/json_signatures/create/fn.sign_object.html" rel="nofollow">FEP-8b32</a> and <a href="https://docs.rs/apx_core/0.15.0/apx_core/ap_url/index.html" rel="nofollow">FEP-ef61 'ap' URIs</a>.</p><p><a href="/tags/fedidev/" rel="tag">#fedidev</a></p>
Edited 245d ago
<p>We'd like to recognize some excellent contributions from our <a href="/tags/ossca/" rel="tag">#OSSCA</a> (Open Source Contribution Academy) participants who have been working on <a href="/tags/fedify/" rel="tag">#Fedify</a>.</p><p><span class="h-card"><a href="https://yuri.garden/@gaebalgom" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>gaebalgom</span></a></span> contributed <a href="https://github.com/fedify-dev/fedify/pull/339" rel="nofollow">PR #339</a>, which introduces the @fedify/elysia package to provide <a href="https://elysiajs.com/" rel="nofollow">Elysia</a> integration for Fedify. This work addresses <a href="https://github.com/fedify-dev/fedify/issues/286" rel="nofollow">issue #286</a> by creating a plugin that enables developers using <a href="/tags/bun/" rel="tag">#Bun</a> and <a href="/tags/elysia/" rel="tag">#Elysia</a> to integrate Fedify's <a href="/tags/activitypub/" rel="tag">#ActivityPub</a> capabilities into their applications. The contribution includes the core integration module, documentation, examples, and proper monorepo configuration, making Fedify accessible to the Elysia community.</p><p><span class="h-card"><a href="https://hackers.pub/@r4bb1t" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>r4bb1t</span></a></span> submitted <a href="https://github.com/fedify-dev/fedify/pull/315" rel="nofollow">PR #315</a>, implementing comprehensive <a href="https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal" rel="nofollow">AbortSignal</a> support across multiple APIs to resolve <a href="https://github.com/fedify-dev/fedify/issues/51" rel="nofollow">issue #51</a>. This contribution adds request cancellation capabilities not only to lookupWebFinger() but also to lookupObject(), DocumentLoader, and the HTTP signature authentication flow (doubleKnock()), allowing developers to properly handle timeouts and abort ongoing requests throughout the entire request chain. The implementation includes extensive test coverage for cancellation scenarios across all affected components and lays the groundwork for <a href="https://github.com/fedify-dev/fedify/issues/258" rel="nofollow">adding --timeout options to various CLI commands like fedify lookup</a>, fedify webfinger, and fedify nodeinfo, making federated applications more robust and responsive.</p><p><span class="h-card"><a href="https://hackers.pub/@ooheunda" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>ooheunda</span></a></span> addressed a testing infrastructure issue with <a href="https://github.com/fedify-dev/fedify/pull/350" rel="nofollow">PR #350</a>, fixing a race condition in PostgreSQL message queue tests that was causing intermittent failures (<a href="https://github.com/fedify-dev/fedify/issues/346" rel="nofollow">issue #346</a>). By adding explicit initialization before concurrent message queue listeners, this fix prevents table creation conflicts that were affecting test reliability, ensuring more consistent PR testing for all contributors.</p><p><span class="h-card"><a href="https://hackers.pub/@songbirds" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>songbirds</span></a></span> provided two test stability improvements with <a href="https://github.com/fedify-dev/fedify/pull/344" rel="nofollow">PR #344</a> and <a href="https://github.com/fedify-dev/fedify/pull/347" rel="nofollow">PR #347</a>. The first PR adds skip guards to RedisKvStore tests as a workaround for a known Bun runtime issue, keeping the test suite functional while awaiting an upstream fix. The second PR resolves a race condition in the code generation process by randomizing output filenames, preventing conflicts during parallel test execution. These contributions help maintain a stable testing environment for the project.</p><p>Thank you all for your contributions to Fedify. Your work helps make federated social networking more accessible to developers.</p><p><a href="/tags/opensource/" rel="tag">#opensource</a> <a href="/tags/fedidev/" rel="tag">#fedidev</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a></p>
<p>๐ Security Update for BotKit Users</p><p>We've released <a href="/tags/security/" rel="tag">#security</a> patch versions <a href="https://github.com/fedify-dev/botkit/releases/tag/0.1.2" rel="nofollow">BotKit 0.1.2</a> and <a href="https://github.com/fedify-dev/botkit/releases/tag/0.2.2" rel="nofollow">0.2.2</a> to address <a href="https://github.com/fedify-dev/fedify/security/advisories/GHSA-6jcc-xgcr-q3h4" rel="nofollow">CVE-2025-54888</a>, a security <a href="/tags/vulnerability/" rel="tag">#vulnerability</a> discovered in <a href="/tags/fedify/" rel="tag">#Fedify</a>. These updates incorporate the latest patched version of Fedify to ensure your bots remain secure.</p><p>We strongly recommend all <a href="/tags/botkit/" rel="tag">#BotKit</a> users update to the latest patch version immediately. Thank you for keeping the <a href="/tags/fediverse/" rel="tag">#fediverse</a> safe! ๐ก๏ธ</p><p><a href="/tags/fedidev/" rel="tag">#fedidev</a></p>
<p>Feditext, one of my favorite, consistently solid fediverse apps, (love it for GtS) is looking for iOS devs to swat at a bug or two. </p><p><a href="/tags/fediapps/" rel="tag">#FediApps</a> <a href="/tags/fedidev/" rel="tag">#FediDev</a> <a href="/tags/iosdev/" rel="tag">#iosdev</a> <a href="https://mastodon.social/@Feditext/114990933150568200" rel="nofollow" class="ellipsis" title="mastodon.social/@Feditext/114990933150568200"><span class="invisible">https://</span><span class="ellipsis">mastodon.social/@Feditext/1149</span><span class="invisible">90933150568200</span></a></p>
<p>A couple days ago, I got a DM from a <a href="/tags/bonfire/" rel="tag">#Bonfire</a> user. I happily replied and senta follow requestโbut the Accept never came back, even though they hadn'tenabled manuallyApprovesFollowers. My DM reply probably never arrived either. Classic interop bug.</p><p>I checked out the Bonfire source and dug in. Turns out Bonfire hasn't implemented <a href="https://www.rfc-editor.org/rfc/rfc9421" rel="nofollow">RFC 9421</a> yet, so it was silently discarding any activity signed with it. That alone would be workable, except for one more issue: Bonfire was responding 200 OK even when signature verification failed, instead of 401 Unauthorized.</p><p>This matters because <a href="https://fedify.dev/manual/send#double-knocking-http-signatures" rel="nofollow">Fedify implements</a> a <a href="https://swicg.github.io/activitypub-http-signature/#how-to-upgrade-supported-versions" rel="nofollow">double-knocking mechanism</a>โif a request signed with RFC 9421 fails, it retries with the older draft cavage signature. But since Bonfire returned 200 OK on the failed first knock, <a href="/tags/fedify/" rel="tag">#Fedify</a> had no reason to send a second one.</p><p>I filed two issues on the Bonfire <a href="/tags/activitypub/" rel="tag">#ActivityPub</a> repoโone requesting <a href="https://github.com/bonfire-networks/activity_pub/issues/7" rel="nofollow">RFC 9421 support</a>, and one about <a href="https://github.com/bonfire-networks/activity_pub/issues/8" rel="nofollow">returning 401 on invalid signatures</a>. For the latter, I also sent a PR, which got merged pretty quickly: <a href="https://github.com/bonfire-networks/activity_pub/pull/9" rel="nofollow">bonfire-networks/activity_pub#9</a>.</p><p>That said, individual Bonfire instances won't pick up the fix until they actually deploy it. So in the meantime, I patched <a href="https://github.com/fedify-dev/hollo/commit/a883fd1b2158463b1ceb7894e2084d598bfaabc4" rel="nofollow">Hollo</a> and <a href="https://github.com/hackers-pub/hackerspub/commit/02de643c709984b016bc92c4a18c1c284a59c49a" rel="nofollow">Hackers' Pub</a> to use draft-cavage-http-signatures-12 as the <a href="https://fedify.dev/manual/federation#firstknock" rel="nofollow">firstKnock</a>, so Bonfire instances can at least understand the first request.</p><p>One last thing: Fedify caches whether a given server supports RFC 9421, and the Bonfire servers I'd already talked to were cached as โsupports RFC 9421โโbecause they'd been returning 200 OK. I had to manually clear that cache on both hollo.social and hackers.pub before everything finally worked.</p><p>After all that, the mutual follow went through and my DM reply landed. Worth it.</p><p><a href="/tags/fedidev/" rel="tag">#fedidev</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a> <a href="/tags/hollo/" rel="tag">#Hollo</a> <a href="/tags/hackerspub/" rel="tag">#HackersPub</a></p>
Edited 41d ago
<p>What one person wants from an alternative to a Twitter:</p><p>โข choice of home-feed algorithm,<br>โข editable posts,<br>โข ability to moderate replies</p><p>RE: <a href="https://x.com/Plinz/status/1685945305320329216" rel="nofollow" class="ellipsis" title="x.com/Plinz/status/1685945305320329216"><span class="invisible">https://</span><span class="ellipsis">x.com/Plinz/status/16859453053</span><span class="invisible">20329216</span></a></p><p><a href="/tags/fedidev/" rel="tag">#FediDev</a> <a href="/tags/fedidevs/" rel="tag">#FediDevs</a> <a href="/tags/fediux/" rel="tag">#FediUX</a> <a href="/tags/fediverse/" rel="tag">#Fediverse</a> <a href="/tags/fediverseux/" rel="tag">#FediverseUX</a></p>
<p>How many Fediverse software use Markdown as its default text format โ rather than HTML?</p><p>I think both PeerTube and Lemmy are Markdown native โ rather than HTML.</p><p>Anything else?</p><p><a href="/tags/fedidev/" rel="tag">#FediDev</a> <a href="/tags/fedidevs/" rel="tag">#FediDevs</a> <a href="/tags/fediverse/" rel="tag">#Fediverse</a> <a href="/tags/markdown/" rel="tag">#Markdown</a></p>
<p>RE: <a href="https://planet.moe/@oeee_cafe/115615511184864588" rel="nofollow" class="ellipsis" title="planet.moe/@oeee_cafe/115615511184864588"><span class="invisible">https://</span><span class="ellipsis">planet.moe/@oeee_cafe/11561551</span><span class="invisible">1184864588</span></a></p><p>Oeee Cafe is a Korean federated community drawing app that recently launched mobile apps on iOS and Android. You can follow users there from here in the fediverse already but not sure if you can submit drawings remotely yet.<br><a href="/tags/fedidev/" rel="tag">#fedidev</a></p>
Edited 38d ago
<p>We're excited to share an update on <a href="/tags/fedify/" rel="tag">#Fedify</a>'s development! While we're actively working on Fedify 1.9 in the main branch, we've also begun preparations for Fedify 2.0 in the next branch.</p><p>Before you get too excited about revolutionary new features, we want to set clear expectations: Fedify 2.0 will primarily focus on cleaning up technical debt that we couldn't address due to backward compatibility constraints. This means removing deprecated APIs and making breaking changes that will ultimately result in a cleaner, more maintainable codebase. Think of it as a major housekeeping releaseโnecessary work that will make Fedify better in the long run.</p><p>Some of the planned improvements include adding <a href="https://github.com/fedify-dev/fedify/issues/419" rel="nofollow">readonly modifiers throughout our types and interfaces</a> to better enforce our immutability-by-default principle, implementing our own <a href="https://github.com/fedify-dev/fedify/issues/418" rel="nofollow">RFC 6570 URI Template library</a> for symmetric expansion and pattern matching, and various <a href="https://github.com/fedify-dev/fedify/issues/414" rel="nofollow">CLI tool migrations</a> to our new <a href="https://optique.dev/" rel="nofollow">Optique</a> framework for better cross-runtime support. While the majority of changes will be about refinement rather than revolution, these updates will strengthen Fedify's foundation and improve interoperability across the <a href="/tags/fediverse/" rel="tag">#fediverse</a>. You can track all planned changes in detail by checking out the <a href="https://github.com/fedify-dev/fedify/milestone/3" rel="nofollow">Fedify 2.0 milestone</a> on our GitHub repository.</p><p><a href="/tags/fedify2/" rel="tag">#Fedify2</a> <a href="/tags/fedidev/" rel="tag">#fedidev</a> <a href="/tags/activitypub/" rel="tag">#ActivityPub</a></p>

