Search results

Been thinking about fediverse wiki after @2chanhaeng초무 mentioned it today. Some ideas:

  • Cross-instance page linking: [[Page Title@other-instance.wiki]]
  • Edit pages on other instances with your home account
  • Fork pages across instances: [[Page@instance-a.wiki]][[Page@instance-b.wiki]], sharing edit history up to the fork point
  • Merge forked pages later when needed

The fork/merge model feels natural for federated collaboration. Thoughts?

2

Interesting new DID method: "did:self"

FenTiger @fentiger@zotum.net

One consequence of trying to separate identity hosting from the other components of the system is that it makes the other components harder to bootstrap. If I run just one component of my instance in isolation, how can I authenticate to it in order to configure/manage/test it, if I don't have an identity that I can use?

The answer might be to use a did:self identifier. The flow would look something like

  • Management CLI tool generates a JWT describing a did:self identifier, and stores the private key locally
  • Admin uses scp or something to copy this JWT to the right place on the server
  • The server now has the ID's public key and so the CLI tool can prove that it "owns" the identifier

Which seems like a reasonable fix for the classic problem of "how do you create the first user", and also a useful fallback for when the system is too badly borked to be able to look up real identities.

Another interesting property of did:self is that seems to be possible to add extra metadata, such as a human-readable name, to the ID, by using standard JWT claims - without needing the data to appear in the DID document.

Of course these identities will only be visible to the server they're copied to, not to the whole network, but that shouldn't be a major problem.

(Cue the peanut gallery, with their suggestions of "it's easy, just do so-and-so", because everything looks easy when you take it out of context...)

#ActivityPubDev #FediDev
Read more →
0

RE: neuromatch.social/@jonny/11534

Rumors that the fediverse can't do mobile identity have been greatly exaggerated: is now in draft status - codeberg.org/fediverse/fep/src

This is a proposal for how to migrate all your stuff along with you when you move instances.

The gist:

  • Send a request to move along with a set of stuff you'd like to bring with you. Moderators (optionally) can, approve, send back a change request, or deny. If the changes look ok, start the move, if not, hey you avoided incompatible moderation. Should be possible to layer in any kind of bulk actions you might want: "everything except my DMs," "strip attachments," "only my favorite posts," "nothing," etc.
  • keep a public collection of move events signed by both the source and target for durable, portable proof that you are the same person as the old account
  • the new instance crawls your old account and grabs whatever you specified, and then posts a mapping from old URIs to new URIs.
  • other instances can then immediately remap the URIs so e.g. future interactions get sent to the right place, and then gradually update their local versions over time, spacing out traffic.

Just using existing ActivityPub mechanisms. There are 6 new terms.

Bonus: lays the next steps to migrate to content addressed URIs, decouple accounts from instances, and merge and split accounts.

It being a draft means that there is a 60 day (or longer) public comment period, and feedback/edits/etc. Are very much welcome.
Issue: codeberg.org/fediverse/fep/iss
Discussion: socialhub.activitypub.rocks/t/

0
0
0
1

Here's a draft FEP to do full account migration with posts and whatever other kinda objects you want to bring with you. It's a trivial expansion of existing ActivityPub/streams systems and supports gradual migration as it's implemented and after an account migration. It should be possible to migrate pretty much everything this way, both private and public objects.

criticism, feedback, revisions, etc. welcome - i don't think this is a "final version" and there are certainly things i overlooked.

codeberg.org/sneakers-the-rat/

codeberg.org/fediverse/fep/pul

0
0
1
0
0
0

If we were to do a regular online Fediverse meeting —

(Maybe once a month.)

WHAT DAYS OF THE WEEK WOULD YOU BE ABLE TO ATTEND?

A regular (online) meeting for Fediverse developers, for those who care about the Fediverse as a social movement, and for those who care about the success of the Fediverse.

Sunday?
Monday?
Tuesday?
Wednesday?
Thursday?
Friday?
Saturday?

(You can pick more than one day)

PLEASE REPLY WITH YOUR ANSWER.

0
0
1

RE: mastodon.social/@reiver/115300

