Introducing Starter Kits
Search results
Looks like there is a new kid on the #opensocial block: https://holos.social
You can find them on #Mastodon & # Nostr:
@HolosSocial
From what I understand it's #ActivityPub with features of Nostr: profiles are only distributed by relays, not hosted on the servers themselves.
Today I launched a game called #FrasesGame
@frases, which consists of guessing daily sentences (like Wordle). It supports #ActivityPub agents for communication. Like
@ladeldiaclLa del día 🇨🇱, these sentences are
region-specific. However, I created different actors for #Chile, #Argentina, #CostaRica, #Deutschland #Germany, #Danmark #Denmark, and #English. The game is open to try! #FediGames
Website: https://frases.degu.cl/
@evan@cosocial.ca if I've been hit by them I've never noticed. It could be that the nature of conversations on the fediverse usually mean NodeBB reaches out to many servers, but the only software I've ever had a problem with is Discourse. It blocks me after 15 requests.
mcc has a toot thread in the hundreds, and when NodeBB discovered it it backfilled the entire thing.
When it hits a 429 NodeBB should probably retry after a cooldown period, but it doesn't at the moment. It just marks it as failed.
Voted "No, but.." against backdrop of #ActivityPub API task force, where issue tracker has an issue on rate limits.
From perspective of "avoiding misconceptions" I was wondering about a range of issues that have been created, and how they relate to Protocol versus Solution design. See also: https://github.com/swicg/activitypub-api/issues/63
I think it may be valuable to define different stakeholder roles, to track people's needs. For #Protosocial thus far I discern in order of importance:
1. Solution developer
2. Protosocial implementer
3. Protocol designer
When asking the question "Should rate limits be part of the protocol?", starting point for design is a firm No.
Solution devs should not be worried about them. Need for rate limits depends on requirements of individual Protosocial impls, and what their goals are.
Protocol-level there's actor introspection. There are no "instances" but Application actors that host Services, including system services, that may expose Rate Limit as metadata.
How to Host Your Own #Mastodon Server on a #VPS (5 Minute Quick-Start Guide)
This article provides a guide for how to host your own Mastodon server on a VPS.
Running your own Mastodon server on a VPS is an excellent way to enjoy an efficient and secure Mastodon experience.
What is Mastodon?
Mastodon is a #decentralized social media platform that enables users to post ...
Continued 👉 https://blog.radwebhosting.com/how-to-host-your-own-mastodon-server-on-a-vps/?utm_source=mastodon&utm_medium=social&utm_campaign=mastodon.social #rubyonrails #activitypub #installguide #selfhosting #rubygems #selfhosted
#ActivityPub developers only: do you implement rate limit support in your HTTP client implementation?
Meet Fedibook!
The idea came from thinking about what it actually takes to get regular users onto the fediverse. Mastodon is great (i love it), but the follow-based model feels unfamiliar to some. Friends and Groups though — that's something everyone already understands.
So Fedibook is a fediverse platform built around exactly that, using ActivityPub. Think federated address book meets social network, with the kind of social graph people are already used to.
Current status:
- Friend requests across servers working
- News feed working, with visibility levels: public, friends-only, or local server only
Hoping to open up for early testing and feedback soon. Open source of course.
@effElectronic Frontier Foundation
@taylorlorenz
@404mediaco404 Media
@system76System76
Friends in #colorado and any organizations that can help. A misguided bill (HB26-1255) from people who's hearts are in the right place just passed the last committee before going to the state house floor. This bill will essentially criminalize any #fediverse instance with at least one user in Colorado.
This bill does three particularly scary things:
1. Removes the existing 100,000-user lower limit for the definition of "Social Media Platform" in Section 6-1-1601 (4) of the Colorado Revised Statutes. This means that any of the tens of thousands of small #ActivityPub instances that happens to have a single user in Colorado at any time would be subject to this bill and any others that reference Section 6-1-1601 (4) of the Colorado Revised Statutes.
2. Adds a requirement for a staffed 24/7 hotline for each "Social Media Platform" to be available for law enforcement. This would require a minimum of four part-time staff, even for a Mastodon instance with two people on it that is run off of a Raspberry Pi in a bedroom closet in another country by someone in their spare time.
3. Requires notification of law enforcement within 24 hours of a flag of a threatening post. With VPNs, tunnels, Tor, etc., how do I know which law enforcement agency to reach out to? What if I don't keep any location data on my users? How do I decide what is credible and requires notification?
The ACLU has thankfully already voiced opposition.
the bill: https://leg.colorado.gov/bills/HB26-1255
testimony from last night's committee in opposition (starts at 7:12pm): https://sg001-harmony.sliq.net/00327/Harmony/en/PowerBrowser/PowerBrowserV2/20260318/-1/18310
@smallcircles🫧 socialcoding..
@MichalBryxiMichal Bryxí
@evanEvan Prodromou would be awesome if there was an actual in protocol solution instead of punishing very small instances for being small and distributed - but there isn't.
The NoBot isn't app specific fwiw, it's pretty standard.
@alex
@MichalBryxiMichal Bryxí
@evanEvan Prodromou
> The NoBot isn't app specific fwiw, it's pretty standard.
"pretty" boils down to de-facto standard, or rather it became a sorta kinda requirement by means of post-facto #interoperability. In other words: Who comes first, and popularizes some custom app-specific extension, becomes owner of that part of the spec that is now considered protocol-native.
#NoBot is app-specific too. Or Microblogging domain-specific perhaps, albeit implicitly then.
When it comes to considering it standard, we talk about accepting #ActivityPub protocol decay. Specifically:
- Considering the way account profiles are handled to be part of the protocol.
- To handle special control words (or just #NoBot) in the profile text.
@MichalBryxiMichal Bryxí also they provide a means to opt-out, add #NoBots to your bio (which to be fair, if you don't want automated stuff is a pretty common thing - most well ran ones respect that so may have other upside for you)
If your server is providing data to tags.pub, and you don't want your content to be boosted by tags.pub accounts, you can add the #NoTagsPub hashtag to your account bio. (If you've already got a #NoBots hashtag in your account bio, we'll also skip any boosts.)
@alex
@MichalBryxiMichal Bryxí
I find this habit of creating magic profile hashtags to be a real bad practice, especially when modeling opt-outs in app-specific manner. cc
@evanEvan Prodromou
Am I overreacting? The server @tags.pub takes every of my toots that contain any hashtag, and boost it using an account that has the name of said hashtag.
If I want to follow a hashtag, there is native feature for that within mastodon / activity pub. So my knee jerk reaction is that this is some shady click harvesting. Or?
Last Monday
@dorianeungual invited
@gwilsammy g to
@xpub, and she brought us on a journey to learn about the history of #P2P and #decentralized protocols.
It was so insightful. We took notes here.
@tommiTommi 🤯
@dorianeungual
@gwilsammy g
@xpub
Very elaborate notes, thanks for sharing. On #fediverse I read this, and totally agree:
> there is this huge gulf between people who design these systems and the people who will use these systems.
There are follow-up notes about maintenance and #moderation, and how volunteers burn out on upholding the always-on instances that #ActivityPub requires.
Interest areas where Social coding commons focuses. The fediverse by itself is just tech, created in a technosphere. Tech that should ultimately fulfill social needs of the people using it. In the sociosphere.
Social experience design #SX focuses on the intersection of #SocialWeb, #SustainableFOSS, and the #commons that creates it and relies on it. #Sustainability is a core principle, sustainable evolution and natural growth are objectives.
Moderation is but one of many #governance patterns that works at certain scales. SX is focused on overarching formation of #ChaordicOrganization.
https://coding.social/blog/reimagine-social/#chaordic-organization
So one thing this post discusses is governance of servers. When I joined Mastodon, a server which is cooperatively/democratically governed seemed like the natural and obvious choice, so I found one and joined it. I still think that and hope people create more cooperatively governed servers. But the structure of the activitypub protocol does place natural limitations on how much governance of servers can shape the fediverse. It doesn't use the exact words but a major theme is that everything is about power and it's essential to look at where structures place power.
So, an interesting issue came up in the #Fedify repo that I've been thinking about: #629.
You know how every #fediverse server uses schema:PropertyValue in actor attachment for profile metadata fields (like “Website”, “GitHub”, etc.)? Turns out, strict #AS2 validators like browser.pub reject it, because the AS2 spec says attachment should only contain Object or Link—and PropertyValue is a schema.org type, not an Activity Streams 2.0 type.
The thing is, we can't just drop the type like we did with Endpoints (#576), because Mastodon and others rely on seeing "type": "PropertyValue" to render profile fields. But at the same time, it's technically not spec-compliant.
I'm leaning towards writing a #FEP to formalize this existing practice rather than trying to invent a new type (like toot:PropertyValue extending Object), which would be a nightmare to migrate across the whole fediverse.
What do you all think? Has anyone else run into this? Would love to hear thoughts from implementers and spec folks.
#fedidev #ActivityPub #ActivityStreams #ActivityStreams2 #AS2 #PropertyValue
The source code of #PawFed is now available on #Codeberg. PawFed is a federated map for animal welfare: reports come from the #Fediverse via #ActivityPub mentions, and permanent places like shelters and vets are pulled from OpenStreetMap.
A location is not always required: if you have supplies or food to give away and can ship, just say so.
Found an abandoned animal? Just report it.
How to build a message: https://pawfed.org/tags
Source code: https://codeberg.org/tom79/PawFed
#ActivityPub developers only please: how many items should be in a full collection page?
#HolosDiscover just hit 3 million indexed posts.
What matters more than the number: 145k deletions processed, 83k edits tracked, and over 1k opt-outs respected, all in real time.
Respecting people is the priority and the only way to do it right is to be a full #ActivityPub participant, receiving deletions, edits, and opt-outs as they happen. Before indexing anyone, Holos Discover follows their account, so they know they are being indexed and can opt out.
Week in Fediverse 2026-03-20
Servers
- Akkoma v2026.03
- Bonfire v1.0.2
- PeerTube v8.1.3
- Mitra v4.20.0
- NodeBB v4.10.0
- GoToSocial v0.21.2
- Funkwhale v2.0.0
- Ktistec v3.3.4
- ActivityPub for WordPress v8.0.2
- PeerTube v8.1.3
- ties v0.2.0
- Wafrn v2026.03.02
- PieFed v1.6.13
- Some updates to ActivityBot
- tags.pub: Global hashtag server
Clients
- Fedilab v3.37.1
- tinmop v0.9.9.141421356237309504
- tooi v0.23.0
- Holos v1.0.0
- Voyager v2.44.0
- Aria v1.4.6
Tools and Plugins
- mastodon-bookmark-rss: A small app to let you connect your mastodon bookmarks to your RSS reader
- smol overlays: Chat overlay and emoji wall for Owncast streamers
For developers
- activitypub-federation-rust v0.5.11
Protocol
- FEP-3ab2: ActivityPub Event Streaming API
- FEP-34ec: Notification Collection Endpoint
- FEP-db70: RemoveAll Collection Activity
- FEP-c07e: add product type to object
- FEP-c195: JSONPath Filtering for ActivityPub Collection Retrieval
- FEP-f011: Full-Text Search Query Syntax for ActivityPub
- FEP-a1d1: ActivityPub Patch
- FEP-c81b: Agent Social Attribution for ActivityPub
Articles
- Openness, transparency and reach: three reasons why public institutions should embrace the Fediverse
- The Purpose of Protocols
-----
#WeekInFediverse #Fediverse #ActivityPub
Previous edition: https://mitra.social/objects/019ce933-238d-11fb-304d-c3557c940c30
Feeding a Lonely Pixelfed Instance
https://rant.mvh.dev/feeding-a-lonely-pixelfed-instance/
#pixelfed #fediverse #activitypub #selfhosted #mastodon #docker #scripting
Fireside Fedi 80** **- Delta, AltStore, and Other Ways to Jailbreak Your iOS Experience - Riely Testut - AltStore
Special thank you to @rileytestut@mastodon.social of @altstore@fosstodon.org !
🚀 **Full VOD:** tubefree.org/w/bPVjxbLt8cQtK...
🔎 ** More Episodes:** tubefree.org/a/ozoned/video-channels
FOLLOW to never miss an episode!
#Owncast #Livestream @ozoned@stream.firesidefedi.live
#Peertube #VOD @firesidefedi@tubefree.org
SUBSCRIBE to never miss an episode!
📡 ** #RSS ** tubefree.org/feeds/videos.xml?videoChannelId=5934
🎧 ** #Podcast ** tubefree.org/feeds/podcast/videos.xml?videoChannelId=5934 #FiresideFedi #FiresideChat #Podcast #VideoPodcast #Fediverse #Fedi #ActivityPub #BSKY #DecentralizedSocial #OpenSocialWeb #Community #TechCulture #FutureOfSocial #TechTalk #DevCommunity #CodingFun
So I got this bot that allows multiple people to curate a list of toots that are boosted by it, to create a nice topical account to follow.
Now I only need ideas what to boost haha :)
As you might have seen over on
@FediTips , Wanderer is a trail-sharing platform for the Fediverse somewhat similar to Strava.
Wanderer is free open source software so you can host your own server if you want, and federated so you can communicate with other servers too.
At the moment Wanderer does require some technical knowledge to create your own server, you can find installation instructions at https://wanderer.to/run/installation/quick and source at https://github.com/open-wanderer/wanderer
📢 The
@w3cWorld Wide Web Consortium Breakouts Day 2026 agenda is available!
➡️ https://www.w3.org/calendar/breakouts-day-2026/
Two dates: 🗓️ 25 March from 13:00-15:00 UTC and 🗓️ 26 March from 21:00-23:00 UTC
We invite the web community to take part in these one-hour sessions and give input on diverse topics such as #ActivityPub, #AI, cognitive #a11y, #privacy, policy engagement, #sustainability and more!
Anyone with a W3C account (including non-Members) can participate. No fee or registration is required.
“A protocol does not need to encode governance explicitly in order to shape it; it shapes governance by determining which mechanisms are easy to build, which are hard, and which are effectively impossible within the constraints the architecture imposes.”
A good read by
@laurenshof on
@fediversereportConnected Places
https://connectedplaces.online/the-purpose-of-protocols/
#Fediverse #ActivityPub #ATProto #OpenWeb #decentralization #DigitalGovernance #InternetProtocols
Thought for the day::
POSIWID
def.
"The Purpose Of a System Is What It Does "
(not what the design intention was)
This and other thoughtful observations around protocols...
Here >>
https://connectedplaces.online/the-purpose-of-protocols/
Longish read , that is well argued...
#Socialmedia #Computer #Science #Protocols #SMTP #ActivityPub #RSS #XMPP #POSIWID #Engineering
I sat down with
@snarfed.orgRyan Barrett to talk about his work around the #fediverse, the #indieweb and the #atmosphere including (fed.)brid.gy and
@anewsocial
https://openchannels.fm/connecting-decentralized-social-networks-and-rethinking-interoperability/
6/
Continuing to look for an alternative to "attachment" (for properly supporting an Actor specifying a list of Service actors associated with it) —
Maybe a custom top-level attribute would be useful.
Maybe something like:
"service": [
{
"rel":"callpub",
"href":"https://videocalls.example/users/joeblow"
}
]
Although perhaps that is not much better than "attachment", if you just care about calls
So —
#ActivityPub #ActivityStreams #AudioCall #Call #FediDev #Fediverse #VideoCall
7/
Continuing to look for an alternative to "attachment" (for properly supporting an Actor specifying a list of CALL Service actors associated with it) —
Maybe a call specific custom top-level attribute would be useful.
Maybe something like:
"call": [
{
"rel":"callpub",
"href":"https://videocalls.example/users/joeblow"
}
]
Or even:
"call": [
"href":"https://videocalls.example/users/joeblow"
]
.
#ActivityPub #ActivityStreams #AudioCall #Call #FediDev #Fediverse #VideoCall
5/
Continuing to look for an alternative to "attachment" (for properly supporting an Actor specifying a list of Service actors associated with it) —
I think "endpoints" would also be a poor choice, too. Again, the semantics are wrong, or at least lacking.
So —
#ActivityPub #ActivityStreams #AudioCall #Call #FediDev #Fediverse #VideoCall
6/
Continuing to look for an alternative to "attachment" (for properly supporting an Actor specifying a list of Service actors associated with it) —
Maybe a custom top-level attribute would be useful.
Maybe something like:
"service": [
{
"rel":"callpub",
"href":"https://videocalls.example/users/joeblow"
}
]
Although perhaps that is not much better than "attachment", if you just care about calls
So —
#ActivityPub #ActivityStreams #AudioCall #Call #FediDev #Fediverse #VideoCall
4/
Looking for an alternative to "attachment" (for properly supporting an Actor specifying a list of Service actors associated with it) —
I think using "alsoKnownAs" or "sameAs" would be a poor choice. The semantics are wrong.
For example: a Service actor might represent my mobile phone (or software on it). My phone is not me. It is something I have.
So —
#ActivityPub #ActivityStreams #AudioCall #Call #FediDev #Fediverse #VideoCall
5/
Continuing to look for an alternative to "attachment" (for properly supporting an Actor specifying a list of Service actors associated with it) —
I think "endpoints" would also be a poor choice, too. Again, the semantics are wrong, or at least lacking.
So —
#ActivityPub #ActivityStreams #AudioCall #Call #FediDev #Fediverse #VideoCall
3/
But, what about the non- fall-back situation where software could properly support this (when an Actor specifies a list of Service actors associated with it)‽
I think some might say, put the associated Service actors in "attachment". And, semantically I think that would work with ActivityPub, but — I have a very strong dislike with putting everything in "attachment" (and "tag"). It makes parsing difficult.
So —
#ActivityPub #ActivityStreams #AudioCall #Call #FediDev #Fediverse #VideoCall
4/
Looking for an alternative to "attachment" (for properly supporting an Actor specifying a list of Service actors associated with it) —
I think using "alsoKnownAs" or "sameAs" would be a poor choice. The semantics are wrong.
For example: a Service actor might represent my mobile phone (or software on it). My phone is not me. It is something I have.
So —
#ActivityPub #ActivityStreams #AudioCall #Call #FediDev #Fediverse #VideoCall
2/
Because most people wouldn't be able to add custom attributes or custom values to most Fediverse software (including Mastodon) —
Most supporting software would probably want to support a "PropertyValue" link in "attachment" field as a fall-back
For example:
"attachment": [
{
"type": "PropertyValue",
"name": "Video Calls (callpub)",
"value": "https://videocalls.example/users/joeblow"
}
But —
...
#ActivityPub #ActivityStreams #AudioCall #Call #FediDev #Fediverse #VideoCall
3/
But, what about the non- fall-back situation where software could properly support this (when an Actor specifies a list of Service actors associated with it)‽
I think some might say, put the associated Service actors in "attachment". And, semantically I think that would work with ActivityPub, but — I have a very strong dislike with putting everything in "attachment" (and "tag"). It makes parsing difficult.
So —
#ActivityPub #ActivityStreams #AudioCall #Call #FediDev #Fediverse #VideoCall
1/
AFAIK, there isn't a way for an ActivityPub Actor (such as a Person actor) to specify a list of Service actors associated with it.
...
For example, imagine that there is a Service actor that represents a way to make a video call to me.
And, for example, I have my Mastodon Person actor.
And, I want to let people know about it (and other Service actors associated with me).
How do I do that using AP, etc?
...
#ActivityPub #ActivityStreams #AudioCall #Call #FediDev #Fediverse #VideoCall
2/
Because most people wouldn't be able to add custom attributes or custom values to most Fediverse software (including Mastodon) —
Most supporting software would probably want to support a "PropertyValue" link in "attachment" field as a fall-back
For example:
"attachment": [
{
"type": "PropertyValue",
"name": "Video Calls (callpub)",
"value": "https://videocalls.example/users/joeblow"
}
But —
...
#ActivityPub #ActivityStreams #AudioCall #Call #FediDev #Fediverse #VideoCall
1/
AFAIK, there isn't a way for an ActivityPub Actor (such as a Person actor) to specify a list of Service actors associated with it.
...
For example, imagine that there is a Service actor that represents a way to make a video call to me.
And, for example, I have my Mastodon Person actor.
And, I want to let people know about it (and other Service actors associated with me).
How do I do that using AP, etc?
...
#ActivityPub #ActivityStreams #AudioCall #Call #FediDev #Fediverse #VideoCall
Have there been any further discussions on this? I think it’s becoming increasingly important!
https://github.com/steve-bate/activitypub-ontology/blob/main/activitystreams2.ttl
Just had to add a workaround to #Fedify for http://joinmastodon.org/ns, a JSON-LD context URL that has never actually served a JSON-LD document. Mastodon has always inlined the term definitions, but some implementations put it as a bare URL in their @context, so Fedify's JSON-LD processor tries to fetch it and gets a 404 Not Found. Now Fedify ships a bundled copy of a context that never existed in the first place.
RE: https://toot.fedilab.app/@apps/116245941766830884
#PawFed is not limited to reports about animals found or in distress. You can use it to offer help or ask for it.
Use #offer when you provide help, #request when you need it, #info to share useful information.
Everything works through #ActivityPub. If you delete your original post mentioning @PawFed, the related report is automatically removed from the map. No database ghost. You stay in control of your data. (1/3)
I used to not like JSON-LD. And then I got exposed to CBOR. And, since then, I ended up liking JSON-LD more than I did before.
https://j12t.social/@j12t/114581086678041245
...
I was looking for performant ways of storing JSON-LD data, so that it can be looked up, queried, etc.
CBOR might actually be a way of doing that.
...
For me that is an odd realization given me liking JSON-LD is a reaction to CBOR.
#ActivityPub #ActivityStreams #CBOR #CBORLD #FediDev #JSONLD
RE: https://socialwebfoundation.org/2026/03/17/introducing-tags-pub/
Etiquetar el món (descentralitzat) ara és més fàcil. 🏷️ La Social Web Foundation presenta Tags.pub. El futur de la descoberta a #ActivityPub es veu brillant. ✨
Introducing tags.pub
Evan Prodromou @evanprodromou@socialwebfoundation.org
tags.pub is a new service under development by the Social Web Foundation. It is a global hashtag server -- it lets you follow a hashtag across the Fediverse. There's lots of information on the tags.pub home page, and I (Evan) did a talk about tags.pub at FOSDEM 2026. This blog post answers some basics about tags.pub. To follow a hashtag globally, search for a user with that name at tags.pub, like <a rel="mention" class="u-url mention" href="https://tags.pub/user/example">@example</a> for the #example hashtag. Follow that account, and it will share all the […]
Read more →After Madblog, how many of you would like #ActivityPub and #Indieweb support to come to GPSTracker too?
This is an idea that I’ve been flirting with for a while.
Like many Millennials, 10-15 years ago I was into the Foursquare-mania. It was the age where pubs would offer discount to their Foursquare mayor and where people used to share their Foursquare stats and compete on how many badges they had collected.
Then Foursquare decided to pivot its platform towards the business-side instead, the check-in app was spun off into Swarm, it gradually lost users but it gained trackers, and by now I think only 1-2 of my contacts (out of >100 in the golden age) still use it.
By now I don’t think anyone has filled that gap; there isn’t any social media built around networks that share and recommend their check-ins.
#GPSTracker already supports a lot of tracking, timeline and check-in features, synchronization of geo events with mobile devices, and even stats with arbitrary aggregations (by country, time range, city, region etc.). Plus some features that Foursquare never implemented (like searching for checkins on the timeline by simply selecting an area on the map).
#Microformats already support location tags through the h-adr class, although they are rarely used. Both #Webmentions and ActivityPub could send check-in activities as permalinks to pages with those tags. And the #OpenStreetMap APIs could do the heavylifting of retrieving POIs in in a certain lat/long box.
The only hurdle would be implementing the protocols under the hood, as both the Webmentions and Pubby libraries are in #Python while #GPSTracker is in #Typescript. But it could be a good chance to start writing multi-language bindings for those libraries.
Let me know if it’s something that you would use, or even self-host, and if you know if there’s anything in the Fediverse that already fills this niche.
@hongminhee洪 民憙 (Hong Minhee)
A general-purpose C2S API doesn't mean the user interfaces themselves are general-purpose. One could still build a microblogging UI, a geosocial app, a image sharing app, a chess game app, or whatever, but these would be able to interact with the same AP C2S server for account management, data storage and federation. And they could all use the same account rather than the account-per-service/app model we have now.
@steveSteve Bate
@hongminhee洪 民憙 (Hong Minhee)
I mentioned this thread in the #ActivityPub #C2S tracking issue. I think there's a fundamental risk that C2S is going sideways because of misconceptions between devs on where things are / should be headed.
https://codeberg.org/fediverse/delightful-fediverse-experience/issues/130#issuecomment-11737818
Today
@kopperkopper
shared 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.
@hongminhee洪 民憙 (Hong Minhee)
> Slapping an #ActivityPub facade onto an existing Mastodon-like server and calling it C2S doesn't buy you much ...
The benefit of having a C2S adapter for Mastodon is that it provides a large user pool that could motivate developers to create C2S UIs rather than only supporting the Mastodon API. Having more server-independent client implementations may motivate devs to build general C2S servers with advanced features and eventually disrupt the Mastodon dominance in the Fedi.
In *theory* you should be able to follow this test user:
@你好@i18n.viii.fi
But I can't find any Fediverse software which actually supports non-ASCII usernames.
If you are able to see the user, its description, and its avatar - please send me a screenshot 🙂
Hey #fediverse #activitypub #mastodon #opensource who else is in beautiful #Amsterdam this week? Love to meet you there!
@FediVariety #NOAW
@chillicampariDeeAnn Little @vn
https://www.fedivariety.org/unconference
»Openness, transparency and reach: three reasons why public institutions should embrace the Fediverse« https://blog.elenarossini.com/openness-transparency-and-reach-three-reasons-why-public-institutions-should-embrace-the-fediverse/?Fedizen.EU #Fedizen #Fediverse #ActivityPub #News

Openness, transparency and reach: three reasons why public institutions should embrace the Fediverse
An article making the case that the Fediverse is a fantastic communication platform for public institutions - because of its openness, transparency and reach.
blog.elenarossini.com · Elena Rossini
Link author:
Elena Rossini@ele@blog.elenarossini.com
Some updates to ActivityBot
https://shkspr.mobi/blog/2026/03/some-updates-to-activitybot/I couple of years ago, I developed ActivityBot - the simplest way to build Mastodon Bots. It is a single PHP file which can run an entire ActivityPub server and it is less than 80KB.
It works! You can follow @openbenches@bot.openbenches.org to see the latest entries on OpenBenches.org, and @colours@colours.bots.edent.tel for a slice of colour in your day, and @solar@solar.bots.edent.tel to see what my solar panels are up to.
This is so easy to use. Copy the PHP file (and a .env and .htaccess) to literally any web host running PHP 8.5 and you have a fully-fledged bot which can post to Mastodon.
Grab the code and start today!
Features
Over the years I've added a few more features to it, so I thought I'd run through what they are. Note, this is all hand-written. No sycophantic plagiarism machines were involved in this code or blog post. I just really like emoji, OK⁉️
🔍 Be discovered on the Fediverse
This is the big one, you can find @example@example.viii.fi on your favourite Fediverse client. This is thanks to its WebFinger support.
👉 Be followed by other accounts
No point being discovered if you can't be followed. This accepts follow requests and sends back a signed accept.
🚫 Be unfollowed by accounts
Sometimes people want to unfollow. Too bad, so sad. Again, this will accept the undo request and delete the unfollowing user's information.
📩 Send messages to the Fediverse
If a bot can be followed, but never posts, does it make a sound? This sends a post to all of your followers' (shared) inboxes. Includes some HTML formatting.
💌 Send direct messages to users
Not every message is for the wider public. If you want a bot which sends you a private message, this'll set the visibility correctly.
📷 Attach images & alt text to a message 🆕🆕
A picture is worth a thousand words. But those pictures are meaningless without alt text. Attach as many images as you like. Note, most Mastodon services only accept a maximum of four.
🍿 Video Upload 🆕🆕
No transcoding or anything fancy. Upload a video and it'll be sent to your followers.
🔊 Audio Upload 🆕🆕
Same as video. Raw audio posted to your followers' feeds.
🕸️ Autolink URls, hashtags, and @ mentions
Including URls, tags, and mentions are mostly autolinked correctly. There's a lot of fuzziness in how it works.
🧵 Threads
You can reply to specific messages in order to create a thread.
👈 Follow, Unfollow, Block, and Unblock other accounts
It might be useful for you to remove followers or follow specific accounts.
🗑️ Delete posted messages and their attachments 🆕🆕
We all make mistakes. This will delete your post along with any attachments and send that delete message to everyone. Note, because of the federated nature of the Fediverse, you cannot guarantee that a remote server will delete anything.
✏️ Edit Posts 🆕🆕
If you don't want to delete and re-post, you can edit your existing posts.
🦋 Bridge to BlueSky with your domain name via Bridgy Fed
Not everyone is on the Fediverse. If you want to bridge to BlueSky, you can use the Bridgy Fed service.
🚚 Move followers from an old account and to a new account 🆕🆕
Perhaps you started as @electric@sex.pants but now you want to become @chaste@nunslife.biz - no worries! You can tell followers you've moved and what your new name is.
Similarly, if ActivityBot is no longer right for you, it's simple to tell your existing follower to move to your new account.
🗨️ Allow quote posts 🆕🆕
Rather than just reposting your message, this sets the quote policy to allow people to share your message and attach some commentary of your own.
👀 Show followers
Your follower count isn't just a number, it is a living list of who chooses to follow you.
⚠️ Content Warnings 🆕🆕
Perhaps you want to hide a bit of what you're saying. Add a content warning to hide part of your message.
🔏 Verify cryptographic signatures
HTTP Message Signatures is hard. I think I've mostly got it sorted.
🪵 Log sent messages and errors
This is primarily a learning aide, so have a rummage through the logs and see what's going on.
🚮 Clear logs when there are too many
ActivityPub is a chatty protocol. Your server can easily fill up with hundreds of thousands of messages from others. This regularly prunes down to something more manageable.
#️⃣ Hashed passwords for posting 🆕🆕
Bit of a guilty moment here. I was originally storing the password in plaintext. Naughty! Passwords are now salted and hashed.
💻 Basic website for showing posts
A nice-enough looking front end if people want to view the posts directly on your domain.
Some Deficiencies
Not every piece of software is perfect. ActivityBot is less perfect than most things. Here are some of the things it can't do and, perhaps, will never do. If you'd like to help tackle any of these, fork the code from my git repo!
⏳ Retry Failed Messages
A proper Mastodon server will keep trying to send messages to unresponsive hosts. ActivityBot is one-and-done. If a remote server didn't respond in time, or was offline, or something else went wrong - it may not get the message.
🔄 Reposts / Announce / Quote
You cannot boost other posts, or even your own. Nor can you send quote posts.
🤖 Act On Instructions
This is a basic bot. It contains no logic. If you send it a message asking it to take action, it will not. You will need to build something else to make it truly interactive.
📥 Receive Messages
In fact, other than the follow / unfollow stuff, the bot can't receive any messages from the Fediverse. It doesn't know when a post has been replied to, liked, or reposted.
😎 Set Post Visibility
Your posts are either public or a DM. There's no support for things like quiet followers.
📊 Create Polls
Everyone loves to vote on meaningless polls - but this is quite a hard problem for ActivityBot. It would need to keep track of votes, prevent double voting, and probably some other difficult stuff.
🗨️ Change Quote Post Visibility
As quote posts are still quite new to Mastodon, I'm not sure how best to implement this.
🔗 Proper HTML / Markdown Support
Autolinking names, hashtags, and links just about works - but not very reliably. In theory the bot could parse Markdown and create richly formatted HTML from it. But that may require an external library which would bloat the size. Perhaps posting raw HTML could work?
🖼️ Focus Points for Images
Perhaps of less use now, but still of interest to people?
❓ Other Stuff
I don't know what I don't know. Maybe some stuff is total broken? Maybe it is wildly out of spec? If you spot something dodgy, please let me know or raise a Pull Request.
#ActivityBot #ActivityPub #mastodon #php🆕 blog! “Some updates to ActivityBot”
I couple of years ago, I developed ActivityBot - the simplest way to build Mastodon Bots. It is a single PHP file which can run an entire ActivityPub server and it is less than 80KB.
It works! You can follow
@openbenchesOpenBenches.org to see the latest entries on OpenBenches.org, and
@coloursColours Bot for a …
👀 Read more: https://shkspr.mobi/blog/2026/03/some-updates-to-activitybot/
⸻
#ActivityBot #ActivityPub #mastodon #php
@fabioFabio Manganiello Very cool! This seems like something #11ty could implement, as blog posts are just Markdown files too. I have experimented with Webmentions on my 11ty blog in the past, but I felt it over-complicated my setup at the time, so I ditched it. I love the simplicity of your approach. #Eleventy
@ricmacRichard MacManus #Madblog has native support for #Webmentions, and unlike #ActivityPub they’re enabled by default.
I’ve tried to make it as simple as possible and avoid manual callbacks or special tags for mentioned links.
You put a link in an article, and when you save it Webmentions are sent to supported targets. Someone mentions your article from a place that supports Webmentions, and the mention is stored on your blog.


















