In #WebFinger, are there any relations that use the template
property instead of the href
property, excluding the http://ostatus.org/schema/1.0/subscribe
relation?
Search results
/forcepub
#activityPub #fediDev #javaScript
RE: not-brain.d.on-t.work/notes/abzowvxq03j29w5w
jsr.io/@outpost/http-signatures is a thing now.
Brand new, zero dependency (may end up with one to make base64 cross platform down the road), fully TypeScript HTTP signature library.
Passes all of Mastodon's incoming signature tests (except it intentionally does not support the no query string quirk) but I have not yet tried it out "in the real world" yet. API may change for the next little while as I implement it on my own software and realize my mistakes, but it Should Work™
/forcepub
#activityPub #fediDev #typeScript
Flag Activity
FenTiger @fentiger@zotum.net
As ever, the spec only tells me that it exists; it doesn't say anything about what it contains, where it gets delivered to, how the recipient processes it, etc.
Maybe I could find out more by setting up some test instances and experimenting with it, or by trying to trawl through various repositories to find the relevant source code - but it seems a lot quicker to just ask.
#ActivityPub #ActivityPubDev #FediDev #FediDevs
The #Fedify monorepo has grown to 16 packages!
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.
Our packages now include:
- Core framework and CLI tools
- Web framework integrations: Express, Hono, H3, Elysia, NestJS, Next.js, SvelteKit
- Database drivers: PostgreSQL, Redis, SQLite, AMQP/RabbitMQ
- Platform integrations: Cloudflare Workers, Deno KV
- Testing utilities
Each package is available on JSR and/or npm, making it easy to pick exactly what you need for your ActivityPub implementation.
What integration would you like to see next? Let us know!
Are you a Fediverse developer? Do you work with ActivityPub?
You should follow https://activitypub.space
And here is the awesome thing — you can follow it from your existing Fediverse account!
Follow these activitypub.space channels:
• @generalGeneral Discussion
• @technical-discussion
• @faqFrequently Asked Questions
• @random
• @meta
(Thank you @julian )
We're excited to announce the release of BotKit 0.3.0! This release marks a significant milestone as #BotKit now supports #Node.js alongside #Deno, making it accessible to a wider audience. The minimum required Node.js version is 22.0.0. This dual-runtime support means you can now choose your preferred #JavaScript runtime while building #ActivityPub #bots with the same powerful BotKit APIs.
One of the most requested features has landed: poll support! You can now create interactive polls in your #bot messages, allowing followers to vote on questions with single or multiple-choice options. Polls are represented as ActivityPub Question
objects with proper expiration times, and your bot can react to votes through the new onVote
event handler. This feature enhances engagement possibilities and brings BotKit to feature parity with major #fediverse platforms like Mastodon and Misskey.
// Create a poll with multiple choices
await session.publish(text`What's your favorite programming language?`, {
class: Question,
poll: {
multiple: true, // Allow multiple selections
options: ["JavaScript", "TypeScript", "Python", "Rust"],
endTime: Temporal.Now.instant().add({ hours: 24 }),
},
});
// Handle votes
bot.onVote = async (session, vote) => {
console.log(`${vote.actor} voted for "${vote.option}"`);
};
The web frontend has been enhanced with a new followers page, thanks to the contribution from Hyeonseo Kim (@gaebalgom개발곰)! The
/followers
route now displays a paginated list of your bot's followers, and the follower count on the main profile page is now clickable, providing better visibility into your bot's audience. This improvement makes the web interface more complete and user-friendly.
For developers looking for alternative storage backends, we've introduced the SqliteRepository
through the new @fedify/botkit-sqlite
package. This provides a production-ready SQLite-based storage solution with ACID compliance, write-ahead logging (WAL) for optimal performance, and proper indexing. Additionally, the new @fedify/botkit/repository
module offers MemoryCachedRepository
for adding an in-memory cache layer on top of any repository implementation, improving read performance for frequently accessed data.
This release also includes an important security update: we've upgraded to #Fedify 1.8.8, ensuring your bots stay secure and compatible with the latest ActivityPub standards. The repository pattern has been expanded with new interfaces and types like RepositoryGetMessagesOptions
, RepositoryGetFollowersOptions
, and proper support for polls storage through the KvStoreRepositoryPrefixes.polls
option, providing more flexibility for custom implementations.
For a sneak preview of my followup to the Fediverse Schema Observatory, there's now a project page on the lab website for the ActivityPub Fuzzer:
https://asml.cyber.harvard.edu/activitypub-fuzzer/
Basically it lets an ActivityPub server developer test compatibility with simulated messages from Fediverse software known to the Observatory (dozens of software projects and hundreds of versions!). The dev can do this entirely in a local dev environment.
The project is still in the works but I'll be releasing the code soon.
super nice.
#fedidev #ActivityPub
What I worked on the past weeks was to analyze the current news corpora of the University of Leipzig in different languages.
Then mixed it with an anonymized fedi corpus and wrote a thing which can
- compress ActivityPub Objects to 20% of its size by a combination of semantic compression where 256 languages can be covered. The rest would be uncompressed in multilanguage Objects (see Evans new Primer Page).
Result is UInt8Array for a database.
What I am working on now is to "preserve hashtags and common knowledge".
One byte is a pointer to Hashtags (where any word has a # at 0) and one byte is a pointer to 3x(256²) wikidata tables. So that we directly get the e.g. Q1055 for Hamburg and can ask the author if the prominent Hamburg is meant …
This was just a first demo for German https://github.com/sebilasse/compressDE which meanwhile improved and soon you can generate your lexica from corpora.
btw This can detect 852 languages https://github.com/redaktor/languages
Less data, better climate …
I just realized that the default specifications for ActivityPub/ActivityStreams do not have a way to perform an update on an object's ID. (ie, moving it from example.com/1 -> example.com/2)
An Update activity does not allow ID updates because it would lose the reference to the original one. (It can be massaged by using an Origin property, but I don't like that).
Another option would be to use a Move activity (which is defined as moving objects between collections), where the Origin property is the object itself instead of a collection. (I like this behaviour better, as it requires less divergence from the spec)
socialhub.activitypub.rocks/t/would-there-be-any-interest-in-a-pre-authorized-fetch-fep/5481
/forcepub
#activityPub #fediDev #fediDevs #mastoDev
We'd like to recognize the valuable contributions from two developers who participated in Korea's #OSSCA (Open Source Contribution Academy) program. Both contributors identified important gaps in #Fedify's functionality and documentation, providing thoughtful solutions that benefit the broader #ActivityPub ecosystem.
@gaebalgom개발곰 contributed PR #365, addressing issue #353 regarding NodeInfo parser compatibility, originally reported by
@andypiper. The issue arose when Fedify incorrectly rejected #NodeInfo documents from snac instances due to overly strict version string parsing that required semantic versioning compliance. Their solution improves the fallback behavior in the
parseSoftware()
function to handle non-SemVer version strings by parsing dot-separated numbers and defaulting to zero for missing components. The implementation includes thorough test coverage for various edge cases, including single numbers (3
), two-part versions (2.81
), and malformed version strings. This fix provides immediate compatibility improvements across the fediverse while maintaining backward compatibility, and will be included in Fedify 1.9. The contribution serves as an interim solution, with a more comprehensive fix planned for Fedify 2.0 (issue #366), where the NodeInfo software.version
field will be changed from the SemVer
type to a plain string
to fully comply with the NodeInfo specification.
@z9mb1wwj contributed PR #364, resolving issue #337 by adding practical examples for Fedify's custom collection dispatchers feature. Custom collections were introduced in Fedify 1.8 but lacked clear documentation for developers seeking to implement them. Their contribution provides a comprehensive example demonstrating how to set up custom collections for tagged posts, including proper routing patterns, pagination handling, and counter functionality. The example includes mock data structures, shows how to configure collection dispatchers with URL patterns like
/users/{userId}/tags/{tag}
, and demonstrates the complete request/response cycle using federation.fetch()
. This work provides developers with a clear, runnable reference that reduces the complexity of implementing custom collections in ActivityPub applications.
We appreciate these meaningful contributions that help make Fedify more accessible and robust for the entire ActivityPub community.
Improved the setup steps for a new #ONI instance.
Initially it wasn't possible to operate everything without manually editing some json files, but now everything works with vanilla client to server #ActivityPub activities triggered from a CLI helper.
Now I just need to put it all into a document.
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.
#FediApps #FediDev #iosdev https://mastodon.social/@Feditext/114990933150568200
Web Monetization, Programming
11/
I implemented Simple Payment Setup Protocol (SPSP) (from scratch) in the Go programming-language.
https://github.com/reiver/go-spsp
Base on the specification I found before.
#CrowdBucks #FediDev #Fediverse #Golang #PaymentPointer #PeerTube #WebMonetization
Web Monetization, Programming
12/
I have been looking for (working) Payment-Pointers being used by others.
But, ever time I find one — it doesn't work (mostly because one provides seems to have stopped working).
...
For example, over here:
https://web.archive.org/web/20250222120416/https://pupper-pages.glitch.me/
If I look at the HTML source-code, I see a Payment-Pointer.
But the host in the Payment-Pointer doesn't work.
#CrowdBucks #FediDev #Fediverse #PaymentPointer #PeerTube #WebMonetization
Web Monetization, Programming
10/
I found some updates for the https://paymentpointers.org/ web-site that haven't been deployed:
https://github.com/interledger/paymentpointers.org/pull/57/files
Some of it confirms things I suspected. But, there is also new information in there.
#CrowdBucks #FediDev #Fediverse #PaymentPointer #WebMonetization
Web Monetization, Programming
11/
I implemented Simple Payment Setup Protocol (SPSP) (from scratch) in the Go programming-language.
https://github.com/reiver/go-spsp
Base on the specification I found before.
#CrowdBucks #FediDev #Fediverse #Golang #PaymentPointer #PeerTube #WebMonetization
Web Monetization, Programming
9/
I implemented Payment Pointers (from scratch) in the Go programming-language.
https://github.com/reiver/go-pymtptr
Base on the specification I found before.
#CrowdBucks #FediDev #Fediverse #Golang #PaymentPointer #PeerTube #WebMonetization
Web Monetization, Programming
10/
I found some updates for the https://paymentpointers.org/ web-site that haven't been deployed:
https://github.com/interledger/paymentpointers.org/pull/57/files
Some of it confirms things I suspected. But, there is also new information in there.
#CrowdBucks #FediDev #Fediverse #PaymentPointer #WebMonetization
🔒 Security Update for BotKit Users
We've released #security patch versions BotKit 0.1.2 and 0.2.2 to address CVE-2025-54888, a security #vulnerability discovered in #Fedify. These updates incorporate the latest patched version of Fedify to ensure your bots remain secure.
We strongly recommend all #BotKit users update to the latest patch version immediately. Thank you for keeping the #fediverse safe! 🛡️
All #Fedify users must immediately update to the latest patched versions. A #critical authentication bypass #vulnerability (CVE-2025-54888) has been discovered in Fedify that allows attackers to impersonate any #ActivityPub actor by sending forged activities signed with their own keys.
This vulnerability affects all Fedify instances and enables complete actor impersonation across the federation network. Attackers can send fake posts and messages as any user, create or remove follows as any user, boost and share content as any user, and completely compromise the federation trust model. The vulnerability affects all Fedify instances but does not propagate to other ActivityPub implementations like Mastodon, which properly validate authentication before processing activities.
The following versions contain the #security fix: 1.3.20, 1.4.13, 1.5.5, 1.6.8, 1.7.9, and 1.8.5. Users should update immediately using their package manager with commands such as npm update @fedify/fedify
, yarn upgrade @fedify/fedify
, pnpm update @fedify/fedify
, bun update @fedify/fedify
, or deno update @fedify/fedify
.
After updating, redeploy your application immediately and monitor recent activities for any suspicious content. Please also inform other Fedify operators about this critical update to ensure the security of the entire federation network.
The safety and security of our community depends on immediate action. Please update now and feel free to leave comments below if you have any questions.
Web Monetization, Programming
9/
I implemented Payment Pointers (from scratch) in the Go programming-language.
https://github.com/reiver/go-pymtptr
Base on the specification I found before.
#CrowdBucks #FediDev #Fediverse #Golang #PaymentPointer #PeerTube #WebMonetization
Web Monetization, Programming
very nice!
#FediDev
considering "from scratch" to be the default ;) I have written today the generator for semantic compression in any language.
What I am working on is a compressor for ActivityPub Objects with Natural Language Maps. It converts anything to a UInt8Array which is only 20-25% of the original.
Basically it loads a news corpus from the Leipzig Uni (not the famous Leipzig HGB Academy Of Visual Arts, from the ordinary University but it's fine ;) Then it generates a definition for the most 256 common languages.
Made a demo for the before (from scratch generated) DE 2 days ago https://github.com/sebilasse/compressDE and it will be combined with the language detection of 852 locales https://github.com/redaktor/languages
Web Monetization, Programming
8/
PeerTube seems to have Payment-Pointers and Web-Monetization built-in already.
#CrowdBucks #FediDev #Fediverse #PaymentPointer #PeerTube #WebMonetization
Web Monetization, Programming
9/
I implemented Payment Pointers (from scratch) in the Go programming-language.
https://github.com/reiver/go-pymtptr
Base on the specification I found before.
#CrowdBucks #FediDev #Fediverse #Golang #PaymentPointer #PeerTube #WebMonetization
Web Monetization, Programming
7/
And, a description of the fields in the SPSP JSON seems to be here:
https://interledger.org/developers/rfcs/simple-payment-setup-protocol/#response-body
• destination_account
• shared_secret
• receipts_enabled
.
#CrowdBucks #FediDev #Fediverse #PaymentPointer #SimplePaymentSetupProtocol #SPSP #WebMonetization
Web Monetization, Programming
8/
PeerTube seems to have Payment-Pointers and Web-Monetization built-in already.
#CrowdBucks #FediDev #Fediverse #PaymentPointer #PeerTube #WebMonetization
Is there anything like #foursquare or, let's call it, micro place reviews app based on #activitypub ?
We're thrilled to announce Fedify 1.8.1, a mega release made possible through the incredible efforts of contributors from South Korea's #OSSCA (Open Source Contribution Academy). This release marks a significant milestone in #Fedify's development, bringing major architectural changes, new packages, and numerous enhancements across the board.
Note: Version 1.8.0 was skipped due to a versioning error.
🎉 Major Milestone: Monorepo Architecture
Fedify has been restructured as a #monorepo, consolidating all packages into a single repository with unified versioning. This change streamlines development and ensures all packages are released together with consistent version numbers.
Consolidated Packages
All existing Fedify packages now live under one roof:
- @fedify/fedify — Main library
- @fedify/cli — CLI toolchain
- @fedify/amqp — AMQP/RabbitMQ driver
- @fedify/express — Express integration
- @fedify/h3 — h3 framework integration
- @fedify/postgres — PostgreSQL drivers
- @fedify/redis — Redis drivers
🆕 New Packages
This release introduces four new packages to the Fedify ecosystem:
- @fedify/elysia — Elysia integration for Bun-powered applications
- @fedify/nestjs — NestJS integration for enterprise Node.js apps
- @fedify/sqlite — SQLite driver compatible with Bun, Deno, and Node.js
- @fedify/testing — Testing utilities with mock
Federation
andContext
classes
@fedify/fedify
Custom Collection Dispatchers
A powerful new feature that allows you to create custom collections beyond the standard ActivityPub collections. This enables implementation of domain-specific collections while maintaining federation compatibility.
Contributors: ChanHaeng Lee [#310, #332]
- Added comprehensive types and interfaces for custom collection handling
- New methods on
Federatable
interface:setCollectionDispatcher()
andsetOrderedCollectionDispatcher()
- Added
getCollectionUri()
method to theContext
interface - Full support for paginated custom collections
Compare-and-Swap (CAS) Support for KV Stores
Key–value stores now optionally support CAS operations for atomic updates, enabling optimistic locking and preventing lost updates in concurrent environments.
- Added optional
KvStore.cas()
method - Implemented in
MemoryKvStore
andDenoKvStore
- Useful for implementing distributed locks and counters
Fediverse Handle Utilities
New utility functions make working with #fediverse handles more convenient.
Contributors: ChanHaeng Lee [#278]
parseFediverseHandle()
— Parse handles into componentsisFediverseHandle()
— Validate handle formattoAcctUrl()
— Convert handles to URLsFediverseHandle
interface for type safety
Enhanced HTTP Request APIs
Contributors: Lee ByeongJun [#248, #281], Hyunchae Kim [#51, #315]
- Added
LookupWebFingerOptions.maxRedirection
option for controlling redirect behavior - APIs now support
AbortSignal
for request cancellation - New
DocumentLoaderOptions
interface - Added
signal
options toLookupObjectOptions
,LookupWebFingerOptions
, andDoubleKnockOptions
@fedify/cli
New Commands and Enhancements
The CLI has received significant improvements thanks to our OSSCA contributors:
fedify webfinger
Command
Contributors: ChanHaeng Lee [#260, #278], KeunHyeong Park [#311, #328]
Look up WebFinger information for any fediverse resource:
- Supports handles (
@user@server
) and URLs --user-agent
option for custom User-Agent headers--allow-private-address
for local testing--max-redirection
to control redirect following
fedify nodeinfo
Command
Contributors: Hyeonseo Kim [#267, #331, #168, #282, #304]
Replaces the deprecated fedify node
command with improved terminal rendering.
Enhanced fedify lookup
Command
Contributors: Jiwon Kwon [#169, #348, #261, #321]
- Terminal-specific image display for Kitty, WezTerm, Konsole, Warp, Wayst, st, and iTerm
-o
/--output
option to save results to files
Improved fedify inbox
Command
Contributors: Hasang Cho [#262, #285], Jang Hanarae [#191, #342]
--actor-name
and--actor-summary
options for customizing temporary actors- Now displays object types contained in activities
fedify init --dry-run
Contributors: Lee ByeongJun [#263, #298]
Preview project initialization without creating files.
Better Terminal Support
Contributors: Cho Hasang [#257, #341]
Correctly handles color output based on TTY detection and NO_COLOR
environment variable.
@fedify/elysia
Contributors: Hyeonseo Kim [#286, #339]
New Elysia integration brings Fedify to Bun-powered applications with a simple plugin interface:
import { Elysia } from "elysia";
import { fedify } from "@fedify/elysia";
const app = new Elysia()
.use(fedify(federation, { /* options */ }))
.listen(3000);
@fedify/nestjs
Contributors: Jaeyeol Lee [#269, #309]
Enterprise-ready NestJS integration with dependency injection support:
import { FedifyModule } from "@fedify/nestjs";
@Module({
imports: [
FedifyModule.forRoot({
kv: new MemoryKvStore(),
queue: new InProcessMessageQueue(),
origin: "https://example.com",
}),
],
})
export class AppModule {}
@fedify/sqlite
Contributors: An Subin [#274, #318]
SqliteKvStore
implementation compatible across all major JavaScript runtimes:
import { SqliteKvStore } from "@fedify/sqlite";
const kv = new SqliteKvStore("./fedify.db");
@fedify/testing
Contributors: Lee ByeongJun [#197, #283]
Comprehensive testing utilities with mocking support for Fedify applications:
import { MockFederation, MockContext } from "@fedify/testing";
const mockFederation = new MockFederation();
const mockContext = new MockContext();
// Track sent activities with full metadata
// Support custom path registration
// Multiple activity type listeners
🙏 Acknowledgments
This release represents an extraordinary community effort, particularly from the participants of South Korea's OSSCA (Open Source Contribution Academy) (Note: page in Korean). We extend our heartfelt thanks to all contributors:
Core Contributors
- ChanHaeng Lee (
@2chanhaeng이찬행) — Custom collections, fediverse handles, WebFinger command
- Lee ByeongJun (
@joonnotnotJoon) — WebFinger redirections, dry-run, testing utilities
- Hyunchae Kim (
@r4bb1t) — AbortSignal support
- Hyeonseo Kim (
@gaebalgom개발곰) — Elysia integration, nodeinfo command
- Jaeyeol Lee (
@kodingwarriorJaeyeol Lee) — NestJS integration
- An Subin (
@nyeongAn Nyeong (安寧)) — SQLite driver
- Jiwon Kwon (
@z9mb1wwj) — Terminal image display, output options
- Hasang Cho (
@crohasang크롸상) — Color output handling, actor customization
- Jang Hanarae (
@meneleHanal Ae) — Activity object type display
- KeunHyeong Park (
@w8385박근형) — WebFinger redirect options
Test Infrastructure Contributors
- Oh Daeun (
@ooheundaoed) — Fixed PostgreSQL test race conditions [#346, #350]
- Song Hanseo (
@songbirds) — Test stability improvements for Redis and code generation [#344, #347]
- Kim Jonghyeon (
@woaol벨) — CLI version management and documentation fixes [#306, #329, #330, #343]
Your contributions have made Fedify stronger and more versatile than ever. The OSSCA program's support has been instrumental in achieving this milestone release.
Migration Guide
Updating from Previous Versions
If you're using separate Fedify packages, update all packages to version 1.8.1:
{
"dependencies": {
"@fedify/fedify": "^1.8.1",
"@fedify/cli": "^1.8.1",
"@fedify/express": "^1.8.1"
}
}
All packages now share the same version number, simplifying dependency management.
Breaking Changes
There are no breaking changes in this release. All existing code should continue to work without modifications.
What's Next
With the monorepo structure in place and new integrations available, we're excited to continue improving Fedify's developer experience and expanding its capabilities. Stay tuned for more updates, and thank you for being part of the Fedify community!
For detailed technical information about all changes, please refer to the full changelog.
Fedify is an open-source project that helps developers build federated server applications powered by ActivityPub. Join us on GitHub or Discord to contribute or get help!
Web Monetization, Programming
6/
Actually, that screen-shot is part of a larger example.
It does seem as if what is returned from the HTTPS-URL that a Payment Pointer resolves to is indeed SPSP JSON.
https://interledger.org/developers/rfcs/simple-payment-setup-protocol/
.
#CrowdBucks #FediDev #Fediverse #PaymentPointer #SimplePaymentSetupProtocol #SPSP #WebMonetization
Web Monetization, Programming
7/
And, a description of the fields in the SPSP JSON seems to be here:
https://interledger.org/developers/rfcs/simple-payment-setup-protocol/#response-body
• destination_account
• shared_secret
• receipts_enabled
.
#CrowdBucks #FediDev #Fediverse #PaymentPointer #SimplePaymentSetupProtocol #SPSP #WebMonetization
Web Monetization, Programming
5/
I am wondering if maybe what is returned from the HTTPS-URL that a Payment Pointer resolves to is:
SPSP JSON
https://interledger.org/developers/rfcs/simple-payment-setup-protocol/
.
#CrowdBucks #FediDev #Fediverse #PaymentPointer #SimplePaymentSetupProtocol #SPSP #WebMonetization
Web Monetization, Programming
6/
Actually, that screen-shot is part of a larger example.
It does seem as if what is returned from the HTTPS-URL that a Payment Pointer resolves to is indeed SPSP JSON.
https://interledger.org/developers/rfcs/simple-payment-setup-protocol/
.
#CrowdBucks #FediDev #Fediverse #PaymentPointer #SimplePaymentSetupProtocol #SPSP #WebMonetization
Web Monetization, Programming
4/
One thing that seems missing is — what is supposed to be returned from the HTTPS-URL that a Web Monetization Payment-Pointer resolves to?
What are the fields in the JSON?
...
I assume it is JSON because of an example HTTP request here (that does NOT show the response):
https://paymentpointers.org/flow/#example
.
#CrowdBucks #FediDev #Fediverse #PaymentPointer #WebMonetization
Web Monetization, Programming
5/
I am wondering if maybe what is returned from the HTTPS-URL that a Payment Pointer resolves to is:
SPSP JSON
https://interledger.org/developers/rfcs/simple-payment-setup-protocol/
.
#CrowdBucks #FediDev #Fediverse #PaymentPointer #SimplePaymentSetupProtocol #SPSP #WebMonetization
We'd like to recognize some excellent contributions from our #OSSCA (Open Source Contribution Academy) participants who have been working on #Fedify.
@gaebalgom개발곰 contributed PR #339, which introduces the
@fedify/elysia
package to provide Elysia integration for Fedify. This work addresses issue #286 by creating a plugin that enables developers using #Bun and #Elysia to integrate Fedify's #ActivityPub capabilities into their applications. The contribution includes the core integration module, documentation, examples, and proper monorepo configuration, making Fedify accessible to the Elysia community.
@r4bb1t submitted PR #315, implementing comprehensive
AbortSignal
support across multiple APIs to resolve issue #51. 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 adding --timeout
options to various CLI commands like fedify lookup
, fedify webfinger
, and fedify nodeinfo
, making federated applications more robust and responsive.
@ooheundaoed addressed a testing infrastructure issue with PR #350, fixing a race condition in PostgreSQL message queue tests that was causing intermittent failures (issue #346). 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.
@songbirds provided two test stability improvements with PR #344 and PR #347. 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.
Thank you all for your contributions to Fedify. Your work helps make federated social networking more accessible to developers.
Web Monetization, Programming
3/
I was looking around for a specification for Web Monetization Payment-Pointers. The closest thing I could find is this:
https://github.com/interledger/paymentpointers.org
https://github.com/interledger/rfcs/blob/main/0026-payment-pointers/0026-payment-pointers.md
#CrowdBucks #FediDev #Fediverse #PaymentPointer #WebMonetization
Web Monetization, Programming
4/
One thing that seems missing is — what is supposed to be returned from the HTTPS-URL that a Web Monetization Payment-Pointer resolves to?
What are the fields in the JSON?
...
I assume it is JSON because of an example HTTP request here (that does NOT show the response):
https://paymentpointers.org/flow/#example
.
#CrowdBucks #FediDev #Fediverse #PaymentPointer #WebMonetization
Web Monetization, Programming
2/
The Payment-Pointer:
$reiver.link
Would resolve to the HTTP-URL:
https://reiver.link/.well-known/pay
And, that (HTTPS-URL) would return some type of JSON document.
#CrowdBucks #FediDev #Fediverse #PaymentPointer #WebMonetization
Web Monetization, Programming
3/
I was looking around for a specification for Web Monetization Payment-Pointers. The closest thing I could find is this:
https://github.com/interledger/paymentpointers.org
https://github.com/interledger/rfcs/blob/main/0026-payment-pointers/0026-payment-pointers.md
#CrowdBucks #FediDev #Fediverse #PaymentPointer #WebMonetization
Web Monetization, Programming
1/
I have been looking at Web Monetization.
Partly because I am curious. And, partly because I may implement them for CrowdBucks.
One part of Web Monetization are "Payment-Pointers".
They aren't URLs. But sort of URL-like, in that they point somewhere.
For example, my web-site is:
Then I could let people people pay me with this Payment-Pointer:
$reiver.link
#CrowdBucks #FediDev #Fediverse #PaymentPointer #WebMonetization
Web Monetization, Programming
2/
The Payment-Pointer:
$reiver.link
Would resolve to the HTTP-URL:
https://reiver.link/.well-known/pay
And, that (HTTPS-URL) would return some type of JSON document.
#CrowdBucks #FediDev #Fediverse #PaymentPointer #WebMonetization
Web Monetization, Programming
1/
I have been looking at Web Monetization.
Partly because I am curious. And, partly because I may implement them for CrowdBucks.
One part of Web Monetization are "Payment-Pointers".
They aren't URLs. But sort of URL-like, in that they point somewhere.
For example, my web-site is:
Then I could let people people pay me with this Payment-Pointer:
$reiver.link
#CrowdBucks #FediDev #Fediverse #PaymentPointer #WebMonetization
@evanEvan Prodromou do you know is there an agreed upon opinion in the #ActivityPub working group (or in in the fediverse at large) if `Dislike` activities should be added to an object's likes collection?
Lots of talk about Ghost today, and rightly so, but don’t forget that a little open source framework @fedifyFedify: ActivityPub server framework made the ActivityPub plugin possible.
Support open source!
#APx ActivityPub toolkit consists of two packages: apx_sdk
(the main package) and apx_core
.
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 FEP-8b32 and FEP-ef61 'ap' URIs.
If you’re interested in viewing the sessions from Fedicon, follow @fedicon
It’s been less than 24 hours and the first session is already listed!
We're thrilled to highlight five outstanding contributions from the Korean Open Source Contribution Academy (#OSSCA) program participants who have been working on #Fedify! Their dedication and effort have significantly enhanced our #ActivityPub server framework.
First up is @nyeongAn Nyeong (安寧) with his monumental #318 PR, implementing a SQLite-based key–value store to address #274. 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!
Next, @crohasang크롸상 delivered an excellent quality-of-life improvement with #341 PR, fixing #257. 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!
@meneleHanal Ae contributed a thoughtful enhancement with #342 PR, addressing #191. 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!
@woaol벨 tackled an important developer experience issue with #329 PR, solving #306. 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!
Finally, @kodingwarriorJaeyeol Lee made a significant contribution with #309 PR, implementing #269—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!
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! 🚀
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 GitHub repository and join us in building the future of federated social web! 🌟
What is the biggest reason that makes you hesitate to adopt #Fedify?
What is the biggest reason that makes you hesitate to adopt #Fedify?
🎉 Huge shoutout to @2chanhaeng이찬행 for implementing custom collection dispatchers in #Fedify through the Korean #OSSCA program!
This incredible contribution adds support for creating arbitrary collections beyond the built-in ones (e.g., outbox, inbox, following, followers). Now developers can expose custom collections like user bookmarks, post categories, or any grouped content through the #ActivityPub protocol:
federation
.setCollectionDispatcher(
"bookmarks",
Article,
"/users/{identifier}/bookmarks",
async (ctx, values, cursor) => {
const { posts, nextCursor } = await getBookmarkedPosts(values.identifier, cursor);
return { items: posts, nextCursor };
}
)
.setCounter(async (ctx, values) =>
getBookmarkCount(values.identifier)
);
The implementation is technically excellent with full #TypeScript support, both Collection
and OrderedCollection
types, cursor-based pagination, authorization predicates, and zero breaking changes. @2chanhaeng이찬행 delivered not just code but a complete feature with 313 lines of comprehensive documentation, practical examples, and thorough test coverage.
This opens up countless possibilities for ActivityPub applications built with Fedify. From user-specific collections to complex categorization systems, developers now have the flexibility to create any type of custom collection while maintaining full ActivityPub compliance.
Thank you @2chanhaeng이찬행 for this outstanding contribution and to the OSSCA program for fostering such excellent open source collaboration! 🚀
🎉 Huge shoutouts to two amazing contributors from Korea's #OSSCA program who just made #Fedify even better!
First, @z9mb1wwj delivered PR #321, 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.
But the real showstopper is @joonnotnotJoon's incredible PR #283, 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.
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! 🚀
currently i'm searching a place to talk about #activitypub. i have a plan to create my own social media with #activitypub protocol in #golang.
i'm okay with IRC or XMPP, thanks!
Your could talk about it here, if you use the hash-tags #ActivityPub and #FediDev — then other Fediverse developers will see it.
🎉 Huge shoutout to two amazing contributors from Korea's #OSSCA program who've made excellent contributions to #Fedify!
👏 @gaebalgom개발곰 tackled a tricky terminal compatibility issue in PR #282, fixing the
fedify node
command's favicon display on terminal emulators without truecolor support (#168). His solution elegantly detects terminal capabilities and falls back to 256-color mode when needed—ensuring a great experience across different environments.
🌟 @joonnotnotJoon enhanced Fedify's #WebFinger functionality in PR #281 by adding a configurable
maxRedirection
option to the lookupWebFinger()
function (#248). He transformed a hardcoded limitation into a flexible, user-customizable parameter while maintaining perfect backward compatibility.
Both delivered thoughtful, well-implemented solutions that showcase the quality of contributions coming from the OSSCA program. Welcome to the Fedify community!
🎉 Big thanks to @2chanhaeng이찬행 for his first contribution to #Fedify! He implemented the new
fedify webfinger
command in PR #278, which allows isolated #WebFinger lookups for testing configurations. This addresses the need for developers to test WebFinger functionality without performing comprehensive object retrieval.
The contribution includes:
- A new
fedify webfinger <handle>
command that accepts@user@domain
format handles or URIs - Clean JSON output of WebFinger JRD results
- Proper error handling for invalid handles and lookup failures
- Complete #CLI integration with help text and usage examples
This was originally filed as issue #260 and marked as a good first issue—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.
We appreciate all first-time contributors who help make Fedify better for the entire #fediverse community. Welcome aboard, ChanHaeng!
Just installed the fedify CLI tool on my Mac. Very useful tool for AP developers and tinkerers alike.
You can ask to to look up an AP object and it returns the response. Cool!
`fedify lookup https://spark.box464.social/pub/actors/spark464`
Excited to share that I've joined #OSSCA (Open Source Software Contribution Academy) as a mentor for the @fedifyFedify: ActivityPub server framework project!
OSSCA is a national program run by South Korea's NIPA (National IT Industry Promotion Agency) through their Open Source Software Support Center, aimed at fostering the next generation of open source contributors.
We're currently in the process of selecting around 20 mentees who will start contributing to #Fedify once the selection is complete. I've been busy preparing good first issues to help them get started on their open source journey.
Looking forward to working with these new contributors and seeing what amazing things we can build together!
And just finished writing a comprehensive contributor guide for the #OSSCA mentees!
You can check it out here—it's Korean though: https://hackers.pub/@hongminhee/2025/ossca-fedify-contributors-guide.
It covers everything from setting up the #fediverse accounts and development environment to finding good first issues. While it's primarily for the OSSCA participants, anyone interested in contributing to @fedifyFedify: ActivityPub server framework is welcome to use it as a reference.
Ready to onboard the next wave of #ActivityPub developers!
#Fedify has moved to a monorepo structure with unified versioning across all packages (@fedify/fedify
, @fedify/cli
, database adapters & framework integrations).
All packages now release together, making dependency management much simpler!
I've just deployed the first set of changes to have proper activitypub quotes on bird.makeup, those exemples should (in theory) work on Mastodon 4.4 and others implementations that support those:
https://bird.makeup/users/davidfowl/statuses/1939555328343085175
https://bird.makeup/users/bigtechalert/statuses/1937857604488970603
https://bird.makeup/users/nntaleb/statuses/1937556442103288296
Can you all test and report back? I will fix any incompatibilty with any implementation #fedidev
Excited to share that I've joined #OSSCA (Open Source Software Contribution Academy) as a mentor for the @fedifyFedify: ActivityPub server framework project!
OSSCA is a national program run by South Korea's NIPA (National IT Industry Promotion Agency) through their Open Source Software Support Center, aimed at fostering the next generation of open source contributors.
We're currently in the process of selecting around 20 mentees who will start contributing to #Fedify once the selection is complete. I've been busy preparing good first issues to help them get started on their open source journey.
Looking forward to working with these new contributors and seeing what amazing things we can build together!
We're pleased to share that Encyclia has joined our success stories.
@encyclia bridges academic research to the #fediverse by making #ORCID researcher profiles and publications discoverable through #ActivityPub—built with #Fedify for seamless interoperability across Mastodon and other fediverse platforms.
This demonstrates Fedify's versatility beyond traditional social networking, helping specialized domains connect to the federated web.
We're also grateful for #Encyclia's sponsorship support, which helps make Fedify's development possible.
Learn more about Encyclia at https://encyclia.pub/. 📚
We are pleased to announce the release of #Fedify 1.7.0. This release was expedited at the request of the Ghost team, who are actively using Fedify for their #ActivityPub implementation. As a result, several features originally planned for this version have been moved to Fedify 1.8.0 to ensure timely delivery of the most critical improvements.
This release focuses on enhancing message queue functionality and improving compatibility with ActivityPub servers through refined HTTP signature handling.
Native retry mechanism support
This release introduces support for native retry mechanisms in message queue backends. The new MessageQueue.nativeRetrial
property allows queue implementations to indicate whether they provide built-in retry functionality, enabling Fedify to optimize its retry behavior accordingly.
When nativeRetrial
is set to true
, Fedify will delegate retry handling to the queue backend rather than implementing its own retry logic. This approach reduces overhead and leverages the proven retry mechanisms of established queue systems.
Current implementations with native retry support include:
DenoKvMessageQueue
— utilizes Deno KV's automatic retry with exponential backoffWorkersMessageQueue
— leverages Cloudflare Queues' automatic retry and dead-letter queue featuresAmqpMessageQueue
— can now be configured to use AMQP broker's native retry mechanisms
The InProcessMessageQueue
continues to use Fedify's internal retry mechanism, while ParallelMessageQueue
inherits the retry behavior from its wrapped queue.
AMQP message queue improvements
Alongside Fedify 1.7.0, we have also released @fedify/amqp 0.3.0. This release adds the nativeRetrial
option to AmqpMessageQueueOptions
, enabling you to leverage your AMQP broker's built-in retry mechanisms. When enabled, this option allows the AMQP broker to handle message retries according to its configured policies, rather than relying on Fedify's internal retry logic.
Configurable double-knocking
The new FederationOptions.firstKnock
option provides control over the HTTP Signatures specification used for the initial signature attempt when communicating with previously unknown servers.
Previously, the first knock for newly encountered servers always used RFC 9421 (HTTP Message Signatures), falling back to draft-cavage-http-signatures-12 if needed. With this release, you can now configure which specification to use for the first knock when communicating with unknown servers, with RFC 9421 remaining the default.
Summary
This release maintains Fedify's commitment to reliability and compatibility while laying the groundwork for more efficient message processing. The native retry mechanism support will particularly benefit applications using queue backends with sophisticated retry capabilities, while the double-knocking mechanism addresses real-world compatibility challenges in the ActivityPub ecosystem.
For detailed technical information about these changes, please refer to the changelog in the repository.