I just did a video-chat with @sl007Sebastian Lasse

(This is the first time we chatted.)

We talked about a number of Fediverse related things.

One of those things was — having a regular (online) meeting.

A regular (online) meeting for Fediverse developers, for those who care about the Fediverse as a social movement, and for those who care about the success of the Fediverse.

I have heard others say this, too, over and over again.

(And, at times, we have had them before.)

0

A wiki you can post on, what a concept.
But that's basically what it is we just don't have names for posts or concepts.

I actually did implement this, where you could give a post a title and that gives it a namespaced URL, ideally then one would be able to do [[my post]] or [[@jonny/my post]] , (and then quoting a named concept would be {{ @jonny/my post }} ). Idk why we never deployed this.

github.com/NeuromatchAcademy/m

0
2
5
1

4/

Apparently, Bookwyrm stores quotations with:

type="Quotation"

And if one Bookwyrm server talks to another Bookwyrm server, then — the ActivityPub / ActivityStreams representation of the quotation will have:

type="Quotation"

...

BUT — if a non-Bookwyrm server talks to a Bookwyrm server, then — the ActivityPub / ActivityStreams representation of the quotation will have:

type="Note"

0
0

Quotations & the Fediverse / ActivityPub

1/

One thing I used to do a lot on social-media is — post quotations.

Sometimes I was reading a book. And, I would quote things from the book and post it on social-media.

Or I was reading a scholarly paper, or reading a blog post, or watching a video, or listening to a podcast, etc.

...

I was thinking — how could you represent a quotation in ActivityPub‽

“[And yet another book that made an argument that was in favor of human universals is] Brent Berlin and Paul Kay’s [book] "Basic Color Terms: Their Universality and Evolution" (1969).”

“by the early 1970s two independent lines of psychological research, culminating in studies conducted among preliterate peoples of New Guinea, had shown that there are universal facial expressions of emotions.”

“Berlin and Kay show that although color classification does vary, it also shows remarkable uniformities: particularly in the sequence in which basic color terms are added to the lexicon.”

“Anthropologists and linguists had long known that the way colors are classified varies from language to language. Careful studies conducted by anthropologists after World War II, such as Harold Conklin’s (1955) study of Hanunóo color words, made the point very clearly.”

“The different sets of words for color in various languages …”
0

Quotations & the Fediverse / ActivityPub

1/

One thing I used to do a lot on social-media is — post quotations.

Sometimes I was reading a book. And, I would quote things from the book and post it on social-media.

Or I was reading a scholarly paper, or reading a blog post, or watching a video, or listening to a podcast, etc.

...

I was thinking — how could you represent a quotation in ActivityPub‽

“[And yet another book that made an argument that was in favor of human universals is] Brent Berlin and Paul Kay’s [book] "Basic Color Terms: Their Universality and Evolution" (1969).”

“by the early 1970s two independent lines of psychological research, culminating in studies conducted among preliterate peoples of New Guinea, had shown that there are universal facial expressions of emotions.”

“Berlin and Kay show that although color classification does vary, it also shows remarkable uniformities: particularly in the sequence in which basic color terms are added to the lexicon.”

“Anthropologists and linguists had long known that the way colors are classified varies from language to language. Careful studies conducted by anthropologists after World War II, such as Harold Conklin’s (1955) study of Hanunóo color words, made the point very clearly.”

“The different sets of words for color in various languages …”
0

8/

REMEMBER: this is for power-users, not regular users

How would you get ActivityPub / ActivityStreams into HTML using RDFa‽

Like this:

<div vocab="w3.org/ns/activitystreams#" typeof="Note">
<p property="name">Hello!</p>
<p>How do you do?</p>
</div>

AGAIN, REMEMBER: this is for power-users, not regular users.

Regular users can just write Markdown or HTML and Retejo will figure this out automatically for you

0

7/

If you are wondering what RDFa is —

You might be more familiar with OpenGraph.

ogp.me/

OpenGraph is usually the thing that causes "preview cards" to be showed for links shared on social-media.

OpenGraph is written in RDFa. Which, in practice, is some special HTML elements added to the page.

