It's that time of the year when it feels appropriate to look back at the past 12 months and make some kind of summary of how I spent them and what I achieved. I think it makes sense if only because after looking through my projects, I see there's been quite a lot more of that than I had thought. I think we often quickly forget what we spent time on and it might feel like a lot of it was wasted on nothing, but it turns out there's a lot of that nothing 😅

It's also a good time to look a bit forward on the new year and think about what I want to do during that time, to not lose sight of some things.

For comparison, see my 2024 review from a year ago (imported from micro.blog).

Just to quickly look at the last section there:

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.

Narrator: he did not improve his work-life balance after all 🫠

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).

I did finish that one, around March.

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 😛).

I didn't add OAuth anywhere yet, but I did start working on tests and documentation, I wrote a bunch of blog posts, and I managed to resist starting to build an AppView…


Feed service


Handle Directory


Blog(s)

Introduction to AT Protocol
Walkthrough of the various parts and concepts in Bluesky's AT Protocol (ATProto), the types of servers involved and how it all fits together
https://mackuba.eu/2025/08/20/introduction-to-atproto/

Ruby gems

  • 2 releases of Skyfall (including that binary websocket speedup)

  • 4 releases of BlueFactory (added support for interactions API, post reasons & context, and video feeds)

  • 2 releases of DIDKit

  • refreshed my feed generator project template, previously last touched long ago

  • launched a new gem "Tapfall", building on Skyfall to connect to Tap, which lets you build things like a page that imports, indexes and lists all labellers on the network in a single 200-line Ruby file

Another thing that I started doing on that front is that I've been trying to turn this loose set of gems into a bit more of a single "SDK", even though it isn't and won't really be a single whole like e.g. Marshal's Python SDK is. I've built a new shared documentation site for all gems (using Vitepress), which includes each gem's readme & changelog in one place, and where I moved all the code samples from existing repos' example folders (+ refreshed some of them and added a few new ones). I'm also working on adding YARD/RDoc-generated API documentation there, and I slowly started improving the currently abysmal test coverage in the gems (with some help from Codex).

ATProto Ruby SDK
A set of libraries for building and accessing AT Protocol services in Ruby
https://ruby.sdk.blue

SDK.blue

  • added over 50 new projects

  • added tags like xrpc client / firehose / identity / pds impl. etc.

  • support for importing project info from Tangled (or from both Tangled + GitHub and merging data)

  • support for importing release info for Rust 🦀 projects from crates.io

  • I also made a Bluesky account , on which I'm occasionally posting links to new projects that I add to the list

sdk.blue
A curated list of libraries, SDKs and tools for the Bluesky API and AT Protocol
https://sdk.blue

Skythread


Lycan

I launched this small Ruby service in October – it's a "search engine" for your Bluesky likes (and reposts, quotes, and old-style pin bookmarks). It lets you search for keywords in any post you've liked, shared or saved previously, which is really helpful for finding that thing you've seen a week/month/year ago that someone built or posted but you really can't find right now.

The code is open source, and my instance runs at lycan.feeds.blue. The service is API-only, and the UI is built as a separate page in Skythread, see "Archive search" in the menu in the top-right (note, the first time you want to use it, you need to tell it to start an import and wait a bit for it to finish).


Tootify (Mastodon cross-poster)

  • added support for Mastodon OAuth (but not for Bluesky yet 🙃)

  • cross-posting of threads/chains of own posts

  • preventing duplicate cross-posts

  • support for Mastodon 4.5 quote posts (currently not very useful until Bridgy adds support for them too)

  • support for cross-posting video embeds


Other random things

  • At the beginning of last year I moved my main account to my own PDS lab.martianbase.net; it's been running mostly problem-free and with almost no maintenance since then. In order to change that 🙃, I started messing with it again recently, switching to a setup without Docker (I'll make a small write-up about this) and with the addition of 's excellent Gatekeeper service, which restores support for email-based 2FA, which is missing in self-hosted PDSes (seriously though guys, how is it still not implemented in bluesky-social/pds in 2026… 🫣)

  • I've also been running a small ATProto relay at relay.feeds.blue for the past few months – it covers only the "independent Atmosphere", excluding Bluesky's mushroom PDSes, so the traffic is pretty small, but still large enough for testing some things. Note, currently it doesn't automatically add connections to newly discovered PDSes yet, but I'm hoping to change this soon!

  • I've been gradually moving my git repos from GitHub to Tangled, a git hosting service based on ATProto. My newest repos are only on Tangled, and older but active ones have Tangled mirrors (I didn't want to lose the previously collected stars 😏).

  • I finally got into a habit of using ChatGPT much more regularly, in a question-reply mode in the (very nice) native Mac app, and it's been a great help in debugging weird problems or using some technologies I'm not as familiar with, like Bash scripts, Nginx configs, Svelte, or Postgres. I've also started using Codex for some "implement this thing for me" kind of tasks, but for now only occasionally, when I have something simple but boilerplatey to do – e.g. recently I've been using it to generate unit tests and now documentation comments (which I later review and tweak to my taste before committing, but I have some starting point that saves me some time).


Plans for 2026

So, what's next? Probably more of the same ;)

  • I want to continue my work on making my "ATProto Ruby SDK" look more polished and serious – add inline documentation, add/improve the unit tests, finish some missing things. My evil secret plan is to try to Ruby-pill some existing or future ATProto developers, and to do that, I need my libraries to be easier to use, easier to find, to look more complete, and to save you as much work as possible.

  • The SDK.blue site needs a few small QoL improvements, like a sticky language nav bar or filtering by tags

  • I need to finally bite the bullet and properly learn OAuth, and add it to some of my projects

  • There's a whole list of small things I want to add to the newly "sveltified" Skythread, although this will require some UI thinking around where to put what and how it should look

  • I have some long overdue design work to do on the Labellers list and the Label Scanner too

  • I've got a few next ATProto-themed blog posts on my todo list

  • … and I need to work on my work-life balance 🫣

Looking forward to a very "Atmospheric" 2026! 🌤️