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.
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.
after reading @smallcirclesjust small circles 🕊 texts it reminded me my thoughts that Fediverse could be also great coworking place. with project management, kanban, tickets. I like #Australian company #Atlassian very much for their high quality products. Maybe if they will enable (add) #ActivityPub support to their sofware, it will be very nice & cool.
but first, I think, they need to establish account on #fediverse .
New: SocialHub and the Substrate of Decentralised Networks
SocialHub, one of the primary forums to talk about the #fediverse and #ActivityPub, has been struggling how to continue the operation. Decentralised networks need a coordination layer, but how to build this in a decentralised manner?
- robust #p2p technologies exist - there's no large uptake of p2p (social) networks
In 2017 investigating promising decentralized tech, most noteworthy was the landscape of tombstones of long-dead forgotten projects where people pumped in years of coding.
I came to #ActivityPub as best positioned for broad adoption and 'universal social networking' (bit disillusioned now).
With #Solid project you saw a "Just create intricate #LinkedData specs, omit appealing to dev community, target biz directly. And broad adoption will come".
With #ActivityPub we saw "Let's have these initial specs be the basis, and throw it into this grassroots ecosystem, and vNext will rise from that".
#DAT project saw cryptography and compsci experts going deep in the tech, without considering how it would be adopted, implicit "code it and they will come".
@pepper0Decenta Lyzed It was started in 2010s under the name MaidSafe. It was a blockchain, there was a token sale, etc. Didn't get any traction. Then it was rebranded to SAFE Network. Then to Autonomi.
I've never met anyone who actually uses it, but I guess they made enough money from the token sale to keep developing it for the next 100 years.
- robust #p2p technologies exist - there's no large uptake of p2p (social) networks
In 2017 investigating promising decentralized tech, most noteworthy was the landscape of tombstones of long-dead forgotten projects where people pumped in years of coding.
I came to #ActivityPub as best positioned for broad adoption and 'universal social networking' (bit disillusioned now).
#ActivityPub objects are JSON documents with a special id property. This property is an URI indicating the location of a document, and we can authenticate a document by fetching its id. If the document exists at the specified location, and has the same ID, we conclude that it is valid.
This has several important corollaries:
1. The server of origin is the only authority. Other servers must not be trusted. 2. ActivityPub is fundamentally a "pull" protocol, not "push". 3. The type of a document is not relevant for authentication. Actor documents are not special.
However, fetching documents is not always practical, and developers may want to push data to other nodes. How documents can be authenticated without making an HTTP request? Digital signatures.
The server publishes a JSON document containing a public key, and then starts signing other documents with a corresponding secret key.
Upon receiving a signed document (such as activity), we determine the ID of a public key document, retrieve the document and verify the signature. If the public key document has the same server of origin as the signed document, and the signature is valid, we conclude that the signed document is valid too, because a chain of trust has been established: received document -> public key document -> server.
The public key document doesn't change often, so now we can verify many signed documents without re-fetching the public key.
This also has important corollaries:
1. Once again, the type of a signed document is not relevant for authentication. 2. Public keys do not need to be attached to actor documents. 3. One key per server is enough.
Developers are constantly being told that ActivityPub is an actor-centric "push" protocol, and that each actor must have its own key. But those ideas are wrong and it is time to put them to rest.
Update 2025-08-26: a link between a key and an actor is required for implementing access control and may be required in some other special cases; see the latest version of the FEP for details
Excited to share some great news from the #creative community! Oeee Cafe, a fantastic oekaki#drawing platform, just added #ActivityPub support today. This means all the amazing artwork being created there can now be shared and discovered across the #fediverse, which is such a wonderful step toward connecting creative communities.
Big shoutout to my friend @jihyeokJihyeok Seo for building this platform and bringing it to the fediverse. It's always inspiring to see developers creating spaces for artists and then opening them up to the broader federated community. If you're into digital art or just appreciate seeing creative work, definitely worth checking out what people are sharing from Oeee Cafe on your timeline now. You can find me there at @hongminhee洪兔 if you want to connect!
For the past couple of days I've been hard at work writing documentation in the attempt to decrease the friction for developers that try #GoActivityPub for their applications.
I am of a mind to pay some #Go developers in the near future to do a weekend's worth of programming into trying to use the library in projects, so we can iron out potential issues with the use of the library itself and the documentation.
There's a whole thread happening over at Eugen's place re: what even is decentralization maaaan
So the thing is, in practice, AP isn't actually decentralized. What it's done is replace one center with many that are even less scrutable. This is not in any way an improvement.
I used to be a big fan of AP
Not being able to see art anymore on tech dot LGBT due to The Art Instance™️ being run by a tyrant was the first big crack in my liking the AP fediverse. It revealed how centralized it really is. Meanwhile Bluesky builds AT and all the tooling to moot the company and its potential power.
AT still has potential. AP is hard locked to a certain course unless some massive disruption happens internally. Its potential, timeline-wise, was where AT is now, not almost 10 years in. I don't see it happening in a world where it peaked at ~3m and doesn't seem to grow any. The million active users it has are the million it will have for the foreseeable future.
Is it possible to make a post on the Fediverse which:
is publicly viewable to all,
doesn't necessarily get delivered to my followers' timelines, and
is delivered to everyone following a particular hashtag?
I have lots of interests and would like to toot more about them: railways, FOSS, standards, politics etc., but I don't want to spam all of my followers with stuff they're not interested in. I could create multiple profiles, but that seems like a crude hack - is there a better way?
The creators of WeDistribute have announced a newsletter, Relay, that will provide deep dive content by the core team as well as guest writers each week, about all things social.
"Web 3.0 is poised to change this dynamic by returning ownership to the data owners. This is not speculative; it’s already emerging. For example, #ActivityPub the protocol behind decentralized social networks like Mastodon, combines content sharing with built-in attribution."
“Mastodon’s developers — many of whom were queer and trans — did not enjoy the privilege of living the totally open life: they needed privacy and safety, means to protect themselves from harassment.”
Which led to particular choices that were made for #ActivityPub. Good ones imho. 1/2
Ω🪬Ω New version (v1.1.0) of #FediAlgo, the customizable timeline algorithm / filtering system for your Mastodon feed, has a toggle switch to allow or disallow the selection of more than one filter option for when you're checking out your favourite hashtags.
Here's a thought, the more I make my blog compatible with the fediverse, at some point I can just use my blog instead of mastodon right? What would the benefit be to have a separate mastodon account? #fediverse#activitypub#mastodon
I have a demo at work in like 5 minutes, then I have meetings until 11pm PST which I go live on the @firesidefedi ! But I just realized I don't have an fediverse appropriate tshirt, so I will try to create one.
I already choose one text, and is not in this list, but what would have been your fav?
🏕️ my adventures in #selfhosting: day 244 (Everest edition) ⛰️
a blog post that details some of the highs and lows I have been experiencing lately in my self-hosting adventures. I have a major challenge ahead - learning #Docker - in order to take advantage of #Ghost x #ActivityPub federation. It's my new Everest 🥲
#ActivityPub is peanuts, right? All peanuts, all varieties, shapes and sizes. Isn't it peculiar then that six years after AP became a #W3C recommendation we are still all mostly eating from 1 small ingredient package of the primitive #ActivityStreams variety. One small bag to cook with, and supply us with rich #fediverse peanut butter. Isn't that becoming somewhat bland and boring?
Running a single user (or small) instance in the Fediverse? Relay instances acting as a spreading proxy can help you to find your content and also to make your posts visible to others - and you can easily join with #Mastodon, #snac and many other ones!
The https://fedi-relay.gyptazy.com relay is mostly for tech related content and just got updates to the manpageblog design.
If you're thinking of creating a Fedi site, I strongly recommend avoiding a .com, .net, .org, .info, .us, or .edu domain name.
You want to avoid U.S. jurisdiction entirely, which means choosing a domain name, registrar, and web hosting provider located outside of it.
I personally recommend the following domain extensions: .be (Belgium), .nl (Netherlands), .is (Iceland), .ch (Switzerland), .at (Austria), and finally, .tw (Taiwan).
All of these countries have strong protections for freedom of speech, including speech that defends and promotes minority rights — such as LGBTQ+ rights. Domain registration is open to everyone... You don’t need to be a citizen or own a business in any of these countries.
No solution is 100% perfect, but at this moment, we can say with confidence that the USA, China, and Russia are not ideal choices.
I have expanded my list of domain extensions I would recommend:
.be (Belgium)
.nl (Netherlands)
.is (Iceland)
.ch (Switzerland)
.at (Austria)
.tw (Taiwan)
.fi (Finland)
.se (Sweden)
.li (Liechtenstein)
.cz (Czech Republic)
All of these countries have strong protections for freedom of speech, including speech that defends and promotes minority rights — such as LGBTQ+ rights. Domain registration is open to everyone... You don’t need to be a citizen or own a business in any of these countries.
I would also add an optional, alternative:
.de (Germany, with registrar help * )
* Germany technically allows anyone with verified contact details within the country to register a domain. Many registrars offer this as a service. However, you should ensure your domain registrar is located outside U.S. jurisdiction.
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.
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 have a #fediverse#activitypub question. There used to be a microblogging software called Laconica, is it in anyway related to what we are using here today?
Recently on the #ActivityPub developers forum SocialHub, the last active admin announced an intention to stop doing essential maintenance. Since then, we've been talking about the need for new governance;
We need an admin team responsive to the community who gather there (whether to comment or just read). People whose priority is to help us share knowledge and solve problems together, so we can make the fediverse better for everyone.
Dumb question that I was always too afraid to ask:
I know how the #Fediverse and its federation works. It's intuitive and familiar to me; I mean, I even host my own instance.
But I never understood how interaction cross-software is supposed to work. In theory, I can use whatever #ActivityPub software I want and still interact with everyone else. But in practice that just... isn't the case, right?
I mean, for text it's quite simple: I write a short post on #Mastodon and people on #GoToSocial or #Misskey or whatever can see and read that same post and interact with it. They can see my profile and it appears on their instance in their style and with their features.
Even outside of microblogging I still get it. A super-long post on #Friendica or #Diaspora appears on my timeline, too. Their profiles might have more fields than I can see here, but that's fine.
But what's up beyond that?
I can see #Pixelfed posts here, converted into image galleries. But what about the other way 'round? If someone on Pixelfed follows my Mastodon account, they can't see any of my non-image posts, right?
What about #PeerTube and such niche software? I guess I could follow a PeerTube account as a microblogger and see their videos and descriptions in my timeline. Video comments are replies.
But the other way 'round? How are they supposed to interact with Friendica or Pixelfed users? PeerTube doesn't even have a "timeline".
Doesn't that feature disparity undermine the whole idea of the #Fediverse or am I missing something?
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)
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)