Working on my first ActivityPub application
I mostly came in the Fediverse years ago due to its openness and the fact that new software and tools could easily be leveraged by the already existing community. Even if I didn't start at first on the ActivityPub side, developing side-apps (mostly against Mastodon API) gave me some understanding of how things where working behind the hood. Especially with Sengi and its cross-instances functionalities.
Now that Sengi is getting very close to a 1.0.0 release (more on that on another post) I wanted to dig more deeply in this interesting topic.
A little pet project
Usually when starting in a new domain, I start a little Proof of Concept or a limited pet project so that I can get a little glance at it before going down the rabbit hole.
Those little projects made me confident enough to start Sengi's development and helped to focus on advanced topics since the basics where already covered.
Yes, my first AP project will be another Twitter to ActivityPub mirroring service.
Firstly because feeding on already existing data is very convenient for developement and testing purpose, secondly because as useful a dedicated bot can be, it lacks a lot of usability (and a real AP service will help to handle this), and lastly because – in the same way I like to have all my Mastodon and Pleroma accounts in the same client – I'd like to have an easy way to follow (temporarily or not) some accounts from the birdsite.
There were some projects out there that were aiming to create such service, but some never get through when others got canceled, I had also a lot of interesting (and sometime quite stormy) exchanges and debates about those, and all this fed my reflection on how to make a service more ethical, less intrusive and as functional as it can possibly be (and for that, thanks to everyone that took the time to feed those numerous discussions).
What will be the differences?
Firstly, mirroring services pisses of people (instance's admin as end-users) because they are polluting Timelines with ghost accounts. There is also the issue about duplicating data and making it freely and publicly available.
To solve those issues and also to provide a useful service, Birdsite.LIVE will: * Only post in “Followers-Only” mode, so that your ActivityPub account will behave exactly like any other Twitter client (the data is fetched for you, and only you). And the statuses will therefore not be available publicly, so it won't be visible in timelines (no more pollution!). * Be able to provide a Twitter profile to follow by searching/browsing @TwitterHandle@domain.name from your favorite instance * Provide well formatted statuses will functional mentions, images, videos, hashtags, etc (but it won't provide a proper boosted feature due to the “followers-only” constraint) * Of course, it will be FLOSS under AGPLv3 license, so that you will be able to auto-host the service if you like * A Docker image will be available and an as easy as possible install procedure will be provided (but I'm not a sysadmin, so I'll do my best here)
What's the current state then?
Pretty advanced in fact, it's not a really big project and even if I still have some work to do before a first release, here is what is already done: * User discoverability * Following/Unfollowing * Status synchronization and publication * Media attachment * Mention and hashtag parsing * CI/CD for basic build and unit testing
And what still needs to be done: * Minor bugs to solve * Some optimizations to do * Add better security and resilience * CI/CD Docker build * Install procedure * Deploy an official instance
The code is not published yet, I'd like to refine the code a bit before that; but it will be done very soon.
And after that?
Once this first pet project done, I will work on something more ambitious. But to make it the more understandable possible (since there isn't really something equivalent in the Fediverse or elsewhere), I will first write down some articles to explain my thought process and motivations.
Follow this blog by searching the URL of this post/blog in your instance to get next updates!