#ActivityPub platform feature want: similar to "no boosts" from accounts followed, do not see their replies to people on domains you have blocked.
Presumably, if you have decided an entire domain's worth of accounts should never appear in your feed or receive your own emanations, you have reasons. Which are probably offended seeing an account you *do* follow having exactly the kind of conversation you are avoiding experiencing directly.
A technical #ActivityPub question for a Sunday: is it possible/desirable to have every Actor on an instance share the same key pair?
I'm building something vaguely in the vein of FediMeteo, where all the accounts are automated and you'd generally follow one of those automated accounts to get the weather for your locality. Now, FediMeteo has a different key pair for each account, so the bot for Birmingham's weather has a different public key to Manchester.
But it's not a requirement that each account has a unique key, if the keys are only used for signature verification, right? Like, I don't think it'd be a security issue if "Weather for Birmingham" was signed with the key from "Weather for Manchester".
My question: is this another one of my Sunday Bad Ideas, and I should really have a key pair per account instead of trying to have the whole instance share?
A friend of mine is working on a cool project ofor his master thesis in digital humanities: a federated calendar software based on #activitypub The idea would be to have a system specifically to share and push events on the federated network! I love the idea, and I can definitely see it being a great way to organize both local and decentralized communities.
A friend of mine is working on a cool project ofor his master thesis in digital humanities: a federated calendar software based on #activitypub The idea would be to have a system specifically to share and push events on the federated network! I love the idea, and I can definitely see it being a great way to organize both local and decentralized communities.
Installed #yunohost yesterday on my Proxmox home server to fiddle around and was about to deploy #GoToSocial. But this "Danger" Box in the docs, saying the domain will be taken forever by this instance of GTS scares me. Or is this the case for every #ActivityPub Server anyway?
I thought, only the full handle like "@user@social.domain.net" can be problematic when being refused because of caching and generated keys. Any experience with that? https://docs.gotosocial.org/en/v0.22.0/getting_started/
Working on a brand new post for my series "a newbie's guide to self-hosting with #YunoHost" - showing people how to set up their own #GoToSocial microblogging instance.
Sorry it's been taking a while: I started over when I realized most people use subdomains... and I'm doing a thorough step-by-step explainer that any newbie could follow - I hope ๐
a screenshot of GoToSocial's installation page on YunoHost that reads: "GoToSocial
Current version: 0.22.0~ynh1
Potential alternative to: Akkoma, Bluesky, Calckey, Mastodon, Misskey, Pleroma, Threads, X
GoToSocial is a fast ActivityPub social network server, written in Golang.
With GoToSocial, you can keep in touch with your friends, post, read, and share images and articles. All without being tracked or advertised to!
The official documentation is at docs.gotosocial.org.
Admins are strongly encouraged to read the documentation of this package after installing it. It is available in the webadmin under Applications > gotosocial (at the bottom) or here on the package's repository!
Please note that this package uses the "i'm so tired" software license 1.0, please read it and accept it before proceeding with installation."
Summer is the worst season for animals. As the holidays get closer, shelters fill with pets left behind.
My cat and dog came from there. Haru (the cat) waited two years in a shelter, and our dog (Tanos) is one a relative could no longer keep. A black cat and a malinois, now sharing the same stairs.
It is not the perfect solution, but if you can help your local shelter, please do.
ALT text
Tanos, a tan Malinois, sits alert on a step while Haru, a small black cat, rests calmly on the step above, looking off to the side. Both are settled and at ease.
Installed #yunohost yesterday on my Proxmox home server to fiddle around and was about to deploy #GoToSocial. But this "Danger" Box in the docs, saying the domain will be taken forever by this instance of GTS scares me. Or is this the case for every #ActivityPub Server anyway?
I thought, only the full handle like "@user@social.domain.net" can be problematic when being refused because of caching and generated keys. Any experience with that? https://docs.gotosocial.org/en/v0.22.0/getting_started/
Working on a brand new post for my series "a newbie's guide to self-hosting with #YunoHost" - showing people how to set up their own #GoToSocial microblogging instance.
Sorry it's been taking a while: I started over when I realized most people use subdomains... and I'm doing a thorough step-by-step explainer that any newbie could follow - I hope ๐
a screenshot of GoToSocial's installation page on YunoHost that reads: "GoToSocial
Current version: 0.22.0~ynh1
Potential alternative to: Akkoma, Bluesky, Calckey, Mastodon, Misskey, Pleroma, Threads, X
GoToSocial is a fast ActivityPub social network server, written in Golang.
With GoToSocial, you can keep in touch with your friends, post, read, and share images and articles. All without being tracked or advertised to!
The official documentation is at docs.gotosocial.org.
Admins are strongly encouraged to read the documentation of this package after installing it. It is available in the webadmin under Applications > gotosocial (at the bottom) or here on the package's repository!
Please note that this package uses the "i'm so tired" software license 1.0, please read it and accept it before proceeding with installation."
Btw, I am keeping a list for myself on projects that enter the fediverse that use AI and/or are proprietary. I see these as risk factors to trigger unwanted corporate interest when they demonstrate there's open market space in the new niches they are exploring. And able to do that very quickly with LLM help, or more smartly (than the average FOSS project) with an enterpreneurial mindset.
And the weird thing is.. there is another Harmony project with a similar but different codebase and different website. And this one has #ActivityPub support. It is also AI-coded (project was at v1.2 when the repo was only 2 weeks old, with a huge codebase):
#TIL about #Harmony, a bleeding-edge project to build a decentralised replacement for Miscord using ActivityPub, E2EE using Vodozemac, a cryptography library used in Matrix software;
Summer is the worst season for animals. As the holidays get closer, shelters fill with pets left behind.
My cat and dog came from there. Haru (the cat) waited two years in a shelter, and our dog (Tanos) is one a relative could no longer keep. A black cat and a malinois, now sharing the same stairs.
It is not the perfect solution, but if you can help your local shelter, please do.
ALT text
Tanos, a tan Malinois, sits alert on a step while Haru, a small black cat, rests calmly on the step above, looking off to the side. Both are settled and at ease.
Summer is the worst season for animals. As the holidays get closer, shelters fill with pets left behind.
My cat and dog came from there. Haru (the cat) waited two years in a shelter, and our dog (Tanos) is one a relative could no longer keep. A black cat and a malinois, now sharing the same stairs.
It is not the perfect solution, but if you can help your local shelter, please do.
ALT text
Tanos, a tan Malinois, sits alert on a step while Haru, a small black cat, rests calmly on the step above, looking off to the side. Both are settled and at ease.
Big news for Org Social! ๐ The Relay now has bridges: you can follow Mastodon (ActivityPub) accounts and RSS/Atom feeds directly from any Org Social client.
A bridge is a virtual social.org feed generated by the Relay. Just add its URL to your follow list like any other feed:
While most of you know my main account for #Fedilab, months ago I wanted to work on something new. Being able to publish this code in production is an important step for me. Yes, it is possible to run an #ActivityPub server on your phone, with #E2EE DMs and a portable identity. And you are no longer tied to a single model like text, media or video. No need for separate apps: one account does it all, and you switch in one tap. Only your device owns the data, and the rules are on your side.
Today, I updated the documentation for installing a relay (Docker, manual, automatic script). Behind the scenes, I reproduced each installation to adapt and fix the doc. Yes, the official #HolosSocial relay is coming to production after a long 10 months of work. The #YunoHost package will come next. Around 800 users on a relay is a small number of GB, everything is optimised, and it can run on a small VPS. I am quite proud of this work. Thank you for making it possible with your support.
While most of you know my main account for #Fedilab, months ago I wanted to work on something new. Being able to publish this code in production is an important step for me. Yes, it is possible to run an #ActivityPub server on your phone, with #E2EE DMs and a portable identity. And you are no longer tied to a single model like text, media or video. No need for separate apps: one account does it all, and you switch in one tap. Only your device owns the data, and the rules are on your side.
Today, I updated the documentation for installing a relay (Docker, manual, automatic script). Behind the scenes, I reproduced each installation to adapt and fix the doc. Yes, the official #HolosSocial relay is coming to production after a long 10 months of work. The #YunoHost package will come next. Around 800 users on a relay is a small number of GB, everything is optimised, and it can run on a small VPS. I am quite proud of this work. Thank you for making it possible with your support.
Big news for Org Social! ๐ The Relay now has bridges: you can follow Mastodon (ActivityPub) accounts and RSS/Atom feeds directly from any Org Social client.
A bridge is a virtual social.org feed generated by the Relay. Just add its URL to your follow list like any other feed:
Check out https://rel.re#relre if you are looking for a strong #activitypub#relay , I'm constantly trying to improve it or find quirks of specific relaying implementations to support as many AP services as possible (that do relaying). tor onion relaying also possible. (oh now that i think about it, ill generate a tor onion link for relre)
Check out https://rel.re#relre if you are looking for a strong #activitypub#relay , I'm constantly trying to improve it or find quirks of specific relaying implementations to support as many AP services as possible (that do relaying). tor onion relaying also possible. (oh now that i think about it, ill generate a tor onion link for relre)
Check out https://rel.re#relre if you are looking for a strong #activitypub#relay , I'm constantly trying to improve it or find quirks of specific relaying implementations to support as many AP services as possible (that do relaying). tor onion relaying also possible. (oh now that i think about it, ill generate a tor onion link for relre)
I'm adding support for multiple public keys per actor in Smithereen for future-proofing purposes. Are there any signature algorithms other than RSA currently in use on the fediverse? ECDSA maybe?
I'm adding support for multiple public keys per actor in Smithereen for future-proofing purposes. Are there any signature algorithms other than RSA currently in use on the fediverse? ECDSA maybe?
(To avoid confusion, FitPub is a totally separate project to the Fediverse trail and journey tracker Wanderer, which you can find out more about at https://wanderer.to )
(To avoid confusion, FitPub is a totally separate project to the Fediverse trail and journey tracker Wanderer, which you can find out more about at https://wanderer.to )
(To avoid confusion, FitPub is a totally separate project to the Fediverse trail and journey tracker Wanderer, which you can find out more about at https://wanderer.to )
Related to the latter, I'd also like to give attention to the #ForgeFed ActivityPub protocol extension, which is really promising but needs an impetus from the community to bring the specifications to a higher level of maturity, and get good reference implementations to help open standard adoption:
Related to the latter, I'd also like to give attention to the #ForgeFed ActivityPub protocol extension, which is really promising but needs an impetus from the community to bring the specifications to a higher level of maturity, and get good reference implementations to help open standard adoption:
This release brings finer privacy controls, local visibility, commutes, a major federation rewrite, improved profiles, verified email changes, durable email delivery, and a much more capable admin area for users, federation queues, logs, diagnostics, and monitoring.
It also includes extensive reliability, security, performance, and UX improvements.
This release brings finer privacy controls, local visibility, commutes, a major federation rewrite, improved profiles, verified email changes, durable email delivery, and a much more capable admin area for users, federation queues, logs, diagnostics, and monitoring.
It also includes extensive reliability, security, performance, and UX improvements.
#Fediverse is a *social* network, right? About being different from corporate anti-social media. Has ambitions to be more diverse, inclusive, cohesive. To provide inter-community social networking where people with similar interests find each other and interact.
Like the #ActivityPub developer community, for instance. The group of people who make all this possible in the first place. Together they uphold the fediverse technology ecosystem and are collectively responsible for evolving it. They chose fediverse as their communication medium, dogfooding their creations, even though this comes with its disadvantages. #Microblogging is ephemeral and fleety and discussions are dispersed and fragmented. There are clear points of improvements for the #fedi, frequently discussed.
What's very odd is that most AP devs hardly:
1. Engage with other AP devs posts. 2. Boost each other's msgs for visibility. 3. Use hashtags for discoverability.
This week, we cover the writing layer of the fediverse: Ghost, WriteFreely, Micro.blog, Plume, WordPress, and Flipboard. Text was ActivityPub's first real workload, but these platforms didn't all arrive at federation the same way.
Ghost: a UK non-profit that funds Fedify (by @hongminhee) the framework its federation is built on. it's a publisher and a fediverse client at once, with an inbox as well as an outbox. Our newsletter is also powered by it, so @index is followable from any Mastodon app right now.
WriteFreely: one primary maintainer, Matt Baer (@matt), roughly 1,400 of 1,900+ commits, going since 2015. Funded by his own hosted product, Write.as.
Micro.blog: a Kickstarter By Manton Reese (@manton) that funded the platform before it had a single user. POSSE, native ActivityPub, and native Bluesky, no bridge.
Plume: a simple platform that also supported collaborative multi-author blogs. But no longer actively developed - it recommends WriteFreely and WordPress instead of itself.
WordPress: built-in ActivityPub (using plugin by Matthias Pfefferle - @pfefferle) plus a native AT Protocol plugin and real moderation tooling.
Flipboard: curating other people's writing rather than hosting its own.
An antique quill and inkwell against a vibrant multicolor cosmic backdrop, with constellation lines connecting points of light across a deep starfield. Magenta, cyan, violet, and amber tones.
#Fediverse is a *social* network, right? About being different from corporate anti-social media. Has ambitions to be more diverse, inclusive, cohesive. To provide inter-community social networking where people with similar interests find each other and interact.
Like the #ActivityPub developer community, for instance. The group of people who make all this possible in the first place. Together they uphold the fediverse technology ecosystem and are collectively responsible for evolving it. They chose fediverse as their communication medium, dogfooding their creations, even though this comes with its disadvantages. #Microblogging is ephemeral and fleety and discussions are dispersed and fragmented. There are clear points of improvements for the #fedi, frequently discussed.
What's very odd is that most AP devs hardly:
1. Engage with other AP devs posts. 2. Boost each other's msgs for visibility. 3. Use hashtags for discoverability.
I've added several features to my #ActivityPub C2S (Social API) Server testing tool. There's now an embedded automated test runner, the ability to create and post ActivityPub objects using schema-based forms or JSON templates, a server capability report, server capability JSON export (for custom reports), and an optional sidecar server for analyzing CORS issues.
I've added several features to my #ActivityPub C2S (Social API) Server testing tool. There's now an embedded automated test runner, the ability to create and post ActivityPub objects using schema-based forms or JSON templates, a server capability report, server capability JSON export (for custom reports), and an optional sidecar server for analyzing CORS issues.
#ActivityPub carries posts, follows, likes and so on, but not moderation. A ban stays trapped on the instance that issued it. So, for instance, an account banned for racism on one instance stays unknown to the next. Moderation is activity too, and it should travel like the rest: signed and verifiable. This is a real problem, and others have explored it already. I will look into what already exists and see what we could build on for #HolosSocial.
#Fediverse is a *social* network, right? About being different from corporate anti-social media. Has ambitions to be more diverse, inclusive, cohesive. To provide inter-community social networking where people with similar interests find each other and interact.
Like the #ActivityPub developer community, for instance. The group of people who make all this possible in the first place. Together they uphold the fediverse technology ecosystem and are collectively responsible for evolving it. They chose fediverse as their communication medium, dogfooding their creations, even though this comes with its disadvantages. #Microblogging is ephemeral and fleety and discussions are dispersed and fragmented. There are clear points of improvements for the #fedi, frequently discussed.
What's very odd is that most AP devs hardly:
1. Engage with other AP devs posts. 2. Boost each other's msgs for visibility. 3. Use hashtags for discoverability.
#ActivityPub carries posts, follows, likes and so on, but not moderation. A ban stays trapped on the instance that issued it. So, for instance, an account banned for racism on one instance stays unknown to the next. Moderation is activity too, and it should travel like the rest: signed and verifiable. This is a real problem, and others have explored it already. I will look into what already exists and see what we could build on for #HolosSocial.
Or help improve the #UX of E2EE enabled fedi apps. Or even just spread the word around by boosting the article around, and give impetus to #E2EE adoption.
#ActivityPub carries posts, follows, likes and so on, but not moderation. A ban stays trapped on the instance that issued it. So, for instance, an account banned for racism on one instance stays unknown to the next. Moderation is activity too, and it should travel like the rest: signed and verifiable. This is a real problem, and others have explored it already. I will look into what already exists and see what we could build on for #HolosSocial.
#ActivityPub carries posts, follows, likes and so on, but not moderation. A ban stays trapped on the instance that issued it. So, for instance, an account banned for racism on one instance stays unknown to the next. Moderation is activity too, and it should travel like the rest: signed and verifiable. This is a real problem, and others have explored it already. I will look into what already exists and see what we could build on for #HolosSocial.
#ActivityPub carries posts, follows, likes and so on, but not moderation. A ban stays trapped on the instance that issued it. So, for instance, an account banned for racism on one instance stays unknown to the next. Moderation is activity too, and it should travel like the rest: signed and verifiable. This is a real problem, and others have explored it already. I will look into what already exists and see what we could build on for #HolosSocial.
What the fresh heck is this... It bogged down my federated #ActivityPub#WordPress Mastodon app enabled website, #MastoAdmin. Now I am scouring my Mastodon instance's server logs for this twit.
The linked readme url https://blog.bmn.dev/fedi-research.txt says, "I currently work on an attempt to build a reasonable recommendation engine for mastodon. For this I set up a bot to listen to the major instances' public feeds. If it is causing you considerable annoyances, please contact me! You can find out more about me, including my contact information here: https://blog.bmn.dev/about
I currently work on an attempt to build a reasonable recommendation engine for mastodon.
For this I set up a bot to listen to the major instances' public feeds.
If it is causing you considerable annoyances, please contact me!
You can find out more about me, including my contact information here: https://blog.bmn.dev/about
Thank you for running a mastodon instance!
#fedi#askfedi Is the #ActivityPub protocol any closer to having data portability? And how about single ID usable in different apps? And how about E2EE?
#fedi#askfedi Is the #ActivityPub protocol any closer to having data portability? And how about single ID usable in different apps? And how about E2EE?
#fedi#askfedi Is the #ActivityPub protocol any closer to having data portability? And how about single ID usable in different apps? And how about E2EE?
A #Mastodon (and #activityPub ?) feature: if #alttext is missing, anyone can click it and suggest alt text (like a reply to alt text) and original poster can accept it (or not).
#HolosSocial relay is confirmed to be very stable. I will officially tag it soon so admins can run their own relay with a script to easily install it on their VPS. Using Holos with a custom domain and a cloud for media allows you to own your portable identity on the #Fediverse. Relays become only an infrastructure for it. Your device runs the #ActivityPub server and works as smoothly as any other app. Micro-blogging, media, and video, all from a single account. Switch with a simple tap.
#HolosSocial relay is confirmed to be very stable. I will officially tag it soon so admins can run their own relay with a script to easily install it on their VPS. Using Holos with a custom domain and a cloud for media allows you to own your portable identity on the #Fediverse. Relays become only an infrastructure for it. Your device runs the #ActivityPub server and works as smoothly as any other app. Micro-blogging, media, and video, all from a single account. Switch with a simple tap.
A #Mastodon (and #activityPub ?) feature: if #alttext is missing, anyone can click it and suggest alt text (like a reply to alt text) and original poster can accept it (or not).
Are there any #ActivityPub server implementations using the actor model of computation? I'm not asking about ones just implemented in an actor model-capable programming language (Elixir), but ones that are fully or mostly implemented using that model. TIA
Are there any #ActivityPub server implementations using the actor model of computation? I'm not asking about ones just implemented in an actor model-capable programming language (Elixir), but ones that are fully or mostly implemented using that model. TIA
Those who like me run Akkoma on home networks may have experienced timeouts when searching for posts by (Mastodon) URL.
Thatโs because searching #ActivityPub elements using non-canonical URLs involves a bit of back and forth over HTTP, and for some reason Akkoma had a hardcoded timeout of 5 seconds for it - which means that many if not all the searches by Mastodon post URL failed, and the search task also crashed.
This PR adds support for a configurable fetch timeout:
# Set it to e.g. 15 seconds to allow the HTTP task
# more time to fetch remote resources
config :pleroma, Pleroma.Search, fetch_timeout: 15_000
If you want to try it out already (together with other features, such as support for Mastodon the quotes protocol and indexable flag on accounts), you can build Akkoma from my fork.
The closing post in the "Fediverse Beyond Mastodon" maps forums, social reading, and music, the formats that don't fit the microblog.
The Threadiverse (Fediverse's answer to Reddit): Lemmy, Kbin/Mbin and PieFed (created by Rimu - @rimu).
Forums that predate federation: NodeBB (created by @julian) rewrote its core so every new forum federates by default. Discourse (@Discourse) ships it as an opt-in, per-category plugin. Both were built years ago to replace phpBB and vBulletin, and both now speak ActivityPub.
Social reading: BookWyrm (created by @tripofmice), a federated Goodreads where your shelves and reviews show up in a Mastodon timeline.
Music: Funkwhale (@funkwhale) - a self-hosted Grooveshark successor.
Bandwagon (created by @benpate) an online music storefront where musicians sell directly, built on the Emissary framework.
Four glowing neon shapes, a speech bubble, cube, ring, and diamond, linked by a flowing particle trail carrying emojis, musical notes and open books, against a dark background.
The closing post in the "Fediverse Beyond Mastodon" maps forums, social reading, and music, the formats that don't fit the microblog.
The Threadiverse (Fediverse's answer to Reddit): Lemmy, Kbin/Mbin and PieFed (created by Rimu - @rimu).
Forums that predate federation: NodeBB (created by @julian) rewrote its core so every new forum federates by default. Discourse (@Discourse) ships it as an opt-in, per-category plugin. Both were built years ago to replace phpBB and vBulletin, and both now speak ActivityPub.
Social reading: BookWyrm (created by @tripofmice), a federated Goodreads where your shelves and reviews show up in a Mastodon timeline.
Music: Funkwhale (@funkwhale) - a self-hosted Grooveshark successor.
Bandwagon (created by @benpate) an online music storefront where musicians sell directly, built on the Emissary framework.
Four glowing neon shapes, a speech bubble, cube, ring, and diamond, linked by a flowing particle trail carrying emojis, musical notes and open books, against a dark background.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
Those who like me run Akkoma on home networks may have experienced timeouts when searching for posts by (Mastodon) URL.
Thatโs because searching #ActivityPub elements using non-canonical URLs involves a bit of back and forth over HTTP, and for some reason Akkoma had a hardcoded timeout of 5 seconds for it - which means that many if not all the searches by Mastodon post URL failed, and the search task also crashed.
This PR adds support for a configurable fetch timeout:
# Set it to e.g. 15 seconds to allow the HTTP task
# more time to fetch remote resources
config :pleroma, Pleroma.Search, fetch_timeout: 15_000
If you want to try it out already (together with other features, such as support for Mastodon the quotes protocol and indexable flag on accounts), you can build Akkoma from my fork.
Those who like me run Akkoma on home networks may have experienced timeouts when searching for posts by (Mastodon) URL.
Thatโs because searching #ActivityPub elements using non-canonical URLs involves a bit of back and forth over HTTP, and for some reason Akkoma had a hardcoded timeout of 5 seconds for it - which means that many if not all the searches by Mastodon post URL failed, and the search task also crashed.
This PR adds support for a configurable fetch timeout:
# Set it to e.g. 15 seconds to allow the HTTP task
# more time to fetch remote resources
config :pleroma, Pleroma.Search, fetch_timeout: 15_000
If you want to try it out already (together with other features, such as support for Mastodon the quotes protocol and indexable flag on accounts), you can build Akkoma from my fork.
In case anyone was wondering, yes my project Wordforge is effectively abandoned. I graduated and got a job last year and haven't had the time to work on it. It's a shame really since I really wanted to see something like this on the fediverse, but such is life.
Flohmarkt is a free open platform for small ads and selling things ("Flohmarkt" is the German for flea market). It's part of the Fediverse so the small ads can federate to other servers, and people can interact with Flohmarkt from Mastodon etc accounts.
If you want to post or browse adverts there is a server list:
Flohmarkt is a free open platform for small ads and selling things ("Flohmarkt" is the German for flea market). It's part of the Fediverse so the small ads can federate to other servers, and people can interact with Flohmarkt from Mastodon etc accounts.
If you want to post or browse adverts there is a server list:
Yea, things are dispersed. The #fediverse org at #Codeberg is a place where a host of people (co)maintain various fedi-related projects, most notably the #ActivityPub#FEP process. I maintain the 3 fedi curated lists there for https://delightful.coding.social initiative.
Seeing how EU uses Absent==Yes as trick to pass #Chatcontrol 1.0 shows we need 100% tranparent and scanned communication of politicans working in the EU.
It took a while, but Shoot now has a role editor (among other guild settings)!
Roles and permissions have been implemented server-side nearly since the beginning but they haven't been available in the client until now.
The UI/UX here is very similar to how Discord's permissions used to work. Roles can be assigned to users and they are evaluated from bottom to top in the role list. Roles can deny or allow permissions, with lower roles in the list being overridden by higher roles. In the screenshots guild, the 'everyone' role allows 'Send Messages' permission, but the 'muted' role denies it. If someone has the 'muted' role, it will override the send messages permission from the 'everyone'/default role and prevent them from speaking.
It's still a bit rough of course, but I'm still having a good time working on the project.
You can try it out yourself/learn more at https://shoot.pub using the registration token `0K2A3` which expires in a week. That's just for anti-spam reasons, let me know if you want to register if it doesn't work :)
The role editor in Shoot. There are 3 roles shown, "moderator", "muted", and finally "everyone" which is selected. The editor shows the default permissions given to everyone which include: send messages, view channel, call channel, create invite, and upload permissions.
Implementing your own #Fediverse#ActivityPub server sounds like a good idea until you see the mush of half-implemented protocols that #Mastodon actually is. #ActivityStreams Link type? Profile? Tombstone? Whomst?
Why is there a webfinger endpoint? I don't want skeletal twinks fingering my web!?
And also an RSA key pair? Publicly being this embarrassing should be proof enough, nobody would dare pretend to be *this*!
Seeing how EU uses Absent==Yes as trick to pass #Chatcontrol 1.0 shows we need 100% tranparent and scanned communication of politicans working in the EU.
It took a while, but Shoot now has a role editor (among other guild settings)!
Roles and permissions have been implemented server-side nearly since the beginning but they haven't been available in the client until now.
The UI/UX here is very similar to how Discord's permissions used to work. Roles can be assigned to users and they are evaluated from bottom to top in the role list. Roles can deny or allow permissions, with lower roles in the list being overridden by higher roles. In the screenshots guild, the 'everyone' role allows 'Send Messages' permission, but the 'muted' role denies it. If someone has the 'muted' role, it will override the send messages permission from the 'everyone'/default role and prevent them from speaking.
It's still a bit rough of course, but I'm still having a good time working on the project.
You can try it out yourself/learn more at https://shoot.pub using the registration token `0K2A3` which expires in a week. That's just for anti-spam reasons, let me know if you want to register if it doesn't work :)
The role editor in Shoot. There are 3 roles shown, "moderator", "muted", and finally "everyone" which is selected. The editor shows the default permissions given to everyone which include: send messages, view channel, call channel, create invite, and upload permissions.
#HolosDiscover is a search engine dedicated to the #Fediverse. It does not scrape content, because it speaks #ActivityPub and respects each user's choice to opt in or out. The most respectful alternative, open to all and full of content to explore.
#HolosDiscover is a search engine dedicated to the #Fediverse. It does not scrape content, because it speaks #ActivityPub and respects each user's choice to opt in or out. The most respectful alternative, open to all and full of content to explore.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#HolosSocial relay is confirmed to be very stable. I will officially tag it soon so admins can run their own relay with a script to easily install it on their VPS. Using Holos with a custom domain and a cloud for media allows you to own your portable identity on the #Fediverse. Relays become only an infrastructure for it. Your device runs the #ActivityPub server and works as smoothly as any other app. Micro-blogging, media, and video, all from a single account. Switch with a simple tap.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#HolosSocial relay is confirmed to be very stable. I will officially tag it soon so admins can run their own relay with a script to easily install it on their VPS. Using Holos with a custom domain and a cloud for media allows you to own your portable identity on the #Fediverse. Relays become only an infrastructure for it. Your device runs the #ActivityPub server and works as smoothly as any other app. Micro-blogging, media, and video, all from a single account. Switch with a simple tap.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
I'm looking for your opinions from the developers of the fediverse.
A common HTML web page can contain related links via the <link> tag. I would like to do the same for Activity Streams objects, for example:
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://writings.hongminhee.org/ap/2024/12/a-year-with-the-fediverse.json",
"type": "Article",
"name": "A year with the fediverse",
"content": "2024 was truly a year where I was deeply immersed in the fediverse. โฆ",
"url": "https://writings.hongminhee.org/2024/12/a-year-with-the-fediverse/",
"attachment": [
{
"type": "Link",
"rel": "alternate",
"hreflang": "ko",
"href": "https://writings.hongminhee.org/2024/12/a-year-with-the-fediverse/index.ko-hang-kr.html",
"mediaType": "text/html"
},
{
"type": "Link",
"rel": "alternate",
"hreflang": "ja",
"href": "https://writings.hongminhee.org/2024/12/a-year-with-the-fediverse/index.ja.html",
"mediaType": "text/html"
}
]
}
Do you think this makes sense, and would it be appropriate to put Link objects in the attachment?
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.
mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.
Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.
If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.
I have heard people say "In #ActivityPub there's a timeline and a notification feed". No, there isn't. But perhaps in ones solution, there is. "There are Mentions and Hashtags". No, there aren't. Though there may be #SocialCG recommendations on how to deal with those (I have eternal trouble finding these documents quickly). "There are special hashtags to put in a summary field that machines understand". Nope!
There are #FEP documents. These are just guidance that allow people to align on common ways to achieve things, and are currently the best way to avoid an even larger sprawl of protocol decay. They are non-normative wrt to the AP protocol itself.
I think a large part of the quick rise in attractiveness, popularity and adoption of #ATProto stems from how it offered devs a clear and well-documented introduction and a path to doing solution development on top of a robust protocol, where a dev could say "this is my app, and this is protocol".
Snapshot from a fediverse bot profile reading: "If you DO NOT want a post boosted use #nobot in the post. Add #NoBots to your profile bio to stop all boosts for any tag.
I have heard people say "In #ActivityPub there's a timeline and a notification feed". No, there isn't. But perhaps in ones solution, there is. "There are Mentions and Hashtags". No, there aren't. Though there may be #SocialCG recommendations on how to deal with those (I have eternal trouble finding these documents quickly). "There are special hashtags to put in a summary field that machines understand". Nope!
There are #FEP documents. These are just guidance that allow people to align on common ways to achieve things, and are currently the best way to avoid an even larger sprawl of protocol decay. They are non-normative wrt to the AP protocol itself.
I think a large part of the quick rise in attractiveness, popularity and adoption of #ATProto stems from how it offered devs a clear and well-documented introduction and a path to doing solution development on top of a robust protocol, where a dev could say "this is my app, and this is protocol".
Snapshot from a fediverse bot profile reading: "If you DO NOT want a post boosted use #nobot in the post. Add #NoBots to your profile bio to stop all boosts for any tag.
ActivityPub at heart is a social graph of addressible actors that exchange activities with an object payload.
There are no "servers", "instances", "users". Neither is there "client", "app", "actor profile", and even not "identity" in #ActivityPub. That these words appear in the specification text, does not make them part of the protocol. Yes, all software runs on a computer system, yet "system" is not part of ActivityPub.
But you'd be forgiven the confusion, as over time app developers have liberally introduced abstractions that were subsequently seen by others as "the way to do it" and became de-facto standards. The name for that is Post-facto interoperability, "follow-the-leader", and it is the predominant way in which the fediverse has evolved unfortunately, without the specs catching up and incorporating the protocol decay this introduces. There were no good rules for protocol extension, and subsequent delineation of what is core protocol and what's an extension.
ActivityPub at heart is a social graph of addressible actors that exchange activities with an object payload.
There are no "servers", "instances", "users". Neither is there "client", "app", "actor profile", and even not "identity" in #ActivityPub. That these words appear in the specification text, does not make them part of the protocol. Yes, all software runs on a computer system, yet "system" is not part of ActivityPub.
But you'd be forgiven the confusion, as over time app developers have liberally introduced abstractions that were subsequently seen by others as "the way to do it" and became de-facto standards. The name for that is Post-facto interoperability, "follow-the-leader", and it is the predominant way in which the fediverse has evolved unfortunately, without the specs catching up and incorporating the protocol decay this introduces. There were no good rules for protocol extension, and subsequent delineation of what is core protocol and what's an extension.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
First, the actor cards on the followed/following pages show relevant actor status. On the followed page, it tells you how long it has been since that actor published an activity (create, announce, like, etc.) that was sent to your server. It's a proxy for how active they are (or are not). On the following page, it tells you how long it has been since you have been able to send to that server. It's a proxy for whether that server is reachable or that actor is still alive.
Second, the backend for user-defined algorithmic feeds is in place, along with a keyword/hashtag/mention feeds implementation. You can't set up a feed via the user-interface, but the feeds work if you set one up directly in the databaseโwhich is how I've been previewing them.. I plan to release the frontend next week.
Here's the full changelog:
Added
Display activity status on actor cards.
Back-end support for user-defined algorithmic feeds.
Apply community-relayed moderator deletes received as a Group's wrapped Announce.
Follow a web page's rel="alternate" link when searching.
Fixed
Avoid loading entire has_many collections when constructing child records.
Evaluate the same-origin fetch gate against an embedded node's own identifier.
Accept a delete of an uncached object or actor without verification.
Catch MIME::Multipart::Error in local file-upload handling.
Map malformed request-body parse failures to Bad Request.
First, the actor cards on the followed/following pages show relevant actor status. On the followed page, it tells you how long it has been since that actor published an activity (create, announce, like, etc.) that was sent to your server. It's a proxy for how active they are (or are not). On the following page, it tells you how long it has been since you have been able to send to that server. It's a proxy for whether that server is reachable or that actor is still alive.
Second, the backend for user-defined algorithmic feeds is in place, along with a keyword/hashtag/mention feeds implementation. You can't set up a feed via the user-interface, but the feeds work if you set one up directly in the databaseโwhich is how I've been previewing them.. I plan to release the frontend next week.
Here's the full changelog:
Added
Display activity status on actor cards.
Back-end support for user-defined algorithmic feeds.
Apply community-relayed moderator deletes received as a Group's wrapped Announce.
Follow a web page's rel="alternate" link when searching.
Fixed
Avoid loading entire has_many collections when constructing child records.
Evaluate the same-origin fetch gate against an embedded node's own identifier.
Accept a delete of an uncached object or actor without verification.
Catch MIME::Multipart::Error in local file-upload handling.
Map malformed request-body parse failures to Bad Request.
Let's talk for a moment about what an actual actor model could look like in a protocol _like_ #ActivityPub. I've done variations on this thought experiment before, but I find it useful to revisit.
alice@servera wants to send a message to bob@serverb. So Alice (A) accesses her profile and pulls a reference to an outbox actor (Ref{O}). She send the message (M) to this outbox:
A -M-> O
With me so far?
The Outbox actor does Somethingโข, it doesn't matter what, but the server that hosts the outbox actor now may do one of two things, depending on whether servera (Sa) already has a reference to an inbox actor (Ref{I}) for bob on serverb (Sb).
The first scenario is a derivation of the second, so let's go through the second.
For this scenario Sa reaches out to webfinger (or some other lookup mechanism, but let's use webfinger) and says to it "gimme the user profile for bob@serverb." Sb returns the user profile Profile{bob@serverb}.
Within Profile{bob@serverb} is a list of actor references with names. One of which is named inbox. So now Sa has Ref{I} and can execute:
Sa -M-> I
In a way, we could end here and be content.
We're not done.
This is basically identical to the current ActivityPub flow with a few notable exceptions:
1. Note that I am not talking about the _user_ as an _actor_. The user is a user. The actor is an actor. Profile{bob@serverb} is not an actor, it's a Profile of a User. 2. I formalized the addition of webfinger. I don't need to do this, and there are alternatives. 3. It could _very_ well be that the inbox reference you are handed is identical between multiple actors. 4. I am treating "The Inbox" as a singular thing, but it _doesn't have to be_. I could have a different reference for where to send Events or calendar entries, I could have a different reference for where to send direct messages versus general posts, etc. All of this could be laid out pretty easily in a single map. 5. Most critically: The "inbox" is not a dereferencable collection. It's an _actor reference_. What gets exposed to the user might be completely different than what gets sent there.
The details don't matter as much as this: the foundational unit by which we reason about the system is different.
Let's talk for a moment about what an actual actor model could look like in a protocol _like_ #ActivityPub. I've done variations on this thought experiment before, but I find it useful to revisit.
alice@servera wants to send a message to bob@serverb. So Alice (A) accesses her profile and pulls a reference to an outbox actor (Ref{O}). She send the message (M) to this outbox:
A -M-> O
With me so far?
The Outbox actor does Somethingโข, it doesn't matter what, but the server that hosts the outbox actor now may do one of two things, depending on whether servera (Sa) already has a reference to an inbox actor (Ref{I}) for bob on serverb (Sb).
The first scenario is a derivation of the second, so let's go through the second.
For this scenario Sa reaches out to webfinger (or some other lookup mechanism, but let's use webfinger) and says to it "gimme the user profile for bob@serverb." Sb returns the user profile Profile{bob@serverb}.
Within Profile{bob@serverb} is a list of actor references with names. One of which is named inbox. So now Sa has Ref{I} and can execute:
Sa -M-> I
In a way, we could end here and be content.
We're not done.
This is basically identical to the current ActivityPub flow with a few notable exceptions:
1. Note that I am not talking about the _user_ as an _actor_. The user is a user. The actor is an actor. Profile{bob@serverb} is not an actor, it's a Profile of a User. 2. I formalized the addition of webfinger. I don't need to do this, and there are alternatives. 3. It could _very_ well be that the inbox reference you are handed is identical between multiple actors. 4. I am treating "The Inbox" as a singular thing, but it _doesn't have to be_. I could have a different reference for where to send Events or calendar entries, I could have a different reference for where to send direct messages versus general posts, etc. All of this could be laid out pretty easily in a single map. 5. Most critically: The "inbox" is not a dereferencable collection. It's an _actor reference_. What gets exposed to the user might be completely different than what gets sent there.
The details don't matter as much as this: the foundational unit by which we reason about the system is different.
In a few days, the last brick of the relay server will be published for an official release and a tag. A lot of stress when you are alone, but after a few weeks the work has paid off, it is really stable. Running your own #ActivityPub server on your phone will be as simple as using any other app. You will not be limited to a lookalike: micro-blogging, media, videos, all you want in a simple tap.
In a few days, the last brick of the relay server will be published for an official release and a tag. A lot of stress when you are alone, but after a few weeks the work has paid off, it is really stable. Running your own #ActivityPub server on your phone will be as simple as using any other app. You will not be limited to a lookalike: micro-blogging, media, videos, all you want in a simple tap.
Today @koppershared a post on the fediverse titled how to not regret c2s, and I found it genuinely interesting to read, even if I'm not sure its proposed architecture actually solves what it sets out to solve.
The author's frustration with naรฏve #C2S implementations is well-founded. Slapping an #ActivityPub facade onto an existing Mastodon-like server and calling it C2S doesn't buy you muchโyou end up with the rigidity of a bespoke API without any of the interoperability C2S is supposed to offer. The โJSON-LD flavored Mastodon APIโ framing is apt.
The proposed solution is to split responsibility more aggressively: the C2S server should be nearly stateless and dumb, storing ActivityPub objects without interpreting them, while a separate โclientโ layer handles indexing, timelines, moderation, and exposes its own API to the frontend running on the user's device. It's a clean separation of concerns on paper.
But here's what bothers me. When you map this architecture onto familiar terms, it looks roughly like this:
C2S server โ a database (PostgreSQL, say)
โClientโ โ an application server (Mastodon, Misskey)
โFrontendโ โ the actual client app on your phone
That's not a new architecture. That's just the current architecture with the labels shifted. The interesting question is which interface gets standardized, and the author's answer is the one between the C2S server and the โclientโ layerโthe bottom boundary.
The problem is that what people actually want from C2S is to connect any frontend to any server. The portability they're after lives at the top boundary, between the frontend and whatever is behind it. But the author explicitly argues against standardizing that layer: โwe don't really need a standardized api,โ they write, leaving each client free to expose whatever API it likes.
Which means frontends remain locked to specific clients, just as Mastodon apps are locked to the Mastodon API today. The interoperability promise of C2Sโlog in to any server with any appโisn't actually delivered. It's been pushed one layer down, out of reach of the end user.
There's real value in the post's thinking about data hosting vs. interpretation, and about the security implications of servers that understand too much. But as an answer to the question C2S is supposed to answer, I'm not convinced.
my opinions about how activitypub c2s ought to be implemented, probably with way too much snark for anyone to take it seriously. wrote pretty much all of it at like 1 am so expect the writing to not be great. will prolly regret it tomorrow but eh. whatever
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
First, the actor cards on the followed/following pages show relevant actor status. On the followed page, it tells you how long it has been since that actor published an activity (create, announce, like, etc.) that was sent to your server. It's a proxy for how active they are (or are not). On the following page, it tells you how long it has been since you have been able to send to that server. It's a proxy for whether that server is reachable or that actor is still alive.
Second, the backend for user-defined algorithmic feeds is in place, along with a keyword/hashtag/mention feeds implementation. You can't set up a feed via the user-interface, but the feeds work if you set one up directly in the databaseโwhich is how I've been previewing them.. I plan to release the frontend next week.
Here's the full changelog:
Added
Display activity status on actor cards.
Back-end support for user-defined algorithmic feeds.
Apply community-relayed moderator deletes received as a Group's wrapped Announce.
Follow a web page's rel="alternate" link when searching.
Fixed
Avoid loading entire has_many collections when constructing child records.
Evaluate the same-origin fetch gate against an embedded node's own identifier.
Accept a delete of an uncached object or actor without verification.
Catch MIME::Multipart::Error in local file-upload handling.
Map malformed request-body parse failures to Bad Request.
First, the actor cards on the followed/following pages show relevant actor status. On the followed page, it tells you how long it has been since that actor published an activity (create, announce, like, etc.) that was sent to your server. It's a proxy for how active they are (or are not). On the following page, it tells you how long it has been since you have been able to send to that server. It's a proxy for whether that server is reachable or that actor is still alive.
Second, the backend for user-defined algorithmic feeds is in place, along with a keyword/hashtag/mention feeds implementation. You can't set up a feed via the user-interface, but the feeds work if you set one up directly in the databaseโwhich is how I've been previewing them.. I plan to release the frontend next week.
Here's the full changelog:
Added
Display activity status on actor cards.
Back-end support for user-defined algorithmic feeds.
Apply community-relayed moderator deletes received as a Group's wrapped Announce.
Follow a web page's rel="alternate" link when searching.
Fixed
Avoid loading entire has_many collections when constructing child records.
Evaluate the same-origin fetch gate against an embedded node's own identifier.
Accept a delete of an uncached object or actor without verification.
Catch MIME::Multipart::Error in local file-upload handling.
Map malformed request-body parse failures to Bad Request.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
This remains one of my least favorite features of #ActivityPub.
1. It violates fundamental type safety principles. 2. "without authentication" means that it needs to be accessible to random people on the internet if read literally, and evidently changing this (along with "we should all require transport layer security") are controversial opinions in fediverse development. 3. Literally everything about that Note makes me die inside. 4. Yet another example of how "there are no servers in ActivityPub" is undermined by the spec. Because this entire concept and its use cases assume a server. "There are no servers" has always been a fiction, but this illustrates the tension. 5. It is the kind of thing that could be better implemented by using actors, but the protocol is unwilling to take that route for how to implement features.
ALT text
5.6 Public Addressing
In addition to [ActivityStreams] collections and objects, Activities may additionally be addressed to the special "public" collection, with the identifier https://www.w3.org/ns/activitystreams#Public. For example:
EXAMPLE 10
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://www.w3.org/ns/activitystreams#Public",
"type": "Collection"
}
Activities addressed to this special URI shall be accessible to all users, without authentication. Implementations MUST NOT deliver to the "public" special collection; it is not capable of receiving actual activities. However, actors MAY have a sharedInbox endpoint which is available for efficient shared delivery of public posts (as well as posts to followers-only); see 7.1.3 Shared Inbox Delivery.
NOTE
Compacting an ActivityStreams object using the ActivityStreams JSON-LD context might result in https://www.w3.org/ns/activitystreams#Public being represented as simply Public or as:Public which are valid representations of the Public collection. Implementations which treat ActivityStreams objects as simply JSON rather than converting an incoming activity over to a local context using JSON-LD tooling should be aware of this and should be prepared to accept all three representations.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
This remains one of my least favorite features of #ActivityPub.
1. It violates fundamental type safety principles. 2. "without authentication" means that it needs to be accessible to random people on the internet if read literally, and evidently changing this (along with "we should all require transport layer security") are controversial opinions in fediverse development. 3. Literally everything about that Note makes me die inside. 4. Yet another example of how "there are no servers in ActivityPub" is undermined by the spec. Because this entire concept and its use cases assume a server. "There are no servers" has always been a fiction, but this illustrates the tension. 5. It is the kind of thing that could be better implemented by using actors, but the protocol is unwilling to take that route for how to implement features.
ALT text
5.6 Public Addressing
In addition to [ActivityStreams] collections and objects, Activities may additionally be addressed to the special "public" collection, with the identifier https://www.w3.org/ns/activitystreams#Public. For example:
EXAMPLE 10
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://www.w3.org/ns/activitystreams#Public",
"type": "Collection"
}
Activities addressed to this special URI shall be accessible to all users, without authentication. Implementations MUST NOT deliver to the "public" special collection; it is not capable of receiving actual activities. However, actors MAY have a sharedInbox endpoint which is available for efficient shared delivery of public posts (as well as posts to followers-only); see 7.1.3 Shared Inbox Delivery.
NOTE
Compacting an ActivityStreams object using the ActivityStreams JSON-LD context might result in https://www.w3.org/ns/activitystreams#Public being represented as simply Public or as:Public which are valid representations of the Public collection. Implementations which treat ActivityStreams objects as simply JSON rather than converting an incoming activity over to a local context using JSON-LD tooling should be aware of this and should be prepared to accept all three representations.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
Not sure if there's an existing framework that can be designed to work with #ActivityPub. But I do think that thinking about consent in a more general/generic sense would be a worthwhile effort. This should be something that is picked up at the #SocialCG level, or perhaps in #FEP documents first. A lot of the mechanisms that proliferate now are also app-centric and almost *assume* that #fediverse is a glorified #microblogging environment. The more that trend continues, the more that will indeed be the case. This is what my long blog post was about, that I wrote recently:
Absolute Madness how everyone thinks it is just okay to sprinkle magic opt-in / opt-out and other control words in the profile description of someone's #fediverse account!
Why do we have #ActivityPub be extensible if not for supporting a native mechanism to deal with consent? Why should there be out-of-bound ugliest of ugliest hacks?
With all that jazz being introduced it is no wonder people opt-in for #ATProto and other more sane social networking protocols that have robust protocol specifications, and not a metric ton of protocol decay to poop on top of your basic AP implementation so it becomes interoperable until the next on-the-fly hack by someone else breaks your nice code..
Fediverse is protocol impl + eternal whack-a-mole development and maintenance this way.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
Just opened an issue for a major new task for #Fedify: building an #interoperability smoke test suite.
To ensure Fedify-built servers federate correctly with the wider #fediverse, we're planning to run automated E2E tests in #CI against live instances of Mastodon, Misskey, and more. This is crucial for a framework's reliability.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
Goodmorning fedi, I just woke up in a windy tent in the middle of a field and sleepily scrolled thru all the opening talks at #DwebCamp to figure out what my first stop needs to be: def have to catch @cwebber, @dholms.at and @boris discuss the trade offs, design decisions and points of convergence between #ActivityPub and #ATProto
ALT text
Christine Lemmer Webber is lead author and co-editor of the W3C ActivityPub specification. Daniel Holmgren is Head of Protocol at Bluesky, working on the AT Protocol specification at the IETF. Join us for a discussion on decentralization trade-offs and other design decisions in the two protocols, and what that means for different architectures, structures, and even future points of convergence.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
Goodmorning fedi, I just woke up in a windy tent in the middle of a field and sleepily scrolled thru all the opening talks at #DwebCamp to figure out what my first stop needs to be: def have to catch @cwebber, @dholms.at and @boris discuss the trade offs, design decisions and points of convergence between #ActivityPub and #ATProto
ALT text
Christine Lemmer Webber is lead author and co-editor of the W3C ActivityPub specification. Daniel Holmgren is Head of Protocol at Bluesky, working on the AT Protocol specification at the IETF. Join us for a discussion on decentralization trade-offs and other design decisions in the two protocols, and what that means for different architectures, structures, and even future points of convergence.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.
AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.
I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.
Building this around ego-graphs (subgraphs of the real underlying social network, centred around one user) allows for a much simpler (and more decentralised) model than protocols like #ActivityPub, #Matrix etc, that need to reconcile multiple participants having equal rights on a discussion spaceโฆ
The trade-off, is that it does not scale very well: these ego-graphs must remain at a manageable size (~10-15k people).
Building this around ego-graphs (subgraphs of the real underlying social network, centred around one user) allows for a much simpler (and more decentralised) model than protocols like #ActivityPub, #Matrix etc, that need to reconcile multiple participants having equal rights on a discussion spaceโฆ
The trade-off, is that it does not scale very well: these ego-graphs must remain at a manageable size (~10-15k people).
Was ich vom Netzwerk vutuv.de halten soll und ob ich mich weiter damit beschรคftigen werde, weiร ich noch nicht. Vor 9 Jahren habe ich mir dort wohl mal einen Account angelegt und kรผrzlich kam eine E-Mail, dass man nun wieder aktiv am Netzwerk arbeite. Ok.
Womit ich nicht gerechnet hatte: Unter den Einstellungen findet sich ein Abschnitt โFediverseโ, in dem sich eine Verbindung hierher aktivieren lรคsst:
โMastodon und viele weitere Dienste bilden ein groรes, offenes Netzwerk: das Fediverse. Wenn Sie teilnehmen, kรถnnen Ihnen Menschen von dort folgen, und Ihre รถffentlichen vutuv-Beitrรคge erscheinen in deren Timelines, ganz ohne vutuv-Konto.โ
This week, we cover the writing layer of the fediverse: Ghost, WriteFreely, Micro.blog, Plume, WordPress, and Flipboard. Text was ActivityPub's first real workload, but these platforms didn't all arrive at federation the same way.
Ghost: a UK non-profit that funds Fedify (by @hongminhee) the framework its federation is built on. it's a publisher and a fediverse client at once, with an inbox as well as an outbox. Our newsletter is also powered by it, so @index is followable from any Mastodon app right now.
WriteFreely: one primary maintainer, Matt Baer (@matt), roughly 1,400 of 1,900+ commits, going since 2015. Funded by his own hosted product, Write.as.
Micro.blog: a Kickstarter By Manton Reese (@manton) that funded the platform before it had a single user. POSSE, native ActivityPub, and native Bluesky, no bridge.
Plume: a simple platform that also supported collaborative multi-author blogs. But no longer actively developed - it recommends WriteFreely and WordPress instead of itself.
WordPress: built-in ActivityPub (using plugin by Matthias Pfefferle - @pfefferle) plus a native AT Protocol plugin and real moderation tooling.
Flipboard: curating other people's writing rather than hosting its own.
An antique quill and inkwell against a vibrant multicolor cosmic backdrop, with constellation lines connecting points of light across a deep starfield. Magenta, cyan, violet, and amber tones.
Mapped the writing layer of the fediverse: Ghost, WriteFreely, Micro.blog, Plume, WordPress, and Flipboard.
Text was ActivityPub's first real workload, but these platforms didn't all arrive at federation the same way. Some built it in, some bolted it on while others bridged it through.
Part 3 of the mini-series: Fediverse Beyond Mastodon.
An antique book, quill and inkwell against a vibrant multicolor cosmic backdrop, with constellation lines connecting points of light across a deep starfield. Magenta, cyan, violet, and amber tones.
What's the scene with #activitypub / #fediverse development? Why do I keep hearing that developing software for fedi or ap is a major pain in the butt?
This week, we cover the writing layer of the fediverse: Ghost, WriteFreely, Micro.blog, Plume, WordPress, and Flipboard. Text was ActivityPub's first real workload, but these platforms didn't all arrive at federation the same way.
Ghost: a UK non-profit that funds Fedify (by @hongminhee) the framework its federation is built on. it's a publisher and a fediverse client at once, with an inbox as well as an outbox. Our newsletter is also powered by it, so @index is followable from any Mastodon app right now.
WriteFreely: one primary maintainer, Matt Baer (@matt), roughly 1,400 of 1,900+ commits, going since 2015. Funded by his own hosted product, Write.as.
Micro.blog: a Kickstarter By Manton Reese (@manton) that funded the platform before it had a single user. POSSE, native ActivityPub, and native Bluesky, no bridge.
Plume: a simple platform that also supported collaborative multi-author blogs. But no longer actively developed - it recommends WriteFreely and WordPress instead of itself.
WordPress: built-in ActivityPub (using plugin by Matthias Pfefferle - @pfefferle) plus a native AT Protocol plugin and real moderation tooling.
Flipboard: curating other people's writing rather than hosting its own.
An antique quill and inkwell against a vibrant multicolor cosmic backdrop, with constellation lines connecting points of light across a deep starfield. Magenta, cyan, violet, and amber tones.
Mapped the writing layer of the fediverse: Ghost, WriteFreely, Micro.blog, Plume, WordPress, and Flipboard.
Text was ActivityPub's first real workload, but these platforms didn't all arrive at federation the same way. Some built it in, some bolted it on while others bridged it through.
Part 3 of the mini-series: Fediverse Beyond Mastodon.
An antique book, quill and inkwell against a vibrant multicolor cosmic backdrop, with constellation lines connecting points of light across a deep starfield. Magenta, cyan, violet, and amber tones.
This week, we cover the writing layer of the fediverse: Ghost, WriteFreely, Micro.blog, Plume, WordPress, and Flipboard. Text was ActivityPub's first real workload, but these platforms didn't all arrive at federation the same way.
Ghost: a UK non-profit that funds Fedify (by @hongminhee) the framework its federation is built on. it's a publisher and a fediverse client at once, with an inbox as well as an outbox. Our newsletter is also powered by it, so @index is followable from any Mastodon app right now.
WriteFreely: one primary maintainer, Matt Baer (@matt), roughly 1,400 of 1,900+ commits, going since 2015. Funded by his own hosted product, Write.as.
Micro.blog: a Kickstarter By Manton Reese (@manton) that funded the platform before it had a single user. POSSE, native ActivityPub, and native Bluesky, no bridge.
Plume: a simple platform that also supported collaborative multi-author blogs. But no longer actively developed - it recommends WriteFreely and WordPress instead of itself.
WordPress: built-in ActivityPub (using plugin by Matthias Pfefferle - @pfefferle) plus a native AT Protocol plugin and real moderation tooling.
Flipboard: curating other people's writing rather than hosting its own.
An antique quill and inkwell against a vibrant multicolor cosmic backdrop, with constellation lines connecting points of light across a deep starfield. Magenta, cyan, violet, and amber tones.
This week, we cover the writing layer of the fediverse: Ghost, WriteFreely, Micro.blog, Plume, WordPress, and Flipboard. Text was ActivityPub's first real workload, but these platforms didn't all arrive at federation the same way.
Ghost: a UK non-profit that funds Fedify (by @hongminhee) the framework its federation is built on. it's a publisher and a fediverse client at once, with an inbox as well as an outbox. Our newsletter is also powered by it, so @index is followable from any Mastodon app right now.
WriteFreely: one primary maintainer, Matt Baer (@matt), roughly 1,400 of 1,900+ commits, going since 2015. Funded by his own hosted product, Write.as.
Micro.blog: a Kickstarter By Manton Reese (@manton) that funded the platform before it had a single user. POSSE, native ActivityPub, and native Bluesky, no bridge.
Plume: a simple platform that also supported collaborative multi-author blogs. But no longer actively developed - it recommends WriteFreely and WordPress instead of itself.
WordPress: built-in ActivityPub (using plugin by Matthias Pfefferle - @pfefferle) plus a native AT Protocol plugin and real moderation tooling.
Flipboard: curating other people's writing rather than hosting its own.
An antique quill and inkwell against a vibrant multicolor cosmic backdrop, with constellation lines connecting points of light across a deep starfield. Magenta, cyan, violet, and amber tones.
I just discovered the Fediverse (English) Wikipedia page has a huge section on AT Protocol and I question why. It seems like excessive promotion of Bluesky and its protocol that is not compatible with ActivityPub, both technically and in spirit. Illustrating bridging isn't the same as compatibility. Might as well add sections for other random network protocols like XMPP (Jabber).
I just discovered the Fediverse (English) Wikipedia page has a huge section on AT Protocol and I question why. It seems like excessive promotion of Bluesky and its protocol that is not compatible with ActivityPub, both technically and in spirit. Illustrating bridging isn't the same as compatibility. Might as well add sections for other random network protocols like XMPP (Jabber).
I just discovered the Fediverse (English) Wikipedia page has a huge section on AT Protocol and I question why. It seems like excessive promotion of Bluesky and its protocol that is not compatible with ActivityPub, both technically and in spirit. Illustrating bridging isn't the same as compatibility. Might as well add sections for other random network protocols like XMPP (Jabber).
This week, we cover the writing layer of the fediverse: Ghost, WriteFreely, Micro.blog, Plume, WordPress, and Flipboard. Text was ActivityPub's first real workload, but these platforms didn't all arrive at federation the same way.
Ghost: a UK non-profit that funds Fedify (by @hongminhee) the framework its federation is built on. it's a publisher and a fediverse client at once, with an inbox as well as an outbox. Our newsletter is also powered by it, so @index is followable from any Mastodon app right now.
WriteFreely: one primary maintainer, Matt Baer (@matt), roughly 1,400 of 1,900+ commits, going since 2015. Funded by his own hosted product, Write.as.
Micro.blog: a Kickstarter By Manton Reese (@manton) that funded the platform before it had a single user. POSSE, native ActivityPub, and native Bluesky, no bridge.
Plume: a simple platform that also supported collaborative multi-author blogs. But no longer actively developed - it recommends WriteFreely and WordPress instead of itself.
WordPress: built-in ActivityPub (using plugin by Matthias Pfefferle - @pfefferle) plus a native AT Protocol plugin and real moderation tooling.
Flipboard: curating other people's writing rather than hosting its own.
An antique quill and inkwell against a vibrant multicolor cosmic backdrop, with constellation lines connecting points of light across a deep starfield. Magenta, cyan, violet, and amber tones.
I just discovered the Fediverse (English) Wikipedia page has a huge section on AT Protocol and I question why. It seems like excessive promotion of Bluesky and its protocol that is not compatible with ActivityPub, both technically and in spirit. Illustrating bridging isn't the same as compatibility. Might as well add sections for other random network protocols like XMPP (Jabber).
First you need to understand: that concept does not exist in ActivityPub. Tags are not mentioned directly in the spec other than to say that the `tag` field is owned by the server and that the server shouldn't use it to modify the addressing fields. There's also a suggestion on how to read it that is vague on the details.
So we go instead to the Activity Vocabulary document to understand it. This contains a non-normative section on microsyntax with a vague suggestion on how to parse the objects and populate the `tag` property.
We see there that a tag can beโฆย any type of object. Or a list of objects! Or a list of Links! which are theoretically disjoint with objects but only when it is convenient to the spec. Their example uses a tag to refer to a Person object.
But wait there's more.
Mastodon comes along and builds their own specialized interpretation: https://docs.joinmastodon.org/spec/activitypub/#Hashtag It sort of kind of follows the example from the nonnormative section of the Activity Vocabulary document, but the idea of a "Hashtag" object itself is completely foreign.
This has rules about normalizationโnot present anywhere else in the spec in any form, but perfectly reasonable on their face.
It then includes a nonconformant link to the AS document in the context, which is basically just likeโฆย pretending to be included.
First you need to understand: that concept does not exist in ActivityPub. Tags are not mentioned directly in the spec other than to say that the `tag` field is owned by the server and that the server shouldn't use it to modify the addressing fields. There's also a suggestion on how to read it that is vague on the details.
So we go instead to the Activity Vocabulary document to understand it. This contains a non-normative section on microsyntax with a vague suggestion on how to parse the objects and populate the `tag` property.
We see there that a tag can beโฆย any type of object. Or a list of objects! Or a list of Links! which are theoretically disjoint with objects but only when it is convenient to the spec. Their example uses a tag to refer to a Person object.
But wait there's more.
Mastodon comes along and builds their own specialized interpretation: https://docs.joinmastodon.org/spec/activitypub/#Hashtag It sort of kind of follows the example from the nonnormative section of the Activity Vocabulary document, but the idea of a "Hashtag" object itself is completely foreign.
This has rules about normalizationโnot present anywhere else in the spec in any form, but perfectly reasonable on their face.
It then includes a nonconformant link to the AS document in the context, which is basically just likeโฆย pretending to be included.
If I compare #ActivityPub#fediverse of today with that of a couple of years ago (as my acount perceives it), these are some of my observations:
- Being on a well-moderated instance I see a quieter, calmer fediverse.
- Less drama, performative activism, and purity spiral anti-patterns reach my timeline.
- People are genuine in their posts, yet doom & gloom dominate the feed.
- There are less posts than there used to be.
- In terms of interactions / engagement fediverse feels like a ghost town.
- But there are plenty nice discussions to participate in.
- People boost less, yet that is how we can grow and foster healthy culture at the same time.
- Posts with high engagement depend on weird virality dynamics, or relate to recognized influencers.
- In that sense this microblog space isn't much different than other platforms.
My #SocialExperience on this account is shaped by my history of years-long fedi / AP / FOSS advocacy, that made me choose whom to follow and who followed me.
I wrote a short article describing the architecture of #Vernissage and the role of each service behind the platform. Maybe it will be useful for other developers interested in #Vernissage architecture. ๐
I wrote a short article describing the architecture of #Vernissage and the role of each service behind the platform. Maybe it will be useful for other developers interested in #Vernissage architecture. ๐
i'm sure inline json-ld contexts with server extensions seem like the wrong thing, but they're preferable to identical copies of the same context hosted externally and served by a dozen or more instances of a server or family of servers.
i could be persuaded to change my mind if a server allowed meaningful customization. but if a server is publishing a canonical vocabulary of extensions for that server, it should be hosted in a single, well-know location.
i'm sure inline json-ld contexts with server extensions seem like the wrong thing, but they're preferable to identical copies of the same context hosted externally and served by a dozen or more instances of a server or family of servers.
i could be persuaded to change my mind if a server allowed meaningful customization. but if a server is publishing a canonical vocabulary of extensions for that server, it should be hosted in a single, well-know location.
Hopefully when it comes to the EU the new strategy of @EUCommission around Digital Autonomy that has a big #FOSS component to it, will make our commons more sustainable.
The #ActivityPub conference held in 2020 was made possible indirectly with their long-term support for the #fediverse via the @NGIZero funding programs. And also the later held 3-day workshop "ActivityPub for Administrations" that was graciously facillitated by Joost of @nlnet is hosted on a #Peertube instance facilitated by Petites Singularitรฉs.
Hopefully when it comes to the EU the new strategy of @EUCommission around Digital Autonomy that has a big #FOSS component to it, will make our commons more sustainable.
The #ActivityPub conference held in 2020 was made possible indirectly with their long-term support for the #fediverse via the @NGIZero funding programs. And also the later held 3-day workshop "ActivityPub for Administrations" that was graciously facillitated by Joost of @nlnet is hosted on a #Peertube instance facilitated by Petites Singularitรฉs.
Great post, I suggest to anyone interested in the ActivityPub spec and technical architecture to read it. I had no idea the tool echosystem had this many problems, and Fedify handles a lot of them for you! #activitypub https://hackers.pub/@fedify/2026/why-activitypub-is-hard
@res260@fedify I'd agree. We have a lot more flexibility in #activitypub than is clear in the text, so a lot of developers expect very specific formats for data. ActivityPub 1.1 will be clearer, with more examples, so that developers can deal with the full variety.
@res260@fedify I'd agree. We have a lot more flexibility in #activitypub than is clear in the text, so a lot of developers expect very specific formats for data. ActivityPub 1.1 will be clearer, with more examples, so that developers can deal with the full variety.
Great post, I suggest to anyone interested in the ActivityPub spec and technical architecture to read it. I had no idea the tool echosystem had this many problems, and Fedify handles a lot of them for you! #activitypub https://hackers.pub/@fedify/2026/why-activitypub-is-hard
Great post, I suggest to anyone interested in the ActivityPub spec and technical architecture to read it. I had no idea the tool echosystem had this many problems, and Fedify handles a lot of them for you! #activitypub
I think perhaps I know the article you want to refer to, and I'm able to quote it. But this makes me wonder about the quote post functionality in general. If you don't get the approval, then your post is meaningless to others, as there is no context.
Before quote posting existed you could share a link to someone's public toot, and clicking it would open it in a new browser tab. Perhaps the consent mechanism is okay as-is, dunno, but it is a bit weird that you can freely share an URL to someone's public blog post, but not to someone's public fediverse post because it is seen by default as an attempt to inline the post with yours.
Picture the moment your server sends its first Follow activity to Mastodon. You read the spec, built the JSON, signed the HTTP request, and POSTed it with care. What comes back is a single line: 401 Unauthorized. No body. No explanation.
What went wrong? Maybe the clock behind your Date header drifted a few minutes. Maybe the hash in your Digest header is off. Maybe you uppercased the (request-target) pseudo-header while building the signing string, or published your public key as PEM where the other side wanted multibase. The remote server won't tell you. So you start reading someone else's server code to debug your own.
I know, because I've been there. Fedify began as a casualty of another project. I set out to build a single-user microblogging server, the one that would later become Hollo, and started implementing ActivityPub from scratch. Somewhere between the signature specs and the JSON-LD, the protocol work swallowed the product, and I put the whole thing down. What I picked back up wasn't the app. It was the framework the app should have had. Fedify shipped first; only then could Hollo exist, built on top of it. (I've told this story at more length in A year with the fediverse.)
ActivityPub development gets hard in a few very specific places. In this post I want to walk through five of them, then show what each one looks like with Fedify. If you've spent time in the fediverse, you'll probably nod along. If you haven't, you may wonder why anyone would do all of this by hand. Either way, the conclusion is the same: nobody has to anymore.
Five scenes
Scene 1: there is more than one standard
ActivityPub servers authenticate each other with HTTP signatures. Except there isn't one signature spec. Most of the fediverse runs on draft-cavage-http-signatures-12, an expired draft that never became a standard. The actual standard exists too: RFC 9421, HTTP Message Signatures. The problem is that you can't know which one a given server accepts until you try.
A real-world implementation therefore has to sign with one spec, see whether it gets rejected, re-sign with the other, and remember per server which one worked so it can skip the dance next time. The fediverse calls this double-knocking. Yes, you get to implement it yourself.
That's still not the end. HTTP signatures only prove who sent a request. For situations like inbox forwarding, where you relay an activity you received to a third party, you need signatures that live on the document itself: Linked Data Signatures and Object Integrity Proofs. Four signature mechanisms in total, and two kinds of keys to manage: RSA and Ed25519.
Scene 2: one document, many shapes
ActivityPub's wire format is JSON-LD, and in JSON-LD the same document can take many shapes. This is easier to show than to explain. Here is a Create activity one server might send:
actor turned from a URI string into an inline object. to turned from a string into an array. object went the other way, from an inline object to a URI. Even the address that means โpublicโ has three valid spellings: https://www.w3.org/ns/activitystreams#Public, as:Public, and plain Public. Your parser has to accept every combination, and which one arrives depends on the sender's implementation.
The spec-compliant answer is to normalize every document with a JSON-LD processor, expansion followed by compaction. In practice many implementations treat it all as โjust JSONโ and quietly break on whatever shape some server happens to emit. Either way, you end up with defensive code smeared across the whole codebase: is this a string? An array? An object? A URI I have to fetch?
Scene 3: the zombie post
A user publishes a post, spots a typo, and deletes it right away. Your server sends a Create, then a Delete. Thanks to network weather, some receiving server gets the Delete first and the Create second. It ignores the deletion of a post that doesn't exist yet, then dutifully processes the creation of a post that was already deleted. That post now lives on that server forever, while its author believes it's gone.
Then there's scale. With five thousand followers, one post means thousands of HTTP deliveries. Do that inline in the request handler and your publish button takes half a minute to respond, or the server falls over. Fine, use a queue. Deliveries fail, so retry them. On what schedule? Exponential backoff. How many times? And is a 500 Internal Server Error the same kind of failure as a 410 Gone? When do you clean up three thousand followers on a server that no longer exists? Should you keep hammering a host that has been down for days?
At some point it dawns on you that this is no longer protocol implementation. It's distributed systems engineering.
Scene 4: it's not a spec, it's an ecosystem
Even perfect spec compliance doesn't buy you interoperability. A few examples from the field:
Mastodon's secure mode requires HTTP signatures on GET requests too (so-called authorized fetch). Now suppose both servers run in that mode. To fetch the other side's public key you must sign your request; to verify your signature, the other side must first fetch your key. Deadlock. The community's workaround is to sign with an โinstance actorโ that represents the server itself. You won't find that in the spec.
Threads can't parse activities whose actor is embedded as an inline object. When sending to Threads, the actor has to be a URI.
Lemmy silently rejects Group actors that lack fields Mastodon never asks for, such as a moderators collection linked via attributedTo and a featured collection.
Misskey carries vocabulary extensions of its own; quote posts alone go by three different property names across implementations.
The list keeps growing. Interoperability here is not something you finish once and stop thinking about. It's maintenance, forever.
Scene 5: insecure by default
Build it from scratch, and you start out wide open. Skip signature verification on incoming activities and anyone can inject a forged Follow or Delete. Leave the document loader unrestricted and a malicious activity can point it at http://169.254.169.254/ or your internal network, turning your server into an SSRF proxy. Skip origin checks on embedded objects and any server can hand out a document claiming โhere's what the Mastodon lead developer said.โ
What these traps share is that nothing happens when you fall into them. Everything appears to work. Until someone exploits it.
Ghost ran into this too
If you're thinking โsurely our team would manage,โ consider Ghost: a leading open-source publishing platform used by thousands of journalists and creators, and a team that set out to build its own ActivityPub support.
We can definitely attest to the problems that Fedify is working hard to solve, because even in just a few weeks of early prototyping we were running into the issues described above right away.
Ghost ended up building its ActivityPub layer on Fedify.
So I put all of it in a framework
Fedify is a TypeScript library for building federated server apps on ActivityPub and the standards around it. It runs on Deno, Node.js, and Bun, and supports edge runtimes like Cloudflare Workers. The design goal hasn't changed since the beginning: keep everything in those five scenes out of application code.
Here are the same five scenes again, this time with Fedify.
Scene 1, revisited: the signature war is the framework's job
Here is everything it takes to put one actor on the fediverse:
import { createFederation, generateCryptoKeyPair, MemoryKvStore } from "@fedify/fedify";import { Endpoints, Person } from "@fedify/vocab";const federation = createFederation<void>({ kv: new MemoryKvStore(), // Swap for Redis, PostgreSQL, etc. in production});federation .setActorDispatcher("/users/{identifier}", async (ctx, identifier) => { if (identifier !== "alice") return null; const keyPairs = await ctx.getActorKeyPairs(identifier); return new Person({ id: ctx.getActorUri(identifier), preferredUsername: identifier, name: "Alice", inbox: ctx.getInboxUri(identifier), endpoints: new Endpoints({ sharedInbox: ctx.getInboxUri() }), publicKey: keyPairs[0].cryptographicKey, assertionMethods: keyPairs.map((keyPair) => keyPair.multikey), }); }) .setKeyPairsDispatcher(async (ctx, identifier) => { // In real code you'd persist these in a database; this shows the gist return [await generateCryptoKeyPair()]; });
The moment this code runs:
Every outgoing request gets signed. With an RSA key, Fedify emits HTTP Signatures and Linked Data Signatures; add an Ed25519 key and it attaches Object Integrity Proofs as well. All four mechanisms coexist on a single activity, and each receiver verifies with the strongest one it understands.
Fedify does the double-knocking for you: first contact goes out as RFC 9421, a rejection triggers a draft-cavage retry, and the winning spec is cached per server. If the rejection carries an Accept-Signature challenge (RFC 9421 ยง5), Fedify reads it and re-signs with exactly the components the server asked for.
One bonus. Because you registered an actor dispatcher, you now have a WebFinger (RFC 7033) server, for free. Type @alice@example.com into Mastodon's search box and your actor comes up. You never wrote a line of WebFinger code.
Scene 2, revisited: types instead of JSON-LD
Fedify ships about eighty classes covering the whole Activity Vocabulary plus the major vendor extensions. The classes are typed and immutable, and their accessors absorb the shape differences that JSON-LD allows.
const actor = await ctx.lookupObject("@hongminhee@hollo.social");if (actor instanceof Person) { console.log(actor.name); // Safe whether it's a string or langString const followers = await actor.getFollowers(); // Fetches a URI, unwraps an object}
lookupObject() takes a handle and runs the whole chain for you, WebFinger discovery included. Accessors like getFollowers()behave the same way whether the value is a URI reference or an inline object, and fetched values are cached.
Vendor fragmentation gets stitched up here too. The three competing quote properties (quoteUri, _misskey_quote, quoteUrl) are unified behind one API, next to the emerging FEP-044fquote. Misskey's isCat property exists as a type, so your server can determine cat-ness with full type safety. It sounds like a joke, but a few dozen details of exactly this kind are what interoperability is actually made of.
Scene 3, revisited: the zombie post dies in one line
Delivery infrastructure first. Plug a message queue into createFederation() and delivery moves to the background, with automatic retries under exponential backoff (up to ten attempts by default). When a post goes to thousands of followers, two-stage fan-out kicks in: a single consolidated message enters the queue, and a background worker splits it into per-server delivery tasks. The publish button responds immediately.
Retries create a problem of their own: the same activity can arrive twice. Fedify keeps a 24-hour idempotence cache of processed activities, so duplicates get detected and skipped before they reach your handlers.
As for the zombie post, the fix is one option:
await ctx.sendActivity( { identifier: "alice" }, "followers", // Collects recipients from your followers collection deleteActivity, { orderingKey: post.id }, // Same key = in-order delivery per server);
Activities that share an orderingKey are delivered to each receiving server in the order they were sent. A Delete can no longer overtake its Create. Activities with different keys still go out in parallel, so throughput survives.
Fedify also handles dead servers. On a 404 Not Found or 410 Gone, it stops retrying and calls a handler you register. If the delivery went to a shared inbox, you also get the list of followers behind it, so you can prune vanished accounts on the spot. Hosts that fail repeatedly trip a per-host circuit breaker that holds deliveries and probes periodically until the host recovers. It's on by default; there's nothing to configure.
Scene 4, revisited: we track the quirks so you don't
Here is how Fedify disarms the traps from scene 4:
Authorized fetch: chain .authorize() onto a dispatcher and the verified identity of the requester lands in your callback. Blocklists, private collections, whatever your app needs is plain application logic. The instance-actor deadlock has a supported pattern as well.
Threads and inline actors: an activity transformer, enabled by default, rewrites inline actors into URIs on the way out. You don't need to know Threads has this problem.
Lemmy's requirements: the custom collection API exposes a moderators collection in a few lines, and Lemmy's JSON-LD context ships preloaded.
When a new quirk surfaces in the wild, the fix lands in Fedify, not in every application separately. Each interoperability lesson gets learned once.
Scene 5, revisited: becoming unsafe takes effort
Fedify's defaults point the other way.
Signature verification is something you turn off (for tests), not something you remember to turn on.
The document loader refuses private address ranges and loopback out of the box, with DNS rebinding accounted for. To open yourself up to SSRF you have to flip an option whose very name announces it's for testing.
In a from-scratch implementation, you have to keep remembering to do things safely. In Fedify, the unsafe path is the one that takes deliberate effort. For a federated server, with its tangle of trust boundaries, that's the right way around.
Your stack stays your stack
โFine, but what if it doesn't fit our stack?โ Fedify was built to fit the stack you already have. There are thirteen web framework integrations: servers like Express, Hono, Fastify, Koa, NestJS, and Elysia, and meta-frameworks like Next.js, Nuxt, SvelteKit, Astro, SolidStart, and Fresh. Middleware handles content negotiation, so the same URL in your existing app serves HTML to browsers and JSON-LD to the fediverse.
Fedify doesn't dictate your database either. For its own storage it asks for one keyโvalue interface, with seven adapters available (Redis, PostgreSQL, MySQL/MariaDB, SQLite, Deno KV, Cloudflare Workers KV, in-memory). Message queues come in eight flavors (PostgreSQL, Redis, AMQP/RabbitMQ, and so on), and you can implement the interface yourself if none fits. Your domain data stays in whatever database and ORM you already use.
Already running federation on another library? There are migration guides with data migration scripts for moving from activitypub-express and friends without losing your existing followers.
The core isn't the ceiling, either. Higher-level packages build on it: @fedify/relay gives you a complete ActivityPub relay server in a single function call, and @fedify/backfill reconstructs incomplete conversation threads by walking the rest of the fediverse for you.
Tools for the whole development loop
A quieter misery of federated development has always been the missing tooling. Fedify comes with tools for every stage of the loop.
fedify init scaffolds a project in one line, and fedify tunnel exposes your local server over HTTPS so you can test against real Mastodon. Activities your server sends can be received by fedify inbox, a disposable inbox server spun up on the spot; whatever other servers publish, you can inspect with fedify lookup. My personal favorite is fedify lookup --authorized-fetch, which generates a one-off key pair and stands up a temporary ActivityPub server just to make a signed request for an object behind secure mode. The CLI is also useful to ActivityPub developers who don't use Fedify at all.
While you write code, an ActivityPub-specific linter (@fedify/lint) catches twenty kinds of interoperability bugs, like an actor missing its inbox. Tests run without the network using mocks from @fedify/testing. Once the server is up, attach the debug dashboard (@fedify/debugger) with one line and watch activities and signature verification results in your browser, live. In production there's built-in OpenTelemetry instrumentation (28 span types, 37 metrics) plus a monitoring guide, and when performance matters, fedify bench, a load-testing tool built for ActivityPub, catches regressions in CI.
As far as I know, no other ActivityPub framework ships even one of the tools in this section.
The documentation is part of the tooling. The official docs run to a thirty-chapter manual and five tutorials, and they go well past API listings. There's an operations chapter with ready-made PromQL queries and alerting rules for watching your queue backlog, and a field-guide chapter that documents de facto conventions, like which property makes your avatar show up in Mastodon, with screenshots. At two in the morning, when federation is broken and you don't know why, this is the difference between a bad night and a short one.
It's already running
Fedify is not a thought experiment. Ghost's ActivityPub service, mentioned above, is built on it. So are Encyclia, which bridges ORCID researcher records into the fediverse; SiliconBeest, running serverless on Cloudflare Workers; Typo Blue, a Korean blogging platform; Hollo, my own single-user microblogging platform; and Hackers' Pub, run by its community. Hollo, by the way, is the app from the beginning of this post: the project I once had to shelve, finished at last on the framework it forced into existence.
I didn't build Fedify to mint more ActivityPub experts. Rather the opposite. I believe the fediverse will only grow beyond microblogging when developers can build federated apps without knowing ActivityPub's fine print. Signature spec transitions and JSON-LD compaction are problems that belong inside a framework, not barriers in front of someone with a new idea.
Starting takes one line:
npm init @fedify
Follow the first tutorial and by the end, Mastodon can find your server. If you get stuck, come find us in the Matrix room or GitHub Discussions. See you in the fediverse.
I'm doing some experiments with different self hosted software, creating accounts for the Fediverse/ActivityPub, like the Wordpress Plugin, Writefreely, GoToSocial and the like. Is there a way to properly delete those accounts when I don't need them anymore? I don't want to leave them orphaned.
Great post, I suggest to anyone interested in the ActivityPub spec and technical architecture to read it. I had no idea the tool echosystem had this many problems, and Fedify handles a lot of them for you! #activitypub
I'm doing some experiments with different self hosted software, creating accounts for the Fediverse/ActivityPub, like the Wordpress Plugin, Writefreely, GoToSocial and the like. Is there a way to properly delete those accounts when I don't need them anymore? I don't want to leave them orphaned.
The story of #microblog migration is reasonably okay esp. for masto-to-masto. Microblog content is relatively ephemeral, and its not too bad to leave your old content behind.
I left a sizable account @humanetech@mastodon.social behind, built around Humane Technology advocacy, which I later completely erased from that server. I also once erased the history of this account, to demonstrate the ephemerality, and that we shouldn't use #microblogging for valuable discussions we like an archive on, like #ActivityPub development.
The story of #microblog migration is reasonably okay esp. for masto-to-masto. Microblog content is relatively ephemeral, and its not too bad to leave your old content behind.
I left a sizable account @humanetech@mastodon.social behind, built around Humane Technology advocacy, which I later completely erased from that server. I also once erased the history of this account, to demonstrate the ephemerality, and that we shouldn't use #microblogging for valuable discussions we like an archive on, like #ActivityPub development.
One thing that people who don't write #ActivityPub software might not know is that Mastodon has remarkably low rate limits for other servers to make requests -- getting data from or sending data to a Mastodon server. The rate limits are hard-coded in the Mastodon software, and they're for the whole server. mastodon.social has the same rate limits as your server on a Raspberry Pi. That means that the server that you need to access about 1/4 of the time is throttling everyone's access to it.
So #EXIF (metadata for images and other media) defines fields for ImageDescription and UserComment (https://timestampcamera.net/photo-guides/exif-tag-reference), both of which could theoretically contain image Alt Text. I wonder if any social media apps (clients for Mastodon of other #ActivityPub or #ATProto services, for example) read and use Alt Text from EXIF on upload, or preserve the metadata in the file if you re-save it. Seems like a relatively obvious and useful feature. #Accessibility#AltText
One thing that people who don't write #ActivityPub software might not know is that Mastodon has remarkably low rate limits for other servers to make requests -- getting data from or sending data to a Mastodon server. The rate limits are hard-coded in the Mastodon software, and they're for the whole server. mastodon.social has the same rate limits as your server on a Raspberry Pi. That means that the server that you need to access about 1/4 of the time is throttling everyone's access to it.
So #EXIF (metadata for images and other media) defines fields for ImageDescription and UserComment (https://timestampcamera.net/photo-guides/exif-tag-reference), both of which could theoretically contain image Alt Text. I wonder if any social media apps (clients for Mastodon of other #ActivityPub or #ATProto services, for example) read and use Alt Text from EXIF on upload, or preserve the metadata in the file if you re-save it. Seems like a relatively obvious and useful feature. #Accessibility#AltText
Picture the moment your server sends its first Follow activity to Mastodon. You read the spec, built the JSON, signed the HTTP request, and POSTed it with care. What comes back is a single line: 401 Unauthorized. No body. No explanation.
What went wrong? Maybe the clock behind your Date header drifted a few minutes. Maybe the hash in your Digest header is off. Maybe you uppercased the (request-target) pseudo-header while building the signing string, or published your public key as PEM where the other side wanted multibase. The remote server won't tell you. So you start reading someone else's server code to debug your own.
I know, because I've been there. Fedify began as a casualty of another project. I set out to build a single-user microblogging server, the one that would later become Hollo, and started implementing ActivityPub from scratch. Somewhere between the signature specs and the JSON-LD, the protocol work swallowed the product, and I put the whole thing down. What I picked back up wasn't the app. It was the framework the app should have had. Fedify shipped first; only then could Hollo exist, built on top of it. (I've told this story at more length in A year with the fediverse.)
ActivityPub development gets hard in a few very specific places. In this post I want to walk through five of them, then show what each one looks like with Fedify. If you've spent time in the fediverse, you'll probably nod along. If you haven't, you may wonder why anyone would do all of this by hand. Either way, the conclusion is the same: nobody has to anymore.
Five scenes
Scene 1: there is more than one standard
ActivityPub servers authenticate each other with HTTP signatures. Except there isn't one signature spec. Most of the fediverse runs on draft-cavage-http-signatures-12, an expired draft that never became a standard. The actual standard exists too: RFC 9421, HTTP Message Signatures. The problem is that you can't know which one a given server accepts until you try.
A real-world implementation therefore has to sign with one spec, see whether it gets rejected, re-sign with the other, and remember per server which one worked so it can skip the dance next time. The fediverse calls this double-knocking. Yes, you get to implement it yourself.
That's still not the end. HTTP signatures only prove who sent a request. For situations like inbox forwarding, where you relay an activity you received to a third party, you need signatures that live on the document itself: Linked Data Signatures and Object Integrity Proofs. Four signature mechanisms in total, and two kinds of keys to manage: RSA and Ed25519.
Scene 2: one document, many shapes
ActivityPub's wire format is JSON-LD, and in JSON-LD the same document can take many shapes. This is easier to show than to explain. Here is a Create activity one server might send:
actor turned from a URI string into an inline object. to turned from a string into an array. object went the other way, from an inline object to a URI. Even the address that means โpublicโ has three valid spellings: https://www.w3.org/ns/activitystreams#Public, as:Public, and plain Public. Your parser has to accept every combination, and which one arrives depends on the sender's implementation.
The spec-compliant answer is to normalize every document with a JSON-LD processor, expansion followed by compaction. In practice many implementations treat it all as โjust JSONโ and quietly break on whatever shape some server happens to emit. Either way, you end up with defensive code smeared across the whole codebase: is this a string? An array? An object? A URI I have to fetch?
Scene 3: the zombie post
A user publishes a post, spots a typo, and deletes it right away. Your server sends a Create, then a Delete. Thanks to network weather, some receiving server gets the Delete first and the Create second. It ignores the deletion of a post that doesn't exist yet, then dutifully processes the creation of a post that was already deleted. That post now lives on that server forever, while its author believes it's gone.
Then there's scale. With five thousand followers, one post means thousands of HTTP deliveries. Do that inline in the request handler and your publish button takes half a minute to respond, or the server falls over. Fine, use a queue. Deliveries fail, so retry them. On what schedule? Exponential backoff. How many times? And is a 500 Internal Server Error the same kind of failure as a 410 Gone? When do you clean up three thousand followers on a server that no longer exists? Should you keep hammering a host that has been down for days?
At some point it dawns on you that this is no longer protocol implementation. It's distributed systems engineering.
Scene 4: it's not a spec, it's an ecosystem
Even perfect spec compliance doesn't buy you interoperability. A few examples from the field:
Mastodon's secure mode requires HTTP signatures on GET requests too (so-called authorized fetch). Now suppose both servers run in that mode. To fetch the other side's public key you must sign your request; to verify your signature, the other side must first fetch your key. Deadlock. The community's workaround is to sign with an โinstance actorโ that represents the server itself. You won't find that in the spec.
Threads can't parse activities whose actor is embedded as an inline object. When sending to Threads, the actor has to be a URI.
Lemmy silently rejects Group actors that lack fields Mastodon never asks for, such as a moderators collection linked via attributedTo and a featured collection.
Misskey carries vocabulary extensions of its own; quote posts alone go by three different property names across implementations.
The list keeps growing. Interoperability here is not something you finish once and stop thinking about. It's maintenance, forever.
Scene 5: insecure by default
Build it from scratch, and you start out wide open. Skip signature verification on incoming activities and anyone can inject a forged Follow or Delete. Leave the document loader unrestricted and a malicious activity can point it at http://169.254.169.254/ or your internal network, turning your server into an SSRF proxy. Skip origin checks on embedded objects and any server can hand out a document claiming โhere's what the Mastodon lead developer said.โ
What these traps share is that nothing happens when you fall into them. Everything appears to work. Until someone exploits it.
Ghost ran into this too
If you're thinking โsurely our team would manage,โ consider Ghost: a leading open-source publishing platform used by thousands of journalists and creators, and a team that set out to build its own ActivityPub support.
We can definitely attest to the problems that Fedify is working hard to solve, because even in just a few weeks of early prototyping we were running into the issues described above right away.
Ghost ended up building its ActivityPub layer on Fedify.
So I put all of it in a framework
Fedify is a TypeScript library for building federated server apps on ActivityPub and the standards around it. It runs on Deno, Node.js, and Bun, and supports edge runtimes like Cloudflare Workers. The design goal hasn't changed since the beginning: keep everything in those five scenes out of application code.
Here are the same five scenes again, this time with Fedify.
Scene 1, revisited: the signature war is the framework's job
Here is everything it takes to put one actor on the fediverse:
import { createFederation, generateCryptoKeyPair, MemoryKvStore } from "@fedify/fedify";import { Endpoints, Person } from "@fedify/vocab";const federation = createFederation<void>({ kv: new MemoryKvStore(), // Swap for Redis, PostgreSQL, etc. in production});federation .setActorDispatcher("/users/{identifier}", async (ctx, identifier) => { if (identifier !== "alice") return null; const keyPairs = await ctx.getActorKeyPairs(identifier); return new Person({ id: ctx.getActorUri(identifier), preferredUsername: identifier, name: "Alice", inbox: ctx.getInboxUri(identifier), endpoints: new Endpoints({ sharedInbox: ctx.getInboxUri() }), publicKey: keyPairs[0].cryptographicKey, assertionMethods: keyPairs.map((keyPair) => keyPair.multikey), }); }) .setKeyPairsDispatcher(async (ctx, identifier) => { // In real code you'd persist these in a database; this shows the gist return [await generateCryptoKeyPair()]; });
The moment this code runs:
Every outgoing request gets signed. With an RSA key, Fedify emits HTTP Signatures and Linked Data Signatures; add an Ed25519 key and it attaches Object Integrity Proofs as well. All four mechanisms coexist on a single activity, and each receiver verifies with the strongest one it understands.
Fedify does the double-knocking for you: first contact goes out as RFC 9421, a rejection triggers a draft-cavage retry, and the winning spec is cached per server. If the rejection carries an Accept-Signature challenge (RFC 9421 ยง5), Fedify reads it and re-signs with exactly the components the server asked for.
One bonus. Because you registered an actor dispatcher, you now have a WebFinger (RFC 7033) server, for free. Type @alice@example.com into Mastodon's search box and your actor comes up. You never wrote a line of WebFinger code.
Scene 2, revisited: types instead of JSON-LD
Fedify ships about eighty classes covering the whole Activity Vocabulary plus the major vendor extensions. The classes are typed and immutable, and their accessors absorb the shape differences that JSON-LD allows.
const actor = await ctx.lookupObject("@hongminhee@hollo.social");if (actor instanceof Person) { console.log(actor.name); // Safe whether it's a string or langString const followers = await actor.getFollowers(); // Fetches a URI, unwraps an object}
lookupObject() takes a handle and runs the whole chain for you, WebFinger discovery included. Accessors like getFollowers()behave the same way whether the value is a URI reference or an inline object, and fetched values are cached.
Vendor fragmentation gets stitched up here too. The three competing quote properties (quoteUri, _misskey_quote, quoteUrl) are unified behind one API, next to the emerging FEP-044fquote. Misskey's isCat property exists as a type, so your server can determine cat-ness with full type safety. It sounds like a joke, but a few dozen details of exactly this kind are what interoperability is actually made of.
Scene 3, revisited: the zombie post dies in one line
Delivery infrastructure first. Plug a message queue into createFederation() and delivery moves to the background, with automatic retries under exponential backoff (up to ten attempts by default). When a post goes to thousands of followers, two-stage fan-out kicks in: a single consolidated message enters the queue, and a background worker splits it into per-server delivery tasks. The publish button responds immediately.
Retries create a problem of their own: the same activity can arrive twice. Fedify keeps a 24-hour idempotence cache of processed activities, so duplicates get detected and skipped before they reach your handlers.
As for the zombie post, the fix is one option:
await ctx.sendActivity( { identifier: "alice" }, "followers", // Collects recipients from your followers collection deleteActivity, { orderingKey: post.id }, // Same key = in-order delivery per server);
Activities that share an orderingKey are delivered to each receiving server in the order they were sent. A Delete can no longer overtake its Create. Activities with different keys still go out in parallel, so throughput survives.
Fedify also handles dead servers. On a 404 Not Found or 410 Gone, it stops retrying and calls a handler you register. If the delivery went to a shared inbox, you also get the list of followers behind it, so you can prune vanished accounts on the spot. Hosts that fail repeatedly trip a per-host circuit breaker that holds deliveries and probes periodically until the host recovers. It's on by default; there's nothing to configure.
Scene 4, revisited: we track the quirks so you don't
Here is how Fedify disarms the traps from scene 4:
Authorized fetch: chain .authorize() onto a dispatcher and the verified identity of the requester lands in your callback. Blocklists, private collections, whatever your app needs is plain application logic. The instance-actor deadlock has a supported pattern as well.
Threads and inline actors: an activity transformer, enabled by default, rewrites inline actors into URIs on the way out. You don't need to know Threads has this problem.
Lemmy's requirements: the custom collection API exposes a moderators collection in a few lines, and Lemmy's JSON-LD context ships preloaded.
When a new quirk surfaces in the wild, the fix lands in Fedify, not in every application separately. Each interoperability lesson gets learned once.
Scene 5, revisited: becoming unsafe takes effort
Fedify's defaults point the other way.
Signature verification is something you turn off (for tests), not something you remember to turn on.
The document loader refuses private address ranges and loopback out of the box, with DNS rebinding accounted for. To open yourself up to SSRF you have to flip an option whose very name announces it's for testing.
In a from-scratch implementation, you have to keep remembering to do things safely. In Fedify, the unsafe path is the one that takes deliberate effort. For a federated server, with its tangle of trust boundaries, that's the right way around.
Your stack stays your stack
โFine, but what if it doesn't fit our stack?โ Fedify was built to fit the stack you already have. There are thirteen web framework integrations: servers like Express, Hono, Fastify, Koa, NestJS, and Elysia, and meta-frameworks like Next.js, Nuxt, SvelteKit, Astro, SolidStart, and Fresh. Middleware handles content negotiation, so the same URL in your existing app serves HTML to browsers and JSON-LD to the fediverse.
Fedify doesn't dictate your database either. For its own storage it asks for one keyโvalue interface, with seven adapters available (Redis, PostgreSQL, MySQL/MariaDB, SQLite, Deno KV, Cloudflare Workers KV, in-memory). Message queues come in eight flavors (PostgreSQL, Redis, AMQP/RabbitMQ, and so on), and you can implement the interface yourself if none fits. Your domain data stays in whatever database and ORM you already use.
Already running federation on another library? There are migration guides with data migration scripts for moving from activitypub-express and friends without losing your existing followers.
The core isn't the ceiling, either. Higher-level packages build on it: @fedify/relay gives you a complete ActivityPub relay server in a single function call, and @fedify/backfill reconstructs incomplete conversation threads by walking the rest of the fediverse for you.
Tools for the whole development loop
A quieter misery of federated development has always been the missing tooling. Fedify comes with tools for every stage of the loop.
fedify init scaffolds a project in one line, and fedify tunnel exposes your local server over HTTPS so you can test against real Mastodon. Activities your server sends can be received by fedify inbox, a disposable inbox server spun up on the spot; whatever other servers publish, you can inspect with fedify lookup. My personal favorite is fedify lookup --authorized-fetch, which generates a one-off key pair and stands up a temporary ActivityPub server just to make a signed request for an object behind secure mode. The CLI is also useful to ActivityPub developers who don't use Fedify at all.
While you write code, an ActivityPub-specific linter (@fedify/lint) catches twenty kinds of interoperability bugs, like an actor missing its inbox. Tests run without the network using mocks from @fedify/testing. Once the server is up, attach the debug dashboard (@fedify/debugger) with one line and watch activities and signature verification results in your browser, live. In production there's built-in OpenTelemetry instrumentation (28 span types, 37 metrics) plus a monitoring guide, and when performance matters, fedify bench, a load-testing tool built for ActivityPub, catches regressions in CI.
As far as I know, no other ActivityPub framework ships even one of the tools in this section.
The documentation is part of the tooling. The official docs run to a thirty-chapter manual and five tutorials, and they go well past API listings. There's an operations chapter with ready-made PromQL queries and alerting rules for watching your queue backlog, and a field-guide chapter that documents de facto conventions, like which property makes your avatar show up in Mastodon, with screenshots. At two in the morning, when federation is broken and you don't know why, this is the difference between a bad night and a short one.
It's already running
Fedify is not a thought experiment. Ghost's ActivityPub service, mentioned above, is built on it. So are Encyclia, which bridges ORCID researcher records into the fediverse; SiliconBeest, running serverless on Cloudflare Workers; Typo Blue, a Korean blogging platform; Hollo, my own single-user microblogging platform; and Hackers' Pub, run by its community. Hollo, by the way, is the app from the beginning of this post: the project I once had to shelve, finished at last on the framework it forced into existence.
I didn't build Fedify to mint more ActivityPub experts. Rather the opposite. I believe the fediverse will only grow beyond microblogging when developers can build federated apps without knowing ActivityPub's fine print. Signature spec transitions and JSON-LD compaction are problems that belong inside a framework, not barriers in front of someone with a new idea.
Starting takes one line:
npm init @fedify
Follow the first tutorial and by the end, Mastodon can find your server. If you get stuck, come find us in the Matrix room or GitHub Discussions. See you in the fediverse.
Picture the moment your server sends its first Follow activity to Mastodon. You read the spec, built the JSON, signed the HTTP request, and POSTed it with care. What comes back is a single line: 401 Unauthorized. No body. No explanation.
What went wrong? Maybe the clock behind your Date header drifted a few minutes. Maybe the hash in your Digest header is off. Maybe you uppercased the (request-target) pseudo-header while building the signing string, or published your public key as PEM where the other side wanted multibase. The remote server won't tell you. So you start reading someone else's server code to debug your own.
I know, because I've been there. Fedify began as a casualty of another project. I set out to build a single-user microblogging server, the one that would later become Hollo, and started implementing ActivityPub from scratch. Somewhere between the signature specs and the JSON-LD, the protocol work swallowed the product, and I put the whole thing down. What I picked back up wasn't the app. It was the framework the app should have had. Fedify shipped first; only then could Hollo exist, built on top of it. (I've told this story at more length in A year with the fediverse.)
ActivityPub development gets hard in a few very specific places. In this post I want to walk through five of them, then show what each one looks like with Fedify. If you've spent time in the fediverse, you'll probably nod along. If you haven't, you may wonder why anyone would do all of this by hand. Either way, the conclusion is the same: nobody has to anymore.
Five scenes
Scene 1: there is more than one standard
ActivityPub servers authenticate each other with HTTP signatures. Except there isn't one signature spec. Most of the fediverse runs on draft-cavage-http-signatures-12, an expired draft that never became a standard. The actual standard exists too: RFC 9421, HTTP Message Signatures. The problem is that you can't know which one a given server accepts until you try.
A real-world implementation therefore has to sign with one spec, see whether it gets rejected, re-sign with the other, and remember per server which one worked so it can skip the dance next time. The fediverse calls this double-knocking. Yes, you get to implement it yourself.
That's still not the end. HTTP signatures only prove who sent a request. For situations like inbox forwarding, where you relay an activity you received to a third party, you need signatures that live on the document itself: Linked Data Signatures and Object Integrity Proofs. Four signature mechanisms in total, and two kinds of keys to manage: RSA and Ed25519.
Scene 2: one document, many shapes
ActivityPub's wire format is JSON-LD, and in JSON-LD the same document can take many shapes. This is easier to show than to explain. Here is a Create activity one server might send:
actor turned from a URI string into an inline object. to turned from a string into an array. object went the other way, from an inline object to a URI. Even the address that means โpublicโ has three valid spellings: https://www.w3.org/ns/activitystreams#Public, as:Public, and plain Public. Your parser has to accept every combination, and which one arrives depends on the sender's implementation.
The spec-compliant answer is to normalize every document with a JSON-LD processor, expansion followed by compaction. In practice many implementations treat it all as โjust JSONโ and quietly break on whatever shape some server happens to emit. Either way, you end up with defensive code smeared across the whole codebase: is this a string? An array? An object? A URI I have to fetch?
Scene 3: the zombie post
A user publishes a post, spots a typo, and deletes it right away. Your server sends a Create, then a Delete. Thanks to network weather, some receiving server gets the Delete first and the Create second. It ignores the deletion of a post that doesn't exist yet, then dutifully processes the creation of a post that was already deleted. That post now lives on that server forever, while its author believes it's gone.
Then there's scale. With five thousand followers, one post means thousands of HTTP deliveries. Do that inline in the request handler and your publish button takes half a minute to respond, or the server falls over. Fine, use a queue. Deliveries fail, so retry them. On what schedule? Exponential backoff. How many times? And is a 500 Internal Server Error the same kind of failure as a 410 Gone? When do you clean up three thousand followers on a server that no longer exists? Should you keep hammering a host that has been down for days?
At some point it dawns on you that this is no longer protocol implementation. It's distributed systems engineering.
Scene 4: it's not a spec, it's an ecosystem
Even perfect spec compliance doesn't buy you interoperability. A few examples from the field:
Mastodon's secure mode requires HTTP signatures on GET requests too (so-called authorized fetch). Now suppose both servers run in that mode. To fetch the other side's public key you must sign your request; to verify your signature, the other side must first fetch your key. Deadlock. The community's workaround is to sign with an โinstance actorโ that represents the server itself. You won't find that in the spec.
Threads can't parse activities whose actor is embedded as an inline object. When sending to Threads, the actor has to be a URI.
Lemmy silently rejects Group actors that lack fields Mastodon never asks for, such as a moderators collection linked via attributedTo and a featured collection.
Misskey carries vocabulary extensions of its own; quote posts alone go by three different property names across implementations.
The list keeps growing. Interoperability here is not something you finish once and stop thinking about. It's maintenance, forever.
Scene 5: insecure by default
Build it from scratch, and you start out wide open. Skip signature verification on incoming activities and anyone can inject a forged Follow or Delete. Leave the document loader unrestricted and a malicious activity can point it at http://169.254.169.254/ or your internal network, turning your server into an SSRF proxy. Skip origin checks on embedded objects and any server can hand out a document claiming โhere's what the Mastodon lead developer said.โ
What these traps share is that nothing happens when you fall into them. Everything appears to work. Until someone exploits it.
Ghost ran into this too
If you're thinking โsurely our team would manage,โ consider Ghost: a leading open-source publishing platform used by thousands of journalists and creators, and a team that set out to build its own ActivityPub support.
We can definitely attest to the problems that Fedify is working hard to solve, because even in just a few weeks of early prototyping we were running into the issues described above right away.
Ghost ended up building its ActivityPub layer on Fedify.
So I put all of it in a framework
Fedify is a TypeScript library for building federated server apps on ActivityPub and the standards around it. It runs on Deno, Node.js, and Bun, and supports edge runtimes like Cloudflare Workers. The design goal hasn't changed since the beginning: keep everything in those five scenes out of application code.
Here are the same five scenes again, this time with Fedify.
Scene 1, revisited: the signature war is the framework's job
Here is everything it takes to put one actor on the fediverse:
import { createFederation, generateCryptoKeyPair, MemoryKvStore } from "@fedify/fedify";import { Endpoints, Person } from "@fedify/vocab";const federation = createFederation<void>({ kv: new MemoryKvStore(), // Swap for Redis, PostgreSQL, etc. in production});federation .setActorDispatcher("/users/{identifier}", async (ctx, identifier) => { if (identifier !== "alice") return null; const keyPairs = await ctx.getActorKeyPairs(identifier); return new Person({ id: ctx.getActorUri(identifier), preferredUsername: identifier, name: "Alice", inbox: ctx.getInboxUri(identifier), endpoints: new Endpoints({ sharedInbox: ctx.getInboxUri() }), publicKey: keyPairs[0].cryptographicKey, assertionMethods: keyPairs.map((keyPair) => keyPair.multikey), }); }) .setKeyPairsDispatcher(async (ctx, identifier) => { // In real code you'd persist these in a database; this shows the gist return [await generateCryptoKeyPair()]; });
The moment this code runs:
Every outgoing request gets signed. With an RSA key, Fedify emits HTTP Signatures and Linked Data Signatures; add an Ed25519 key and it attaches Object Integrity Proofs as well. All four mechanisms coexist on a single activity, and each receiver verifies with the strongest one it understands.
Fedify does the double-knocking for you: first contact goes out as RFC 9421, a rejection triggers a draft-cavage retry, and the winning spec is cached per server. If the rejection carries an Accept-Signature challenge (RFC 9421 ยง5), Fedify reads it and re-signs with exactly the components the server asked for.
One bonus. Because you registered an actor dispatcher, you now have a WebFinger (RFC 7033) server, for free. Type @alice@example.com into Mastodon's search box and your actor comes up. You never wrote a line of WebFinger code.
Scene 2, revisited: types instead of JSON-LD
Fedify ships about eighty classes covering the whole Activity Vocabulary plus the major vendor extensions. The classes are typed and immutable, and their accessors absorb the shape differences that JSON-LD allows.
const actor = await ctx.lookupObject("@hongminhee@hollo.social");if (actor instanceof Person) { console.log(actor.name); // Safe whether it's a string or langString const followers = await actor.getFollowers(); // Fetches a URI, unwraps an object}
lookupObject() takes a handle and runs the whole chain for you, WebFinger discovery included. Accessors like getFollowers()behave the same way whether the value is a URI reference or an inline object, and fetched values are cached.
Vendor fragmentation gets stitched up here too. The three competing quote properties (quoteUri, _misskey_quote, quoteUrl) are unified behind one API, next to the emerging FEP-044fquote. Misskey's isCat property exists as a type, so your server can determine cat-ness with full type safety. It sounds like a joke, but a few dozen details of exactly this kind are what interoperability is actually made of.
Scene 3, revisited: the zombie post dies in one line
Delivery infrastructure first. Plug a message queue into createFederation() and delivery moves to the background, with automatic retries under exponential backoff (up to ten attempts by default). When a post goes to thousands of followers, two-stage fan-out kicks in: a single consolidated message enters the queue, and a background worker splits it into per-server delivery tasks. The publish button responds immediately.
Retries create a problem of their own: the same activity can arrive twice. Fedify keeps a 24-hour idempotence cache of processed activities, so duplicates get detected and skipped before they reach your handlers.
As for the zombie post, the fix is one option:
await ctx.sendActivity( { identifier: "alice" }, "followers", // Collects recipients from your followers collection deleteActivity, { orderingKey: post.id }, // Same key = in-order delivery per server);
Activities that share an orderingKey are delivered to each receiving server in the order they were sent. A Delete can no longer overtake its Create. Activities with different keys still go out in parallel, so throughput survives.
Fedify also handles dead servers. On a 404 Not Found or 410 Gone, it stops retrying and calls a handler you register. If the delivery went to a shared inbox, you also get the list of followers behind it, so you can prune vanished accounts on the spot. Hosts that fail repeatedly trip a per-host circuit breaker that holds deliveries and probes periodically until the host recovers. It's on by default; there's nothing to configure.
Scene 4, revisited: we track the quirks so you don't
Here is how Fedify disarms the traps from scene 4:
Authorized fetch: chain .authorize() onto a dispatcher and the verified identity of the requester lands in your callback. Blocklists, private collections, whatever your app needs is plain application logic. The instance-actor deadlock has a supported pattern as well.
Threads and inline actors: an activity transformer, enabled by default, rewrites inline actors into URIs on the way out. You don't need to know Threads has this problem.
Lemmy's requirements: the custom collection API exposes a moderators collection in a few lines, and Lemmy's JSON-LD context ships preloaded.
When a new quirk surfaces in the wild, the fix lands in Fedify, not in every application separately. Each interoperability lesson gets learned once.
Scene 5, revisited: becoming unsafe takes effort
Fedify's defaults point the other way.
Signature verification is something you turn off (for tests), not something you remember to turn on.
The document loader refuses private address ranges and loopback out of the box, with DNS rebinding accounted for. To open yourself up to SSRF you have to flip an option whose very name announces it's for testing.
In a from-scratch implementation, you have to keep remembering to do things safely. In Fedify, the unsafe path is the one that takes deliberate effort. For a federated server, with its tangle of trust boundaries, that's the right way around.
Your stack stays your stack
โFine, but what if it doesn't fit our stack?โ Fedify was built to fit the stack you already have. There are thirteen web framework integrations: servers like Express, Hono, Fastify, Koa, NestJS, and Elysia, and meta-frameworks like Next.js, Nuxt, SvelteKit, Astro, SolidStart, and Fresh. Middleware handles content negotiation, so the same URL in your existing app serves HTML to browsers and JSON-LD to the fediverse.
Fedify doesn't dictate your database either. For its own storage it asks for one keyโvalue interface, with seven adapters available (Redis, PostgreSQL, MySQL/MariaDB, SQLite, Deno KV, Cloudflare Workers KV, in-memory). Message queues come in eight flavors (PostgreSQL, Redis, AMQP/RabbitMQ, and so on), and you can implement the interface yourself if none fits. Your domain data stays in whatever database and ORM you already use.
Already running federation on another library? There are migration guides with data migration scripts for moving from activitypub-express and friends without losing your existing followers.
The core isn't the ceiling, either. Higher-level packages build on it: @fedify/relay gives you a complete ActivityPub relay server in a single function call, and @fedify/backfill reconstructs incomplete conversation threads by walking the rest of the fediverse for you.
Tools for the whole development loop
A quieter misery of federated development has always been the missing tooling. Fedify comes with tools for every stage of the loop.
fedify init scaffolds a project in one line, and fedify tunnel exposes your local server over HTTPS so you can test against real Mastodon. Activities your server sends can be received by fedify inbox, a disposable inbox server spun up on the spot; whatever other servers publish, you can inspect with fedify lookup. My personal favorite is fedify lookup --authorized-fetch, which generates a one-off key pair and stands up a temporary ActivityPub server just to make a signed request for an object behind secure mode. The CLI is also useful to ActivityPub developers who don't use Fedify at all.
While you write code, an ActivityPub-specific linter (@fedify/lint) catches twenty kinds of interoperability bugs, like an actor missing its inbox. Tests run without the network using mocks from @fedify/testing. Once the server is up, attach the debug dashboard (@fedify/debugger) with one line and watch activities and signature verification results in your browser, live. In production there's built-in OpenTelemetry instrumentation (28 span types, 37 metrics) plus a monitoring guide, and when performance matters, fedify bench, a load-testing tool built for ActivityPub, catches regressions in CI.
As far as I know, no other ActivityPub framework ships even one of the tools in this section.
The documentation is part of the tooling. The official docs run to a thirty-chapter manual and five tutorials, and they go well past API listings. There's an operations chapter with ready-made PromQL queries and alerting rules for watching your queue backlog, and a field-guide chapter that documents de facto conventions, like which property makes your avatar show up in Mastodon, with screenshots. At two in the morning, when federation is broken and you don't know why, this is the difference between a bad night and a short one.
It's already running
Fedify is not a thought experiment. Ghost's ActivityPub service, mentioned above, is built on it. So are Encyclia, which bridges ORCID researcher records into the fediverse; SiliconBeest, running serverless on Cloudflare Workers; Typo Blue, a Korean blogging platform; Hollo, my own single-user microblogging platform; and Hackers' Pub, run by its community. Hollo, by the way, is the app from the beginning of this post: the project I once had to shelve, finished at last on the framework it forced into existence.
I didn't build Fedify to mint more ActivityPub experts. Rather the opposite. I believe the fediverse will only grow beyond microblogging when developers can build federated apps without knowing ActivityPub's fine print. Signature spec transitions and JSON-LD compaction are problems that belong inside a framework, not barriers in front of someone with a new idea.
Starting takes one line:
npm init @fedify
Follow the first tutorial and by the end, Mastodon can find your server. If you get stuck, come find us in the Matrix room or GitHub Discussions. See you in the fediverse.
Picture the moment your server sends its first Follow activity to Mastodon. You read the spec, built the JSON, signed the HTTP request, and POSTed it with care. What comes back is a single line: 401 Unauthorized. No body. No explanation.
What went wrong? Maybe the clock behind your Date header drifted a few minutes. Maybe the hash in your Digest header is off. Maybe you uppercased the (request-target) pseudo-header while building the signing string, or published your public key as PEM where the other side wanted multibase. The remote server won't tell you. So you start reading someone else's server code to debug your own.
I know, because I've been there. Fedify began as a casualty of another project. I set out to build a single-user microblogging server, the one that would later become Hollo, and started implementing ActivityPub from scratch. Somewhere between the signature specs and the JSON-LD, the protocol work swallowed the product, and I put the whole thing down. What I picked back up wasn't the app. It was the framework the app should have had. Fedify shipped first; only then could Hollo exist, built on top of it. (I've told this story at more length in A year with the fediverse.)
ActivityPub development gets hard in a few very specific places. In this post I want to walk through five of them, then show what each one looks like with Fedify. If you've spent time in the fediverse, you'll probably nod along. If you haven't, you may wonder why anyone would do all of this by hand. Either way, the conclusion is the same: nobody has to anymore.
Five scenes
Scene 1: there is more than one standard
ActivityPub servers authenticate each other with HTTP signatures. Except there isn't one signature spec. Most of the fediverse runs on draft-cavage-http-signatures-12, an expired draft that never became a standard. The actual standard exists too: RFC 9421, HTTP Message Signatures. The problem is that you can't know which one a given server accepts until you try.
A real-world implementation therefore has to sign with one spec, see whether it gets rejected, re-sign with the other, and remember per server which one worked so it can skip the dance next time. The fediverse calls this double-knocking. Yes, you get to implement it yourself.
That's still not the end. HTTP signatures only prove who sent a request. For situations like inbox forwarding, where you relay an activity you received to a third party, you need signatures that live on the document itself: Linked Data Signatures and Object Integrity Proofs. Four signature mechanisms in total, and two kinds of keys to manage: RSA and Ed25519.
Scene 2: one document, many shapes
ActivityPub's wire format is JSON-LD, and in JSON-LD the same document can take many shapes. This is easier to show than to explain. Here is a Create activity one server might send:
actor turned from a URI string into an inline object. to turned from a string into an array. object went the other way, from an inline object to a URI. Even the address that means โpublicโ has three valid spellings: https://www.w3.org/ns/activitystreams#Public, as:Public, and plain Public. Your parser has to accept every combination, and which one arrives depends on the sender's implementation.
The spec-compliant answer is to normalize every document with a JSON-LD processor, expansion followed by compaction. In practice many implementations treat it all as โjust JSONโ and quietly break on whatever shape some server happens to emit. Either way, you end up with defensive code smeared across the whole codebase: is this a string? An array? An object? A URI I have to fetch?
Scene 3: the zombie post
A user publishes a post, spots a typo, and deletes it right away. Your server sends a Create, then a Delete. Thanks to network weather, some receiving server gets the Delete first and the Create second. It ignores the deletion of a post that doesn't exist yet, then dutifully processes the creation of a post that was already deleted. That post now lives on that server forever, while its author believes it's gone.
Then there's scale. With five thousand followers, one post means thousands of HTTP deliveries. Do that inline in the request handler and your publish button takes half a minute to respond, or the server falls over. Fine, use a queue. Deliveries fail, so retry them. On what schedule? Exponential backoff. How many times? And is a 500 Internal Server Error the same kind of failure as a 410 Gone? When do you clean up three thousand followers on a server that no longer exists? Should you keep hammering a host that has been down for days?
At some point it dawns on you that this is no longer protocol implementation. It's distributed systems engineering.
Scene 4: it's not a spec, it's an ecosystem
Even perfect spec compliance doesn't buy you interoperability. A few examples from the field:
Mastodon's secure mode requires HTTP signatures on GET requests too (so-called authorized fetch). Now suppose both servers run in that mode. To fetch the other side's public key you must sign your request; to verify your signature, the other side must first fetch your key. Deadlock. The community's workaround is to sign with an โinstance actorโ that represents the server itself. You won't find that in the spec.
Threads can't parse activities whose actor is embedded as an inline object. When sending to Threads, the actor has to be a URI.
Lemmy silently rejects Group actors that lack fields Mastodon never asks for, such as a moderators collection linked via attributedTo and a featured collection.
Misskey carries vocabulary extensions of its own; quote posts alone go by three different property names across implementations.
The list keeps growing. Interoperability here is not something you finish once and stop thinking about. It's maintenance, forever.
Scene 5: insecure by default
Build it from scratch, and you start out wide open. Skip signature verification on incoming activities and anyone can inject a forged Follow or Delete. Leave the document loader unrestricted and a malicious activity can point it at http://169.254.169.254/ or your internal network, turning your server into an SSRF proxy. Skip origin checks on embedded objects and any server can hand out a document claiming โhere's what the Mastodon lead developer said.โ
What these traps share is that nothing happens when you fall into them. Everything appears to work. Until someone exploits it.
Ghost ran into this too
If you're thinking โsurely our team would manage,โ consider Ghost: a leading open-source publishing platform used by thousands of journalists and creators, and a team that set out to build its own ActivityPub support.
We can definitely attest to the problems that Fedify is working hard to solve, because even in just a few weeks of early prototyping we were running into the issues described above right away.
Ghost ended up building its ActivityPub layer on Fedify.
So I put all of it in a framework
Fedify is a TypeScript library for building federated server apps on ActivityPub and the standards around it. It runs on Deno, Node.js, and Bun, and supports edge runtimes like Cloudflare Workers. The design goal hasn't changed since the beginning: keep everything in those five scenes out of application code.
Here are the same five scenes again, this time with Fedify.
Scene 1, revisited: the signature war is the framework's job
Here is everything it takes to put one actor on the fediverse:
import { createFederation, generateCryptoKeyPair, MemoryKvStore } from "@fedify/fedify";import { Endpoints, Person } from "@fedify/vocab";const federation = createFederation<void>({ kv: new MemoryKvStore(), // Swap for Redis, PostgreSQL, etc. in production});federation .setActorDispatcher("/users/{identifier}", async (ctx, identifier) => { if (identifier !== "alice") return null; const keyPairs = await ctx.getActorKeyPairs(identifier); return new Person({ id: ctx.getActorUri(identifier), preferredUsername: identifier, name: "Alice", inbox: ctx.getInboxUri(identifier), endpoints: new Endpoints({ sharedInbox: ctx.getInboxUri() }), publicKey: keyPairs[0].cryptographicKey, assertionMethods: keyPairs.map((keyPair) => keyPair.multikey), }); }) .setKeyPairsDispatcher(async (ctx, identifier) => { // In real code you'd persist these in a database; this shows the gist return [await generateCryptoKeyPair()]; });
The moment this code runs:
Every outgoing request gets signed. With an RSA key, Fedify emits HTTP Signatures and Linked Data Signatures; add an Ed25519 key and it attaches Object Integrity Proofs as well. All four mechanisms coexist on a single activity, and each receiver verifies with the strongest one it understands.
Fedify does the double-knocking for you: first contact goes out as RFC 9421, a rejection triggers a draft-cavage retry, and the winning spec is cached per server. If the rejection carries an Accept-Signature challenge (RFC 9421 ยง5), Fedify reads it and re-signs with exactly the components the server asked for.
One bonus. Because you registered an actor dispatcher, you now have a WebFinger (RFC 7033) server, for free. Type @alice@example.com into Mastodon's search box and your actor comes up. You never wrote a line of WebFinger code.
Scene 2, revisited: types instead of JSON-LD
Fedify ships about eighty classes covering the whole Activity Vocabulary plus the major vendor extensions. The classes are typed and immutable, and their accessors absorb the shape differences that JSON-LD allows.
const actor = await ctx.lookupObject("@hongminhee@hollo.social");if (actor instanceof Person) { console.log(actor.name); // Safe whether it's a string or langString const followers = await actor.getFollowers(); // Fetches a URI, unwraps an object}
lookupObject() takes a handle and runs the whole chain for you, WebFinger discovery included. Accessors like getFollowers()behave the same way whether the value is a URI reference or an inline object, and fetched values are cached.
Vendor fragmentation gets stitched up here too. The three competing quote properties (quoteUri, _misskey_quote, quoteUrl) are unified behind one API, next to the emerging FEP-044fquote. Misskey's isCat property exists as a type, so your server can determine cat-ness with full type safety. It sounds like a joke, but a few dozen details of exactly this kind are what interoperability is actually made of.
Scene 3, revisited: the zombie post dies in one line
Delivery infrastructure first. Plug a message queue into createFederation() and delivery moves to the background, with automatic retries under exponential backoff (up to ten attempts by default). When a post goes to thousands of followers, two-stage fan-out kicks in: a single consolidated message enters the queue, and a background worker splits it into per-server delivery tasks. The publish button responds immediately.
Retries create a problem of their own: the same activity can arrive twice. Fedify keeps a 24-hour idempotence cache of processed activities, so duplicates get detected and skipped before they reach your handlers.
As for the zombie post, the fix is one option:
await ctx.sendActivity( { identifier: "alice" }, "followers", // Collects recipients from your followers collection deleteActivity, { orderingKey: post.id }, // Same key = in-order delivery per server);
Activities that share an orderingKey are delivered to each receiving server in the order they were sent. A Delete can no longer overtake its Create. Activities with different keys still go out in parallel, so throughput survives.
Fedify also handles dead servers. On a 404 Not Found or 410 Gone, it stops retrying and calls a handler you register. If the delivery went to a shared inbox, you also get the list of followers behind it, so you can prune vanished accounts on the spot. Hosts that fail repeatedly trip a per-host circuit breaker that holds deliveries and probes periodically until the host recovers. It's on by default; there's nothing to configure.
Scene 4, revisited: we track the quirks so you don't
Here is how Fedify disarms the traps from scene 4:
Authorized fetch: chain .authorize() onto a dispatcher and the verified identity of the requester lands in your callback. Blocklists, private collections, whatever your app needs is plain application logic. The instance-actor deadlock has a supported pattern as well.
Threads and inline actors: an activity transformer, enabled by default, rewrites inline actors into URIs on the way out. You don't need to know Threads has this problem.
Lemmy's requirements: the custom collection API exposes a moderators collection in a few lines, and Lemmy's JSON-LD context ships preloaded.
When a new quirk surfaces in the wild, the fix lands in Fedify, not in every application separately. Each interoperability lesson gets learned once.
Scene 5, revisited: becoming unsafe takes effort
Fedify's defaults point the other way.
Signature verification is something you turn off (for tests), not something you remember to turn on.
The document loader refuses private address ranges and loopback out of the box, with DNS rebinding accounted for. To open yourself up to SSRF you have to flip an option whose very name announces it's for testing.
In a from-scratch implementation, you have to keep remembering to do things safely. In Fedify, the unsafe path is the one that takes deliberate effort. For a federated server, with its tangle of trust boundaries, that's the right way around.
Your stack stays your stack
โFine, but what if it doesn't fit our stack?โ Fedify was built to fit the stack you already have. There are thirteen web framework integrations: servers like Express, Hono, Fastify, Koa, NestJS, and Elysia, and meta-frameworks like Next.js, Nuxt, SvelteKit, Astro, SolidStart, and Fresh. Middleware handles content negotiation, so the same URL in your existing app serves HTML to browsers and JSON-LD to the fediverse.
Fedify doesn't dictate your database either. For its own storage it asks for one keyโvalue interface, with seven adapters available (Redis, PostgreSQL, MySQL/MariaDB, SQLite, Deno KV, Cloudflare Workers KV, in-memory). Message queues come in eight flavors (PostgreSQL, Redis, AMQP/RabbitMQ, and so on), and you can implement the interface yourself if none fits. Your domain data stays in whatever database and ORM you already use.
Already running federation on another library? There are migration guides with data migration scripts for moving from activitypub-express and friends without losing your existing followers.
The core isn't the ceiling, either. Higher-level packages build on it: @fedify/relay gives you a complete ActivityPub relay server in a single function call, and @fedify/backfill reconstructs incomplete conversation threads by walking the rest of the fediverse for you.
Tools for the whole development loop
A quieter misery of federated development has always been the missing tooling. Fedify comes with tools for every stage of the loop.
fedify init scaffolds a project in one line, and fedify tunnel exposes your local server over HTTPS so you can test against real Mastodon. Activities your server sends can be received by fedify inbox, a disposable inbox server spun up on the spot; whatever other servers publish, you can inspect with fedify lookup. My personal favorite is fedify lookup --authorized-fetch, which generates a one-off key pair and stands up a temporary ActivityPub server just to make a signed request for an object behind secure mode. The CLI is also useful to ActivityPub developers who don't use Fedify at all.
While you write code, an ActivityPub-specific linter (@fedify/lint) catches twenty kinds of interoperability bugs, like an actor missing its inbox. Tests run without the network using mocks from @fedify/testing. Once the server is up, attach the debug dashboard (@fedify/debugger) with one line and watch activities and signature verification results in your browser, live. In production there's built-in OpenTelemetry instrumentation (28 span types, 37 metrics) plus a monitoring guide, and when performance matters, fedify bench, a load-testing tool built for ActivityPub, catches regressions in CI.
As far as I know, no other ActivityPub framework ships even one of the tools in this section.
The documentation is part of the tooling. The official docs run to a thirty-chapter manual and five tutorials, and they go well past API listings. There's an operations chapter with ready-made PromQL queries and alerting rules for watching your queue backlog, and a field-guide chapter that documents de facto conventions, like which property makes your avatar show up in Mastodon, with screenshots. At two in the morning, when federation is broken and you don't know why, this is the difference between a bad night and a short one.
It's already running
Fedify is not a thought experiment. Ghost's ActivityPub service, mentioned above, is built on it. So are Encyclia, which bridges ORCID researcher records into the fediverse; SiliconBeest, running serverless on Cloudflare Workers; Typo Blue, a Korean blogging platform; Hollo, my own single-user microblogging platform; and Hackers' Pub, run by its community. Hollo, by the way, is the app from the beginning of this post: the project I once had to shelve, finished at last on the framework it forced into existence.
I didn't build Fedify to mint more ActivityPub experts. Rather the opposite. I believe the fediverse will only grow beyond microblogging when developers can build federated apps without knowing ActivityPub's fine print. Signature spec transitions and JSON-LD compaction are problems that belong inside a framework, not barriers in front of someone with a new idea.
Starting takes one line:
npm init @fedify
Follow the first tutorial and by the end, Mastodon can find your server. If you get stuck, come find us in the Matrix room or GitHub Discussions. See you in the fediverse.
Picture the moment your server sends its first Follow activity to Mastodon. You read the spec, built the JSON, signed the HTTP request, and POSTed it with care. What comes back is a single line: 401 Unauthorized. No body. No explanation.
What went wrong? Maybe the clock behind your Date header drifted a few minutes. Maybe the hash in your Digest header is off. Maybe you uppercased the (request-target) pseudo-header while building the signing string, or published your public key as PEM where the other side wanted multibase. The remote server won't tell you. So you start reading someone else's server code to debug your own.
I know, because I've been there. Fedify began as a casualty of another project. I set out to build a single-user microblogging server, the one that would later become Hollo, and started implementing ActivityPub from scratch. Somewhere between the signature specs and the JSON-LD, the protocol work swallowed the product, and I put the whole thing down. What I picked back up wasn't the app. It was the framework the app should have had. Fedify shipped first; only then could Hollo exist, built on top of it. (I've told this story at more length in A year with the fediverse.)
ActivityPub development gets hard in a few very specific places. In this post I want to walk through five of them, then show what each one looks like with Fedify. If you've spent time in the fediverse, you'll probably nod along. If you haven't, you may wonder why anyone would do all of this by hand. Either way, the conclusion is the same: nobody has to anymore.
Five scenes
Scene 1: there is more than one standard
ActivityPub servers authenticate each other with HTTP signatures. Except there isn't one signature spec. Most of the fediverse runs on draft-cavage-http-signatures-12, an expired draft that never became a standard. The actual standard exists too: RFC 9421, HTTP Message Signatures. The problem is that you can't know which one a given server accepts until you try.
A real-world implementation therefore has to sign with one spec, see whether it gets rejected, re-sign with the other, and remember per server which one worked so it can skip the dance next time. The fediverse calls this double-knocking. Yes, you get to implement it yourself.
That's still not the end. HTTP signatures only prove who sent a request. For situations like inbox forwarding, where you relay an activity you received to a third party, you need signatures that live on the document itself: Linked Data Signatures and Object Integrity Proofs. Four signature mechanisms in total, and two kinds of keys to manage: RSA and Ed25519.
Scene 2: one document, many shapes
ActivityPub's wire format is JSON-LD, and in JSON-LD the same document can take many shapes. This is easier to show than to explain. Here is a Create activity one server might send:
actor turned from a URI string into an inline object. to turned from a string into an array. object went the other way, from an inline object to a URI. Even the address that means โpublicโ has three valid spellings: https://www.w3.org/ns/activitystreams#Public, as:Public, and plain Public. Your parser has to accept every combination, and which one arrives depends on the sender's implementation.
The spec-compliant answer is to normalize every document with a JSON-LD processor, expansion followed by compaction. In practice many implementations treat it all as โjust JSONโ and quietly break on whatever shape some server happens to emit. Either way, you end up with defensive code smeared across the whole codebase: is this a string? An array? An object? A URI I have to fetch?
Scene 3: the zombie post
A user publishes a post, spots a typo, and deletes it right away. Your server sends a Create, then a Delete. Thanks to network weather, some receiving server gets the Delete first and the Create second. It ignores the deletion of a post that doesn't exist yet, then dutifully processes the creation of a post that was already deleted. That post now lives on that server forever, while its author believes it's gone.
Then there's scale. With five thousand followers, one post means thousands of HTTP deliveries. Do that inline in the request handler and your publish button takes half a minute to respond, or the server falls over. Fine, use a queue. Deliveries fail, so retry them. On what schedule? Exponential backoff. How many times? And is a 500 Internal Server Error the same kind of failure as a 410 Gone? When do you clean up three thousand followers on a server that no longer exists? Should you keep hammering a host that has been down for days?
At some point it dawns on you that this is no longer protocol implementation. It's distributed systems engineering.
Scene 4: it's not a spec, it's an ecosystem
Even perfect spec compliance doesn't buy you interoperability. A few examples from the field:
Mastodon's secure mode requires HTTP signatures on GET requests too (so-called authorized fetch). Now suppose both servers run in that mode. To fetch the other side's public key you must sign your request; to verify your signature, the other side must first fetch your key. Deadlock. The community's workaround is to sign with an โinstance actorโ that represents the server itself. You won't find that in the spec.
Threads can't parse activities whose actor is embedded as an inline object. When sending to Threads, the actor has to be a URI.
Lemmy silently rejects Group actors that lack fields Mastodon never asks for, such as a moderators collection linked via attributedTo and a featured collection.
Misskey carries vocabulary extensions of its own; quote posts alone go by three different property names across implementations.
The list keeps growing. Interoperability here is not something you finish once and stop thinking about. It's maintenance, forever.
Scene 5: insecure by default
Build it from scratch, and you start out wide open. Skip signature verification on incoming activities and anyone can inject a forged Follow or Delete. Leave the document loader unrestricted and a malicious activity can point it at http://169.254.169.254/ or your internal network, turning your server into an SSRF proxy. Skip origin checks on embedded objects and any server can hand out a document claiming โhere's what the Mastodon lead developer said.โ
What these traps share is that nothing happens when you fall into them. Everything appears to work. Until someone exploits it.
Ghost ran into this too
If you're thinking โsurely our team would manage,โ consider Ghost: a leading open-source publishing platform used by thousands of journalists and creators, and a team that set out to build its own ActivityPub support.
We can definitely attest to the problems that Fedify is working hard to solve, because even in just a few weeks of early prototyping we were running into the issues described above right away.
Ghost ended up building its ActivityPub layer on Fedify.
So I put all of it in a framework
Fedify is a TypeScript library for building federated server apps on ActivityPub and the standards around it. It runs on Deno, Node.js, and Bun, and supports edge runtimes like Cloudflare Workers. The design goal hasn't changed since the beginning: keep everything in those five scenes out of application code.
Here are the same five scenes again, this time with Fedify.
Scene 1, revisited: the signature war is the framework's job
Here is everything it takes to put one actor on the fediverse:
import { createFederation, generateCryptoKeyPair, MemoryKvStore } from "@fedify/fedify";import { Endpoints, Person } from "@fedify/vocab";const federation = createFederation<void>({ kv: new MemoryKvStore(), // Swap for Redis, PostgreSQL, etc. in production});federation .setActorDispatcher("/users/{identifier}", async (ctx, identifier) => { if (identifier !== "alice") return null; const keyPairs = await ctx.getActorKeyPairs(identifier); return new Person({ id: ctx.getActorUri(identifier), preferredUsername: identifier, name: "Alice", inbox: ctx.getInboxUri(identifier), endpoints: new Endpoints({ sharedInbox: ctx.getInboxUri() }), publicKey: keyPairs[0].cryptographicKey, assertionMethods: keyPairs.map((keyPair) => keyPair.multikey), }); }) .setKeyPairsDispatcher(async (ctx, identifier) => { // In real code you'd persist these in a database; this shows the gist return [await generateCryptoKeyPair()]; });
The moment this code runs:
Every outgoing request gets signed. With an RSA key, Fedify emits HTTP Signatures and Linked Data Signatures; add an Ed25519 key and it attaches Object Integrity Proofs as well. All four mechanisms coexist on a single activity, and each receiver verifies with the strongest one it understands.
Fedify does the double-knocking for you: first contact goes out as RFC 9421, a rejection triggers a draft-cavage retry, and the winning spec is cached per server. If the rejection carries an Accept-Signature challenge (RFC 9421 ยง5), Fedify reads it and re-signs with exactly the components the server asked for.
One bonus. Because you registered an actor dispatcher, you now have a WebFinger (RFC 7033) server, for free. Type @alice@example.com into Mastodon's search box and your actor comes up. You never wrote a line of WebFinger code.
Scene 2, revisited: types instead of JSON-LD
Fedify ships about eighty classes covering the whole Activity Vocabulary plus the major vendor extensions. The classes are typed and immutable, and their accessors absorb the shape differences that JSON-LD allows.
const actor = await ctx.lookupObject("@hongminhee@hollo.social");if (actor instanceof Person) { console.log(actor.name); // Safe whether it's a string or langString const followers = await actor.getFollowers(); // Fetches a URI, unwraps an object}
lookupObject() takes a handle and runs the whole chain for you, WebFinger discovery included. Accessors like getFollowers()behave the same way whether the value is a URI reference or an inline object, and fetched values are cached.
Vendor fragmentation gets stitched up here too. The three competing quote properties (quoteUri, _misskey_quote, quoteUrl) are unified behind one API, next to the emerging FEP-044fquote. Misskey's isCat property exists as a type, so your server can determine cat-ness with full type safety. It sounds like a joke, but a few dozen details of exactly this kind are what interoperability is actually made of.
Scene 3, revisited: the zombie post dies in one line
Delivery infrastructure first. Plug a message queue into createFederation() and delivery moves to the background, with automatic retries under exponential backoff (up to ten attempts by default). When a post goes to thousands of followers, two-stage fan-out kicks in: a single consolidated message enters the queue, and a background worker splits it into per-server delivery tasks. The publish button responds immediately.
Retries create a problem of their own: the same activity can arrive twice. Fedify keeps a 24-hour idempotence cache of processed activities, so duplicates get detected and skipped before they reach your handlers.
As for the zombie post, the fix is one option:
await ctx.sendActivity( { identifier: "alice" }, "followers", // Collects recipients from your followers collection deleteActivity, { orderingKey: post.id }, // Same key = in-order delivery per server);
Activities that share an orderingKey are delivered to each receiving server in the order they were sent. A Delete can no longer overtake its Create. Activities with different keys still go out in parallel, so throughput survives.
Fedify also handles dead servers. On a 404 Not Found or 410 Gone, it stops retrying and calls a handler you register. If the delivery went to a shared inbox, you also get the list of followers behind it, so you can prune vanished accounts on the spot. Hosts that fail repeatedly trip a per-host circuit breaker that holds deliveries and probes periodically until the host recovers. It's on by default; there's nothing to configure.
Scene 4, revisited: we track the quirks so you don't
Here is how Fedify disarms the traps from scene 4:
Authorized fetch: chain .authorize() onto a dispatcher and the verified identity of the requester lands in your callback. Blocklists, private collections, whatever your app needs is plain application logic. The instance-actor deadlock has a supported pattern as well.
Threads and inline actors: an activity transformer, enabled by default, rewrites inline actors into URIs on the way out. You don't need to know Threads has this problem.
Lemmy's requirements: the custom collection API exposes a moderators collection in a few lines, and Lemmy's JSON-LD context ships preloaded.
When a new quirk surfaces in the wild, the fix lands in Fedify, not in every application separately. Each interoperability lesson gets learned once.
Scene 5, revisited: becoming unsafe takes effort
Fedify's defaults point the other way.
Signature verification is something you turn off (for tests), not something you remember to turn on.
The document loader refuses private address ranges and loopback out of the box, with DNS rebinding accounted for. To open yourself up to SSRF you have to flip an option whose very name announces it's for testing.
In a from-scratch implementation, you have to keep remembering to do things safely. In Fedify, the unsafe path is the one that takes deliberate effort. For a federated server, with its tangle of trust boundaries, that's the right way around.
Your stack stays your stack
โFine, but what if it doesn't fit our stack?โ Fedify was built to fit the stack you already have. There are thirteen web framework integrations: servers like Express, Hono, Fastify, Koa, NestJS, and Elysia, and meta-frameworks like Next.js, Nuxt, SvelteKit, Astro, SolidStart, and Fresh. Middleware handles content negotiation, so the same URL in your existing app serves HTML to browsers and JSON-LD to the fediverse.
Fedify doesn't dictate your database either. For its own storage it asks for one keyโvalue interface, with seven adapters available (Redis, PostgreSQL, MySQL/MariaDB, SQLite, Deno KV, Cloudflare Workers KV, in-memory). Message queues come in eight flavors (PostgreSQL, Redis, AMQP/RabbitMQ, and so on), and you can implement the interface yourself if none fits. Your domain data stays in whatever database and ORM you already use.
Already running federation on another library? There are migration guides with data migration scripts for moving from activitypub-express and friends without losing your existing followers.
The core isn't the ceiling, either. Higher-level packages build on it: @fedify/relay gives you a complete ActivityPub relay server in a single function call, and @fedify/backfill reconstructs incomplete conversation threads by walking the rest of the fediverse for you.
Tools for the whole development loop
A quieter misery of federated development has always been the missing tooling. Fedify comes with tools for every stage of the loop.
fedify init scaffolds a project in one line, and fedify tunnel exposes your local server over HTTPS so you can test against real Mastodon. Activities your server sends can be received by fedify inbox, a disposable inbox server spun up on the spot; whatever other servers publish, you can inspect with fedify lookup. My personal favorite is fedify lookup --authorized-fetch, which generates a one-off key pair and stands up a temporary ActivityPub server just to make a signed request for an object behind secure mode. The CLI is also useful to ActivityPub developers who don't use Fedify at all.
While you write code, an ActivityPub-specific linter (@fedify/lint) catches twenty kinds of interoperability bugs, like an actor missing its inbox. Tests run without the network using mocks from @fedify/testing. Once the server is up, attach the debug dashboard (@fedify/debugger) with one line and watch activities and signature verification results in your browser, live. In production there's built-in OpenTelemetry instrumentation (28 span types, 37 metrics) plus a monitoring guide, and when performance matters, fedify bench, a load-testing tool built for ActivityPub, catches regressions in CI.
As far as I know, no other ActivityPub framework ships even one of the tools in this section.
The documentation is part of the tooling. The official docs run to a thirty-chapter manual and five tutorials, and they go well past API listings. There's an operations chapter with ready-made PromQL queries and alerting rules for watching your queue backlog, and a field-guide chapter that documents de facto conventions, like which property makes your avatar show up in Mastodon, with screenshots. At two in the morning, when federation is broken and you don't know why, this is the difference between a bad night and a short one.
It's already running
Fedify is not a thought experiment. Ghost's ActivityPub service, mentioned above, is built on it. So are Encyclia, which bridges ORCID researcher records into the fediverse; SiliconBeest, running serverless on Cloudflare Workers; Typo Blue, a Korean blogging platform; Hollo, my own single-user microblogging platform; and Hackers' Pub, run by its community. Hollo, by the way, is the app from the beginning of this post: the project I once had to shelve, finished at last on the framework it forced into existence.
I didn't build Fedify to mint more ActivityPub experts. Rather the opposite. I believe the fediverse will only grow beyond microblogging when developers can build federated apps without knowing ActivityPub's fine print. Signature spec transitions and JSON-LD compaction are problems that belong inside a framework, not barriers in front of someone with a new idea.
Starting takes one line:
npm init @fedify
Follow the first tutorial and by the end, Mastodon can find your server. If you get stuck, come find us in the Matrix room or GitHub Discussions. See you in the fediverse.
Picture the moment your server sends its first Follow activity to Mastodon. You read the spec, built the JSON, signed the HTTP request, and POSTed it with care. What comes back is a single line: 401 Unauthorized. No body. No explanation.
What went wrong? Maybe the clock behind your Date header drifted a few minutes. Maybe the hash in your Digest header is off. Maybe you uppercased the (request-target) pseudo-header while building the signing string, or published your public key as PEM where the other side wanted multibase. The remote server won't tell you. So you start reading someone else's server code to debug your own.
I know, because I've been there. Fedify began as a casualty of another project. I set out to build a single-user microblogging server, the one that would later become Hollo, and started implementing ActivityPub from scratch. Somewhere between the signature specs and the JSON-LD, the protocol work swallowed the product, and I put the whole thing down. What I picked back up wasn't the app. It was the framework the app should have had. Fedify shipped first; only then could Hollo exist, built on top of it. (I've told this story at more length in A year with the fediverse.)
ActivityPub development gets hard in a few very specific places. In this post I want to walk through five of them, then show what each one looks like with Fedify. If you've spent time in the fediverse, you'll probably nod along. If you haven't, you may wonder why anyone would do all of this by hand. Either way, the conclusion is the same: nobody has to anymore.
Five scenes
Scene 1: there is more than one standard
ActivityPub servers authenticate each other with HTTP signatures. Except there isn't one signature spec. Most of the fediverse runs on draft-cavage-http-signatures-12, an expired draft that never became a standard. The actual standard exists too: RFC 9421, HTTP Message Signatures. The problem is that you can't know which one a given server accepts until you try.
A real-world implementation therefore has to sign with one spec, see whether it gets rejected, re-sign with the other, and remember per server which one worked so it can skip the dance next time. The fediverse calls this double-knocking. Yes, you get to implement it yourself.
That's still not the end. HTTP signatures only prove who sent a request. For situations like inbox forwarding, where you relay an activity you received to a third party, you need signatures that live on the document itself: Linked Data Signatures and Object Integrity Proofs. Four signature mechanisms in total, and two kinds of keys to manage: RSA and Ed25519.
Scene 2: one document, many shapes
ActivityPub's wire format is JSON-LD, and in JSON-LD the same document can take many shapes. This is easier to show than to explain. Here is a Create activity one server might send:
actor turned from a URI string into an inline object. to turned from a string into an array. object went the other way, from an inline object to a URI. Even the address that means โpublicโ has three valid spellings: https://www.w3.org/ns/activitystreams#Public, as:Public, and plain Public. Your parser has to accept every combination, and which one arrives depends on the sender's implementation.
The spec-compliant answer is to normalize every document with a JSON-LD processor, expansion followed by compaction. In practice many implementations treat it all as โjust JSONโ and quietly break on whatever shape some server happens to emit. Either way, you end up with defensive code smeared across the whole codebase: is this a string? An array? An object? A URI I have to fetch?
Scene 3: the zombie post
A user publishes a post, spots a typo, and deletes it right away. Your server sends a Create, then a Delete. Thanks to network weather, some receiving server gets the Delete first and the Create second. It ignores the deletion of a post that doesn't exist yet, then dutifully processes the creation of a post that was already deleted. That post now lives on that server forever, while its author believes it's gone.
Then there's scale. With five thousand followers, one post means thousands of HTTP deliveries. Do that inline in the request handler and your publish button takes half a minute to respond, or the server falls over. Fine, use a queue. Deliveries fail, so retry them. On what schedule? Exponential backoff. How many times? And is a 500 Internal Server Error the same kind of failure as a 410 Gone? When do you clean up three thousand followers on a server that no longer exists? Should you keep hammering a host that has been down for days?
At some point it dawns on you that this is no longer protocol implementation. It's distributed systems engineering.
Scene 4: it's not a spec, it's an ecosystem
Even perfect spec compliance doesn't buy you interoperability. A few examples from the field:
Mastodon's secure mode requires HTTP signatures on GET requests too (so-called authorized fetch). Now suppose both servers run in that mode. To fetch the other side's public key you must sign your request; to verify your signature, the other side must first fetch your key. Deadlock. The community's workaround is to sign with an โinstance actorโ that represents the server itself. You won't find that in the spec.
Threads can't parse activities whose actor is embedded as an inline object. When sending to Threads, the actor has to be a URI.
Lemmy silently rejects Group actors that lack fields Mastodon never asks for, such as a moderators collection linked via attributedTo and a featured collection.
Misskey carries vocabulary extensions of its own; quote posts alone go by three different property names across implementations.
The list keeps growing. Interoperability here is not something you finish once and stop thinking about. It's maintenance, forever.
Scene 5: insecure by default
Build it from scratch, and you start out wide open. Skip signature verification on incoming activities and anyone can inject a forged Follow or Delete. Leave the document loader unrestricted and a malicious activity can point it at http://169.254.169.254/ or your internal network, turning your server into an SSRF proxy. Skip origin checks on embedded objects and any server can hand out a document claiming โhere's what the Mastodon lead developer said.โ
What these traps share is that nothing happens when you fall into them. Everything appears to work. Until someone exploits it.
Ghost ran into this too
If you're thinking โsurely our team would manage,โ consider Ghost: a leading open-source publishing platform used by thousands of journalists and creators, and a team that set out to build its own ActivityPub support.
We can definitely attest to the problems that Fedify is working hard to solve, because even in just a few weeks of early prototyping we were running into the issues described above right away.
Ghost ended up building its ActivityPub layer on Fedify.
So I put all of it in a framework
Fedify is a TypeScript library for building federated server apps on ActivityPub and the standards around it. It runs on Deno, Node.js, and Bun, and supports edge runtimes like Cloudflare Workers. The design goal hasn't changed since the beginning: keep everything in those five scenes out of application code.
Here are the same five scenes again, this time with Fedify.
Scene 1, revisited: the signature war is the framework's job
Here is everything it takes to put one actor on the fediverse:
import { createFederation, generateCryptoKeyPair, MemoryKvStore } from "@fedify/fedify";import { Endpoints, Person } from "@fedify/vocab";const federation = createFederation<void>({ kv: new MemoryKvStore(), // Swap for Redis, PostgreSQL, etc. in production});federation .setActorDispatcher("/users/{identifier}", async (ctx, identifier) => { if (identifier !== "alice") return null; const keyPairs = await ctx.getActorKeyPairs(identifier); return new Person({ id: ctx.getActorUri(identifier), preferredUsername: identifier, name: "Alice", inbox: ctx.getInboxUri(identifier), endpoints: new Endpoints({ sharedInbox: ctx.getInboxUri() }), publicKey: keyPairs[0].cryptographicKey, assertionMethods: keyPairs.map((keyPair) => keyPair.multikey), }); }) .setKeyPairsDispatcher(async (ctx, identifier) => { // In real code you'd persist these in a database; this shows the gist return [await generateCryptoKeyPair()]; });
The moment this code runs:
Every outgoing request gets signed. With an RSA key, Fedify emits HTTP Signatures and Linked Data Signatures; add an Ed25519 key and it attaches Object Integrity Proofs as well. All four mechanisms coexist on a single activity, and each receiver verifies with the strongest one it understands.
Fedify does the double-knocking for you: first contact goes out as RFC 9421, a rejection triggers a draft-cavage retry, and the winning spec is cached per server. If the rejection carries an Accept-Signature challenge (RFC 9421 ยง5), Fedify reads it and re-signs with exactly the components the server asked for.
One bonus. Because you registered an actor dispatcher, you now have a WebFinger (RFC 7033) server, for free. Type @alice@example.com into Mastodon's search box and your actor comes up. You never wrote a line of WebFinger code.
Scene 2, revisited: types instead of JSON-LD
Fedify ships about eighty classes covering the whole Activity Vocabulary plus the major vendor extensions. The classes are typed and immutable, and their accessors absorb the shape differences that JSON-LD allows.
const actor = await ctx.lookupObject("@hongminhee@hollo.social");if (actor instanceof Person) { console.log(actor.name); // Safe whether it's a string or langString const followers = await actor.getFollowers(); // Fetches a URI, unwraps an object}
lookupObject() takes a handle and runs the whole chain for you, WebFinger discovery included. Accessors like getFollowers()behave the same way whether the value is a URI reference or an inline object, and fetched values are cached.
Vendor fragmentation gets stitched up here too. The three competing quote properties (quoteUri, _misskey_quote, quoteUrl) are unified behind one API, next to the emerging FEP-044fquote. Misskey's isCat property exists as a type, so your server can determine cat-ness with full type safety. It sounds like a joke, but a few dozen details of exactly this kind are what interoperability is actually made of.
Scene 3, revisited: the zombie post dies in one line
Delivery infrastructure first. Plug a message queue into createFederation() and delivery moves to the background, with automatic retries under exponential backoff (up to ten attempts by default). When a post goes to thousands of followers, two-stage fan-out kicks in: a single consolidated message enters the queue, and a background worker splits it into per-server delivery tasks. The publish button responds immediately.
Retries create a problem of their own: the same activity can arrive twice. Fedify keeps a 24-hour idempotence cache of processed activities, so duplicates get detected and skipped before they reach your handlers.
As for the zombie post, the fix is one option:
await ctx.sendActivity( { identifier: "alice" }, "followers", // Collects recipients from your followers collection deleteActivity, { orderingKey: post.id }, // Same key = in-order delivery per server);
Activities that share an orderingKey are delivered to each receiving server in the order they were sent. A Delete can no longer overtake its Create. Activities with different keys still go out in parallel, so throughput survives.
Fedify also handles dead servers. On a 404 Not Found or 410 Gone, it stops retrying and calls a handler you register. If the delivery went to a shared inbox, you also get the list of followers behind it, so you can prune vanished accounts on the spot. Hosts that fail repeatedly trip a per-host circuit breaker that holds deliveries and probes periodically until the host recovers. It's on by default; there's nothing to configure.
Scene 4, revisited: we track the quirks so you don't
Here is how Fedify disarms the traps from scene 4:
Authorized fetch: chain .authorize() onto a dispatcher and the verified identity of the requester lands in your callback. Blocklists, private collections, whatever your app needs is plain application logic. The instance-actor deadlock has a supported pattern as well.
Threads and inline actors: an activity transformer, enabled by default, rewrites inline actors into URIs on the way out. You don't need to know Threads has this problem.
Lemmy's requirements: the custom collection API exposes a moderators collection in a few lines, and Lemmy's JSON-LD context ships preloaded.
When a new quirk surfaces in the wild, the fix lands in Fedify, not in every application separately. Each interoperability lesson gets learned once.
Scene 5, revisited: becoming unsafe takes effort
Fedify's defaults point the other way.
Signature verification is something you turn off (for tests), not something you remember to turn on.
The document loader refuses private address ranges and loopback out of the box, with DNS rebinding accounted for. To open yourself up to SSRF you have to flip an option whose very name announces it's for testing.
In a from-scratch implementation, you have to keep remembering to do things safely. In Fedify, the unsafe path is the one that takes deliberate effort. For a federated server, with its tangle of trust boundaries, that's the right way around.
Your stack stays your stack
โFine, but what if it doesn't fit our stack?โ Fedify was built to fit the stack you already have. There are thirteen web framework integrations: servers like Express, Hono, Fastify, Koa, NestJS, and Elysia, and meta-frameworks like Next.js, Nuxt, SvelteKit, Astro, SolidStart, and Fresh. Middleware handles content negotiation, so the same URL in your existing app serves HTML to browsers and JSON-LD to the fediverse.
Fedify doesn't dictate your database either. For its own storage it asks for one keyโvalue interface, with seven adapters available (Redis, PostgreSQL, MySQL/MariaDB, SQLite, Deno KV, Cloudflare Workers KV, in-memory). Message queues come in eight flavors (PostgreSQL, Redis, AMQP/RabbitMQ, and so on), and you can implement the interface yourself if none fits. Your domain data stays in whatever database and ORM you already use.
Already running federation on another library? There are migration guides with data migration scripts for moving from activitypub-express and friends without losing your existing followers.
The core isn't the ceiling, either. Higher-level packages build on it: @fedify/relay gives you a complete ActivityPub relay server in a single function call, and @fedify/backfill reconstructs incomplete conversation threads by walking the rest of the fediverse for you.
Tools for the whole development loop
A quieter misery of federated development has always been the missing tooling. Fedify comes with tools for every stage of the loop.
fedify init scaffolds a project in one line, and fedify tunnel exposes your local server over HTTPS so you can test against real Mastodon. Activities your server sends can be received by fedify inbox, a disposable inbox server spun up on the spot; whatever other servers publish, you can inspect with fedify lookup. My personal favorite is fedify lookup --authorized-fetch, which generates a one-off key pair and stands up a temporary ActivityPub server just to make a signed request for an object behind secure mode. The CLI is also useful to ActivityPub developers who don't use Fedify at all.
While you write code, an ActivityPub-specific linter (@fedify/lint) catches twenty kinds of interoperability bugs, like an actor missing its inbox. Tests run without the network using mocks from @fedify/testing. Once the server is up, attach the debug dashboard (@fedify/debugger) with one line and watch activities and signature verification results in your browser, live. In production there's built-in OpenTelemetry instrumentation (28 span types, 37 metrics) plus a monitoring guide, and when performance matters, fedify bench, a load-testing tool built for ActivityPub, catches regressions in CI.
As far as I know, no other ActivityPub framework ships even one of the tools in this section.
The documentation is part of the tooling. The official docs run to a thirty-chapter manual and five tutorials, and they go well past API listings. There's an operations chapter with ready-made PromQL queries and alerting rules for watching your queue backlog, and a field-guide chapter that documents de facto conventions, like which property makes your avatar show up in Mastodon, with screenshots. At two in the morning, when federation is broken and you don't know why, this is the difference between a bad night and a short one.
It's already running
Fedify is not a thought experiment. Ghost's ActivityPub service, mentioned above, is built on it. So are Encyclia, which bridges ORCID researcher records into the fediverse; SiliconBeest, running serverless on Cloudflare Workers; Typo Blue, a Korean blogging platform; Hollo, my own single-user microblogging platform; and Hackers' Pub, run by its community. Hollo, by the way, is the app from the beginning of this post: the project I once had to shelve, finished at last on the framework it forced into existence.
I didn't build Fedify to mint more ActivityPub experts. Rather the opposite. I believe the fediverse will only grow beyond microblogging when developers can build federated apps without knowing ActivityPub's fine print. Signature spec transitions and JSON-LD compaction are problems that belong inside a framework, not barriers in front of someone with a new idea.
Starting takes one line:
npm init @fedify
Follow the first tutorial and by the end, Mastodon can find your server. If you get stuck, come find us in the Matrix room or GitHub Discussions. See you in the fediverse.
Considering the #TagsPub mess and the fact that it's made by a co-creator of the #ActivityPub protocol: is AP fundamentally incapable of doing consent by default and if so, how to replace it by a private-by-default protocol where every interaction must be authorized by all parts?
The Interledger Foundation @Interledger has an open funding call for libraries implementing #RFC9421 (HTTP Signature). This is crucial infrastructure for #ActivityPub. Go get that money!
The Interledger Foundation @Interledger has an open funding call for libraries implementing #RFC9421 (HTTP Signature). This is crucial infrastructure for #ActivityPub. Go get that money!
What do we think of anonymous ActivityPub actors? Like, you know how on some sites you can enter your name and post a (likely moderated) comment on a post without logging in. Would it make sense to have the site create an temporary/anonymous actor for that person so if someone fetches replies on your post they can see everything?
Support FEP-2c59: Discovery of a Webfinger address from an ActivityPub actor.
Support ActivityPub Update activities for actor profile changes.
Fixed
Disambiguate reblog IDs from status IDs. (fixes #151)
Correct the quote_policy mapping to public/nobody values.
Ignore malformed pagination parameters instead of raising.
Treat "cannot be reconnected" errors as connection failures.
Infer a media attachment's type when mediaType is missing.
Faster, case-insensitive, actor username lookups.
Faster statuses_count using an approximate count.
Changed
Resolve JSON-LD contexts by matching their digest against a bundled copy.
The first version of algorithmic feeds won't be very algorithmicโit will let you create a feed that filters by keywords, hashtags, and mentions. That covers a lot of ground for me personally, and lays the groundwork for future enhancements.
Support FEP-2c59: Discovery of a Webfinger address from an ActivityPub actor.
Support ActivityPub Update activities for actor profile changes.
Fixed
Disambiguate reblog IDs from status IDs. (fixes #151)
Correct the quote_policy mapping to public/nobody values.
Ignore malformed pagination parameters instead of raising.
Treat "cannot be reconnected" errors as connection failures.
Infer a media attachment's type when mediaType is missing.
Faster, case-insensitive, actor username lookups.
Faster statuses_count using an approximate count.
Changed
Resolve JSON-LD contexts by matching their digest against a bundled copy.
The first version of algorithmic feeds won't be very algorithmicโit will let you create a feed that filters by keywords, hashtags, and mentions. That covers a lot of ground for me personally, and lays the groundwork for future enhancements.
What do we think of anonymous ActivityPub actors? Like, you know how on some sites you can enter your name and post a (likely moderated) comment on a post without logging in. Would it make sense to have the site create an temporary/anonymous actor for that person so if someone fetches replies on your post they can see everything?
Was your previous domain location conf.tube perhaps? If so, on conf.tube were the videos of the #ActivityPub 2020 conference, which I cannot find on the new #Peertube location.
#activitypub (or better: #fediverse) question: is there some platform that would allow me to do this?
For my blog, I'd like some comment functionality that's better than what I have: a link to a fedi post. I'd love to have the post and its responses in an #iframe within that blog post page. Ideally with the option for some custom styling so it could fit into the blog page.
Does something like that exist?
I'm not a webdev, and I don't know a lot about CORS and other things that could prevent this, that's why I'm asking here. I think this would be a cool way to integrate fedi into other contexts where it makes sense, without specialized plugins etc.
#activitypub (or better: #fediverse) question: is there some platform that would allow me to do this?
For my blog, I'd like some comment functionality that's better than what I have: a link to a fedi post. I'd love to have the post and its responses in an #iframe within that blog post page. Ideally with the option for some custom styling so it could fit into the blog page.
Does something like that exist?
I'm not a webdev, and I don't know a lot about CORS and other things that could prevent this, that's why I'm asking here. I think this would be a cool way to integrate fedi into other contexts where it makes sense, without specialized plugins etc.
my opinions about how activitypub c2s ought to be implemented, probably with way too much snark for anyone to take it seriously. wrote pretty much all of it at like 1 am so expect the writing to not be great. will prolly regret it tomorrow but eh. whatever
Was your previous domain location conf.tube perhaps? If so, on conf.tube were the videos of the #ActivityPub 2020 conference, which I cannot find on the new #Peertube location.
@helenfernanda Extrapola o escopo do Mastodon. Tem que ser parte da especificaรงรฃo do #ActivityPub. Todos os navegadores deveriam adotar e os aplicativos tambรฉm.
Depois, vou tentar conversar com o @evan sobre isso.
@julia Eu tava bisbilhotando um novo usuรกrio no Mastodon e percebi que quando ele clica no link pra outra instรขncia, ele tenta fazer login e dรก senha errada. Aรญ ele me avisa que tinha acabado de confirmar o e-mail e criar a senha e mesmo assim nรฃo conseguia entrar.
Foi aรญ que eu percebi que ele tava no domรญnio errado e que ele precisava usar a busca da sua prรณpria instรขncia pra acessar o link que ele queria (link pra uma postagem).
Isso รฉ um pouco difรญcil de explicar e รฉ uma barreira enorme para novos usuรกrios.
Eu atรฉ tentei conversar sobre um link especรญfico do #ActivityPub, mas ninguรฉm deu a devida atenรงรฃo. O ideal รฉ que todo link pra dentro do Fediverso comeรงasse com activitypub:// e o aplicativo principal da pessoa se virava pra traduzir isso.
I can now publish from my #wordpress blog to my existing #Bluesky account using #ATmosphere plugin. Replies to the Bluesky post turn up as comments on the original.
I would love to do this with #Mastodon too but the #ActivityPub plugin creates a new Mastodon profile, basically turning your website into an instance. There seems no way to link my blog to my existing Mastodon account.
It's a real shame to see this implemented for Bluesky but not Mastodon.
Was your previous domain location conf.tube perhaps? If so, on conf.tube were the videos of the #ActivityPub 2020 conference, which I cannot find on the new #Peertube location.
I can now publish from my #wordpress blog to my existing #Bluesky account using #ATmosphere plugin. Replies to the Bluesky post turn up as comments on the original.
I would love to do this with #Mastodon too but the #ActivityPub plugin creates a new Mastodon profile, basically turning your website into an instance. There seems no way to link my blog to my existing Mastodon account.
It's a real shame to see this implemented for Bluesky but not Mastodon.
This week, we map the visual layer of the fediverse with current numbers (June 2026): Pixelfed, Loops, PeerTube, and ... Flickr?
Pixelfed: ~100K MAU across 700 servers. @dansup has been building it for eight years, mostly alone, turning down VC offers and funding it through a Kickstarter that raised CA$138K for a nonprofit foundation.
Loops: federated short-form video, also by dansup. mid-4,000s MAU, 26 servers. opt-in algorithmic feed (the default is chronological), trust-score moderation, no AI training on user content.
PeerTube: 47K MAU across 1,500+ servers. Framasoft (French nonprofit). the most infrastructure-heavy platform on the fediverse.
The visual web is the most expensive layer of the internet to decentralize. None of this was built on venture-scale economics.
A hand holding a smartphone displaying a social media feed, with glowing photo thumbnails lifting off the screen and floating into a starfield. Warm amber frames and teal highlights against a dark blue background.
This week, we map the visual layer of the fediverse with current numbers (June 2026): Pixelfed, Loops, PeerTube, and ... Flickr?
Pixelfed: ~100K MAU across 700 servers. @dansup has been building it for eight years, mostly alone, turning down VC offers and funding it through a Kickstarter that raised CA$138K for a nonprofit foundation.
Loops: federated short-form video, also by dansup. mid-4,000s MAU, 26 servers. opt-in algorithmic feed (the default is chronological), trust-score moderation, no AI training on user content.
PeerTube: 47K MAU across 1,500+ servers. Framasoft (French nonprofit). the most infrastructure-heavy platform on the fediverse.
The visual web is the most expensive layer of the internet to decentralize. None of this was built on venture-scale economics.
A hand holding a smartphone displaying a social media feed, with glowing photo thumbnails lifting off the screen and floating into a starfield. Warm amber frames and teal highlights against a dark blue background.
This week, we map the visual layer of the fediverse with current numbers (June 2026): Pixelfed, Loops, PeerTube, and ... Flickr?
Pixelfed: ~100K MAU across 700 servers. @dansup has been building it for eight years, mostly alone, turning down VC offers and funding it through a Kickstarter that raised CA$138K for a nonprofit foundation.
Loops: federated short-form video, also by dansup. mid-4,000s MAU, 26 servers. opt-in algorithmic feed (the default is chronological), trust-score moderation, no AI training on user content.
PeerTube: 47K MAU across 1,500+ servers. Framasoft (French nonprofit). the most infrastructure-heavy platform on the fediverse.
The visual web is the most expensive layer of the internet to decentralize. None of this was built on venture-scale economics.
A hand holding a smartphone displaying a social media feed, with glowing photo thumbnails lifting off the screen and floating into a starfield. Warm amber frames and teal highlights against a dark blue background.
experimenting with running an Enigma1/2 #bbs again. From what I can see it now can federate via #activitypub, but the whole thing is a bit experimental. I managed to post something, I just can't seem to find it from my main account.
experimenting with running an Enigma1/2 #bbs again. From what I can see it now can federate via #activitypub, but the whole thing is a bit experimental. I managed to post something, I just can't seem to find it from my main account.
@maxleibman I think your point about competing for follows is interesting. I don't think it's usually the direction things work, though. People usually follow topics they are interested in, via hashtag feeds, *then* follow people they found from that hashtag.
If people do decide to follow a hashtag rather than a person, though, that seems like it's OK? If someone decided they wanted to follow #ActivityPub instead of following me, for whatever reason, that seems like it's up to them.
@teohhanhui I've been playing with #activitypub ideas in https://codeberg.org/cmars/medina recently (very incomplete and slightly incoherent rough sketch). I had this idea of a hub or relay where the identities are moderated but the clients own their keys and data in a portable #sqlite db which could be hosted by an instance or relayed. Exploring that balance between moderation and autonomy. I'm also testing some of these ideas with #veilid in another project that I haven't shared yet.
Looks like you're using #iroh which I haven't tried yet. It's hard for me to commit to side-projects right now, but very interested to see how your project goes!
This is a bit of a long shot, but I'm looking for a collaborator to build something together. (It's just a hobby project that will NEVER be commercialized or monetized. I'm a jobless programmer and I just need to code shit.)
@teohhanhui I've been playing with #activitypub ideas in https://codeberg.org/cmars/medina recently (very incomplete and slightly incoherent rough sketch). I had this idea of a hub or relay where the identities are moderated but the clients own their keys and data in a portable #sqlite db which could be hosted by an instance or relayed. Exploring that balance between moderation and autonomy. I'm also testing some of these ideas with #veilid in another project that I haven't shared yet.
Looks like you're using #iroh which I haven't tried yet. It's hard for me to commit to side-projects right now, but very interested to see how your project goes!
This is a bit of a long shot, but I'm looking for a collaborator to build something together. (It's just a hobby project that will NEVER be commercialized or monetized. I'm a jobless programmer and I just need to code shit.)
I've been poking around various #ActivityPub projects and one thing led to another - I realised there's not great JSON-LD support (at least, v1.1) in the .NET world. The most popular package works (for v1.0), but is roughly ported from Java, which was roughly ported from JS. It also has a dep on NewtonsoftJson.
All of which is to say I've started work on a .NET library for JSON-LD because life didn't have enough hassle in it ๐ v0.1 will only cover some of the spec - but should prove useful. It'll use `System.Text.Json`. I'll post updates here as I go.
#HolosSocial lets you run your own #ActivityPub server on your device. The goal is to let everyone using AP with a phone or a computer reach full independence, through custom domains and by hosting your media on your own cloud. This is not a hack of AP (as I have read), everything stays within the spec. The project simply lets you be fully independent. You can reach full independence step by step. And #E2EE DMs already work through AP.
#HolosSocial lets you run your own #ActivityPub server on your device. The goal is to let everyone using AP with a phone or a computer reach full independence, through custom domains and by hosting your media on your own cloud. This is not a hack of AP (as I have read), everything stays within the spec. The project simply lets you be fully independent. You can reach full independence step by step. And #E2EE DMs already work through AP.
#HolosSocial lets you run your own #ActivityPub server on your device. The goal is to let everyone using AP with a phone or a computer reach full independence, through custom domains and by hosting your media on your own cloud. This is not a hack of AP (as I have read), everything stays within the spec. The project simply lets you be fully independent. You can reach full independence step by step. And #E2EE DMs already work through AP.
#HolosSocial lets you run your own #ActivityPub server on your device. The goal is to let everyone using AP with a phone or a computer reach full independence, through custom domains and by hosting your media on your own cloud. This is not a hack of AP (as I have read), everything stays within the spec. The project simply lets you be fully independent. You can reach full independence step by step. And #E2EE DMs already work through AP.
#HolosSocial lets you run your own #ActivityPub server on your device. The goal is to let everyone using AP with a phone or a computer reach full independence, through custom domains and by hosting your media on your own cloud. This is not a hack of AP (as I have read), everything stays within the spec. The project simply lets you be fully independent. You can reach full independence step by step. And #E2EE DMs already work through AP.
Bluesky is working on a new Communities feature for ATProto. At the same time, the #SocialCG at the W3C is working on Groups features for #ActivityPub.
It would be a missed opportunity if we used wildly different architectural patterns that made bridging the two models impossible.
I opened up an issue on our GitHub repo to discuss how we can minimise that:
A few #ActivityPub questions I am hoping someone can answer for me:
How good is the support for Ed25519 keys and signatures across the Fediverse? What happens if my instance only does Ed25519 signing and another instance does not support it? What if I try to make an Authorized Fetch signed with Ed25519?
Can I use the same key pair for all users on my instance?
Is there a functional difference between using an instance actor or the admin user for Authorized Fetch signatures?
If I don't want to implement an Outbox (since it seems like the Fediverse has moved away from it), does my endpoint for it still need to exist?
What is the worst thing a bad actor could do if my account's private key is compromised?
A few #ActivityPub questions I am hoping someone can answer for me:
How good is the support for Ed25519 keys and signatures across the Fediverse? What happens if my instance only does Ed25519 signing and another instance does not support it? What if I try to make an Authorized Fetch signed with Ed25519?
Can I use the same key pair for all users on my instance?
Is there a functional difference between using an instance actor or the admin user for Authorized Fetch signatures?
If I don't want to implement an Outbox (since it seems like the Fediverse has moved away from it), does my endpoint for it still need to exist?
What is the worst thing a bad actor could do if my account's private key is compromised?
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
A few #ActivityPub questions I am hoping someone can answer for me:
How good is the support for Ed25519 keys and signatures across the Fediverse? What happens if my instance only does Ed25519 signing and another instance does not support it? What if I try to make an Authorized Fetch signed with Ed25519?
Can I use the same key pair for all users on my instance?
Is there a functional difference between using an instance actor or the admin user for Authorized Fetch signatures?
If I don't want to implement an Outbox (since it seems like the Fediverse has moved away from it), does my endpoint for it still need to exist?
What is the worst thing a bad actor could do if my account's private key is compromised?
Bluesky is working on a new Communities feature for ATProto. At the same time, the #SocialCG at the W3C is working on Groups features for #ActivityPub.
It would be a missed opportunity if we used wildly different architectural patterns that made bridging the two models impossible.
I opened up an issue on our GitHub repo to discuss how we can minimise that:
Bluesky is working on a new Communities feature for ATProto. At the same time, the #SocialCG at the W3C is working on Groups features for #ActivityPub.
It would be a missed opportunity if we used wildly different architectural patterns that made bridging the two models impossible.
I opened up an issue on our GitHub repo to discuss how we can minimise that:
It is said that there are only two hard things in computer science: cache invalidation and naming things. The story goes: you have something that is expensive to compute, so you compute it once and then you cache it and use the cached value in the future. But the inputs to that computation change, and so the cached value grows stale. You have to decide when and how to recompute that value.
In Ktistec, presenting accurate tag counts is expensive because not every tagged post counts. Posts are deleted, actors are blocked. My own drafts don't count, but when they're published they do. A post tagged with the same hashtag more than once, must count as one. And tag cardinality is not uniform: #3dprinting has hundreds of thousands of posts, others have one or two. Even with indexes, there is no single query that counts all cases in an acceptable amount of time.
So I reached for a cache, counted once and then cached the count. Because I didn't want to maintain adjustments from every place in the code that changed something that touched the count, I settled for eventual consistency and recomputed counts after every server restart.
As it turns out, that's not good enough. On a server with reasonable traffic, an event that affects some tag's count happens every few hours. Days or weeks later there is significant drift. Worse, the implementation didn't recompute on first read, it recomputed on first write (a new tagged object arrives).
This release fixes all that. Counts are still eventually consistent, but all counts are recomputed in a regular background task, so they really are eventually consistent, and care was taken in constructing the query to minimize database (read) locking to ~100-200msec.
Is it better? Yes! Is it perfect? Probably not. Cache invalidation is hard.
Here's the full changelog for this release:
Added
Background task to reconcile tag statistics.
Fixed
Prevent model hook callbacks from interleaving.
Add spacing between content and the sticky footer.
Changed
Replace Semantic UI with Fomantic UI.
Cache the PURL and GoToSocial JSON-LD contexts.
Reduce database lock time when reconciling tags.
Block npm dependency install scripts.
Removed
The unused idx_relationships_type database index.
In the next release, I'm going to fix a few bugs in the Mastodon-compatible API. These require an internal redesign, so I've held off until a few other things were out of the way. And I'm turning my attention to reading and better tools for surfacing and finding interesting content.
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
It feels like an #ActivityPub#relay exclusively for solo-user instances might be a nice idea. Does that sound silly? A more manageable / predictable flow of activity and less chance of spam / bumf.
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
It is said that there are only two hard things in computer science: cache invalidation and naming things. The story goes: you have something that is expensive to compute, so you compute it once and then you cache it and use the cached value in the future. But the inputs to that computation change, and so the cached value grows stale. You have to decide when and how to recompute that value.
In Ktistec, presenting accurate tag counts is expensive because not every tagged post counts. Posts are deleted, actors are blocked. My own drafts don't count, but when they're published they do. A post tagged with the same hashtag more than once, must count as one. And tag cardinality is not uniform: #3dprinting has hundreds of thousands of posts, others have one or two. Even with indexes, there is no single query that counts all cases in an acceptable amount of time.
So I reached for a cache, counted once and then cached the count. Because I didn't want to maintain adjustments from every place in the code that changed something that touched the count, I settled for eventual consistency and recomputed counts after every server restart.
As it turns out, that's not good enough. On a server with reasonable traffic, an event that affects some tag's count happens every few hours. Days or weeks later there is significant drift. Worse, the implementation didn't recompute on first read, it recomputed on first write (a new tagged object arrives).
This release fixes all that. Counts are still eventually consistent, but all counts are recomputed in a regular background task, so they really are eventually consistent, and care was taken in constructing the query to minimize database (read) locking to ~100-200msec.
Is it better? Yes! Is it perfect? Probably not. Cache invalidation is hard.
Here's the full changelog for this release:
Added
Background task to reconcile tag statistics.
Fixed
Prevent model hook callbacks from interleaving.
Add spacing between content and the sticky footer.
Changed
Replace Semantic UI with Fomantic UI.
Cache the PURL and GoToSocial JSON-LD contexts.
Reduce database lock time when reconciling tags.
Block npm dependency install scripts.
Removed
The unused idx_relationships_type database index.
In the next release, I'm going to fix a few bugs in the Mastodon-compatible API. These require an internal redesign, so I've held off until a few other things were out of the way. And I'm turning my attention to reading and better tools for surfacing and finding interesting content.
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
Starting on FEP-ef61 (Portable Objects) in @fedify. It's a @sovtechfund milestone due September 30, and the scope isโฆ substantial. Not a lot of runway. Wish me luck.
@internetarchive@mastodon.archive.org ยท Reply to internetarchive
3/3 Participants will take part in talks, workshops, and hands-on collaboration exploring what a more resilient, open, and decentralised web could look like in practice.
DWeb Camp is a space for building, not just talking about, the web we want.
A large group of DWeb Camp attendees seated in a circle on a patterned rug inside a white open-sided tent, engaged in a structured group discussion, with a flipchart easel and sunny outdoor landscape visible behind them.
ALT text
DWeb Camp attendees relaxing and conversing in inflatable lounge chairs among tall redwood trees, with teal paper lanterns strung overhead and a hammock visible in the background.
@js@dave side note: I don't know if you're aware of what an important tool browser.pub is. I use it almost every day in standards work. Talking with ActivityPub developers, they will pull up browser.pub to show examples of their activities. It's really important to the #activitypub community.
@js@dave side note: I don't know if you're aware of what an important tool browser.pub is. I use it almost every day in standards work. Talking with ActivityPub developers, they will pull up browser.pub to show examples of their activities. It's really important to the #activitypub community.
@js@dave side note: I don't know if you're aware of what an important tool browser.pub is. I use it almost every day in standards work. Talking with ActivityPub developers, they will pull up browser.pub to show examples of their activities. It's really important to the #activitypub community.
Feeling reckless in my heat-induced, sleep-deprived state. I upgraded to the latest GoToSocial release candidate that adds support for #ActivityPub relay servers, and added a couple to push to, and one to ingest. Might wake up (if sleep comes, that is!) to a full VPS, but we'll see!
@internetarchive@mastodon.archive.org ยท Reply to internetarchive
3/3 Participants will take part in talks, workshops, and hands-on collaboration exploring what a more resilient, open, and decentralised web could look like in practice.
DWeb Camp is a space for building, not just talking about, the web we want.
A large group of DWeb Camp attendees seated in a circle on a patterned rug inside a white open-sided tent, engaged in a structured group discussion, with a flipchart easel and sunny outdoor landscape visible behind them.
ALT text
DWeb Camp attendees relaxing and conversing in inflatable lounge chairs among tall redwood trees, with teal paper lanterns strung overhead and a hammock visible in the background.
Do you think there is still a room for Prismo in fediverse? We have couple of amazing projects already, doing something similar or much more (lemmy and piefed as an examples). Would love to hear your thoughts in the comments!
Dug into the ActivityPub platforms beyond Mastodon with current FediDB numbers (June 2026): Misskey and its fork family, Pleroma and Akkoma, Friendica, GoToSocial, and the Threadiverse.
Misskey's custom emoji culture runs deeper than it sounds. Instances maintain hand-drawn reaction libraries that federate across the network. The closest analogue is early Slack workspace emoji culture, but federated.
Friendica has been federating since 2010 via its own DFRN protocol, Diaspora*, and OStatus. It added ActivityPub in 2019, consistent with its core goal of bridging every federation protocol it can reach.
GoToSocial exists for people who want a personal fediverse presence but find Mastodon too heavy to self-host. 250MB RAM, SQLite, no web client of its own. Runs on a Raspberry Pi.
Part 1 of the "Fediverse beyond Mastodon" series. Part 2 covers the visual fediverse: Pixelfed, Loops, and PeerTube.
Abstract digital art on a dark navy background showing a radial burst of colorful geometric shapes and particles in mint green, coral red, amber, and teal. Scattered sticker-like elements suggest emoji reactions and expressive digital culture. Federated Mind brain logo watermark in the bottom right corner.
Dug into the ActivityPub platforms beyond Mastodon with current FediDB numbers (June 2026): Misskey and its fork family, Pleroma and Akkoma, Friendica, GoToSocial, and the Threadiverse.
Misskey's custom emoji culture runs deeper than it sounds. Instances maintain hand-drawn reaction libraries that federate across the network. The closest analogue is early Slack workspace emoji culture, but federated.
Friendica has been federating since 2010 via its own DFRN protocol, Diaspora*, and OStatus. It added ActivityPub in 2019, consistent with its core goal of bridging every federation protocol it can reach.
Part 1 of the "Fediverse Beyond Mastodon" series inside the greater "Exploring the Fediverse" series. Part 2 will cover the visual fediverse: Pixelfed, Loops, and PeerTube.
Abstract digital art on a dark navy background showing a radial burst of colorful geometric shapes and particles in mint green, coral red, amber, and teal. Scattered sticker-like elements suggest emoji reactions and expressive digital culture. Federated Mind brain logo watermark in the bottom right corner.
Dug into the ActivityPub platforms beyond Mastodon with current FediDB numbers (June 2026): Misskey and its fork family, Pleroma and Akkoma, Friendica, GoToSocial, and the Threadiverse.
Misskey's custom emoji culture runs deeper than it sounds. Instances maintain hand-drawn reaction libraries that federate across the network. The closest analogue is early Slack workspace emoji culture, but federated.
Friendica has been federating since 2010 via its own DFRN protocol, Diaspora*, and OStatus. It added ActivityPub in 2019, consistent with its core goal of bridging every federation protocol it can reach.
GoToSocial exists for people who want a personal fediverse presence but find Mastodon too heavy to self-host. 250MB RAM, SQLite, no web client of its own. Runs on a Raspberry Pi.
Part 1 of the "Fediverse beyond Mastodon" series. Part 2 covers the visual fediverse: Pixelfed, Loops, and PeerTube.
Abstract digital art on a dark navy background showing a radial burst of colorful geometric shapes and particles in mint green, coral red, amber, and teal. Scattered sticker-like elements suggest emoji reactions and expressive digital culture. Federated Mind brain logo watermark in the bottom right corner.
Do you think there is still a room for Prismo in fediverse? We have couple of amazing projects already, doing something similar or much more (lemmy and piefed as an examples). Would love to hear your thoughts in the comments!
Do you think there is still a room for Prismo in fediverse? We have couple of amazing projects already, doing something similar or much more (lemmy and piefed as an examples). Would love to hear your thoughts in the comments!
I have tried every way I can to establish a private instance for all of my #fediverse and #socialnetworking needs. I've tried Hubzilla, GNUSocial, and Friendica, but maintaining the cost of a virtual private server isn't justifiable to me and those apps don't play well with shared hosting, which is all I can afford right now (and I don't have the space to set up a personal server).
The fact of the matter is that the only self-hosted application that checks the boxes of being a) dead simple to install on shared hosting--preferably through Softaculous since I just don't feel like jumping through hoops, b) well-supported, c) easy to use, and d) able to connect with both ActivityPub and AT protocols is WordPress, which I am reluctant to use because Matt Mullenweg is a pretty detestable as a human.
That said, I am holding my nose and using WordPress as my social networking hub until and unless something that isn't tainted with Mullenweg's nonsense comes along, so here I be.
I am rebuilding my profile and follow lists, and I apologize to those of you who seem to get a new follow request from me every other day, but I plan on this being the last time until the unlikely WordPress-killer comes around.
I have tried every way I can to establish a private instance for all of my #fediverse and #socialnetworking needs. I've tried Hubzilla, GNUSocial, and Friendica, but maintaining the cost of a virtual private server isn't justifiable to me and those apps don't play well with shared hosting, which is all I can afford right now (and I don't have the space to set up a personal server).
The fact of the matter is that the only self-hosted application that checks the boxes of being a) dead simple to install on shared hosting--preferably through Softaculous since I just don't feel like jumping through hoops, b) well-supported, c) easy to use, and d) able to connect with both ActivityPub and AT protocols is WordPress, which I am reluctant to use because Matt Mullenweg is a pretty detestable as a human.
That said, I am holding my nose and using WordPress as my social networking hub until and unless something that isn't tainted with Mullenweg's nonsense comes along, so here I be.
I am rebuilding my profile and follow lists, and I apologize to those of you who seem to get a new follow request from me every other day, but I plan on this being the last time until the unlikely WordPress-killer comes around.
Do you think there is still a room for Prismo in fediverse? We have couple of amazing projects already, doing something similar or much more (lemmy and piefed as an examples). Would love to hear your thoughts in the comments!
Summer is here, and sadly it is peak season for pet abandonment. #PawFed is a federated map for animal welfare built on #ActivityPub and #OSM.
It already shows shelters and vets near you. Found an abandoned animal or need help? Mention @PawFed from any #Fediverse account: a pin lands on the map, and your call is relayed across the #Fediverse, whatever your instance.
Summer is here, and sadly it is peak season for pet abandonment. #PawFed is a federated map for animal welfare built on #ActivityPub and #OSM.
It already shows shelters and vets near you. Found an abandoned animal or need help? Mention @PawFed from any #Fediverse account: a pin lands on the map, and your call is relayed across the #Fediverse, whatever your instance.
Summer is here, and sadly it is peak season for pet abandonment. #PawFed is a federated map for animal welfare built on #ActivityPub and #OSM.
It already shows shelters and vets near you. Found an abandoned animal or need help? Mention @PawFed from any #Fediverse account: a pin lands on the map, and your call is relayed across the #Fediverse, whatever your instance.
Summer is here, and sadly it is peak season for pet abandonment. #PawFed is a federated map for animal welfare built on #ActivityPub and #OSM.
It already shows shelters and vets near you. Found an abandoned animal or need help? Mention @PawFed from any #Fediverse account: a pin lands on the map, and your call is relayed across the #Fediverse, whatever your instance.
@js Hey, is this doing what you want? (It's not doing what I want, but you and I might have different opinions.) The followers collection for this (every?) podcast is an empty document. #ActivityPub#PodcastIndex
I wonder if the task is too easy or to heavy to (most) publishers:
Independent Media: Just use this wonderful protocol here #ActivityPub to create your own plattforms, audience and possibilities. It is completely open. It supports multilanguage and Linked Data for all the wonderful agency / editors vocabularies. In digital times it is by far not enough to create words only. You need to create the surface too. About the possibilities of ActivityPub don't hesitate, AMA
Whereas #ActivityPub is rich email, where we can represent anything, be it an Invoice, Order confirmation, Postal package tracker, Train ticket, Concert booking, Restaurant reservation, Shopping list, Cooking recipe, Science paper, Academic citation, Sport coverage, Adventure game ..
Just had the most horrifying UX parsing this thread in Mastodon's microblog feed, likely causing 10x more network overhead than needed, and replied to @cwebber quote:
Stepping away from ATProto vs. AP I was most intrigued by @dialecticalmusings comment:
> People arguing about moderation and community building often have fundamentally differing visions for the political economy of the Fediverse, but those differences never get unpacked, so people end up talking past each other.
What is never answered well is: What is fediverse? I'd argue it is just a common utility word like internet and web, denoting a communication medium.
What do you do with this medium is then the next question. Well, the power of ActivityPub allows us "to extend constructs of society online" to support our daily needs.
But on the basis of some warped microblog abstraction turned into a pretzel by bolting on features to hang everything off, this is not possible.
I agree on the gist, but with a twist. The control is in sustainable and healthy evolution of the protocol, which in turn will stimulate organic growth.
I am also a dreamer, and in my dream ActivityPub remains commons based, of the people by the people. I'd love to see Pixelfed and Loops and many other fedi services to gain adoption by millions and billions, because you and those others share value alignment. We dream collectively of making the world a better place.
Unfortunately #ActivityPub isn't commons based at the moment. At this point in time every increase in popularity of the fediverse is an attractor of commercial interests. Large #FOSS platforms prove that there is a market. And very large platforms become a threat to established #BigTech players, who are then forced to act.
Contrary to perhaps you and others, I don't think that corporate capture and takeover can be avoided once Big Tech giants decide to go all-in and throw billions bucks, 1,000's employees at it.
Just shipped a Loops Starter Kit bug fix that prevented Mastodon collections from working properly, I've also filed a bug on their side to resolve this as it will likely affect other software.
So I usually hate sending over bluesky links anywhere since I'm not a fan, but Rob Ricci highlights some important distinctions between #activitypub and #atproto
Fundamentally, activitypub is designed to be useful with a partial view of the network. (Narrowing down to #mastodon here) Likes are communicated, mentions are communicated, and so on.
Over at atproto land, you have no option but to write to your repo, and so you have no choice but to view the entire network to say, find replies and such (narrowing to #bluesky here). So the only way you can get your data is to read the network and filter it yourself, or have someone else do it for you, which doesn't solve the problem, only shift it.
So I usually hate sending over bluesky links anywhere since I'm not a fan, but Rob Ricci highlights some important distinctions between #activitypub and #atproto
Fundamentally, activitypub is designed to be useful with a partial view of the network. (Narrowing down to #mastodon here) Likes are communicated, mentions are communicated, and so on.
Over at atproto land, you have no option but to write to your repo, and so you have no choice but to view the entire network to say, find replies and such (narrowing to #bluesky here). So the only way you can get your data is to read the network and filter it yourself, or have someone else do it for you, which doesn't solve the problem, only shift it.
@innocentzero@social.tchncs.de ยท Reply to InnocentZero
Having said that, and also disliking the fact that it came out of corpo billionaire creators of twitter, I genuinely believe there's some good stuff to pick up from that protocol.
In particular, I think the coolest part of the architecture is server-independent (more like server-migratable) identity, which is kind of amazing.
Activitypub/fediverse should adopt https://helge.codeberg.page/fep/fep/ef61/ soon, and I feel like that'd be even better than what atproto has if I understand correctly.
I agree on the gist, but with a twist. The control is in sustainable and healthy evolution of the protocol, which in turn will stimulate organic growth.
I am also a dreamer, and in my dream ActivityPub remains commons based, of the people by the people. I'd love to see Pixelfed and Loops and many other fedi services to gain adoption by millions and billions, because you and those others share value alignment. We dream collectively of making the world a better place.
Unfortunately #ActivityPub isn't commons based at the moment. At this point in time every increase in popularity of the fediverse is an attractor of commercial interests. Large #FOSS platforms prove that there is a market. And very large platforms become a threat to established #BigTech players, who are then forced to act.
Contrary to perhaps you and others, I don't think that corporate capture and takeover can be avoided once Big Tech giants decide to go all-in and throw billions bucks, 1,000's employees at it.
#Lazyweb When I want to spin up my own #Fediverse instance that supports #Markdown when composing a post and that can handle my significant amount of followers with a seamless migration from my current #Mastodon instance, which #ActivityPub Implementation would you use? Ideally it should be a simple rootless container setup that JustWorksโข with podman. Perfection would be a single, self-contained container without the need to spin up several ones for databases or other stuff.
So I usually hate sending over bluesky links anywhere since I'm not a fan, but Rob Ricci highlights some important distinctions between #activitypub and #atproto
Fundamentally, activitypub is designed to be useful with a partial view of the network. (Narrowing down to #mastodon here) Likes are communicated, mentions are communicated, and so on.
Over at atproto land, you have no option but to write to your repo, and so you have no choice but to view the entire network to say, find replies and such (narrowing to #bluesky here). So the only way you can get your data is to read the network and filter it yourself, or have someone else do it for you, which doesn't solve the problem, only shift it.
@innocentzero@social.tchncs.de ยท Reply to InnocentZero
Having said that, and also disliking the fact that it came out of corpo billionaire creators of twitter, I genuinely believe there's some good stuff to pick up from that protocol.
In particular, I think the coolest part of the architecture is server-independent (more like server-migratable) identity, which is kind of amazing.
Activitypub/fediverse should adopt https://helge.codeberg.page/fep/fep/ef61/ soon, and I feel like that'd be even better than what atproto has if I understand correctly.
While having an extremely snobbish and arrogant tone, I think it makes some good points about separating hosting from viewing, which I think the usual #fediverse sort of conflates. And while the doesn't doesn't cover it, #atproto also has the unique feature of your data being relatively portable, largely absent in #fediverse.
So I usually hate sending over bluesky links anywhere since I'm not a fan, but Rob Ricci highlights some important distinctions between #activitypub and #atproto
Fundamentally, activitypub is designed to be useful with a partial view of the network. (Narrowing down to #mastodon here) Likes are communicated, mentions are communicated, and so on.
Over at atproto land, you have no option but to write to your repo, and so you have no choice but to view the entire network to say, find replies and such (narrowing to #bluesky here). So the only way you can get your data is to read the network and filter it yourself, or have someone else do it for you, which doesn't solve the problem, only shift it.
Don't get me wrong, a lot of fediverse developers do not want millions of users, they are designing their software carefully for them and people like them.
I'm a dreamer, and love to think bigger, and build platforms with millions and even billions of people.
Both types of devs and projects can thrive, because we give the people control and power.
That is what matters, nobody can control this, not even me or mastodon.social
#HolosDiscover now indexes #PeerTube videos. You can find them in search and timelines, but the way they look still needs some work. A video is not the same kind of #ActivityPub object as a normal post. A post is a short text made to be read in the timeline. A video has a title, a long description, and a media file, so it should be shown as a video card with a thumbnail and a link, not as plain text. That part is coming next.
Tagging the first version of the relay will be a proud accomplishment for me. It means officially publishing an #ActivityPub relay, here only to maintain your identity and activities when your devices are offline. It brings custom domains for self-identity, #E2EE DMs, and multi-device support, while each device runs its own AP server. Not tied to a single platform, it supports microblogging, images, or even videos in one click. Full sovereignty, without installing an instance on a VPS.
I am really happy with my work today, I have never seen the relay so stable and fast. The response time is now really short, around 20 ms, and hasn't moved for hours. I am really close to tagging the first version of the relay as 1.0.0.
Holos Social relay admin dashboard showing performance metrics: a request rate of 406 req/sec, an average response time of 20 ms, an error rate of 0.2 percent, and 80 MB of memory used.
ALT text
Response time graph over roughly 24 hours, showing peaks around 1600 to 1700 ms in the evening, a middle period fluctuating between 400 and 1000 ms, then dropping to around 20 ms and staying flat for the last several hours.
Tagging the first version of the relay will be a proud accomplishment for me. It means officially publishing an #ActivityPub relay, here only to maintain your identity and activities when your devices are offline. It brings custom domains for self-identity, #E2EE DMs, and multi-device support, while each device runs its own AP server. Not tied to a single platform, it supports microblogging, images, or even videos in one click. Full sovereignty, without installing an instance on a VPS.
I am really happy with my work today, I have never seen the relay so stable and fast. The response time is now really short, around 20 ms, and hasn't moved for hours. I am really close to tagging the first version of the relay as 1.0.0.
Holos Social relay admin dashboard showing performance metrics: a request rate of 406 req/sec, an average response time of 20 ms, an error rate of 0.2 percent, and 80 MB of memory used.
ALT text
Response time graph over roughly 24 hours, showing peaks around 1600 to 1700 ms in the evening, a middle period fluctuating between 400 and 1000 ms, then dropping to around 20 ms and staying flat for the last several hours.
#Lazyweb When I want to spin up my own #Fediverse instance that supports #Markdown when composing a post and that can handle my significant amount of followers with a seamless migration from my current #Mastodon instance, which #ActivityPub Implementation would you use? Ideally it should be a simple rootless container setup that JustWorksโข with podman. Perfection would be a single, self-contained container without the need to spin up several ones for databases or other stuff.
#HolosDiscover now indexes #PeerTube videos. You can find them in search and timelines, but the way they look still needs some work. A video is not the same kind of #ActivityPub object as a normal post. A post is a short text made to be read in the timeline. A video has a title, a long description, and a media file, so it should be shown as a video card with a thumbnail and a link, not as plain text. That part is coming next.
Don't get me wrong, a lot of fediverse developers do not want millions of users, they are designing their software carefully for them and people like them.
I'm a dreamer, and love to think bigger, and build platforms with millions and even billions of people.
Both types of devs and projects can thrive, because we give the people control and power.
That is what matters, nobody can control this, not even me or mastodon.social
There are a couple of projects that explore #ActivityPub in its intended #LinkedData format. Plain JSON is allowed, but the AP's primary notation is using #JSONLD. I think there is a slight uptick in interest for this approach again, coming along with the opportunity to implement the Social API (client-to-server) as intended.
What I really like is that ecosystem tools which aim to ease #fediverse solution development, are gaining an interest. Most notably here is #Fedify imho, who recently received #NLnet funding to build Fedify Studio development platform..
The apis.io architecture that catalogues > 10,000 APIs is an interesting use case for JSON-LD. A variation of this architecture could also be a way to decentralize the #ActivityPub FEP process.
The apis.io architecture that catalogues > 10,000 APIs is an interesting use case for JSON-LD. A variation of this architecture could also be a way to decentralize the #ActivityPub FEP process.
Meme de dos perros Shiba Inu comparando el registro en dos redes sociales. A la izquierda aparece el perro musculoso bajo el tรญtulo โRegistro en WSocialโ, recitando una larga lista de pasos absurdamente complejos: elegir usuario y contraseรฑa, seleccionar intereses, descargar una app de identidad, escanear varios cรณdigos QR, crear un PIN, verificar identidad con pasaporte, leer el chip NFC y hacerse un selfie. A la derecha, un perro pequeรฑo y llorando bajo el tรญtulo โRegistro en el Fediversoโ dice: โJooo, pero ยฟquรฉ server tengo que seleccionar? Ayy, quรฉ complicado!โ. El meme ironiza sobre cรณmo algunas personas consideran difรญcil elegir instancia en el Fediverso mientras aceptan procesos mucho mรกs invasivos y complejos en redes centralizadas.โ
Meme de dos perros Shiba Inu comparando el registro en dos redes sociales. A la izquierda aparece el perro musculoso bajo el tรญtulo โRegistro en WSocialโ, recitando una larga lista de pasos absurdamente complejos: elegir usuario y contraseรฑa, seleccionar intereses, descargar una app de identidad, escanear varios cรณdigos QR, crear un PIN, verificar identidad con pasaporte, leer el chip NFC y hacerse un selfie. A la derecha, un perro pequeรฑo y llorando bajo el tรญtulo โRegistro en el Fediversoโ dice: โJooo, pero ยฟquรฉ server tengo que seleccionar? Ayy, quรฉ complicado!โ. El meme ironiza sobre cรณmo algunas personas consideran difรญcil elegir instancia en el Fediverso mientras aceptan procesos mucho mรกs invasivos y complejos en redes centralizadas.โ
I really enjoy optimization. Release v3.5.0 of Ktistec doesn't drop significant new features, but it does deliver a ~15% smaller executable and significantly faster queries on anonymous endpoints. The two are intertwined.
The size reduction comes from replacing a poorly designed, custom rules engine with a materialized view layer that uses SQL to define membership in a collection. The rules engine worked well enough but required a lot of supporting code to present rules as a DSL (Domain Specific Language) over the domain objects in ktistec. The driving realization was that SQL is a DSL and membership in a collection is just a query and domain objects are just rows. Voilร !
Query performance improvements came from using this new view layer to materialize two very popular but expensive-to-query views: the instance's public timeline and public hashtag pages. Because both are public pages they receive more traffic than internal pages.
The problem with the original queries was that performance was not uniform. Querying for posts with popular tags was okay. Querying for posts with sparse tags was very slow. I could have added more indexes, but that's its own cost. After the change, endpoints all respond in a consistent ~10msec timeframe and the CPU barely registers when a crawler hits. (I don't want to make things easier for bots, but I don't want to pay a tax for their activity eitherโask me about my new nginx configuration.)
Here is the full changelog:
Added
Lightweight probe endpoint for authenticated sessions.
max-id and min-id pagination links on web pages.
Fixed
Correct the notifications collection's JSON representation.
Accept both single-value and array forms of JSON-LD properties.
Handle variation in schema.org property mapping.
Changed
Faster timeline, public, hashtag, and notification collections.
Adjust the layout of actor profile properties.
Removed
The school dependency; replaced by activity processors and materialized views.
The openssl_ext dependency; vendored in.
There are still a few slow queries. In the next release I'm going to see if I can get everything under 10msec, and maybe release a new feature, too. ๐
I really enjoy optimization. Release v3.5.0 of Ktistec doesn't drop significant new features, but it does deliver a ~15% smaller executable and significantly faster queries on anonymous endpoints. The two are intertwined.
The size reduction comes from replacing a poorly designed, custom rules engine with a materialized view layer that uses SQL to define membership in a collection. The rules engine worked well enough but required a lot of supporting code to present rules as a DSL (Domain Specific Language) over the domain objects in ktistec. The driving realization was that SQL is a DSL and membership in a collection is just a query and domain objects are just rows. Voilร !
Query performance improvements came from using this new view layer to materialize two very popular but expensive-to-query views: the instance's public timeline and public hashtag pages. Because both are public pages they receive more traffic than internal pages.
The problem with the original queries was that performance was not uniform. Querying for posts with popular tags was okay. Querying for posts with sparse tags was very slow. I could have added more indexes, but that's its own cost. After the change, endpoints all respond in a consistent ~10msec timeframe and the CPU barely registers when a crawler hits. (I don't want to make things easier for bots, but I don't want to pay a tax for their activity eitherโask me about my new nginx configuration.)
Here is the full changelog:
Added
Lightweight probe endpoint for authenticated sessions.
max-id and min-id pagination links on web pages.
Fixed
Correct the notifications collection's JSON representation.
Accept both single-value and array forms of JSON-LD properties.
Handle variation in schema.org property mapping.
Changed
Faster timeline, public, hashtag, and notification collections.
Adjust the layout of actor profile properties.
Removed
The school dependency; replaced by activity processors and materialized views.
The openssl_ext dependency; vendored in.
There are still a few slow queries. In the next release I'm going to see if I can get everything under 10msec, and maybe release a new feature, too. ๐
Question about HTTP Signatures in #ActivityPub, IIUC the header is a digest of the HTTP body. Given that JSON is not white-space sensitive, does that mean that storing the response must preserve the indentation used by the server?
DrFed is our sister project, built alongside #Fedify to tackle the debugging side of #ActivityPub development. It just received @nlnet funding and now has its own account here: @drfed.
Some of you have already heard of us as #Fedify Studio. We now have a proper name: DrFed, short for โDoctor Fed.โ We've also just received funding from @nlnet, through the NGI0 Commons Fund.
#DrFed is a web app for debugging #ActivityPub interoperability failures. When two implementations don't federate, the slow part is usually figuring out where the exchange broke: signing, JSON-LD processing, WebFinger, or something less obvious. DrFed's first job is to show where it failed.
DrFed is our sister project, built alongside #Fedify to tackle the debugging side of #ActivityPub development. It just received @nlnet funding and now has its own account here: @drfed.
Some of you have already heard of us as #Fedify Studio. We now have a proper name: DrFed, short for โDoctor Fed.โ We've also just received funding from @nlnet, through the NGI0 Commons Fund.
#DrFed is a web app for debugging #ActivityPub interoperability failures. When two implementations don't federate, the slow part is usually figuring out where the exchange broke: signing, JSON-LD processing, WebFinger, or something less obvious. DrFed's first job is to show where it failed.
DrFed is our sister project, built alongside #Fedify to tackle the debugging side of #ActivityPub development. It just received @nlnet funding and now has its own account here: @drfed.
Some of you have already heard of us as #Fedify Studio. We now have a proper name: DrFed, short for โDoctor Fed.โ We've also just received funding from @nlnet, through the NGI0 Commons Fund.
#DrFed is a web app for debugging #ActivityPub interoperability failures. When two implementations don't federate, the slow part is usually figuring out where the exchange broke: signing, JSON-LD processing, WebFinger, or something less obvious. DrFed's first job is to show where it failed.
I am really delighted with @nlnet decision to select @drfed for an #NGI0 grant. Having good quality developer tools for creating #ActivityPub based solutions is so important for a healthy #fediverse developer ecosystem.
To anyone reading, bookmark the website..
Fedify Studio is focused on alleviating the most pressing issue of "Why is ActivityPub development so frustratingly hard?" that makes it unattractive for newcomers to adopt the technology. And addresses topics of:
#Fedify from the very start has paid attention to ease of use for fediverse solution developers, not just by their library codebase, but with comprehensive documentation and tools to guide people along. Kudos here to @hongminhee who started this great initiative!
I am really delighted with @nlnet decision to select @drfed for an #NGI0 grant. Having good quality developer tools for creating #ActivityPub based solutions is so important for a healthy #fediverse developer ecosystem.
To anyone reading, bookmark the website..
Fedify Studio is focused on alleviating the most pressing issue of "Why is ActivityPub development so frustratingly hard?" that makes it unattractive for newcomers to adopt the technology. And addresses topics of:
#Fedify from the very start has paid attention to ease of use for fediverse solution developers, not just by their library codebase, but with comprehensive documentation and tools to guide people along. Kudos here to @hongminhee who started this great initiative!
I am really delighted with @nlnet decision to select @drfed for an #NGI0 grant. Having good quality developer tools for creating #ActivityPub based solutions is so important for a healthy #fediverse developer ecosystem.
To anyone reading, bookmark the website..
Fedify Studio is focused on alleviating the most pressing issue of "Why is ActivityPub development so frustratingly hard?" that makes it unattractive for newcomers to adopt the technology. And addresses topics of:
#Fedify from the very start has paid attention to ease of use for fediverse solution developers, not just by their library codebase, but with comprehensive documentation and tools to guide people along. Kudos here to @hongminhee who started this great initiative!
I am really delighted with @nlnet decision to select @drfed for an #NGI0 grant. Having good quality developer tools for creating #ActivityPub based solutions is so important for a healthy #fediverse developer ecosystem.
To anyone reading, bookmark the website..
Fedify Studio is focused on alleviating the most pressing issue of "Why is ActivityPub development so frustratingly hard?" that makes it unattractive for newcomers to adopt the technology. And addresses topics of:
#Fedify from the very start has paid attention to ease of use for fediverse solution developers, not just by their library codebase, but with comprehensive documentation and tools to guide people along. Kudos here to @hongminhee who started this great initiative!
DrFed is our sister project, built alongside #Fedify to tackle the debugging side of #ActivityPub development. It just received @nlnet funding and now has its own account here: @drfed.
Some of you have already heard of us as #Fedify Studio. We now have a proper name: DrFed, short for โDoctor Fed.โ We've also just received funding from @nlnet, through the NGI0 Commons Fund.
#DrFed is a web app for debugging #ActivityPub interoperability failures. When two implementations don't federate, the slow part is usually figuring out where the exchange broke: signing, JSON-LD processing, WebFinger, or something less obvious. DrFed's first job is to show where it failed.
DrFed is our sister project, built alongside #Fedify to tackle the debugging side of #ActivityPub development. It just received @nlnet funding and now has its own account here: @drfed.
Some of you have already heard of us as #Fedify Studio. We now have a proper name: DrFed, short for โDoctor Fed.โ We've also just received funding from @nlnet, through the NGI0 Commons Fund.
#DrFed is a web app for debugging #ActivityPub interoperability failures. When two implementations don't federate, the slow part is usually figuring out where the exchange broke: signing, JSON-LD processing, WebFinger, or something less obvious. DrFed's first job is to show where it failed.
DrFed is our sister project, built alongside #Fedify to tackle the debugging side of #ActivityPub development. It just received @nlnet funding and now has its own account here: @drfed.
Some of you have already heard of us as #Fedify Studio. We now have a proper name: DrFed, short for โDoctor Fed.โ We've also just received funding from @nlnet, through the NGI0 Commons Fund.
#DrFed is a web app for debugging #ActivityPub interoperability failures. When two implementations don't federate, the slow part is usually figuring out where the exchange broke: signing, JSON-LD processing, WebFinger, or something less obvious. DrFed's first job is to show where it failed.
I am really delighted with @nlnet decision to select @drfed for an #NGI0 grant. Having good quality developer tools for creating #ActivityPub based solutions is so important for a healthy #fediverse developer ecosystem.
To anyone reading, bookmark the website..
Fedify Studio is focused on alleviating the most pressing issue of "Why is ActivityPub development so frustratingly hard?" that makes it unattractive for newcomers to adopt the technology. And addresses topics of:
#Fedify from the very start has paid attention to ease of use for fediverse solution developers, not just by their library codebase, but with comprehensive documentation and tools to guide people along. Kudos here to @hongminhee who started this great initiative!
DrFed is our sister project, built alongside #Fedify to tackle the debugging side of #ActivityPub development. It just received @nlnet funding and now has its own account here: @drfed.
Some of you have already heard of us as #Fedify Studio. We now have a proper name: DrFed, short for โDoctor Fed.โ We've also just received funding from @nlnet, through the NGI0 Commons Fund.
#DrFed is a web app for debugging #ActivityPub interoperability failures. When two implementations don't federate, the slow part is usually figuring out where the exchange broke: signing, JSON-LD processing, WebFinger, or something less obvious. DrFed's first job is to show where it failed.
DrFed is our sister project, built alongside #Fedify to tackle the debugging side of #ActivityPub development. It just received @nlnet funding and now has its own account here: @drfed.
Some of you have already heard of us as #Fedify Studio. We now have a proper name: DrFed, short for โDoctor Fed.โ We've also just received funding from @nlnet, through the NGI0 Commons Fund.
#DrFed is a web app for debugging #ActivityPub interoperability failures. When two implementations don't federate, the slow part is usually figuring out where the exchange broke: signing, JSON-LD processing, WebFinger, or something less obvious. DrFed's first job is to show where it failed.
DrFed is our sister project, built alongside #Fedify to tackle the debugging side of #ActivityPub development. It just received @nlnet funding and now has its own account here: @drfed.
Some of you have already heard of us as #Fedify Studio. We now have a proper name: DrFed, short for โDoctor Fed.โ We've also just received funding from @nlnet, through the NGI0 Commons Fund.
#DrFed is a web app for debugging #ActivityPub interoperability failures. When two implementations don't federate, the slow part is usually figuring out where the exchange broke: signing, JSON-LD processing, WebFinger, or something less obvious. DrFed's first job is to show where it failed.
DrFed is our sister project, built alongside #Fedify to tackle the debugging side of #ActivityPub development. It just received @nlnet funding and now has its own account here: @drfed.
Some of you have already heard of us as #Fedify Studio. We now have a proper name: DrFed, short for โDoctor Fed.โ We've also just received funding from @nlnet, through the NGI0 Commons Fund.
#DrFed is a web app for debugging #ActivityPub interoperability failures. When two implementations don't federate, the slow part is usually figuring out where the exchange broke: signing, JSON-LD processing, WebFinger, or something less obvious. DrFed's first job is to show where it failed.
DrFed is our sister project, built alongside #Fedify to tackle the debugging side of #ActivityPub development. It just received @nlnet funding and now has its own account here: @drfed.
Some of you have already heard of us as #Fedify Studio. We now have a proper name: DrFed, short for โDoctor Fed.โ We've also just received funding from @nlnet, through the NGI0 Commons Fund.
#DrFed is a web app for debugging #ActivityPub interoperability failures. When two implementations don't federate, the slow part is usually figuring out where the exchange broke: signing, JSON-LD processing, WebFinger, or something less obvious. DrFed's first job is to show where it failed.
Ooh yeah! I've been waiting for #GoToSocial to support relays for ... well, since I started using it. Which was immediately after #Yunohost made it available, so that's quite a while now. Very exciting news for my favourite #ActivityPub fedi server.
Ooh yeah! I've been waiting for #GoToSocial to support relays for ... well, since I started using it. Which was immediately after #Yunohost made it available, so that's quite a while now. Very exciting news for my favourite #ActivityPub fedi server.
Okay, this is doing my head in. It turns out that at least some of my posts and comments from some of my Fedi-fied (self-hosted) WordPress sites aren't federating, either when posting through the site, or from various apps. And I just can't figure out what is going on. Liking and boosting posts appear to work, but comments appear on my site, but not on the post I allegedly commented on. The occasional one might sneak through, and I will get a reply back, but others - nope, nothing. Any ideas? Any incoming comments are listed on the comments page as "Protocol:ActivityPub", while any I try sending are listed as "Protocol:Local", which I assume means that they are being sent somewhere on my server rather than federated out. Using WordPress 7.0, and the latest versions of the ActivityPub, Friends, WebFinger, Node.Info, and EnableMastodonApps plugins. I can't find any settings that need changing on any of these, and would love some help.
Okay, this is doing my head in. It turns out that at least some of my posts and comments from some of my Fedi-fied (self-hosted) WordPress sites aren't federating, either when posting through the site, or from various apps. And I just can't figure out what is going on. Liking and boosting posts appear to work, but comments appear on my site, but not on the post I allegedly commented on. The occasional one might sneak through, and I will get a reply back, but others - nope, nothing. Any ideas? Any incoming comments are listed on the comments page as "Protocol:ActivityPub", while any I try sending are listed as "Protocol:Local", which I assume means that they are being sent somewhere on my server rather than federated out. Using WordPress 7.0, and the latest versions of the ActivityPub, Friends, WebFinger, Node.Info, and EnableMastodonApps plugins. I can't find any settings that need changing on any of these, and would love some help.
Highlights include password reset, avatar uploads, local follows and follow requests, light/dark mode, activity tiles, NodeInfo support, improved federation, instance statistics, and location support for remote activities.
Thank you to everyone who opened issues, submitted pull requests, tested releases, and shared feedback. Every contribution helps.
Highlights include password reset, avatar uploads, local follows and follow requests, light/dark mode, activity tiles, NodeInfo support, improved federation, instance statistics, and location support for remote activities.
Thank you to everyone who opened issues, submitted pull requests, tested releases, and shared feedback. Every contribution helps.
I've been reviewing the new FEP from the Mastodon team today, and one thing that caught my attention is the use of Accept and Reject activities for managing approvals. Another day, someone proposed to use Follow activity for "watching a thread".
So now, when you receive a standard activity, you need to use increasingly complicated heuristics to figure out what the activity does, because it is not possible to infer that from its type anymore.
This has to stop. I think we need to start giving our activities better names.
I've been reviewing the new FEP from the Mastodon team today, and one thing that caught my attention is the use of Accept and Reject activities for managing approvals. Another day, someone proposed to use Follow activity for "watching a thread".
So now, when you receive a standard activity, you need to use increasingly complicated heuristics to figure out what the activity does, because it is not possible to infer that from its type anymore.
This has to stop. I think we need to start giving our activities better names.
I've been reviewing the new FEP from the Mastodon team today, and one thing that caught my attention is the use of Accept and Reject activities for managing approvals. Another day, someone proposed to use Follow activity for "watching a thread".
So now, when you receive a standard activity, you need to use increasingly complicated heuristics to figure out what the activity does, because it is not possible to infer that from its type anymore.
This has to stop. I think we need to start giving our activities better names.
Regarding the why: When coding Mastodon, Eugen used those parts of the #ActivityPub and #ActivityStreams standards he found useful. For functionality that was not (yet) covered by those standards, he came up with his own solutions and made them part of the Mastodon API which can be considered a quasi-standard now.
When Mastodon was a one person shop, this was a pragmatic way to make progress fast. Standardization bodies are famous for moving slowly, and maybe Eugen was also put off by some of the more eccentric personalities in the ActivityPub community. Now that Mastodon (the organisation) has grown, they should assume a more active role in standards bodies. Perhaps they have โ I have not followed these processes closely in recent years.
Regarding the why: When coding Mastodon, Eugen used those parts of the #ActivityPub and #ActivityStreams standards he found useful. For functionality that was not (yet) covered by those standards, he came up with his own solutions and made them part of the Mastodon API which can be considered a quasi-standard now.
When Mastodon was a one person shop, this was a pragmatic way to make progress fast. Standardization bodies are famous for moving slowly, and maybe Eugen was also put off by some of the more eccentric personalities in the ActivityPub community. Now that Mastodon (the organisation) has grown, they should assume a more active role in standards bodies. Perhaps they have โ I have not followed these processes closely in recent years.
I remember reading previously that one shouldn't switch an #ActivityPub server between implementations (e.g. from #Mastodon to #GoToSocial), but never understood why. I know a fair bit about AP but haven't read the full spec. Can somebody please tl;dr this for me? Is it primarily due to the private keys used to sign activities, or something more complex?
This is Haru and Tanos. Haru is the black cat. We adopted him from a shelter at two years old, after he lived there his whole life. Tanos is a Malinois. We took him in when his owner could not keep him anymore. Life can change fast, animals are often the first to lose their home. This is why I made #PawFed, a shared map for animal welfare. Not many people use it yet, but it is worth sharing. It relies fully on #ActivityPub and uses #OSM.
Haru, a black cat, sits calmly on a step between two dogs. At the top stands Raven, a white Swiss Shepherd, looking down at the cat. At the bottom, with his back to the camera, is Tanos, a Malinois. They all live together peacefully.
I remember reading previously that one shouldn't switch an #ActivityPub server between implementations (e.g. from #Mastodon to #GoToSocial), but never understood why. I know a fair bit about AP but haven't read the full spec. Can somebody please tl;dr this for me? Is it primarily due to the private keys used to sign activities, or something more complex?
This is Haru and Tanos. Haru is the black cat. We adopted him from a shelter at two years old, after he lived there his whole life. Tanos is a Malinois. We took him in when his owner could not keep him anymore. Life can change fast, animals are often the first to lose their home. This is why I made #PawFed, a shared map for animal welfare. Not many people use it yet, but it is worth sharing. It relies fully on #ActivityPub and uses #OSM.
Haru, a black cat, sits calmly on a step between two dogs. At the top stands Raven, a white Swiss Shepherd, looking down at the cat. At the bottom, with his back to the camera, is Tanos, a Malinois. They all live together peacefully.
This is Haru and Tanos. Haru is the black cat. We adopted him from a shelter at two years old, after he lived there his whole life. Tanos is a Malinois. We took him in when his owner could not keep him anymore. Life can change fast, animals are often the first to lose their home. This is why I made #PawFed, a shared map for animal welfare. Not many people use it yet, but it is worth sharing. It relies fully on #ActivityPub and uses #OSM.
Haru, a black cat, sits calmly on a step between two dogs. At the top stands Raven, a white Swiss Shepherd, looking down at the cat. At the bottom, with his back to the camera, is Tanos, a Malinois. They all live together peacefully.
I am working on my Laravel-Activitypub package, it will replace federation support in Pixelfed once all tests are passing!
To demonstrate and test it before we use it in Pixelfed, a small and simple single user photo sharing server will be published and I'll boost the first photo here.
BizzFed looks like a professional network - and behaves like one. Profiles, company pages, job listings. What's underneath is different: every account lives on an instance. Many instances communicate via ActivityPub. https://bizzfed.haxxors.com/en#GetFediHired#Jobs#ActivityPub#Fediverse
BizzFed looks like a professional network - and behaves like one. Profiles, company pages, job listings. What's underneath is different: every account lives on an instance. Many instances communicate via ActivityPub. https://bizzfed.haxxors.com/en#GetFediHired#Jobs#ActivityPub#Fediverse
Following a thread is now available in the latest version of #HolosSocial. #ActivityPub already lets you follow an object, not only an account, so a Follow can target a post. You then receive new replies, even from accounts you do not follow. A thread is short-lived, so the Follow uses the standard endTime property to expire on its own. It works best when other servers support it, that's why I want to turn it into a #FEP.
Following a thread is now available in the latest version of #HolosSocial. #ActivityPub already lets you follow an object, not only an account, so a Follow can target a post. You then receive new replies, even from accounts you do not follow. A thread is short-lived, so the Follow uses the standard endTime property to expire on its own. It works best when other servers support it, that's why I want to turn it into a #FEP.
Following threads will be available in #HolosSocial 1.10.0. You can subscribe to a thread and get notified when new replies arrive, even from accounts you do not follow. It works with standard #ActivityPub activities by sending a Follow targeting a post, with a polling fallback for servers that do not support it yet.
Following threads will be available in #HolosSocial 1.10.0. You can subscribe to a thread and get notified when new replies arrive, even from accounts you do not follow. It works with standard #ActivityPub activities by sending a Follow targeting a post, with a polling fallback for servers that do not support it yet.
Following threads will be available in #HolosSocial 1.10.0. You can subscribe to a thread and get notified when new replies arrive, even from accounts you do not follow. It works with standard #ActivityPub activities by sending a Follow targeting a post, with a polling fallback for servers that do not support it yet.
Following threads will be available in #HolosSocial 1.10.0. You can subscribe to a thread and get notified when new replies arrive, even from accounts you do not follow. It works with standard #ActivityPub activities by sending a Follow targeting a post, with a polling fallback for servers that do not support it yet.
Loops es un proyecto del creador de Pixelfed que intenta llevar los vรญdeos cortos al Fediverso usando ActivityPub. Vรญdeos verticales, cรณdigo abierto, financiaciรณn comunitaria y una filosofรญa muy distinta a la de las grandes plataformas.
Todavรญa estรก creciendo y tiene camino por delante, pero ya se puede probar.
Loops es un proyecto del creador de Pixelfed que intenta llevar los vรญdeos cortos al Fediverso usando ActivityPub. Vรญdeos verticales, cรณdigo abierto, financiaciรณn comunitaria y una filosofรญa muy distinta a la de las grandes plataformas.
Todavรญa estรก creciendo y tiene camino por delante, pero ya se puede probar.
โJe zult beleidsdiscussies krijgen die je nooit eerder hadโ, voorspelt hij... โMaar dat is ook goed. In plaats van die beslissingen in de handen leggen van een paar miljardairs, moeten mensen erover nadenken.โ
โJe zult beleidsdiscussies krijgen die je nooit eerder hadโ, voorspelt hij... โMaar dat is ook goed. In plaats van die beslissingen in de handen leggen van een paar miljardairs, moeten mensen erover nadenken.โ
I am working on my Laravel-Activitypub package, it will replace federation support in Pixelfed once all tests are passing!
To demonstrate and test it before we use it in Pixelfed, a small and simple single user photo sharing server will be published and I'll boost the first photo here.
I am working on my Laravel-Activitypub package, it will replace federation support in Pixelfed once all tests are passing!
To demonstrate and test it before we use it in Pixelfed, a small and simple single user photo sharing server will be published and I'll boost the first photo here.
This post is about 7 months old, and #HolosSocial went far beyond it since. It now has #E2EE DMs with the Signal protocol, and real identity portability. You can use a custom domain so your identity rests on your own name and keys, and keep your media on your own cloud. Leaving a relay is no longer a migration, you just point your domain elsewhere and keep going. This remains optional, you have time to discover the app and enable things later that will give you full independence on #ActivityPub.
We're building something for the Fediverse. #Holos
ActivityPub running on your phone. Your own server, your data stored locally. A relay handles your stable identity when you're offline.
One account, all formats. Short text, long articles, photos, videos. The UI adapts to your mood. Switch between text mode, photo grid, video feed, article editor based on what you feel like sharing.
Same network, same followers.
Early stages, but the foundation is solid. We wanted to share the progress.
This post is about 7 months old, and #HolosSocial went far beyond it since. It now has #E2EE DMs with the Signal protocol, and real identity portability. You can use a custom domain so your identity rests on your own name and keys, and keep your media on your own cloud. Leaving a relay is no longer a migration, you just point your domain elsewhere and keep going. This remains optional, you have time to discover the app and enable things later that will give you full independence on #ActivityPub.
We're building something for the Fediverse. #Holos
ActivityPub running on your phone. Your own server, your data stored locally. A relay handles your stable identity when you're offline.
One account, all formats. Short text, long articles, photos, videos. The UI adapts to your mood. Switch between text mode, photo grid, video feed, article editor based on what you feel like sharing.
Same network, same followers.
Early stages, but the foundation is solid. We wanted to share the progress.
Strava (hosted fitness tracking) announced they're paywalling API access, which is impacting self-hosted projects that rely on it for independent data syncing (consider this new ActivityPub alternative (FitHub) or Endurain if you've been impacted)
#ActivityPub quirk of the day: the AS2 Document type. What is it? Well, obviously "it's document of any kind" (per the AS2 spec). ๐คฏ There are no Document-specific properties. Page is a Document, but Article is not. Some people have claimed it's related to resources stored in files, but files are not a thing in AS2. Dereferencing an Image URI (which is a Document) might return a dynamically-generated resource, not one stored in a server file. One can't assume file storage for any resource.
Strava (hosted fitness tracking) announced they're paywalling API access, which is impacting self-hosted projects that rely on it for independent data syncing (consider this new ActivityPub alternative (FitHub) or Endurain if you've been impacted)
#ActivityPub quirk of the day: the AS2 Document type. What is it? Well, obviously "it's document of any kind" (per the AS2 spec). ๐คฏ There are no Document-specific properties. Page is a Document, but Article is not. Some people have claimed it's related to resources stored in files, but files are not a thing in AS2. Dereferencing an Image URI (which is a Document) might return a dynamically-generated resource, not one stored in a server file. One can't assume file storage for any resource.
Authentication is not specified by the ActivityPub standard. In practice, the fediverse mostly uses HTTP Message Signatures to authenticate server-to-server requests, using a relatively consistent profile. This document describes that profile and usage, recommends best practices, and evaluates their success so far.
BookWyrm project page showing information about the open-source social reading platform, including release details and a description of its reading, review, and social features.
ALT text
BookWyrm book discovery interface displaying a grid of book covers from various genres, highlighting browsing and recommendation features for readers.
BookWyrm project page showing information about the open-source social reading platform, including release details and a description of its reading, review, and social features.
ALT text
BookWyrm book discovery interface displaying a grid of book covers from various genres, highlighting browsing and recommendation features for readers.
Authentication is not specified by the ActivityPub standard. In practice, the fediverse mostly uses HTTP Message Signatures to authenticate server-to-server requests, using a relatively consistent profile. This document describes that profile and usage, recommends best practices, and evaluates their success so far.
Authentication is not specified by the ActivityPub standard. In practice, the fediverse mostly uses HTTP Message Signatures to authenticate server-to-server requests, using a relatively consistent profile. This document describes that profile and usage, recommends best practices, and evaluates their success so far.
> Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. > (Brian Kernighan)
Bit hard by this today.
The Rube Goldberg-esque machine of generating HTTP-Signatures and verifying them has become too much for my brain to handle.
Too many elements to keep track of and I'm currently having steam coming out of my ears.
Wrote my first server announcement. Because yesterday, after updating my #Mastodon instance to 4.5.11, I didn't realise the Sidekiq died.
I spotted an unusual server load and temperature 24 hours later, found out that it was a Mastodon LXC, and realised there had been nothing processed by Sidekiq for 24 hours already.
I'm not sure about the reasons, because I didn't find anything useful in the logs. I definitely need better monitoring for #GlitchySocial.
Wrote my first server announcement. Because yesterday, after updating my #Mastodon instance to 4.5.11, I didn't realise the Sidekiq died.
I spotted an unusual server load and temperature 24 hours later, found out that it was a Mastodon LXC, and realised there had been nothing processed by Sidekiq for 24 hours already.
I'm not sure about the reasons, because I didn't find anything useful in the logs. I definitely need better monitoring for #GlitchySocial.
Just discovered the existence of the #snac#ActivityPub server. Looks very interesting, appealing to my #smolweb sensibilities very much, and seems even smoler than #GoToSocial, which I've been using very happily for a few years now. Could be time for me to try another flavour, as Adam Ant might say. And, I'm very very down with the acronym. Yep, Social Networks Are Crap.
If you've been wanting to move your activity history from Strava to FitPub but dreaded dealing with the export files, I made a small browser tool that does the heavy lifting.
Drop in your Strava export files, it decompresses the .fit.gz files, splits everything into correctly-sized ZIP batches, and hands them back for upload. No install, no server, runs entirely in your browser.
Screenshot of the app. Move your activity history from Strava to FitPub. This tool converts your Strava data export into correctly formatted, sized, and counted ZIP batches ready for import.
The next step in our #activitypub implementation is ready! This brings a simple instance actor object along with #webfinger support for it and a #nodeinfo endpoint.
We highly appreciate reviews from any #fedidev ๐
If you are running a version of either Misskey or Mastodon that is more than a year old, I strongly urge you to reconsider your reasons for not upgrading.
This low-effort exploit (see screenshot) can be executed on Mastodon 4.0.x through 4.3.x. If you are still running Mastodon 2.x or 3.x, the situation is significantly worse.
โ ๏ธ This isn't just a Mastodon issue; it affects Misskey too. If you are using a version of Misskey older than 2025, you have simply been lucky so far.
For context, the current version of Mastodon is 4.5.11 (with 4.6 beta 1 available), and the current version of Misskey is 2026.5.4 (with 2026.6.0 available). There is no better time to upgrade than right now. โณ
In my opinion, the Fediverse has been incredibly lucky. Most of you have only had to deal with the occasional bot or script kiddie trying to spam your site. However, leaving your software unpatched exposes you to much more severe threats.
Frankly, as someone who used to manage online forum communities, I donโt understand the reluctance to upgrade. You aren't just leaving yourself vulnerable โ you are risking the security of the hundreds or thousands of users who have placed their trust in your ability to manage the platform safely.
A screenshot that reads: I cannot yet get this to save. The commit still fails. But I am sure someone else could. It is time to upgrade!
ALT text
A screenshot taken from a Misskey site. The message written in both Japanese and English reads: You're running an outdated version of Misskey. You should really upgrade.
Berufliches Netzwerken muss nicht zentralisiert und kommerziell sein. Mit BizzFed.de teste ich, wie professionelles Networking im Fediverse funktionieren kann โ fรถderiert รผber ActivityPub. Wir sind in der Early-Access-Phase: Es geht darum, das Konzept zu evaluieren und herauszufinden, was funktioniert und was nicht. Dafรผr suche ich Mitstreiter:innen, die ausprobieren und Rรผckmeldung geben. Interesse? https://www.bizzfed.de๐ #Fediverse#ActivityPub#BizzFed#DigitaleSouverรคnitรคt
Just discovered the existence of the #snac#ActivityPub server. Looks very interesting, appealing to my #smolweb sensibilities very much, and seems even smoler than #GoToSocial, which I've been using very happily for a few years now. Could be time for me to try another flavour, as Adam Ant might say. And, I'm very very down with the acronym. Yep, Social Networks Are Crap.
Berufliches Netzwerken muss nicht zentralisiert und kommerziell sein. Mit BizzFed.de teste ich, wie professionelles Networking im Fediverse funktionieren kann โ fรถderiert รผber ActivityPub. Wir sind in der Early-Access-Phase: Es geht darum, das Konzept zu evaluieren und herauszufinden, was funktioniert und was nicht. Dafรผr suche ich Mitstreiter:innen, die ausprobieren und Rรผckmeldung geben. Interesse? https://www.bizzfed.de๐ #Fediverse#ActivityPub#BizzFed#DigitaleSouverรคnitรคt
If you are running a version of either Misskey or Mastodon that is more than a year old, I strongly urge you to reconsider your reasons for not upgrading.
This low-effort exploit (see screenshot) can be executed on Mastodon 4.0.x through 4.3.x. If you are still running Mastodon 2.x or 3.x, the situation is significantly worse.
โ ๏ธ This isn't just a Mastodon issue; it affects Misskey too. If you are using a version of Misskey older than 2025, you have simply been lucky so far.
For context, the current version of Mastodon is 4.5.11 (with 4.6 beta 1 available), and the current version of Misskey is 2026.5.4 (with 2026.6.0 available). There is no better time to upgrade than right now. โณ
In my opinion, the Fediverse has been incredibly lucky. Most of you have only had to deal with the occasional bot or script kiddie trying to spam your site. However, leaving your software unpatched exposes you to much more severe threats.
Frankly, as someone who used to manage online forum communities, I donโt understand the reluctance to upgrade. You aren't just leaving yourself vulnerable โ you are risking the security of the hundreds or thousands of users who have placed their trust in your ability to manage the platform safely.
A screenshot that reads: I cannot yet get this to save. The commit still fails. But I am sure someone else could. It is time to upgrade!
ALT text
A screenshot taken from a Misskey site. The message written in both Japanese and English reads: You're running an outdated version of Misskey. You should really upgrade.
Just discovered the existence of the #snac#ActivityPub server. Looks very interesting, appealing to my #smolweb sensibilities very much, and seems even smoler than #GoToSocial, which I've been using very happily for a few years now. Could be time for me to try another flavour, as Adam Ant might say. And, I'm very very down with the acronym. Yep, Social Networks Are Crap.
Just discovered the existence of the #snac#ActivityPub server. Looks very interesting, appealing to my #smolweb sensibilities very much, and seems even smoler than #GoToSocial, which I've been using very happily for a few years now. Could be time for me to try another flavour, as Adam Ant might say. And, I'm very very down with the acronym. Yep, Social Networks Are Crap.
Listening to "Character Limit" by Kate Conger and Ryan Mac on a run. It's a solid account of how Twitter fell apart.
The book sharpens something I keep coming back to about Dorsey and Graber's idea of "decentralized" social media. Graber says she spent years studying existing protocols and decided none were good enough for users, so Bluesky built ATProto from scratch. I still don't buy that none of the existing solutions were worth improving.
There are two kinds of nerds: the Silicon Valley startup kind, and the open standards kind - Torvalds, Berners-Lee, people who build a commons and don't try to own it. Bluesky comes from the first camp. The framing is still commercial: a company, VC money, a product that happens to have an open layer. That's the part that doesn't sit right with me.
Decentralization as something you can market isn't the same as decentralization as something no one controls and any living room nerd could host and tweak on their own.
You, the people, and NLnet, have funded a fully open TikTok alternative with web and mobile clients, ActivityPub federation and an opt-out For You feed algorithm that is privacy friendly.
Anyone can start their own Loops community, and we're working on an official hosting service to help fund development.
You, the people, and NLnet, have funded a fully open TikTok alternative with web and mobile clients, ActivityPub federation and an opt-out For You feed algorithm that is privacy friendly.
Anyone can start their own Loops community, and we're working on an official hosting service to help fund development.
Listening to "Character Limit" by Kate Conger and Ryan Mac on a run. It's a solid account of how Twitter fell apart.
The book sharpens something I keep coming back to about Dorsey and Graber's idea of "decentralized" social media. Graber says she spent years studying existing protocols and decided none were good enough for users, so Bluesky built ATProto from scratch. I still don't buy that none of the existing solutions were worth improving.
There are two kinds of nerds: the Silicon Valley startup kind, and the open standards kind - Torvalds, Berners-Lee, people who build a commons and don't try to own it. Bluesky comes from the first camp. The framing is still commercial: a company, VC money, a product that happens to have an open layer. That's the part that doesn't sit right with me.
Decentralization as something you can market isn't the same as decentralization as something no one controls and any living room nerd could host and tweak on their own.
If you've been wanting to move your activity history from Strava to FitPub but dreaded dealing with the export files, I made a small browser tool that does the heavy lifting.
Drop in your Strava export files, it decompresses the .fit.gz files, splits everything into correctly-sized ZIP batches, and hands them back for upload. No install, no server, runs entirely in your browser.
Screenshot of the app. Move your activity history from Strava to FitPub. This tool converts your Strava data export into correctly formatted, sized, and counted ZIP batches ready for import.
#AskFedi I remember using a service that allows hosting #events and can generate .ics files. It allowed sending #rsvp using mastodon. But I can't remember the domain now. Can anyone #help ?
#AskFedi I remember using a service that allows hosting #events and can generate .ics files. It allowed sending #rsvp using mastodon. But I can't remember the domain now. Can anyone #help ?
Lovely #fediverse does anybody have a list of all the known user-agents for #activitypub software ?
I have some WAF rules to write to make sure my server can be seen behind a frontend that is only meant to battle AI crawlers and I rather not (knowingly) leave endpoints open to OpenAI
Lovely #fediverse does anybody have a list of all the known user-agents for #activitypub software ?
I have some WAF rules to write to make sure my server can be seen behind a frontend that is only meant to battle AI crawlers and I rather not (knowingly) leave endpoints open to OpenAI
Lovely #fediverse does anybody have a list of all the known user-agents for #activitypub software ?
I have some WAF rules to write to make sure my server can be seen behind a frontend that is only meant to battle AI crawlers and I rather not (knowingly) leave endpoints open to OpenAI
But what do we dream about? How do our dreams relate, where do they overlap? Might we realize them together? Turn our online places into a delightful commons of cross-pollination and cocreation? How can we make progress towards forging a better world together, and sustain that progress? Can we turn our collaborative efforts into much more than the sum of their constituent parts, and move on shared vision into a brighter future together?
Questions, questions.
In my previous blog post on Shared responsible ownership I claimed that a commons can be ๐ฅ ignited, and become unstoppable as it realizes positive societal impact. Able to withstand the corrosive forces of Hypercapitalism that seek to corrupt it.
Revolutionary evolution is possible! โ
#Fediverse is the perfect environment to make this happen. We laid the foundations already. We have soil, so now we can blossom. ๐ป
But what do we dream about? How do our dreams relate, where do they overlap? Might we realize them together? Turn our online places into a delightful commons of cross-pollination and cocreation? How can we make progress towards forging a better world together, and sustain that progress? Can we turn our collaborative efforts into much more than the sum of their constituent parts, and move on shared vision into a brighter future together?
Questions, questions.
In my previous blog post on Shared responsible ownership I claimed that a commons can be ๐ฅ ignited, and become unstoppable as it realizes positive societal impact. Able to withstand the corrosive forces of Hypercapitalism that seek to corrupt it.
Revolutionary evolution is possible! โ
#Fediverse is the perfect environment to make this happen. We laid the foundations already. We have soil, so now we can blossom. ๐ป
Somebody went and built a chatroom powered directly by #ActivityPub, called "Harmony". Roughly the opposite of Movim, Harmony aims to replace Discord and even includes end-to-end encryption (although I wonder if it'll be compatible with the implementation by Bonfire and Emissary). mony.lol/
Somebody went and built a chatroom powered directly by #ActivityPub, called "Harmony". Roughly the opposite of Movim, Harmony aims to replace Discord and even includes end-to-end encryption (although I wonder if it'll be compatible with the implementation by Bonfire and Emissary). mony.lol/
I love watching the https://rel.re#activitypub#relay stats lol. They continously increase. At fresh start they are at like 1 inbox and 100 deliveries per second, now at 100 inbox and 8337 deliveries per second after running for a while, it really needs to warm up. Still not sure how it chills at like 1-10% cpu usage of one 4ghz core and 100MB RAM. I always thought rust was very performant aswell but they apparently cant beat goroutines. On aoderelay i would be using at least 3 cores 100% by now, possibly because the error handling is not the "yeah you failed 5 times, go to the ignore bench for a couple minutes" way like i handle it with the stale mechanism.
Somebody went and built a chatroom powered directly by #ActivityPub, called "Harmony". Roughly the opposite of Movim, Harmony aims to replace Discord and even includes end-to-end encryption (although I wonder if it'll be compatible with the implementation by Bonfire and Emissary). mony.lol/
The next step in our #activitypub implementation is ready! This brings a simple instance actor object along with #webfinger support for it and a #nodeinfo endpoint.
We highly appreciate reviews from any #fedidev ๐
It looks like there is an effort to try to merge the ActivityStreams Core specification with the ActivityStreams Vocabulary specification into a single specification ๐
Somebody went and built a chatroom powered directly by #ActivityPub, called "Harmony". Roughly the opposite of Movim, Harmony aims to replace Discord and even includes end-to-end encryption (although I wonder if it'll be compatible with the implementation by Bonfire and Emissary). mony.lol/
I love watching the https://rel.re#activitypub#relay stats lol. They continously increase. At fresh start they are at like 1 inbox and 100 deliveries per second, now at 100 inbox and 8337 deliveries per second after running for a while, it really needs to warm up. Still not sure how it chills at like 1-10% cpu usage of one 4ghz core and 100MB RAM. I always thought rust was very performant aswell but they apparently cant beat goroutines. On aoderelay i would be using at least 3 cores 100% by now, possibly because the error handling is not the "yeah you failed 5 times, go to the ignore bench for a couple minutes" way like i handle it with the stale mechanism.
The next step in our #activitypub implementation is ready! This brings a simple instance actor object along with #webfinger support for it and a #nodeinfo endpoint.
We highly appreciate reviews from any #fedidev ๐
It looks like there is an effort to try to merge the ActivityStreams Core specification with the ActivityStreams Vocabulary specification into a single specification ๐
The next step in our #activitypub implementation is ready! This brings a simple instance actor object along with #webfinger support for it and a #nodeinfo endpoint.
We highly appreciate reviews from any #fedidev ๐
The next step in our #activitypub implementation is ready! This brings a simple instance actor object along with #webfinger support for it and a #nodeinfo endpoint.
We highly appreciate reviews from any #fedidev ๐
The next step in our #activitypub implementation is ready! This brings a simple instance actor object along with #webfinger support for it and a #nodeinfo endpoint.
We highly appreciate reviews from any #fedidev ๐
The (over)use of "mastodon" is understandable. Mastodon played a pioneering role in implementing microblogging use cases with the #ActivityPub protocol and is also the most mature product at this point in that 'business domain'. Establishing itself as a brand.
#Fediverse is not a very descriptive name to people unfamiliar with it and the idea that it provides access to many apps that integrate with on a single social network (ideally) interoperably is foreign. They are used to 'platform thinking'. Fediverse weaves a social fabric that allows you to be "social together with others" online.
The europa.eu website now has a #Mastodon icon in its social channel list, that hides all that.
Perhaps most communicative is the name #ActivityStreams (name of W3C standard vocabulary of social actions to support). Then a person would subscribe to EU's activity streams and receive Posts, Articles, Videos, Events, Policies, News. Every service the EU offers adds to the stream.
Looking for a high performance #ActivityPub#relay ? Look no further: https://rel.re it is using our own golang relay software #relre, designed for maximum performance and reliability. Hosted in Switzerland.
Today at 18:00 I'll be at @hackergarten Lucerne working on @fitpub and would love to meet developers, open-source enthusiasts, and anyone interested in federated social fitness platforms.
If you'd like to contribute, discuss ideas, report bugs, review code, or just see what FitPub is all about, feel free to stop by. New contributors are always welcome.
Looking forward to an evening of coding, collaboration, and open source!
Today at 18:00 I'll be at @hackergarten Lucerne working on @fitpub and would love to meet developers, open-source enthusiasts, and anyone interested in federated social fitness platforms.
If you'd like to contribute, discuss ideas, report bugs, review code, or just see what FitPub is all about, feel free to stop by. New contributors are always welcome.
Looking forward to an evening of coding, collaboration, and open source!
A friend of mine, @siliconsjang, released SiliconBeest v1.0.0 today. It's a #fediverse server built on #Cloudflare Workers, D1, R2, and Queues, using Fedify.
I like the starting point: after watching fediverse servers go down together during Cloudflare outages, they thought, why not just run on Cloudflare directly?
They're aiming for something cheap enough that a small instance can stay on Cloudflare's free plan, and a somewhat bigger one can fit in the $5/month tier. It's still early; a lot is missing, and Mastodon/Misskey API compatibility is more of a long-term goal.
I'm glad to see Fedify put to use for something like this. Worth checking out.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
Is it possible to import my Masto Following/followers .csv files into a #WordPress with #ActivityPub and #Friends plugins? If I remaned it as an OPML file, would that work? Anyone have any clues on this?
Is it possible to import my Masto Following/followers .csv files into a #WordPress with #ActivityPub and #Friends plugins? If I remaned it as an OPML file, would that work? Anyone have any clues on this?
Is there a more complete description of the #ActivityPub Media Upload behavior discussed at https://www.w3.org/wiki/SocialCG/ActivityPub/MediaUpload (last updated in 2017)? For example, the document describes the 202 Accepted async response but not what's returned for a 201 Created response. Is it an object or an activity? It seems like it would be an object since that's what is created, but I see some implementations return a Create activity.
Is there a more complete description of the #ActivityPub Media Upload behavior discussed at https://www.w3.org/wiki/SocialCG/ActivityPub/MediaUpload (last updated in 2017)? For example, the document describes the 202 Accepted async response but not what's returned for a 201 Created response. Is it an object or an activity? It seems like it would be an object since that's what is created, but I see some implementations return a Create activity.
Is there a more complete description of the #ActivityPub Media Upload behavior discussed at https://www.w3.org/wiki/SocialCG/ActivityPub/MediaUpload (last updated in 2017)? For example, the document describes the 202 Accepted async response but not what's returned for a 201 Created response. Is it an object or an activity? It seems like it would be an object since that's what is created, but I see some implementations return a Create activity.
Charla "#ActivityPub El protocolo que impulsa el Fediverso" ensayada
aรบn hay tiempo para los retoques
>> Descubre el poder de la descentralizaciรณn con ActivityPub y el Fediverso. En esta charla, entenderรกs cรณmo este protocolo abre la puerta a una red social mรกs justa, privada, descentralizada y alternativa a las grandes plataformas
FitPub is a federated social fitness platform and Strava alternative built on ActivityPub, giving athletes control over their data, communities, and connections.
Today also marks the launch of the first official FitPub instance: > https://fitpub.social
Charla "#ActivityPub El protocolo que impulsa el Fediverso" ensayada
aรบn hay tiempo para los retoques
>> Descubre el poder de la descentralizaciรณn con ActivityPub y el Fediverso. En esta charla, entenderรกs cรณmo este protocolo abre la puerta a una red social mรกs justa, privada, descentralizada y alternativa a las grandes plataformas
Self-Hosting an ActivityPub Video Podcast Is Surprisingly Affordable
4/
When you look at the actual storage requirements, self-hosting a video podcast on the Fediverse starts to look a lot less intimidating โ and a lot more realistic.
It is affordable โ especially with your own HomeLab (where you buy your own hard drives rather than rent them).
So on my ONI instance that I've been use as an alternative fediverse profile for myself for about two years, the full storage used is about 3.4G, but out of that there's 2.5G containing mostly the Delete activities of mastodon.social. Crazy.
Today the #HolosSocial project takes a step forward by letting one account run on several devices. It may sound minor, but each device runs its own #ActivityPub server, which made it a real challenge: avoiding duplicate actions sent to other instances and keeping everything in sync. All of this stays transparent for the user: adding a device is as simple as scanning a QR code, and the whole transfer is end to end encrypted between the two devices, so the relay never sees it in clear.
#HolosSocial 1.7.0 is available. This version adds multi-device support. You can connect a phone, tablet and desktop to the same account. To add a new device, you scan a QR code from one you already use. This transfers your key and all your account data, encrypted end to end, so the relay never sees it in clear. It also adds bio translation on profiles, actor lists for boost and like notifications, DM filtering, and several fixes.
Building #HolosSocial is by far my most ambitious project. It might only attract a niche of users, though at first it could seem strange to run an #ActivityPub server on a device. But Holos' purpose is more than that: helping everyone have their own identity, host their media, and not depend on a server admin. Make everything accessible with views depending on your mood. One app, one identity, with all that the fediverse can offer. That's the beginning, the way is still long but not unreachable.
Today the #HolosSocial project takes a step forward by letting one account run on several devices. It may sound minor, but each device runs its own #ActivityPub server, which made it a real challenge: avoiding duplicate actions sent to other instances and keeping everything in sync. All of this stays transparent for the user: adding a device is as simple as scanning a QR code, and the whole transfer is end to end encrypted between the two devices, so the relay never sees it in clear.
#HolosSocial 1.7.0 is available. This version adds multi-device support. You can connect a phone, tablet and desktop to the same account. To add a new device, you scan a QR code from one you already use. This transfers your key and all your account data, encrypted end to end, so the relay never sees it in clear. It also adds bio translation on profiles, actor lists for boost and like notifications, DM filtering, and several fixes.
FitPub is a federated social fitness platform and Strava alternative built on ActivityPub, giving athletes control over their data, communities, and connections.
Today also marks the launch of the first official FitPub instance: > https://fitpub.social
FitPub is a federated social fitness platform and Strava alternative built on ActivityPub, giving athletes control over their data, communities, and connections.
Today also marks the launch of the first official FitPub instance: > https://fitpub.social
FitPub is a federated social fitness platform and Strava alternative built on ActivityPub, giving athletes control over their data, communities, and connections.
Today also marks the launch of the first official FitPub instance: > https://fitpub.social
FitPub is a federated social fitness platform and Strava alternative built on ActivityPub, giving athletes control over their data, communities, and connections.
Today also marks the launch of the first official FitPub instance: > https://fitpub.social
FitPub is a federated social fitness platform and Strava alternative built on ActivityPub, giving athletes control over their data, communities, and connections.
Today also marks the launch of the first official FitPub instance: > https://fitpub.social
FitPub is a federated social fitness platform and Strava alternative built on ActivityPub, giving athletes control over their data, communities, and connections.
Today also marks the launch of the first official FitPub instance: > https://fitpub.social
FitPub is a federated social fitness platform and Strava alternative built on ActivityPub, giving athletes control over their data, communities, and connections.
Today also marks the launch of the first official FitPub instance: > https://fitpub.social
What would you consider the minimal features to be considered an #ActivityPub C2S server? Support for inbox GET, outbox POST, OAuth2, proxy endpoint, ... ?
FitPub is a federated social fitness platform and Strava alternative built on ActivityPub, giving athletes control over their data, communities, and connections.
Today also marks the launch of the first official FitPub instance: > https://fitpub.social
What would you consider the minimal features to be considered an #ActivityPub C2S server? Support for inbox GET, outbox POST, OAuth2, proxy endpoint, ... ?
What would you consider the minimal features to be considered an #ActivityPub C2S server? Support for inbox GET, outbox POST, OAuth2, proxy endpoint, ... ?
FitPub is a federated social fitness platform and Strava alternative built on ActivityPub, giving athletes control over their data, communities, and connections.
Today also marks the launch of the first official FitPub instance: > https://fitpub.social
FitPub is a federated social fitness platform and Strava alternative built on ActivityPub, giving athletes control over their data, communities, and connections.
Today also marks the launch of the first official FitPub instance: > https://fitpub.social
FitPub is a federated social fitness platform and Strava alternative built on ActivityPub, giving athletes control over their data, communities, and connections.
Today also marks the launch of the first official FitPub instance: > https://fitpub.social
What a great experience to talk at the #2mr about Fediway! It was a very fruitful discourse about what the open social web and how to make it effortless for anyone. Thank you so much at @bjoernsta , @kingconsult , @frebelt and all other people for supporting us.
Today the #HolosSocial project takes a step forward by letting one account run on several devices. It may sound minor, but each device runs its own #ActivityPub server, which made it a real challenge: avoiding duplicate actions sent to other instances and keeping everything in sync. All of this stays transparent for the user: adding a device is as simple as scanning a QR code, and the whole transfer is end to end encrypted between the two devices, so the relay never sees it in clear.
#HolosSocial 1.7.0 is available. This version adds multi-device support. You can connect a phone, tablet and desktop to the same account. To add a new device, you scan a QR code from one you already use. This transfers your key and all your account data, encrypted end to end, so the relay never sees it in clear. It also adds bio translation on profiles, actor lists for boost and like notifications, DM filtering, and several fixes.
A reminder to #ActivityPub developers and advocates: applications for the NLNet Open Social Fund close on June 1st (#BrookeVibberDay) at noon CEST. You should apply; you are doing important work and we need you to keep doing it.
A reminder to #ActivityPub developers and advocates: applications for the NLNet Open Social Fund close on June 1st (#BrookeVibberDay) at noon CEST. You should apply; you are doing important work and we need you to keep doing it.
Today the #HolosSocial project takes a step forward by letting one account run on several devices. It may sound minor, but each device runs its own #ActivityPub server, which made it a real challenge: avoiding duplicate actions sent to other instances and keeping everything in sync. All of this stays transparent for the user: adding a device is as simple as scanning a QR code, and the whole transfer is end to end encrypted between the two devices, so the relay never sees it in clear.
#HolosSocial 1.7.0 is available. This version adds multi-device support. You can connect a phone, tablet and desktop to the same account. To add a new device, you scan a QR code from one you already use. This transfers your key and all your account data, encrypted end to end, so the relay never sees it in clear. It also adds bio translation on profiles, actor lists for boost and like notifications, DM filtering, and several fixes.
Today the #HolosSocial project takes a step forward by letting one account run on several devices. It may sound minor, but each device runs its own #ActivityPub server, which made it a real challenge: avoiding duplicate actions sent to other instances and keeping everything in sync. All of this stays transparent for the user: adding a device is as simple as scanning a QR code, and the whole transfer is end to end encrypted between the two devices, so the relay never sees it in clear.
#HolosSocial 1.7.0 is available. This version adds multi-device support. You can connect a phone, tablet and desktop to the same account. To add a new device, you scan a QR code from one you already use. This transfers your key and all your account data, encrypted end to end, so the relay never sees it in clear. It also adds bio translation on profiles, actor lists for boost and like notifications, DM filtering, and several fixes.
Today the #HolosSocial project takes a step forward by letting one account run on several devices. It may sound minor, but each device runs its own #ActivityPub server, which made it a real challenge: avoiding duplicate actions sent to other instances and keeping everything in sync. All of this stays transparent for the user: adding a device is as simple as scanning a QR code, and the whole transfer is end to end encrypted between the two devices, so the relay never sees it in clear.
#HolosSocial 1.7.0 is available. This version adds multi-device support. You can connect a phone, tablet and desktop to the same account. To add a new device, you scan a QR code from one you already use. This transfers your key and all your account data, encrypted end to end, so the relay never sees it in clear. It also adds bio translation on profiles, actor lists for boost and like notifications, DM filtering, and several fixes.
A reminder to #ActivityPub developers and advocates: applications for the NLNet Open Social Fund close on June 1st (#BrookeVibberDay) at noon CEST. You should apply; you are doing important work and we need you to keep doing it.
A reminder to #ActivityPub developers and advocates: applications for the NLNet Open Social Fund close on June 1st (#BrookeVibberDay) at noon CEST. You should apply; you are doing important work and we need you to keep doing it.
I kept on thinking about how #e2ee#email over #activitypub would look like only to realise that to solve the problem of server side MITM on TOFU, I needed a central way of looking up actors not tied to the server, and before I knew it I was reinventing #atproto(ik y'all don't like it, sorry, it's the only way identity TOFU won't have an MITM problem)
Building #HolosSocial is by far my most ambitious project. It might only attract a niche of users, though at first it could seem strange to run an #ActivityPub server on a device. But Holos' purpose is more than that: helping everyone have their own identity, host their media, and not depend on a server admin. Make everything accessible with views depending on your mood. One app, one identity, with all that the fediverse can offer. That's the beginning, the way is still long but not unreachable.
I kept on thinking about how #e2ee#email over #activitypub would look like only to realise that to solve the problem of server side MITM on TOFU, I needed a central way of looking up actors not tied to the server, and before I knew it I was reinventing #atproto(ik y'all don't like it, sorry, it's the only way identity TOFU won't have an MITM problem)
Square deep burgundy graphic with a subtle line-art background pattern and white sparkle accents. Large outlined headline reads โMUTUAL AID CHECKPOINT.โ Below it, a central panel says โREPLY WITH:โ followed by bullet points asking people to share their needs or a friendโs needs plus deadline, how to help through crowdfunding links or preferred payment method, and: โIf you have the capacity to contribute meaningfully (financially or socially), please do.โ A bottom CTA says: โBOOST THIS POST + EVERY REPLY. LETโS AMPLIFY EACH OTHER.โ Decorative illustrations show digital payment icons, QR-code scanning, and a calendar/deadline symbol on the left; mutual-aid support symbols on the right, including housing, money, clothing, groceries, and medical supplies; a hijabi woman gesturing at the bottom left; and a person holding a megaphone and waving at the bottom right. The word โwrzkyโ appears vertically near the right side.
Square deep burgundy graphic with a subtle line-art background pattern and white sparkle accents. Large outlined headline reads โMUTUAL AID CHECKPOINT.โ Below it, a central panel says โREPLY WITH:โ followed by bullet points asking people to share their needs or a friendโs needs plus deadline, how to help through crowdfunding links or preferred payment method, and: โIf you have the capacity to contribute meaningfully (financially or socially), please do.โ A bottom CTA says: โBOOST THIS POST + EVERY REPLY. LETโS AMPLIFY EACH OTHER.โ Decorative illustrations show digital payment icons, QR-code scanning, and a calendar/deadline symbol on the left; mutual-aid support symbols on the right, including housing, money, clothing, groceries, and medical supplies; a hijabi woman gesturing at the bottom left; and a person holding a megaphone and waving at the bottom right. The word โwrzkyโ appears vertically near the right side.
Iโm working on my #ActivityPub implementation, I can feel what little remains of my sanity ebbing away . In the background, because I'm #GenX and have taste in music:#DeepPurple โDemon's Eye" is playing. Coincidence, yes, but perhaps the universe is trying to hint at something.
Iโm working on my #ActivityPub implementation, I can feel what little remains of my sanity ebbing away . In the background, because I'm #GenX and have taste in music:#DeepPurple โDemon's Eye" is playing. Coincidence, yes, but perhaps the universe is trying to hint at something.
So on my ONI instance that I've been use as an alternative fediverse profile for myself for about two years, the full storage used is about 3.4G, but out of that there's 2.5G containing mostly the Delete activities of mastodon.social. Crazy.
So on my ONI instance that I've been use as an alternative fediverse profile for myself for about two years, the full storage used is about 3.4G, but out of that there's 2.5G containing mostly the Delete activities of mastodon.social. Crazy.
The biggest change in release v3.4.0 of Ktistec is cursor-based pagination for all web-navigable collections (timeline, notifications, etc.). Offset-based pagination will be removed completely in the next release.
Offset-based (e.g. page/size) pagination works well on collections that don't change. But, what does "the second page" contain in a dynamic timeline? Support for cursor-based pagination is required by the Mastodon-compatible API, but has been a desirable feature for quite a while.
While updating queries to paginate by cursor, I also made performance improvements to the queries themselves, as mentioned elsewhere. Scrapers and bots have already adaptedโsort of. I now see odd hybrid requests in the log like /tags/xyz?page=7&min_id=123. Overall CPU usage under normal load is now sitting at 0-1%.
Here is the full changelog for the release:
Added
Cursor-based pagination for web-navigable collections. (fixes #122)
The biggest change in release v3.4.0 of Ktistec is cursor-based pagination for all web-navigable collections (timeline, notifications, etc.). Offset-based pagination will be removed completely in the next release.
Offset-based (e.g. page/size) pagination works well on collections that don't change. But, what does "the second page" contain in a dynamic timeline? Support for cursor-based pagination is required by the Mastodon-compatible API, but has been a desirable feature for quite a while.
While updating queries to paginate by cursor, I also made performance improvements to the queries themselves, as mentioned elsewhere. Scrapers and bots have already adaptedโsort of. I now see odd hybrid requests in the log like /tags/xyz?page=7&min_id=123. Overall CPU usage under normal load is now sitting at 0-1%.
Here is the full changelog for the release:
Added
Cursor-based pagination for web-navigable collections. (fixes #122)
Hey, #ActivityPub friends! I could use some help. My PR to let #Mastodon users filter or drop notifications from bot users is stalled while the Mastodon team considers whether the notifications page needs a redesign. https://github.com/mastodon/mastodon/pull/38809 A bummer since I feel like it helps with a real user problem, but it's important to maintain that UI integrity, too.
Hey, #ActivityPub friends! I could use some help. My PR to let #Mastodon users filter or drop notifications from bot users is stalled while the Mastodon team considers whether the notifications page needs a redesign. https://github.com/mastodon/mastodon/pull/38809 A bummer since I feel like it helps with a real user problem, but it's important to maintain that UI integrity, too.
Is the state of Mastodon (and most of the fediverse?) such that user/message signing keys are still all RSA? I've seen there's been some discussion of Ed25519 support, but it seems like not much progress?
Most people know about messages, photos and videos on the #Fediverse. But the #ActivityPub protocol actually defines several object types, each one distinct and more or less compatible across apps:
- Note: short post (Mastodon) - Article / Page: long text or shared link (WriteFreely, Lemmy) - Image (Pixelfed) - Video (PeerTube) - Audio (Funkwhale) - Event with date and place (Mobilizon)
Thinking more about activitypub (on the back of setting the blog and CanYouBeatWellington up as actors).
I use Strava and Garmin connect to track my bike rides, but I'm now increasingly aware that I don't really own that data or control who sees it. There is also a bunch of stuff in there I don't need - I don't really care about segments / KOMs or anything like that. All I really want is to see a log of the rides I've done (speed, distance, time etc) and a sum up of what I've done over the last week, month, year, decade. And maybe sharing with a few select people.
I'm considering building a lightweight, self hosted activity focused activtypub system. Any interest out there for something like this? What would you like to see in a system like that?
Most people know about messages, photos and videos on the #Fediverse. But the #ActivityPub protocol actually defines several object types, each one distinct and more or less compatible across apps:
- Note: short post (Mastodon) - Article / Page: long text or shared link (WriteFreely, Lemmy) - Image (Pixelfed) - Video (PeerTube) - Audio (Funkwhale) - Event with date and place (Mobilizon)
Thinking more about activitypub (on the back of setting the blog and CanYouBeatWellington up as actors).
I use Strava and Garmin connect to track my bike rides, but I'm now increasingly aware that I don't really own that data or control who sees it. There is also a bunch of stuff in there I don't need - I don't really care about segments / KOMs or anything like that. All I really want is to see a log of the rides I've done (speed, distance, time etc) and a sum up of what I've done over the last week, month, year, decade. And maybe sharing with a few select people.
I'm considering building a lightweight, self hosted activity focused activtypub system. Any interest out there for something like this? What would you like to see in a system like that?
#tagspub was one of the first #ActivityPub projects, which I built as a POC. It was one of the implementations that showed interoperability when ActivityPub was still being standardized.
Most people know about messages, photos and videos on the #Fediverse. But the #ActivityPub protocol actually defines several object types, each one distinct and more or less compatible across apps:
- Note: short post (Mastodon) - Article / Page: long text or shared link (WriteFreely, Lemmy) - Image (Pixelfed) - Video (PeerTube) - Audio (Funkwhale) - Event with date and place (Mobilizon)
Most people know about messages, photos and videos on the #Fediverse. But the #ActivityPub protocol actually defines several object types, each one distinct and more or less compatible across apps:
- Note: short post (Mastodon) - Article / Page: long text or shared link (WriteFreely, Lemmy) - Image (Pixelfed) - Video (PeerTube) - Audio (Funkwhale) - Event with date and place (Mobilizon)
Multi-device support is progressing well for #HolosSocial. The tricky part: each device runs its own #ActivityPub server, with its own local data, signing its own activities. Keeping several servers in sync both ways, without duplicating everything, without losing actions on the way, and without two of them handling the same activity at the same time, was the main problem to solve. It also had to stay reliable when a device goes offline for hours or days. (1/3)
Multi-device support is progressing well for #HolosSocial. The tricky part: each device runs its own #ActivityPub server, with its own local data, signing its own activities. Keeping several servers in sync both ways, without duplicating everything, without losing actions on the way, and without two of them handling the same activity at the same time, was the main problem to solve. It also had to stay reliable when a device goes offline for hours or days. (1/3)
This is a recent talk that captures the main goal of why we are developing Commonshub. The world needs and wants a healthy alternative to toxic centralized social media and it exists but not enough people know about it. That will change if more organizations and or individual creators setup up their own communities and invite people to join. Exactly what Commonshub is designed for...
This is a recent talk that captures the main goal of why we are developing Commonshub. The world needs and wants a healthy alternative to toxic centralized social media and it exists but not enough people know about it. That will change if more organizations and or individual creators setup up their own communities and invite people to join. Exactly what Commonshub is designed for...
#HolosSocial isn't bringing something new to the #Fediverse, especially not to #ActivityPub. It builds on what exists, without mimicking any platform. Every social network has been given its fediverse clone. Asking people to hold a separate account on each is taking the problem backwards. If the fediverse keeps mirroring the GAFAM, it loses. The point was never to rebuild their world, but to offer something else: one identity across every content. HolosSocial is simply a try. But we can do it.
Article summary:
- We cocreate our future together, yet our rushed modern society holds us back from contributing where it matters most.
- The Paradox of emergence stands in the way of seeing how our two cents of investment contributes to solving wicked problems.
- FOSS and fediverse projects must be more holistically considered to anticipate and address likely huge negative outcomes in-the-large.
- Fediverse is the ideal diverse environment where people can further their own dreams in concert with others, and follow shared vision.
- For fediverse to become the Future of Social networking we must overcome the fragmentation and division caused by specialization.
- Hedonic peer production provides the means to do so, based on the SEE model for Sustainable ecosystem evolution (see diagram above).
- We must foster our ability to truly listen to others, to be able to fight the root cause of Hypercapitalism at inter-personal relationship level.
- Cross-pollination enables knowledge brokering and innovation based on individual needs, assets we can provide, shared values we hold dear.
- To give shape to Hedonic peer production on the social web, SX defines โJoyful creationโ, a formula and vision for inclusive cocreation.
- Sustainable ecosystem evolution aims for the emergence of a commons based value economy where participants exchange services.
- Purposeful social networking that induces prosocial behavior is key to the transition from an attention to an online Intention economy.
#HolosSocial isn't bringing something new to the #Fediverse, especially not to #ActivityPub. It builds on what exists, without mimicking any platform. Every social network has been given its fediverse clone. Asking people to hold a separate account on each is taking the problem backwards. If the fediverse keeps mirroring the GAFAM, it loses. The point was never to rebuild their world, but to offer something else: one identity across every content. HolosSocial is simply a try. But we can do it.
#HolosSocial isn't bringing something new to the #Fediverse, especially not to #ActivityPub. It builds on what exists, without mimicking any platform. Every social network has been given its fediverse clone. Asking people to hold a separate account on each is taking the problem backwards. If the fediverse keeps mirroring the GAFAM, it loses. The point was never to rebuild their world, but to offer something else: one identity across every content. HolosSocial is simply a try. But we can do it.
I tried to better explain the assumptions on which the model is based, and clarified how exactly origins should enforce boundaries between actors:
Servers MUST ensure that activities published by a client do not represent unauthorized actions. This includes activities embedded within other activities and objects.
Servers MUST NOT allow clients to publish activities where embedded objects are owned by another actor local actor.
Lemmy API and Mastodon API implementers don't have to worry about this, but one needs to be very careful when accepting arbitrary payloads from clients, for example, when implementing ActivityPub C2S API or FEP-ae97 API. Unfortunately, these security issues are completely ignored by people who push for wide deployment of ActivityPub C2S API.
Another addition is the recommendation to not use partially embedded objects, because that might lead to cache poisoning:
Embedded non-anonymous objects SHOULD NOT be partial representations. A server that relies on embedding for authentication might save a partial representation of an object to the cache, replacing the full object.
I tried to better explain the assumptions on which the model is based, and clarified how exactly origins should enforce boundaries between actors:
Servers MUST ensure that activities published by a client do not represent unauthorized actions. This includes activities embedded within other activities and objects.
Servers MUST NOT allow clients to publish activities where embedded objects are owned by another actor local actor.
Lemmy API and Mastodon API implementers don't have to worry about this, but one needs to be very careful when accepting arbitrary payloads from clients, for example, when implementing ActivityPub C2S API or FEP-ae97 API. Unfortunately, these security issues are completely ignored by people who push for wide deployment of ActivityPub C2S API.
Another addition is the recommendation to not use partially embedded objects, because that might lead to cache poisoning:
Embedded non-anonymous objects SHOULD NOT be partial representations. A server that relies on embedding for authentication might save a partial representation of an object to the cache, replacing the full object.
I tried to better explain the assumptions on which the model is based, and clarified how exactly origins should enforce boundaries between actors:
Servers MUST ensure that activities published by a client do not represent unauthorized actions. This includes activities embedded within other activities and objects.
Servers MUST NOT allow clients to publish activities where embedded objects are owned by another actor local actor.
Lemmy API and Mastodon API implementers don't have to worry about this, but one needs to be very careful when accepting arbitrary payloads from clients, for example, when implementing ActivityPub C2S API or FEP-ae97 API. Unfortunately, these security issues are completely ignored by people who push for wide deployment of ActivityPub C2S API.
Another addition is the recommendation to not use partially embedded objects, because that might lead to cache poisoning:
Embedded non-anonymous objects SHOULD NOT be partial representations. A server that relies on embedding for authentication might save a partial representation of an object to the cache, replacing the full object.
Great read by @laurenshof on the many parallel efforts to bolt private interaction onto public-by-default protocols:
"Each ends up with bounded spaces, explicit membership, persistent state, and access decisions at the boundary. This is roughly ... what Matrix has been building ... weโre doing carcinization for protocols."
relay.pmth.us is live and open. Any ActivityPub instance (Misskey, Mastodon, Pleroma, Akkoma, GoToSocial, others) can subscribe with no pre-approval and start pulling our timeline. Three days in: blocklist is public, shota.house and lolicon.monster blocked on day one, every cartoon-CSAM instance we encounter goes the same way. If you self-host and want denser federation, point your relay subscription at https://relay.pmth.us . #fediverse#selfhost#activitypub
Great read by @laurenshof on the many parallel efforts to bolt private interaction onto public-by-default protocols:
"Each ends up with bounded spaces, explicit membership, persistent state, and access decisions at the boundary. This is roughly ... what Matrix has been building ... weโre doing carcinization for protocols."
Great read by @laurenshof on the many parallel efforts to bolt private interaction onto public-by-default protocols:
"Each ends up with bounded spaces, explicit membership, persistent state, and access decisions at the boundary. This is roughly ... what Matrix has been building ... weโre doing carcinization for protocols."
In diesem Jahr steht der Sonntag ganz im Zeichen der DeveloperโCommunityโฏโ mit Sessions zu #ActivityPub und #ATโฏProtocol sowie viel Raum fรผr technische und kreative Zusammenarbeit.
๐ Hast du ein spannendes Projekt, Tool, Forschungsthema oder kรผnstlerisches Format zum Fediverse? Dann reiche jetzt deinen Beitrag ein und gestalte mit uns die Zukunft des offenen Webs: ๐ https://ctalx.c-base.org/fediday-2026/cfp
Berlin #Fediverse Dayโฏ2026 โ Celebrate openness. Connect the community. Shape the future together.
Article summary:
- We cocreate our future together, yet our rushed modern society holds us back from contributing where it matters most.
- The Paradox of emergence stands in the way of seeing how our two cents of investment contributes to solving wicked problems.
- FOSS and fediverse projects must be more holistically considered to anticipate and address likely huge negative outcomes in-the-large.
- Fediverse is the ideal diverse environment where people can further their own dreams in concert with others, and follow shared vision.
- For fediverse to become the Future of Social networking we must overcome the fragmentation and division caused by specialization.
- Hedonic peer production provides the means to do so, based on the SEE model for Sustainable ecosystem evolution (see diagram above).
- We must foster our ability to truly listen to others, to be able to fight the root cause of Hypercapitalism at inter-personal relationship level.
- Cross-pollination enables knowledge brokering and innovation based on individual needs, assets we can provide, shared values we hold dear.
- To give shape to Hedonic peer production on the social web, SX defines โJoyful creationโ, a formula and vision for inclusive cocreation.
- Sustainable ecosystem evolution aims for the emergence of a commons based value economy where participants exchange services.
- Purposeful social networking that induces prosocial behavior is key to the transition from an attention to an online Intention economy.
This year, Sunday will be dedicated entirely to the developer community โ with sessions on #ActivityPub and #ATโฏProtocol, and plenty of space for technical and creative collaboration.
๐ Do you have an exciting project, tool, research topic, or artistic format related to the Fediverse? Then submit your proposal now and help us shape the future of the open web: ๐ https://ctalx.c-base.org/fediday-2026/cfp
Berlinโฏ#FediverseโฏDayโฏ2026 โ Celebrate openness. Connect the community. Shape the future together.
This year, Sunday will be dedicated entirely to the developer community โ with sessions on #ActivityPub and #ATโฏProtocol, and plenty of space for technical and creative collaboration.
๐ Do you have an exciting project, tool, research topic, or artistic format related to the Fediverse? Then submit your proposal now and help us shape the future of the open web: ๐ https://ctalx.c-base.org/fediday-2026/cfp
Berlinโฏ#FediverseโฏDayโฏ2026 โ Celebrate openness. Connect the community. Shape the future together.
But what do we dream about? How do our dreams relate, where do they overlap? Might we realize them together? Turn our online places into a delightful commons of cross-pollination and cocreation? How can we make progress towards forging a better world together, and sustain that progress? Can we turn our collaborative efforts into much more than the sum of their constituent parts, and move on shared vision into a brighter future together?
Questions, questions.
In my previous blog post on Shared responsible ownership I claimed that a commons can be ๐ฅ ignited, and become unstoppable as it realizes positive societal impact. Able to withstand the corrosive forces of Hypercapitalism that seek to corrupt it.
Revolutionary evolution is possible! โ
#Fediverse is the perfect environment to make this happen. We laid the foundations already. We have soil, so now we can blossom. ๐ป
Itโs a quickpost! Itโs a Bluesky post! Itโs a Threads post! Itโs a @Mastodon post! Itโs a quick Bluesky Threads Mastodon post! And it's all on Surf!
Itโs a quickpost! Itโs a Bluesky post! Itโs a Threads post! Itโs a @Mastodon post! Itโs a quick Bluesky Threads Mastodon post! And it's all on Surf!
#Wanderer is a very nice project, but it is currently too raw to use. The last two releases just broke everything, and even a clean setup doesn't help. I'll follow the repository, but shut down my instance for now.
I am just digging through the #golang#activitypub library. Sadly, I can't find the entry point to get started. Anybody has a good idea for a starting point or a blog post that shows a minimal example?
As you may know, Mastodon 4.5.10 includes some important security updates. However, some of you are still running an earlier Mastodon Nightly build from before those updates were applied.
You should be running at minimum:
4.6.0-nightly.2026-05-21-security
If you're using Mastodon+Glitch, you should be running at minimum:
As you may know, Mastodon 4.5.10 includes some important security updates. However, some of you are still running an earlier Mastodon Nightly build from before those updates were applied.
You should be running at minimum:
4.6.0-nightly.2026-05-21-security
If you're using Mastodon+Glitch, you should be running at minimum:
Release v3.3.9 of Ktistec continues the security hardening work from recent releases, with further progress on the Mastodon-compatible API.
Of note: all network connections now go through a new Ktistec::Network module. This allows Ktistec to limit the size of HTTP bodies it reads, on both inbound and outbound requests, and ensures it only opens connections to valid remote IP addresses.
Here's the full changelog:
Added
New Mastodon-compatible APIs.
Fixed
Close DNS rebinding window for outbound HTTP requests.
Limit the size of HTTP bodies the server reads.
Sanitize RSS feed output to prevent CDATA breakout.
Destroy all sessions and access tokens on account termination.
Changed
Ensure all GET and POST requests utilize Ktistec::Network.
Process local recipients in-process in inbox/outbox activity processors.
As always, it's worth upgrading for the security fixes!
I am just digging through the #golang#activitypub library. Sadly, I can't find the entry point to get started. Anybody has a good idea for a starting point or a blog post that shows a minimal example?
#Wanderer is a very nice project, but it is currently too raw to use. The last two releases just broke everything, and even a clean setup doesn't help. I'll follow the repository, but shut down my instance for now.
Was erg leuk om gisteren samen met @DesireeBCG deze workshop "Open tech voor digitale soevereiniteit" aan ICT-studenten van de #HogeschoolUtrecht te geven.
We gingen in vogelvlucht van de Franse revolutie tot aan #Mastodon en #ActivityPub, en van het Vrijheidsbeeld tot aan #LibreOffice en #ODF. Ook vertelden we over het "Digital Autonomy Assessment Framework" van de Universiteit Utrecht.
Veel goeie energie en scherpe reflecties van de studenten!
Digitale souvereiniteit in het hart van ons ICT curriculum? Gisteren hadden we een zeer inspirende workshop van mijn oud-collega's Dรฉsirรฉe Castillo Gosker en Bart Knubben over het waarom en hoe van digitale souvereiniteit door Open Technologie bij het Business gilde van Open ICT met daarbij verschillende collega's van andere richtingen en enthousiaste eerstejaar die vrijwillig aanhaakten.
Was erg leuk om gisteren samen met @DesireeBCG deze workshop "Open tech voor digitale soevereiniteit" aan ICT-studenten van de #HogeschoolUtrecht te geven.
We gingen in vogelvlucht van de Franse revolutie tot aan #Mastodon en #ActivityPub, en van het Vrijheidsbeeld tot aan #LibreOffice en #ODF. Ook vertelden we over het "Digital Autonomy Assessment Framework" van de Universiteit Utrecht.
Veel goeie energie en scherpe reflecties van de studenten!
Digitale souvereiniteit in het hart van ons ICT curriculum? Gisteren hadden we een zeer inspirende workshop van mijn oud-collega's Dรฉsirรฉe Castillo Gosker en Bart Knubben over het waarom en hoe van digitale souvereiniteit door Open Technologie bij het Business gilde van Open ICT met daarbij verschillende collega's van andere richtingen en enthousiaste eerstejaar die vrijwillig aanhaakten.
Release v3.3.9 of Ktistec continues the security hardening work from recent releases, with further progress on the Mastodon-compatible API.
Of note: all network connections now go through a new Ktistec::Network module. This allows Ktistec to limit the size of HTTP bodies it reads, on both inbound and outbound requests, and ensures it only opens connections to valid remote IP addresses.
Here's the full changelog:
Added
New Mastodon-compatible APIs.
Fixed
Close DNS rebinding window for outbound HTTP requests.
Limit the size of HTTP bodies the server reads.
Sanitize RSS feed output to prevent CDATA breakout.
Destroy all sessions and access tokens on account termination.
Changed
Ensure all GET and POST requests utilize Ktistec::Network.
Process local recipients in-process in inbox/outbox activity processors.
As always, it's worth upgrading for the security fixes!
Release v3.3.9 of Ktistec continues the security hardening work from recent releases, with further progress on the Mastodon-compatible API.
Of note: all network connections now go through a new Ktistec::Network module. This allows Ktistec to limit the size of HTTP bodies it reads, on both inbound and outbound requests, and ensures it only opens connections to valid remote IP addresses.
Here's the full changelog:
Added
New Mastodon-compatible APIs.
Fixed
Close DNS rebinding window for outbound HTTP requests.
Limit the size of HTTP bodies the server reads.
Sanitize RSS feed output to prevent CDATA breakout.
Destroy all sessions and access tokens on account termination.
Changed
Ensure all GET and POST requests utilize Ktistec::Network.
Process local recipients in-process in inbox/outbox activity processors.
As always, it's worth upgrading for the security fixes!
My Hollo instance has been updated to 0.9.1 if you wanna take a peek. It's shaking off the early UI look and feel for something more professional.
A lot of extra configurations that I didn't have time to review or enable, but some of it looks interesting, like more efficient handling of remote media.
Dreiecksbeziehungen... oder: Wie sich Grid-only-Kanรคle verhalten
Angenommen, ich betreibe einen Grid-only-Kanal (GoK), also einen Kanal, bei welchem bewusst das ActivityPub Protokoll (AP) nicht aktiviert ist. Und nun postet eine der Verbindungen (natรผrlich ein Hubzilla-Kanal, denn nur mit denen kann man ja verbunden sein) einen Beitrag. Die Verbindung ist aber ein Fediverse-Kanal, hat also das ActivityPub Protokoll aktiviert und selbst auch Verbindungen zu ActivityPub Accounts...
Dreiecksbeziehungen... oder: Wie sich Grid-only-Kanรคle verhalten
Angenommen, ich betreibe einen Grid-only-Kanal (GoK), also einen Kanal, bei welchem bewusst das ActivityPub Protokoll (AP) nicht aktiviert ist. Und nun postet eine der Verbindungen (natรผrlich ein Hubzilla-Kanal, denn nur mit denen kann man ja verbunden sein) einen Beitrag. Die Verbindung ist aber ein Fediverse-Kanal, hat also das ActivityPub Protokoll aktiviert und selbst auch Verbindungen zu ActivityPub Accounts.
Vรถllig klar: Das Posting der Verbindung landet nun auch im Stream meines GoK.
Aber wie ist es, wenn eine Verbindung des Fediverse-Kanals, z.B. ein Mastodon-Nutzer auf das Posting antwortet? Sehe ich diesen Kommentar, obwohl mein GoK ja gar kein AP kann? Und kann ich, falls dieser AP-Kommentar in meinem Stream antwortet, selbst auch auf diesen Kommentar antworten? Und schlieรlich: Wenn das auch geht, wer sieht dann meinen Kommentar auf die AP-Antwort?
Nun, die Frage konnte ich auch nicht aus der Hรผfte raus beantworten. Mir ist das noch nicht untergekommen, weil meine einzigen GoK halt ausschlieรlich nicht-รถffentliche Foren-Kanรคle sind und dort solche Ereignisse nicht vorkommen.
Also habe ich mit einem eigens erstellten Kanal Grid-Only, der ein GoK ist, ein entsprechendes Experiment durchgefรผhrt. Und es lieร sich folgendes Verhalten feststellen:
Ist ein GoK mit einem Hubzilla-Kanal verbunden, welcher auch AP aktiviert hat (Fediverse-Kanal), erscheinen selbstverstรคndlich Posting des Fediverse-Kanals auch im Stream des GoK.
Kommentiert nun ein fremder Account eines Fediverse-Dienstes dieses Posting, dann erscheint der Kommentar auch im Thread zum Ausgangsposting beim GoK. Der Inhaber des GoK kann also AP-Beitrรคge sehen, obwohl er gar kein AP unterstรผtzt.
Der GoK kann sogar die im Thread nun angezeigte Antwort des AP-Accounts selbst kommentieren.
Dieser Kommentar erscheint -- logisch -- im Thread im Stream des GoK und -- ebenfalls logisch -- auch im Stream des Fediverse-Kanals (also des Verfassers des Ausgangs-Postings) als Antwort auf den AP-Kommentar.
Aber: Die Antwort des GoK auf den AP-Kommentar erscheint NICHT in der Timeline des AP-Accounts.
Also auf den Punkt gebracht:
Grid-only-Hubzilla-Kanรคle finden in ihrem Stream durchaus auch Inhalte, die von ActivityPub-Diensten stammen, sofern eine ihrer Hubzilla-Verbindungen AP erlaubt und selbst einen Kommentar von einem AP-Dienst empfรคngt.
Solche Antworten aus dem Fediverse sind fรผr den GoK nicht nur im Stream sichtbar, sie kรถnnen durch den GoK sogar kommentiert werden. Diesen Kommentar eines bekommt aber nur der verbundene Hubzilla-Kanal zu Gesicht, nicht aber der AP-Account, dessen Antwort im Thread kommentiert wurde. Kommentare des GoK auf das Ausgangsposting sind hingegen auch fรผr den AP-Account sichtbar. Also: Kommentare eines GoK sieht der AP-Account, Antworten eines GoK auf Kommentare eines AP-Accounts sieht der AP-Account nicht.
I use the ActivityPub for WordPress plugin here on ECS (follow me from Masotdon or similar at @naferrell@social.emucafe.org). Because ActivityPub for WordPress is a key part of this project, I subscribe to the ActivityPub for WordPress blog with my feed reader. Thanks to my subscription, I was able to read ATmosphere 1.0.0 โ Liftoff. ATmosphere is a new WordPress plugin which integrates a Bluesky account with a WordPress website, such that โ[w]hen you publish a post, ATmosphere shares it on Bluesky and stores the full article on your AT Protocol account as a structured record.โ Moreover, โBluesky replies, likes, and reposts come back as comments on your WordPress post.โ I set up something similar by using Bridgy Fed to bridge my ECS ActivityPub account to Bluesky, but why not create a whole Bluesky account? I installed ATmosphere, set up a new Bluesky account (I have a โpersonalโ account for sharing links but it goes mostly unused), and connected it with ATmosphere. Set-up went well. The only issue I had was that I had to manually create a .well-known directory to set up social.emucafe.org as the Bluesky account handle, but it is done โ so you can follow this site from Bluesky at social.emucafe.org. (I would offer some sort of guide, but the blog post and WordPress plugin page guides are the ones to follow.)
My Hollo instance has been updated to 0.9.1 if you wanna take a peek. It's shaking off the early UI look and feel for something more professional.
A lot of extra configurations that I didn't have time to review or enable, but some of it looks interesting, like more efficient handling of remote media.
My Hollo instance has been updated to 0.9.1 if you wanna take a peek. It's shaking off the early UI look and feel for something more professional.
A lot of extra configurations that I didn't have time to review or enable, but some of it looks interesting, like more efficient handling of remote media.
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
@hollo releases a new major version update, 0.90. Too many changes to hit in a single post! Skimming, the most notable to users will be the switch from Pico CSS (my weekend hobbyist fave) to Uno CSS. At least in screenshots, the new UI is taking on a polished look.
Planning to upgrade, but need to review this a bit more before flipping the switch.
I have deeply mixed feelings about #ActivityPub's adoption of JSON-LD, as someone who's spent way too long dealing with it while building #Fedify.
Part of me wishes it had never happened. A lot of developers jump into ActivityPub development without really understanding JSON-LD, and honestly, can you blame them? The result is a growing number of implementations producing technically invalid JSON-LD. It works, sort of, because everyone's just pattern-matching against what Mastodon does, but it's not correct. And even developers who do take the time to understand JSON-LD often end up hardcoding their documents anyway, because proper JSON-LD processor libraries simply don't exist for many languages. No safety net, no validation, just vibes and hoping you got the @context right. Naturally, mistakes creep in.
But then the other part of me thinks: well, we're stuck with JSON-LD now. There's no going back. So wouldn't it be nice if people actually used it properly? Process the documents, normalize them, do the compaction and expansion dance the way the spec intended. That's what Fedify does.
Here's the part that really gets to me, though. Because Fedify actually processes JSON-LD correctly, it's more likely to break when talking to implementations that produce malformed documents. From the end user's perspective, Fedify looks like the fragile one. โWhy can't I follow this person?โ Well, because their server is emitting garbage JSON-LD that happens to work with implementations that just treat it as a regular JSON blob. Every time I get one of these bug reports, I feel a certain injustice. Like being the only person in the group project who actually read the assignment.
To be fair, there are real practical reasons why most people don't bother with proper JSON-LD processing. Implementing a full processor is genuinely a lot of work. It leans on the entire Linked Data stack, which is bigger than most people expect going in. And the performance cost isn't trivial either. Fedify uses some tricks to keep things fast, and I'll be honest, that code isn't my proudest work.
Anyway, none of this is going anywhere. Just me grumbling into the void. If you're building an ActivityPub implementation, maybe consider using a JSON-LD processor if one's available for your language. And if you're not going to, at least test your output against implementations that do.
I have deeply mixed feelings about #ActivityPub's adoption of JSON-LD, as someone who's spent way too long dealing with it while building #Fedify.
Part of me wishes it had never happened. A lot of developers jump into ActivityPub development without really understanding JSON-LD, and honestly, can you blame them? The result is a growing number of implementations producing technically invalid JSON-LD. It works, sort of, because everyone's just pattern-matching against what Mastodon does, but it's not correct. And even developers who do take the time to understand JSON-LD often end up hardcoding their documents anyway, because proper JSON-LD processor libraries simply don't exist for many languages. No safety net, no validation, just vibes and hoping you got the @context right. Naturally, mistakes creep in.
But then the other part of me thinks: well, we're stuck with JSON-LD now. There's no going back. So wouldn't it be nice if people actually used it properly? Process the documents, normalize them, do the compaction and expansion dance the way the spec intended. That's what Fedify does.
Here's the part that really gets to me, though. Because Fedify actually processes JSON-LD correctly, it's more likely to break when talking to implementations that produce malformed documents. From the end user's perspective, Fedify looks like the fragile one. โWhy can't I follow this person?โ Well, because their server is emitting garbage JSON-LD that happens to work with implementations that just treat it as a regular JSON blob. Every time I get one of these bug reports, I feel a certain injustice. Like being the only person in the group project who actually read the assignment.
To be fair, there are real practical reasons why most people don't bother with proper JSON-LD processing. Implementing a full processor is genuinely a lot of work. It leans on the entire Linked Data stack, which is bigger than most people expect going in. And the performance cost isn't trivial either. Fedify uses some tricks to keep things fast, and I'll be honest, that code isn't my proudest work.
Anyway, none of this is going anywhere. Just me grumbling into the void. If you're building an ActivityPub implementation, maybe consider using a JSON-LD processor if one's available for your language. And if you're not going to, at least test your output against implementations that do.
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
@hollo releases a new major version update, 0.90. Too many changes to hit in a single post! Skimming, the most notable to users will be the switch from Pico CSS (my weekend hobbyist fave) to Uno CSS. At least in screenshots, the new UI is taking on a polished look.
Planning to upgrade, but need to review this a bit more before flipping the switch.
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
@hollo releases a new major version update, 0.90. Too many changes to hit in a single post! Skimming, the most notable to users will be the switch from Pico CSS (my weekend hobbyist fave) to Uno CSS. At least in screenshots, the new UI is taking on a polished look.
Planning to upgrade, but need to review this a bit more before flipping the switch.
@hollo releases a new major version update, 0.90. Too many changes to hit in a single post! Skimming, the most notable to users will be the switch from Pico CSS (my weekend hobbyist fave) to Uno CSS. At least in screenshots, the new UI is taking on a polished look.
Planning to upgrade, but need to review this a bit more before flipping the switch.
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
@hollo releases a new major version update, 0.90. Too many changes to hit in a single post! Skimming, the most notable to users will be the switch from Pico CSS (my weekend hobbyist fave) to Uno CSS. At least in screenshots, the new UI is taking on a polished look.
Planning to upgrade, but need to review this a bit more before flipping the switch.
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
The biggest change this release is a complete redesign of every server-rendered page. Pico CSS is replaced by a new design system built on UnoCSS, and your chosen theme color now tints your profile and dashboard pages throughout.
Other highlights:
Passkey (WebAuthn) authentication: sign in with a biometric or PIN gesture, which counts as MFA so there's no separate TOTP step
Full FEP-044f quote authorization: QuoteRequest/Accept/Reject federation, quote policy enforcement, and dereferenceable QuoteAuthorization objects
A configurable media proxy (MEDIA_PROXY=proxy or cache) that re-serves remote avatars, attachments, and preview images from Hollo's own origin
Optional split-domain WebFinger via HANDLE_HOST + WEB_ORIGIN
Public followers/following pages and per-post reaction list pages (likes, boosts, emoji reactions, quotes)
There were also several serious database performance fixes: profile page queries that were taking hundreds of seconds on cold caches, a NodeInfo endpoint doing a full table scan on every request, and a handful of timeline pagination bugs.
Public profile for ๆดช ๆฐๆ (Hong Minhee) with a bookstore header image, circular avatar, follower and following counts, bio, custom fields including website and GitHub links, and a pinned post card below
ALT text
The โEdit @hongminheeโ admin page showing the new Hollo design: profile image upload areas for avatar and header, identity fields for display name and bio, custom fields table with label-value pairs, privacy checkboxes, a 20-swatch theme color picker with orange selected, and a โSave changesโ button
mastodon,,, didn't invent activitypub???
and, guess what happens when you make your own bespoke protocol? nobody uses it! and what is needed for decentralization? for people to use your protocol!!!!!
and, wafrn, wafrn is aiming right at mastodon. it's just mastodon with doohickeys attached. activitypub can do more than that! i think.
better to extend an existing protocol and have some bugs, than make your own and have a complete failure to communicate!!
Dreiecksbeziehungen... oder: Wie sich Grid-only-Kanรคle verhalten
Angenommen, ich betreibe einen Grid-only-Kanal (GoK), also einen Kanal, bei welchem bewusst das ActivityPub Protokoll (AP) nicht aktiviert ist. Und nun postet eine der Verbindungen (natรผrlich ein Hubzilla-Kanal, denn nur mit denen kann man ja verbunden sein) einen Beitrag. Die Verbindung ist aber ein Fediverse-Kanal, hat also das ActivityPub Protokoll aktiviert und selbst auch Verbindungen zu ActivityPub Accounts...
Dreiecksbeziehungen... oder: Wie sich Grid-only-Kanรคle verhalten
Angenommen, ich betreibe einen Grid-only-Kanal (GoK), also einen Kanal, bei welchem bewusst das ActivityPub Protokoll (AP) nicht aktiviert ist. Und nun postet eine der Verbindungen (natรผrlich ein Hubzilla-Kanal, denn nur mit denen kann man ja verbunden sein) einen Beitrag. Die Verbindung ist aber ein Fediverse-Kanal, hat also das ActivityPub Protokoll aktiviert und selbst auch Verbindungen zu ActivityPub Accounts.
Vรถllig klar: Das Posting der Verbindung landet nun auch im Stream meines GoK.
Aber wie ist es, wenn eine Verbindung des Fediverse-Kanals, z.B. ein Mastodon-Nutzer auf das Posting antwortet? Sehe ich diesen Kommentar, obwohl mein GoK ja gar kein AP kann? Und kann ich, falls dieser AP-Kommentar in meinem Stream antwortet, selbst auch auf diesen Kommentar antworten? Und schlieรlich: Wenn das auch geht, wer sieht dann meinen Kommentar auf die AP-Antwort?
Nun, die Frage konnte ich auch nicht aus der Hรผfte raus beantworten. Mir ist das noch nicht untergekommen, weil meine einzigen GoK halt ausschlieรlich nicht-รถffentliche Foren-Kanรคle sind und dort solche Ereignisse nicht vorkommen.
Also habe ich mit einem eigens erstellten Kanal Grid-Only, der ein GoK ist, ein entsprechendes Experiment durchgefรผhrt. Und es lieร sich folgendes Verhalten feststellen:
Ist ein GoK mit einem Hubzilla-Kanal verbunden, welcher auch AP aktiviert hat (Fediverse-Kanal), erscheinen selbstverstรคndlich Posting des Fediverse-Kanals auch im Stream des GoK.
Kommentiert nun ein fremder Account eines Fediverse-Dienstes dieses Posting, dann erscheint der Kommentar auch im Thread zum Ausgangsposting beim GoK. Der Inhaber des GoK kann also AP-Beitrรคge sehen, obwohl er gar kein AP unterstรผtzt.
Der GoK kann sogar die im Thread nun angezeigte Antwort des AP-Accounts selbst kommentieren.
Dieser Kommentar erscheint -- logisch -- im Thread im Stream des GoK und -- ebenfalls logisch -- auch im Stream des Fediverse-Kanals (also des Verfassers des Ausgangs-Postings) als Antwort auf den AP-Kommentar.
Aber: Die Antwort des GoK auf den AP-Kommentar erscheint NICHT in der Timeline des AP-Accounts.
Also auf den Punkt gebracht:
Grid-only-Hubzilla-Kanรคle finden in ihrem Stream durchaus auch Inhalte, die von ActivityPub-Diensten stammen, sofern eine ihrer Hubzilla-Verbindungen AP erlaubt und selbst einen Kommentar von einem AP-Dienst empfรคngt.
Solche Antworten aus dem Fediverse sind fรผr den GoK nicht nur im Stream sichtbar, sie kรถnnen durch den GoK sogar kommentiert werden. Diesen Kommentar eines bekommt aber nur der verbundene Hubzilla-Kanal zu Gesicht, nicht aber der AP-Account, dessen Antwort im Thread kommentiert wurde. Kommentare des GoK auf das Ausgangsposting sind hingegen auch fรผr den AP-Account sichtbar. Also: Kommentare eines GoK sieht der AP-Account, Antworten eines GoK auf Kommentare eines AP-Accounts sieht der AP-Account nicht.
My personal desire would be to create a format from scratch (because you are in control, you get something bespoke to your needs, and it is personally satisfying), but โ
I think there is probably an advantage to using something (such as JSON resume) that already has wide adoption.
I guess that makes me inclined towards the latter.
...
So, if I go that way, I would have to decide: plain JSON or JSON-LD.
There is also the other question of โ would the resume / CV be JSON-LD.
On one hand, if it was in JSON-LD, it would make it machine-legible similar to ActivityPub.
On the other hand, I don't think anyone is going to write JSON-LD (especially HTML embedded in a JSON string value) by hand. But, I do think some people will want to write their resume by hand.
It feels like user-experience is fighting with JSON-LD based machine-legibility.
There is also the other question of โ would the resume / CV be JSON-LD.
On one hand, if it was in JSON-LD, it would make it machine-legible similar to ActivityPub.
On the other hand, I don't think anyone is going to write JSON-LD (especially HTML embedded in a JSON string value) by hand. But, I do think some people will want to write their resume by hand.
It feels like user-experience is fighting with JSON-LD based machine-legibility.
Mastodon has changed the way it previews a linked NeoDB collection: - before, the middle of the cover image & the title in large text - now, like a quote post, with the poster's info & first few lines of small text. No title, no cover image.
As perhaps the only person regularly posting NeoDB collections on Mastodon (& someone who has changed the design of NeoDB collection cover images for better preview on Mastodon), I'm not sure I approve! ๐
Mastodon has changed the way it previews a linked NeoDB collection: - before, the middle of the cover image & the title in large text - now, like a quote post, with the poster's info & first few lines of small text. No title, no cover image.
As perhaps the only person regularly posting NeoDB collections on Mastodon (& someone who has changed the design of NeoDB collection cover images for better preview on Mastodon), I'm not sure I approve! ๐
There is also the other question of โ would the resume / CV be JSON-LD.
On one hand, if it was in JSON-LD, it would make it machine-legible similar to ActivityPub.
On the other hand, I don't think anyone is going to write JSON-LD (especially HTML embedded in a JSON string value) by hand. But, I do think some people will want to write their resume by hand.
It feels like user-experience is fighting with JSON-LD based machine-legibility.
There is also the other question of โ would the resume / CV be JSON-LD.
On one hand, if it was in JSON-LD, it would make it machine-legible similar to ActivityPub.
On the other hand, I don't think anyone is going to write JSON-LD (especially HTML embedded in a JSON string value) by hand. But, I do think some people will want to write their resume by hand.
It feels like user-experience is fighting with JSON-LD based machine-legibility.
CONGRATULATIONS!
The operation succeeded, and you are now a participant in the Social Web Incubator Community Group. A separate form lets you resign the group.
Now that it has come up in two recent conversations, I have to ask: what's the simplest social bookmarking application that gets closest to what Delicious* used to be? Ideally free and open source...
And is anyone working on a federated ActivityPub equivalent? Because that would be cool!
Now that it has come up in two recent conversations, I have to ask: what's the simplest social bookmarking application that gets closest to what Delicious* used to be? Ideally free and open source...
And is anyone working on a federated ActivityPub equivalent? Because that would be cool!
7.3 Update Activity
For server to server interactions, an Update activity means that the receiving server SHOULD update its copy of the object of the same id to the copy supplied in the Update activity. Unlike the client to server handling of the Update activity, this is not a partial update but a complete replacement of the object.
The receiving server MUST take care to be sure that the Update is authorized to modify its object. At minimum, this may be done by ensuring that the Update and its object are of same origin.
ALT text
7.3 Update Activity
For server to server interactions, an Update activity means that the receiving server SHOULD update its copy of the object of the same id to the copy supplied in the Update activity. Unlike the client to server handling of the Update activity, this is not a partial update but a complete replacement of the object.
The receiving server MUST take care to be sure that the Update is authorized to modify its object. At minimum, this may be done by ensuring that the Update and its object are of same origin.
ActivityPub being treated as JSON is a good thing.
1/
Some of us are old enough to remember RSS and blogs.
Some of us are old enough to remember the absurd levels of hype that blogs and RSS attracted โ similar to the modern AI hype and recent crypto hype. During that era, it felt like everyone any their pet cat wanted a blog with an RSS feed. During that era, there was a get-rich-quick fever around blogs and RSS.
@publicspaces will have a pre-conference unconference on June 4th.
This unconference is an open invitation to discuss & forge relationships between people involved with the #OpenSocialWeb. From app builder & protocol architects to advocates, sysadmins, moderators, community organisers & more. Let's forge bonds across cultures, protocols & apps!
ActivityPub being treated as JSON is a good thing.
1/
Some of us are old enough to remember RSS and blogs.
Some of us are old enough to remember the absurd levels of hype that blogs and RSS attracted โ similar to the modern AI hype and recent crypto hype. During that era, it felt like everyone any their pet cat wanted a blog with an RSS feed. During that era, there was a get-rich-quick fever around blogs and RSS.
ActivityPub being treated as JSON is a good thing.
1/
Some of us are old enough to remember RSS and blogs.
Some of us are old enough to remember the absurd levels of hype that blogs and RSS attracted โ similar to the modern AI hype and recent crypto hype. During that era, it felt like everyone any their pet cat wanted a blog with an RSS feed. During that era, there was a get-rich-quick fever around blogs and RSS.
Ultimately the #fediverse needs to solve the problem of maintaining context in postings. I'm not sure what the real solution is, but I think #lemmy in particular needs work doing on the #activitypub side of things.
I think ActivityPub Partial Updates won't work well with attachments or tags.
Not unless there is a way to reliably just target the item in the attachments or tags array that you want to modify. AFAIK, there isn't.
You have to download the old version of the whole attachments or tags array first, update it locally, and then upload the whole (updated) thing. This creates a race-condition.
Hear me out, if we can integrate these 4, in a seamless frictionless integrated experience for both, companies and users, we could have a nice alternative to #LinkedIn that is actually not crap.
A diagram titled "An ActivityPub-based LinkedIn" is presented on a light blue background. The image features four colored rectangular boxes arranged in a grid around a central horizontal bar. The top row includes a light purple box with the text "Professional Profile and Badges" and "fediprofile," alongside a dark purple box with the text "Social Graph and Updates" and "mastodon." A dark blue horizontal bar in the center contains the text "Single Login Identity." The bottom row consists of a black box with the text "Job posts and discussions" and "lemmy," and an orange box with the text "Achievements and Certifications" and "badgefed."
Just to be clear, I think JavaScript is fine for authenticated or more complex content. If I'm a user of a server, it seems acceptable that I should trust it and enable JavaScript.
However, if I am some random visitor to your instance and just trying to view a post or user profile, that should not require JavaScript.
The JavaScript ecosystem (e.g., npm) is rife with supply chain hacks. Plus, there are many poorly maintained Mastodon instances (e.g., mastodon.social, I think?). Although, I guess those poorly maintained instances are not pulling down the latest backdoored npm packages... Regardless, it is a security risk to require visitors run JavaScript from every instance they visit for simple content.
Does anyone have recommendations for a Mastodon fork that doesn't require visitors to enable JavaScript to view basic content? The JavaScript dependency is a security risk and user hostile. Visitors should not be required to enable JavaScript when simply visiting a Mastodon server. Plus, the recommendation to use a native app doesn't even work for all Mastodon/ActivityPub instances.
Also, the requirement for JavaScript makes the Mastodon development team seem incompetent. They can't even make a basic web site that doesn't require JavaScript. I could do that when I was in middle school.
>To use the Mastodon web application, please enable JavaScript. Alternatively, try one of the native apps for Mastodon for your platform.
Just to be clear, I think JavaScript is fine for authenticated or more complex content. If I'm a user of a server, it seems acceptable that I should trust it and enable JavaScript.
However, if I am some random visitor to your instance and just trying to view a post or user profile, that should not require JavaScript.
The JavaScript ecosystem (e.g., npm) is rife with supply chain hacks. Plus, there are many poorly maintained Mastodon instances (e.g., mastodon.social, I think?). Although, I guess those poorly maintained instances are not pulling down the latest backdoored npm packages... Regardless, it is a security risk to require visitors run JavaScript from every instance they visit for simple content.
Does anyone have recommendations for a Mastodon fork that doesn't require visitors to enable JavaScript to view basic content? The JavaScript dependency is a security risk and user hostile. Visitors should not be required to enable JavaScript when simply visiting a Mastodon server. Plus, the recommendation to use a native app doesn't even work for all Mastodon/ActivityPub instances.
Also, the requirement for JavaScript makes the Mastodon development team seem incompetent. They can't even make a basic web site that doesn't require JavaScript. I could do that when I was in middle school.
>To use the Mastodon web application, please enable JavaScript. Alternatively, try one of the native apps for Mastodon for your platform.
@publicspaces will have a pre-conference unconference on June 4th.
This unconference is an open invitation to discuss & forge relationships between people involved with the #OpenSocialWeb. From app builder & protocol architects to advocates, sysadmins, moderators, community organisers & more. Let's forge bonds across cultures, protocols & apps!
Ohyes.. Before we forget it.. At #FOSDEM, we attended a workshop on the European Social Web organised by @evan of @SocialWebFoundation. The group agreed that social sovereignty in Europe depends on interoperability, decentralisation, open standards, and open source. A vision paper is in progress and will be released soon. Preludes were shared at #2MR by @michael and @bjoernsta.
Is there a lightweight #ActivityPub server in existence that supports the #Pixelfed API, akin to how snac2 by @grunfink supports Mastodon API? I'd like to use Pixelfed clients but avoid Pixelfed itself. #askfedi
@publicspaces will have a pre-conference unconference on June 4th.
This unconference is an open invitation to discuss & forge relationships between people involved with the #OpenSocialWeb. From app builder & protocol architects to advocates, sysadmins, moderators, community organisers & more. Let's forge bonds across cultures, protocols & apps!
Ohyes.. Before we forget it.. At #FOSDEM, we attended a workshop on the European Social Web organised by @evan of @SocialWebFoundation. The group agreed that social sovereignty in Europe depends on interoperability, decentralisation, open standards, and open source. A vision paper is in progress and will be released soon. Preludes were shared at #2MR by @michael and @bjoernsta.
Ohyes.. Before we forget it.. At #FOSDEM, we attended a workshop on the European Social Web organised by @evan of @SocialWebFoundation. The group agreed that social sovereignty in Europe depends on interoperability, decentralisation, open standards, and open source. A vision paper is in progress and will be released soon. Preludes were shared at #2MR by @michael and @bjoernsta.
@publicspaces will have a pre-conference unconference on June 4th.
This unconference is an open invitation to discuss & forge relationships between people involved with the #OpenSocialWeb. From app builder & protocol architects to advocates, sysadmins, moderators, community organisers & more. Let's forge bonds across cultures, protocols & apps!
> Any implementation of a music collection on top of #ActivityPub would still have to implement the collection itself, and maintain standards for how backfilling works and how the collection is shaped, so why not start with a clean implementation that only provides the parts that are important to a music collection to begin with?
We often think about ActivityPub by how we experience it on the fediverse. But the fediverse rn is only a very particular implementation of AP, specialized to support microblogging and traditional social media use cases.
AP offers "a social graph of addressible actors to exchange activities with an object payload". Actors, activities, and objects are all fully customizable linked data, they can be anything, modeled to represent any domain.
With an ActivityPub API client you maintain your music collection locally, then publish and interact to a static site, or other interested actors.
#Holos is a new social network working with #ActivityPub. This is not an app where you can connect your Mastodon, Pixelfed or PeerTube account. There is no web version and no API because the ActivityPub server runs on the device itself. That's the whole challenge behind this project. If there is more engagement, I plan to build a desktop version and even sync between different devices.
The official account for all announcements is @HolosSocial
A friend of mine, @siliconsjang, released SiliconBeest v1.0.0 today. It's a #fediverse server built on #Cloudflare Workers, D1, R2, and Queues, using Fedify.
I like the starting point: after watching fediverse servers go down together during Cloudflare outages, they thought, why not just run on Cloudflare directly?
They're aiming for something cheap enough that a small instance can stay on Cloudflare's free plan, and a somewhat bigger one can fit in the $5/month tier. It's still early; a lot is missing, and Mastodon/Misskey API compatibility is more of a long-term goal.
I'm glad to see Fedify put to use for something like this. Worth checking out.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
#Holos is a new social network working with #ActivityPub. This is not an app where you can connect your Mastodon, Pixelfed or PeerTube account. There is no web version and no API because the ActivityPub server runs on the device itself. That's the whole challenge behind this project. If there is more engagement, I plan to build a desktop version and even sync between different devices.
The official account for all announcements is @HolosSocial
Is there a lightweight #ActivityPub server in existence that supports the #Pixelfed API, akin to how snac2 by @grunfink supports Mastodon API? I'd like to use Pixelfed clients but avoid Pixelfed itself. #askfedi
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
A friend of mine, @siliconsjang, released SiliconBeest v1.0.0 today. It's a #fediverse server built on #Cloudflare Workers, D1, R2, and Queues, using Fedify.
I like the starting point: after watching fediverse servers go down together during Cloudflare outages, they thought, why not just run on Cloudflare directly?
They're aiming for something cheap enough that a small instance can stay on Cloudflare's free plan, and a somewhat bigger one can fit in the $5/month tier. It's still early; a lot is missing, and Mastodon/Misskey API compatibility is more of a long-term goal.
I'm glad to see Fedify put to use for something like this. Worth checking out.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
A friend of mine, @siliconsjang, released SiliconBeest v1.0.0 today. It's a #fediverse server built on #Cloudflare Workers, D1, R2, and Queues, using Fedify.
I like the starting point: after watching fediverse servers go down together during Cloudflare outages, they thought, why not just run on Cloudflare directly?
They're aiming for something cheap enough that a small instance can stay on Cloudflare's free plan, and a somewhat bigger one can fit in the $5/month tier. It's still early; a lot is missing, and Mastodon/Misskey API compatibility is more of a long-term goal.
I'm glad to see Fedify put to use for something like this. Worth checking out.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
A friend of mine, @siliconsjang, released SiliconBeest v1.0.0 today. It's a #fediverse server built on #Cloudflare Workers, D1, R2, and Queues, using Fedify.
I like the starting point: after watching fediverse servers go down together during Cloudflare outages, they thought, why not just run on Cloudflare directly?
They're aiming for something cheap enough that a small instance can stay on Cloudflare's free plan, and a somewhat bigger one can fit in the $5/month tier. It's still early; a lot is missing, and Mastodon/Misskey API compatibility is more of a long-term goal.
I'm glad to see Fedify put to use for something like this. Worth checking out.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
A friend of mine, @siliconsjang, released SiliconBeest v1.0.0 today. It's a #fediverse server built on #Cloudflare Workers, D1, R2, and Queues, using Fedify.
I like the starting point: after watching fediverse servers go down together during Cloudflare outages, they thought, why not just run on Cloudflare directly?
They're aiming for something cheap enough that a small instance can stay on Cloudflare's free plan, and a somewhat bigger one can fit in the $5/month tier. It's still early; a lot is missing, and Mastodon/Misskey API compatibility is more of a long-term goal.
I'm glad to see Fedify put to use for something like this. Worth checking out.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
A friend of mine, @siliconsjang, released SiliconBeest v1.0.0 today. It's a #fediverse server built on #Cloudflare Workers, D1, R2, and Queues, using Fedify.
I like the starting point: after watching fediverse servers go down together during Cloudflare outages, they thought, why not just run on Cloudflare directly?
They're aiming for something cheap enough that a small instance can stay on Cloudflare's free plan, and a somewhat bigger one can fit in the $5/month tier. It's still early; a lot is missing, and Mastodon/Misskey API compatibility is more of a long-term goal.
I'm glad to see Fedify put to use for something like this. Worth checking out.
I'm pleased to announce SiliconBeest v1.0.0, a serverless fediverse software project built on Cloudflare edge computing, aiming for Mastodon API compatibility.
SiliconBeest is a fediverse project designed to run on Cloudflare Workers.
After seeing many fediverse servers become unavailable when Cloudflare had outages, I realized that the fediverse already relies heavily on Cloudflare infrastructure.
So I thought: why not build fediverse software directly on top of Cloudflare?
This project was inspired by Cloudflare Inc.โs Wildebeest project, and it also references some of its ideas and code.
The project name, SiliconBeest, comes from my nickname silicon(sjang) combined with Cloudflareโs Wildebeest.
Iโm still working on making it as inexpensive to run as possible. For now, the goal is to support a small number of users with a small federation footprint on the free plan, and a medium federation footprint on the $5 plan.
From an API perspective, SiliconBeest aims to be compatible with both Mastodon and Misskey APIs. However, as many people know, full compatibility is difficult in practice, so this remains a long-term goal rather than something fully implemented today.
This is still an early version, and many parts are not implemented yet. However, SiliconBeest is an experiment in how lightweight and affordable fediverse software can be when built on top of Cloudflareโs serverless infrastructure, such as Workers, D1, R2, and Queues.
In v1.0.0, I focused on organizing the basic architecture and core functionality first. Going forward, I plan to gradually improve Mastodon API compatibility, federation stability, admin tooling, and documentation.
SiliconBeest can be deployed relatively easily using a GitHub template and Cloudflare.
Create a new repository from the GitHub template.
Set up the required resources and environment on Cloudflare.
Store the Cloudflare API token and required environment variables in GitHub Secrets.
Deploy automatically using GitHub Actions.
Once deployment is complete, finish configuring your instance.
The installation process is still being refined, and Iโm aware that there is plenty of room for improvement. I plan to keep improving the documentation and deployment flow over time, and related PRs are always welcome.
If you're a techy person interested in self-hosting Fediverse platforms, you might like to check out the "Delightful Fediverse" list which tries to feature every Fediverse project available:
If you're a techy person interested in self-hosting Fediverse platforms, you might like to check out the "Delightful Fediverse" list which tries to feature every Fediverse project available:
#Holos is a new social network working with #ActivityPub. This is not an app where you can connect your Mastodon, Pixelfed or PeerTube account. There is no web version and no API because the ActivityPub server runs on the device itself. That's the whole challenge behind this project. If there is more engagement, I plan to build a desktop version and even sync between different devices.
The official account for all announcements is @HolosSocial
#Holos is a new social network working with #ActivityPub. This is not an app where you can connect your Mastodon, Pixelfed or PeerTube account. There is no web version and no API because the ActivityPub server runs on the device itself. That's the whole challenge behind this project. If there is more engagement, I plan to build a desktop version and even sync between different devices.
The official account for all announcements is @HolosSocial
If you're a techy person interested in self-hosting Fediverse platforms, you might like to check out the "Delightful Fediverse" list which tries to feature every Fediverse project available:
If you're a techy person interested in self-hosting Fediverse platforms, you might like to check out the "Delightful Fediverse" list which tries to feature every Fediverse project available:
If you're a techy person interested in self-hosting Fediverse platforms, you might like to check out the "Delightful Fediverse" list which tries to feature every Fediverse project available:
If you're a techy person interested in self-hosting Fediverse platforms, you might like to check out the "Delightful Fediverse" list which tries to feature every Fediverse project available:
To me, #ForgeJo is the future. In many different avenues of digital services, it's usually a monopolistic vendor lock-in situation. #Github is no exception, nor is #Gitlab.
But Forgejo aims to be a git system that uses #ActivityPub to communicate with other git instances - in effect decentralizing code repos, and even possibly CD/CI chains. Hold on to your hats, folks.
> Any implementation of a music collection on top of #ActivityPub would still have to implement the collection itself, and maintain standards for how backfilling works and how the collection is shaped, so why not start with a clean implementation that only provides the parts that are important to a music collection to begin with?
We often think about ActivityPub by how we experience it on the fediverse. But the fediverse rn is only a very particular implementation of AP, specialized to support microblogging and traditional social media use cases.
AP offers "a social graph of addressible actors to exchange activities with an object payload". Actors, activities, and objects are all fully customizable linked data, they can be anything, modeled to represent any domain.
With an ActivityPub API client you maintain your music collection locally, then publish and interact to a static site, or other interested actors.
This release continues my focus on security instead of new features. As I wrote earlier this week, I rebuilt the template framework Ktistec uses with type safety as a central principle. What does that mean?
Imagine that you have an instance of a String that holds federated data. Where can you safely render that in a browser, and what operations (sanitization, escaping, etc.) do you need to do first?
The only way to answer that is to look carefully at the lineage of that data: where it came from, how it was stored, how it was transformed, and where it's rendered. A name holds text; an href or src attribute holds a URL. If you want to render a name inside an HTML element you should HTML escape it. You should escape href and src, too, but the escaping rules for URLs are slightly different from the HTML rules. It's easy to make mistakes.
Ktistec uses four "safe" types to express the contracts:
SafeHTML: A String wrapper marking HTML markup safe to emit raw into HTML data slots (text content, between tags).
SafeAttrValue: A String wrapper marking a value safe to emit raw inside a double-quoted HTML attribute (attr="..."), other than URL or event-handler slots.
SafeURI: A String wrapper marking a URL safe to emit raw into a URL attribute slot (href, src, action, etc.).
SafeJSON: A String wrapper marking JSON output safe to emit raw into the body of a <script type="application/json"> block.
Using the wrong type at a call site is either a compile-time error, or it triggers automatic sanitization of the underlying string value.
Here's the full changelog:
Added
String safety framework with typed "safe" strings.
New Slang template engine with compile-time safety checks.
Vendored WebFinger and HostMeta client shards.
Fixed
Prevent delivery to unknown IRIs.
Narrow Like/Dislike addressing to the liked object's author.
I have at least one more cleanup pass to do, and then I'll turn my attention back to the Mastodon-compatible API and a few features I've been looking forward toโlike scheduled posts.
This release continues my focus on security instead of new features. As I wrote earlier this week, I rebuilt the template framework Ktistec uses with type safety as a central principle. What does that mean?
Imagine that you have an instance of a String that holds federated data. Where can you safely render that in a browser, and what operations (sanitization, escaping, etc.) do you need to do first?
The only way to answer that is to look carefully at the lineage of that data: where it came from, how it was stored, how it was transformed, and where it's rendered. A name holds text; an href or src attribute holds a URL. If you want to render a name inside an HTML element you should HTML escape it. You should escape href and src, too, but the escaping rules for URLs are slightly different from the HTML rules. It's easy to make mistakes.
Ktistec uses four "safe" types to express the contracts:
SafeHTML: A String wrapper marking HTML markup safe to emit raw into HTML data slots (text content, between tags).
SafeAttrValue: A String wrapper marking a value safe to emit raw inside a double-quoted HTML attribute (attr="..."), other than URL or event-handler slots.
SafeURI: A String wrapper marking a URL safe to emit raw into a URL attribute slot (href, src, action, etc.).
SafeJSON: A String wrapper marking JSON output safe to emit raw into the body of a <script type="application/json"> block.
Using the wrong type at a call site is either a compile-time error, or it triggers automatic sanitization of the underlying string value.
Here's the full changelog:
Added
String safety framework with typed "safe" strings.
New Slang template engine with compile-time safety checks.
Vendored WebFinger and HostMeta client shards.
Fixed
Prevent delivery to unknown IRIs.
Narrow Like/Dislike addressing to the liked object's author.
I have at least one more cleanup pass to do, and then I'll turn my attention back to the Mastodon-compatible API and a few features I've been looking forward toโlike scheduled posts.
This release continues my focus on security instead of new features. As I wrote earlier this week, I rebuilt the template framework Ktistec uses with type safety as a central principle. What does that mean?
Imagine that you have an instance of a String that holds federated data. Where can you safely render that in a browser, and what operations (sanitization, escaping, etc.) do you need to do first?
The only way to answer that is to look carefully at the lineage of that data: where it came from, how it was stored, how it was transformed, and where it's rendered. A name holds text; an href or src attribute holds a URL. If you want to render a name inside an HTML element you should HTML escape it. You should escape href and src, too, but the escaping rules for URLs are slightly different from the HTML rules. It's easy to make mistakes.
Ktistec uses four "safe" types to express the contracts:
SafeHTML: A String wrapper marking HTML markup safe to emit raw into HTML data slots (text content, between tags).
SafeAttrValue: A String wrapper marking a value safe to emit raw inside a double-quoted HTML attribute (attr="..."), other than URL or event-handler slots.
SafeURI: A String wrapper marking a URL safe to emit raw into a URL attribute slot (href, src, action, etc.).
SafeJSON: A String wrapper marking JSON output safe to emit raw into the body of a <script type="application/json"> block.
Using the wrong type at a call site is either a compile-time error, or it triggers automatic sanitization of the underlying string value.
Here's the full changelog:
Added
String safety framework with typed "safe" strings.
New Slang template engine with compile-time safety checks.
Vendored WebFinger and HostMeta client shards.
Fixed
Prevent delivery to unknown IRIs.
Narrow Like/Dislike addressing to the liked object's author.
I have at least one more cleanup pass to do, and then I'll turn my attention back to the Mastodon-compatible API and a few features I've been looking forward toโlike scheduled posts.
This release continues my focus on security instead of new features. As I wrote earlier this week, I rebuilt the template framework Ktistec uses with type safety as a central principle. What does that mean?
Imagine that you have an instance of a String that holds federated data. Where can you safely render that in a browser, and what operations (sanitization, escaping, etc.) do you need to do first?
The only way to answer that is to look carefully at the lineage of that data: where it came from, how it was stored, how it was transformed, and where it's rendered. A name holds text; an href or src attribute holds a URL. If you want to render a name inside an HTML element you should HTML escape it. You should escape href and src, too, but the escaping rules for URLs are slightly different from the HTML rules. It's easy to make mistakes.
Ktistec uses four "safe" types to express the contracts:
SafeHTML: A String wrapper marking HTML markup safe to emit raw into HTML data slots (text content, between tags).
SafeAttrValue: A String wrapper marking a value safe to emit raw inside a double-quoted HTML attribute (attr="..."), other than URL or event-handler slots.
SafeURI: A String wrapper marking a URL safe to emit raw into a URL attribute slot (href, src, action, etc.).
SafeJSON: A String wrapper marking JSON output safe to emit raw into the body of a <script type="application/json"> block.
Using the wrong type at a call site is either a compile-time error, or it triggers automatic sanitization of the underlying string value.
Here's the full changelog:
Added
String safety framework with typed "safe" strings.
New Slang template engine with compile-time safety checks.
Vendored WebFinger and HostMeta client shards.
Fixed
Prevent delivery to unknown IRIs.
Narrow Like/Dislike addressing to the liked object's author.
I have at least one more cleanup pass to do, and then I'll turn my attention back to the Mastodon-compatible API and a few features I've been looking forward toโlike scheduled posts.
In daily life, if you talk to someone, you have the right to remember what was said, right?
And if you don't possess photographic memory, you have the right to take notes, keep record, maintain a diary, yes?
And no one has the right to order you to forget your memories, or under normal circumstances to destroy your notes?
So if you have a single-person #fediverse instance, it is okay then to ignore #ActivityPub Delete requests to erase your memory of online public conversations you had with others?
Terrible moment to learn that #Bonfire, the up-and-coming #ActivityPub implementation, apparently has a hard dependency on #AVX instructions that my home server's chipset physically lacks. I'd have to spend upwards of $400 just to replace my server in order to test it, sigh... @Bonfire
Looking to hear from #ActivityPub and #FediDev audiences: When do you expect a link (either an id or a Link.href) to have an AS2 representation? When do you expect it might *not* have one? Is there a good way to make those expectations clearer or more explicit? Please weigh in.
Looking to hear from #ActivityPub and #FediDev audiences: When do you expect a link (either an id or a Link.href) to have an AS2 representation? When do you expect it might *not* have one? Is there a good way to make those expectations clearer or more explicit? Please weigh in.
Does #mastodon support a root level domain handles yet? Like, say, user having his AP-enabled single-user website under example.com having a @example.com handle instead of @something@example.com
A PeerTube instance rejected my account application recently.
Reason: they're "highly opposed to AI, including education on how to use AI-assisted tooling and selfhosting."
Last line: "you might want to try a different instance."
I'm now on spectra.video, where the same content posts without friction.
That rejection isn't a failure but evidence that the structure is working. An instance that knows what it's for, knows its position is unusual, and communicates both clearly โ that's governance doing exactly what it's supposed to do.
Part 3 of `Exploring Mastodon` covers what governance actually means at the instance level: defederation, Fedipact, the Truth Social cautionary tale, and why a server's code of conduct is a self-portrait, not a rulebook.
Abstract network topology visualization on a deep navy background. A dense cluster of glowing nodes in teal and coral are connected by luminous edges, with a bright central node suggesting a focal governance point. The image conveys distributed structure โ many nodes, no single center. Federated Mind brain logo watermark in the bottom right corner.
A PeerTube instance rejected my account application recently.
Reason: they're "highly opposed to AI, including education on how to use AI-assisted tooling and selfhosting."
Last line: "you might want to try a different instance."
I'm now on spectra.video, where the same content posts without friction.
That rejection isn't a failure but evidence that the structure is working. An instance that knows what it's for, knows its position is unusual, and communicates both clearly โ that's governance doing exactly what it's supposed to do.
Part 3 of `Exploring Mastodon` covers what governance actually means at the instance level: defederation, Fedipact, the Truth Social cautionary tale, and why a server's code of conduct is a self-portrait, not a rulebook.
Abstract network topology visualization on a deep navy background. A dense cluster of glowing nodes in teal and coral are connected by luminous edges, with a bright central node suggesting a focal governance point. The image conveys distributed structure โ many nodes, no single center. Federated Mind brain logo watermark in the bottom right corner.
Terrible moment to learn that #Bonfire, the up-and-coming #ActivityPub implementation, apparently has a hard dependency on #AVX instructions that my home server's chipset physically lacks. I'd have to spend upwards of $400 just to replace my server in order to test it, sigh... @Bonfire
If you are not an engineer, but would like a glimpse of what real engineering looks like in practice, here is a slightly mindboggling writeup on how they reduced operating cost of Bridgy Fed, which bridges #AtProto and #ActivityPub. By A New Social CTO @snarfed.org
Does #mastodon support a root level domain handles yet? Like, say, user having his AP-enabled single-user website under example.com having a @example.com handle instead of @something@example.com
Fedify is an #ActivityPub server framework in #TypeScript & #JavaScript. It aims to eliminate the complexity and redundant boilerplate code when building a federated server app, so that you can focus on your business logic and user experience.
The key features it provides currently are:
Type-safe objects for Activity Vocabulary (including some vendor-specific extensions)
ActivityPub specifications don't seem to provide a way to do Idempotent POSTs to your outbox.
That seems like a problem for C2S to me.
Networks are unreliable. You cannot tell the difference between an unreceived request vs an unreceived response. You'll get unwanted identical duplicate activities.
Although it isn't difficult to solve โ a convention just needs to be picked.
For example, a new Idempotency field could be added to the JSON-LD payload.
ActivityPub specifications don't seem to provide a way to do Idempotent POSTs to your outbox.
That seems like a problem for C2S to me.
Networks are unreliable. You cannot tell the difference between an unreceived request vs an unreceived response. You'll get unwanted identical duplicate activities.
Although it isn't difficult to solve โ a convention just needs to be picked.
For example, a new Idempotency field could be added to the JSON-LD payload.
ActivityPub specifications don't seem to provide a way to do Idempotent POSTs to your outbox.
That seems like a problem for C2S to me.
Networks are unreliable. You cannot tell the difference between an unreceived request vs an unreceived response. You'll get unwanted identical duplicate activities.
Although it isn't difficult to solve โ a convention just needs to be picked.
For example, a new Idempotency field could be added to the JSON-LD payload.
ActivityPub specifications don't seem to provide a way to do Idempotent POSTs to your outbox.
That seems like a problem for C2S to me.
Networks are unreliable. You cannot tell the difference between an unreceived request vs an unreceived response. You'll get unwanted identical duplicate activities.
Although it isn't difficult to solve โ a convention just needs to be picked.
For example, a new Idempotency field could be added to the JSON-LD payload.
If The New York Times, The Atlantic, ans USA Today are preventing archiving or caching of their content, perhaps Mastodon and Misskey administrators should be denying these publishers from trending.
If The New York Times, The Atlantic, ans USA Today are preventing archiving or caching of their content, perhaps Mastodon and Misskey administrators should be denying these publishers from trending.
In daily life, if you talk to someone, you have the right to remember what was said, right?
And if you don't possess photographic memory, you have the right to take notes, keep record, maintain a diary, yes?
And no one has the right to order you to forget your memories, or under normal circumstances to destroy your notes?
So if you have a single-person #fediverse instance, it is okay then to ignore #ActivityPub Delete requests to erase your memory of online public conversations you had with others?
I consider this to be part of the "misconceptions" that exist on the ActivityPub fediverse, to once more quote the term as Rich Hickey uses in "Hammock driven development". See:
The way I look at ActivityStreams is as a toolbox of social primitives, building blocks for federated solutions. Not as core capabilities of the ActivityPub protocol. Because they are simply not specified as universal and ubiquitous protocol capabilities.
If one particular object supports CRUD is solution-specific in my book. Ideally the ActivityStreams primitives all have well-defined singular purpose, but unfortunately that is not the case. More the opposite where everyone is encouraged to hammer their business domain into an ActivityStreams straitjacket.
In daily life, if you talk to someone, you have the right to remember what was said, right?
And if you don't possess photographic memory, you have the right to take notes, keep record, maintain a diary, yes?
And no one has the right to order you to forget your memories, or under normal circumstances to destroy your notes?
So if you have a single-person #fediverse instance, it is okay then to ignore #ActivityPub Delete requests to erase your memory of online public conversations you had with others?
I consider this to be part of the "misconceptions" that exist on the ActivityPub fediverse, to once more quote the term as Rich Hickey uses in "Hammock driven development". See:
The way I look at ActivityStreams is as a toolbox of social primitives, building blocks for federated solutions. Not as core capabilities of the ActivityPub protocol. Because they are simply not specified as universal and ubiquitous protocol capabilities.
If one particular object supports CRUD is solution-specific in my book. Ideally the ActivityStreams primitives all have well-defined singular purpose, but unfortunately that is not the case. More the opposite where everyone is encouraged to hammer their business domain into an ActivityStreams straitjacket.
To me, #ForgeJo is the future. In many different avenues of digital services, it's usually a monopolistic vendor lock-in situation. #Github is no exception, nor is #Gitlab.
But Forgejo aims to be a git system that uses #ActivityPub to communicate with other git instances - in effect decentralizing code repos, and even possibly CD/CI chains. Hold on to your hats, folks.
To me, #ForgeJo is the future. In many different avenues of digital services, it's usually a monopolistic vendor lock-in situation. #Github is no exception, nor is #Gitlab.
But Forgejo aims to be a git system that uses #ActivityPub to communicate with other git instances - in effect decentralizing code repos, and even possibly CD/CI chains. Hold on to your hats, folks.
In daily life, if you talk to someone, you have the right to remember what was said, right?
And if you don't possess photographic memory, you have the right to take notes, keep record, maintain a diary, yes?
And no one has the right to order you to forget your memories, or under normal circumstances to destroy your notes?
So if you have a single-person #fediverse instance, it is okay then to ignore #ActivityPub Delete requests to erase your memory of online public conversations you had with others?
In daily life, if you talk to someone, you have the right to remember what was said, right?
And if you don't possess photographic memory, you have the right to take notes, keep record, maintain a diary, yes?
And no one has the right to order you to forget your memories, or under normal circumstances to destroy your notes?
So if you have a single-person #fediverse instance, it is okay then to ignore #ActivityPub Delete requests to erase your memory of online public conversations you had with others?
@apps Does there exist some forum-software that also supports #ActivityPub? That way you could allow people from the Fediverse to participate, avoiding having to register new accounts everywhere ๐ค
What a great experience to talk at the #2mr about Fediway! It was a very fruitful discourse about what the open social web and how to make it effortless for anyone. Thank you so much at @bjoernsta , @kingconsult , @frebelt and all other people for supporting us.
Do me a huge favor, please, and watch, rate with โญ๏ธ, and leave a short, honest review for the first movie from our tiny movie studio @famebot โฃ๏ธ
Prove to the world I'm not crazy for spending so much time posting here on #Mastodon and celebrating the #Fediverse and #ActivityPub
Wondering if the devs of #Ghost have stopped working on improving the #ActivityPub integration? Haven't heard of anything since the release of it back with the release of 6.0.
Wondering if the devs of #Ghost have stopped working on improving the #ActivityPub integration? Haven't heard of anything since the release of it back with the release of 6.0.
Do me a huge favor, please, and watch, rate with โญ๏ธ, and leave a short, honest review for the first movie from our tiny movie studio @famebot โฃ๏ธ
Prove to the world I'm not crazy for spending so much time posting here on #Mastodon and celebrating the #Fediverse and #ActivityPub
Drafting a proposal to add API support in #Fedify for the ActivityPub Media Upload extension, the SocialCG-incubated #C2S companion that lets clients upload media via a dedicated endpoints.uploadMedia endpoint, separate from the outbox.
The sketched API mirrors the outbox listeners shipped in Fedify 2.2: setMediaUploader(path, callback) paired with .authorize(). Return a vocab.Object for 201 Created, or a URL for 202 Accepted.
This is still an early design draft. Feedback on the shape, semantics, and edge cases is very welcome:
Drafting a proposal to add API support in #Fedify for the ActivityPub Media Upload extension, the SocialCG-incubated #C2S companion that lets clients upload media via a dedicated endpoints.uploadMedia endpoint, separate from the outbox.
The sketched API mirrors the outbox listeners shipped in Fedify 2.2: setMediaUploader(path, callback) paired with .authorize(). Return a vocab.Object for 201 Created, or a URL for 202 Accepted.
This is still an early design draft. Feedback on the shape, semantics, and edge cases is very welcome:
Drafting a proposal to add API support in #Fedify for the ActivityPub Media Upload extension, the SocialCG-incubated #C2S companion that lets clients upload media via a dedicated endpoints.uploadMedia endpoint, separate from the outbox.
The sketched API mirrors the outbox listeners shipped in Fedify 2.2: setMediaUploader(path, callback) paired with .authorize(). Return a vocab.Object for 201 Created, or a URL for 202 Accepted.
This is still an early design draft. Feedback on the shape, semantics, and edge cases is very welcome:
Drafting a proposal to add API support in #Fedify for the ActivityPub Media Upload extension, the SocialCG-incubated #C2S companion that lets clients upload media via a dedicated endpoints.uploadMedia endpoint, separate from the outbox.
The sketched API mirrors the outbox listeners shipped in Fedify 2.2: setMediaUploader(path, callback) paired with .authorize(). Return a vocab.Object for 201 Created, or a URL for 202 Accepted.
This is still an early design draft. Feedback on the shape, semantics, and edge cases is very welcome:
Drafting a proposal to add API support in #Fedify for the ActivityPub Media Upload extension, the SocialCG-incubated #C2S companion that lets clients upload media via a dedicated endpoints.uploadMedia endpoint, separate from the outbox.
The sketched API mirrors the outbox listeners shipped in Fedify 2.2: setMediaUploader(path, callback) paired with .authorize(). Return a vocab.Object for 201 Created, or a URL for 202 Accepted.
This is still an early design draft. Feedback on the shape, semantics, and edge cases is very welcome:
Release v3.3.7 of Ktistecfixes several bugs and introduces two enhancements.
Security is a focus in this release. Every gap in input sanitization or escaping is a potential vulnerability, and I've been systematically closing them. I am also carefully, and maybe conservatively, restricting things like supported URL schemes and uploaded file types.
The two enhancements improve compatibility with Mastodon-compatible clients. Mastodon's OAuth tokens don't expire, and Mastodon clients don't know how to handle tokens that do. Sliding expiration ensures that tokens in active use stay alive, while unused tokens eventually expire.
Here's the full changelog:
Added
Sliding token expiration for OAuth2 access tokens.
Prevent pinning of (and auto-unpin) private objects.
Don't save a quote if the quoted actor cannot be dereferenced.
Fix rendering of federated actor profile attachment values.
Remove href attributes with unsafe schemes from sanitized HTML.
Escape interpolated values in view helpers and the actor icon streaming refresh.
Restrict upload extensions and serve uploads with X-Content-Type-Options: nosniff.
Escape publicKey and scrub Tag.href.
Sanitizer no longer permits single-quote attribute injection.
Ensure bearer-token sessions cannot reach the web UI.
Require client authentication on the OAuth token endpoint.
I'm working on performance improvements for the next release. A rewrite of the Slang template library looks like it will cut both build time and executable size by around 10%!
Release v3.3.7 of Ktistecfixes several bugs and introduces two enhancements.
Security is a focus in this release. Every gap in input sanitization or escaping is a potential vulnerability, and I've been systematically closing them. I am also carefully, and maybe conservatively, restricting things like supported URL schemes and uploaded file types.
The two enhancements improve compatibility with Mastodon-compatible clients. Mastodon's OAuth tokens don't expire, and Mastodon clients don't know how to handle tokens that do. Sliding expiration ensures that tokens in active use stay alive, while unused tokens eventually expire.
Here's the full changelog:
Added
Sliding token expiration for OAuth2 access tokens.
Prevent pinning of (and auto-unpin) private objects.
Don't save a quote if the quoted actor cannot be dereferenced.
Fix rendering of federated actor profile attachment values.
Remove href attributes with unsafe schemes from sanitized HTML.
Escape interpolated values in view helpers and the actor icon streaming refresh.
Restrict upload extensions and serve uploads with X-Content-Type-Options: nosniff.
Escape publicKey and scrub Tag.href.
Sanitizer no longer permits single-quote attribute injection.
Ensure bearer-token sessions cannot reach the web UI.
Require client authentication on the OAuth token endpoint.
I'm working on performance improvements for the next release. A rewrite of the Slang template library looks like it will cut both build time and executable size by around 10%!
Wordpress is a strange platform try and actually get working with ActivityPub in a meaningful way. While I do enjoy Sharkey I'd love to not have to pay for multiple subscriptions just to run my website and interact with people on the Fediverse.