For example:

<meta property="og:image" content="example.com/img/preview.png" />

So what about ActivityPub‽ —

8/

REMEMBER: this is for power-users, not regular users

How would you get ActivityPub / ActivityStreams into HTML using RDFa‽

Like this:

<div vocab="w3.org/ns/activitystreams#" typeof="Note">
<p property="name">Hello!</p>
<p>How do you do?</p>
</div>

AGAIN, REMEMBER: this is for power-users, not regular users.

Regular users can just write Markdown or HTML and Retejo will figure this out automatically for you

0

6/

Obviously, beginners are NOT going to do this, but — some power-users may want this level of control.

There are different way this could be done, but — one way might be that power-users could use RDFa to explicitly specify what data from the HTML gets into the ActivityPub / ActivityStreams data.

Again, beginners and typical users would NOT do this.

But a power-user might want to.

Here is an example —

7/

If you are wondering what RDFa is —

You might be more familiar with OpenGraph.

ogp.me/

OpenGraph is usually the thing that causes "preview cards" to be showed for links shared on social-media.

OpenGraph is written in RDFa. Which, in practice, is some special HTML elements added to the page.

For example:

<meta property="og:image" content="example.com/img/preview.png" />

So what about ActivityPub‽ —

0

6/

Obviously, beginners are NOT going to do this, but — some power-users may want this level of control.

There are different way this could be done, but — one way might be that power-users could use RDFa to explicitly specify what data from the HTML gets into the ActivityPub / ActivityStreams data.

Again, beginners and typical users would NOT do this.

But a power-user might want to.

Here is an example —

0
0
0

2/

What are "good" ways of automatically creating ActivityPub / ActivityStreams data from HTML and Markdown‽

I think the answer depends on who, for example, is writing HTML, and how they are writing it.

For example, is this a typical user? Is this a power-user? Do they know HTML? And if they do know HTML, how well do they know it? Etc?

I will show you what I mean —

...

0

1/

I have spending time thinking of ways you could automatically create ActivityPub / ActivityStreams data from HTML and Markdown

Most people will probably write in plain UTF-8 text, or Markdown, or HTML

How to do you take that and get it onto the Fediverse and Social Web‽

This isn't just a question of how to technically do it — but also a question of user-experience (UX)

I.e., what are "good" ways of doing it‽

...

2/

What are "good" ways of automatically creating ActivityPub / ActivityStreams data from HTML and Markdown‽

I think the answer depends on who, for example, is writing HTML, and how they are writing it.

For example, is this a typical user? Is this a power-user? Do they know HTML? And if they do know HTML, how well do they know it? Etc?

I will show you what I mean —

...

0

1/

I have spending time thinking of ways you could automatically create ActivityPub / ActivityStreams data from HTML and Markdown

Most people will probably write in plain UTF-8 text, or Markdown, or HTML

How to do you take that and get it onto the Fediverse and Social Web‽

This isn't just a question of how to technically do it — but also a question of user-experience (UX)

I.e., what are "good" ways of doing it‽

...

0

Today I discovered an interesting inconsistency in Activity Streams specs while investigating a Fedify issue.

The question: How should we interpret URLs like "icon": "https://example.com/avatar.png"?

