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
finished the migration to Postgres and testing MySQL, as mentioned above
spent some time working on speeding up the firehose processing, which also resulted in a PR to the Faye library I'm using that greatly improves the speed of binary websocket streams like this one (by avoiding converting the event data unnecessarily from string to array and back)
added new feeds: Atmosphere Buddies, ATProto Top Threads, Hailey's Kittens, Only Posts, Team Watch
ongoing updates to feeds like ATProto, Linux, Star Wars or Mac/iOS Dev
Handle Directory
added a page tracking verifications
ongoing maintenance of the list of independent PDSes
Blog(s)
10 posts on the micro.blog / leaflet.pub "journal" blog
4 posts on the main blog, including a long technical introduction to ATProto:
some updates to my user-focused Bluesky Guide
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).
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
Skythread
made a bunch of smaller updates and added some new separate tools like timeline stats around the middle of the year
then, rewrote the whole thing in Svelte, TypeScript and ES Modules with Bun as the bundler in the autumn
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 inbluesky-social/pdsin 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).
I got an ATProto grant from Bluesky ☺️
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! 🌤️