Year 2024 review
2024 was a pretty intense year for me in terms of coding… and a pretty not-intense one for anything else 🫣 I was so completely absorbed with building my Bluesky-related projects. It gives me a lot of satisfaction to be able to work on things which are based on my own ideas and needs, which give me fun problems to solve, let me learn a lot, and which seem to be helping a lot of other people.
I figured I could look back at this past year and make a summary of what I managed to build and do, since it’s been a while since I’ve done one of those. Yes, I know we’re well into February already, I’ve been procrastinating, sue me. (Also, we’ve just had an anniversary of Bluesky public launch a few days ago, so that seems like a good excuse too.)
Bluefeeds
Bluefeeds is my internal codename for the Ruby project which runs my main server at blue.mackuba.eu, which includes my feed service, the Handle Directory, statistics and so on.
- New feeds: ATProto feed, ATProto projects feed, Kit feed 🐱, News From Mastodon, Bluesky Team Links feed
- The two Replies feeds: Only Replies and Follows & Replies, which have gained a lot of popularity after the Following feed changes in the summer, when the option to show all replies in Following was removed, and which are now my two feeds with the biggest traffic
- A work-in-progress Hashtags feed (for following hashtags, currently requires running a Ruby script to add tags)
- Some continuous updates to existing feeds, like the Linux feed, where I’ve recently had to fix the name “RedHat” appearing in completely unrelated contexts 🫠
- The Handle Directory, listing handles grouped by top-level domain, a global list of most popular accounts with custom handles, and a ranking of independent PDSes
- The statistics page, showing daily and weekly post stats, later also separately for bridged posts from Mastodon/Nostr and posts on independent PDSes
- I also periodically post stats of most popular languages on Bluesky – what % of posts are in which language, and how many users are there that regularly post in each
- The very unstyled labellers list page, which was even briefly featured in a CNBC video for a few seconds 🤯
- An automatically updating list of official .gov and .edu accounts with verified handles, plus an open source repo with the script that updates them
- I also managed to learn some basics of Rust 🦀 and to write – with major help from ChatGPT – a tiny native module for Ruby in Rust, which I knew absolutely nothing about before, to speed up the matching of post contents to regexps (I’ll try to write a bit more about this at some point and share the code)
- … and I’ve spent literally months working on migrating this whole thing from SQLite to either MySQL or Postgres, and I’m still not done 😩
Skythread
- Added a hashtag feed view, listing latest posts with the given hashtag, back when this wasn’t working in the Bluesky app yet
- Similarly, added a post quotes counter and a view listing the post quotes, before that was added to the app (you can still use it now to peek at the quotes which are hidden/detached in the official app 😈)
- Implemented link highlighting and link cards
- Added special handling for bridged Mastodon posts, which are showing author’s formatted Mastodon handle and the expanded full-length post contents (since Bridgy stashes the full original text in a custom field in the post records)
- Added an “infohazard” feature, which lets you load hidden comments which the official app hides because of the “nuclear block” between two commenters
Some of these, like the quotes list and the hidden comments, use data loaded from the Bluefeeds server APIs – since I’m saving all incoming posts to one big-ass table, I can index them by quote source and by thread root, and can use that to look up all quotes of a post or all replies which are supposed to be there in the thread.
Blog
- I wrote a super long post “Complete guide to Bluesky” with a lot of explanations of how things work and various tips and tricks (and updated it a few times, as new features were added)
Skyfall
- 7 releases, adding support for new features like labellers or account state events
- added support for streaming from Jetstream, parsing events from JSON instead of CBOR
Minisky
- 2 releases with small improvements (OAuth support is still waiting for a better day)
New projects & tools
- Label Scanner – a simple web tool that shows all labels assigned to an account/post by any of the known labellers
- sdk.blue – list of libraries and SDKs for Bluesky/ATProto, grouped by language
- tootify – a simple tool for selective cross-posting from Bluesky to Mastodon, which I use to mirror some of my Bluesky posts to my Mastodon account
- didkit – a Ruby library for resolving handles to DIDs, loading DID info like assigned PDS host etc.
- a bookmarklet to easily mute notifications in the Bluesky web app
- two Ruby scripts to scan your home feed or some selected accounts and print the stats of who is posting how much daily
Servers
- I’ve migrated my projects from my old Swiss hosting Coin.host to German Netcup, which has VPSes with really fast CPUs and SSDs and a ton of bandwidth included for a really good price
- I’ve set up my own self-hosted PDS at lab.martianbase.net, and migrated my main account there
Oof… that’s a lot of stuff 🥲 What’s next, in 2025? I… I really think I need to work a bit more on work-life balance (sideproject-life balance?) this year. I feel like I’m doing way too many things. But I have no idea if that’s going to happen. I think at least I should try to do a bit more project finishing and a bit less project starting.
First of all, I can’t wait to get out of this transitional state with that main service running on three different databases in parallel. I think I’m really close now (though I’ve been saying this for weeks).
Then, I have all of the above to maintain, OAuth to add to Minisky & Skythread, things like better documentation and tests to add to the open source projects. I have a few ideas for longer blog posts to write, e.g. some kind of architectural introduction to ATProto.
And also… I’d really love to write an AppView one day (but yes, I know, less project starting 😛).