JSON-LD context (https://www.w3.org/ns/activitystreams): @type: "@id" → “This is an IRI reference, dereference it to fetch an ActivityStreams object.”

Activity Streams Primer: “assume that a bare string is the href of a Link object, not an id” (no dereferencing)

Result: JSON-LD processor-based implementations try to parse PNG files as JSON and fail.

Turns out w3c/activitystreams#595 already discusses the same issue for href properties. I added a note that icon, image, etc. have the same problem.

Once again reminded of how tricky spec work can be…

0

We're excited to share an update on '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.

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.

Some of the planned improvements include adding readonly modifiers throughout our types and interfaces to better enforce our immutability-by-default principle, implementing our own RFC 6570 URI Template library for symmetric expansion and pattern matching, and various CLI tool migrations to our new Optique 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 . You can track all planned changes in detail by checking out the Fedify 2.0 milestone on our GitHub repository.

1
0
0
0
0
Announcement?????? idk

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
0

Flag Activity

FenTiger @fentiger@zotum.net

Is there any information anywhere on how the Flag activity is used in practice?

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
Read more →
0

The 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!

A table showing 16 Fedify packages with three columns: Package name, registry availability (JSR and npm links), and Description. The packages include the core @fedify/fedify framework, CLI toolchain, database drivers (PostgreSQL, Redis, SQLite, AMQP/RabbitMQ), web framework integrations (Express, Hono, H3, Elysia, NestJS, Next.js, SvelteKit, Cloudflare Workers), Deno KV integration, and testing utilities. Most packages are available on both JSR and npm registries, with some exceptions like @fedify/denokv (JSR only) and @fedify/elysia, @fedify/nestjs, @fedify/next (npm only).
1
0
1

Are you a Fediverse developer? Do you work with ActivityPub?

You should follow 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 )

0
0
0

We're excited to announce the release of BotKit 0.3.0! This release marks a significant milestone as now supports .js alongside , 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 runtime while building with the same powerful BotKit APIs.

One of the most requested features has landed: poll support! You can now create interactive polls in your 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 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 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.

2
1
0

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:

asml.cyber.harvard.edu/activit

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.

@dariusDarius Kazemi

super nice.

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 github.com/sebilasse/compressDE which meanwhile improved and soon you can generate your lexica from corpora.
btw This can detect 852 languages github.com/redaktor/languages
Less data, better climate …

0

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)

0
0

We'd like to recognize the valuable contributions from two developers who participated in Korea's (Open Source Contribution Academy) program. Both contributors identified important gaps in 's functionality and documentation, providing thoughtful solutions that benefit the broader ecosystem.

@gaebalgom개발곰 contributed PR #365, addressing issue #353 regarding NodeInfo parser compatibility, originally reported by @andypiper. The issue arose when Fedify incorrectly rejected 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.

3
0
0
0

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:

web.archive.org/web/2025022212

If I look at the HTML source-code, I see a Payment-Pointer.

But the host in the Payment-Pointer doesn't work.

<meta name="monetization" content="$ilp.uphold.com/LJmbPn7WD4JB">
0
0

🔒 Security Update for BotKit Users

We've released patch versions BotKit 0.1.2 and 0.2.2 to address CVE-2025-54888, a security discovered in . These updates incorporate the latest patched version of Fedify to ensure your bots remain secure.

We strongly recommend all users update to the latest patch version immediately. Thank you for keeping the safe! 🛡️

0

All users must immediately update to the latest patched versions. A authentication bypass (CVE-2025-54888) has been discovered in Fedify that allows attackers to impersonate any 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 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.

1
2
1

Web Monetization, Programming

@reiver@reiver ⊼ (Charles) :batman:

very nice!

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 github.com/sebilasse/compressDE and it will be combined with the language detection of 852 locales github.com/redaktor/languages

0
0
0

We're thrilled to announce Fedify 1.8.1, a mega release made possible through the incredible efforts of contributors from South Korea's (Open Source Contribution Academy). This release marks a significant milestone in '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 , 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/elysiaElysia integration for Bun-powered applications
  • @fedify/nestjsNestJS integration for enterprise Node.js apps
  • @fedify/sqlite — SQLite driver compatible with Bun, Deno, and Node.js
  • @fedify/testing — Testing utilities with mock Federation and Context 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() and setOrderedCollectionDispatcher()
  • Added getCollectionUri() method to the Context 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 and DenoKvStore
  • Useful for implementing distributed locks and counters

Fediverse Handle Utilities

New utility functions make working with handles more convenient.

Contributors: ChanHaeng Lee [#278]

  • parseFediverseHandle() — Parse handles into components
  • isFediverseHandle() — Validate handle format
  • toAcctUrl() — Convert handles to URLs
  • FediverseHandle 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 to LookupObjectOptions, LookupWebFingerOptions, and DoubleKnockOptions

@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

Test Infrastructure Contributors

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!

7
0
0