Periodical update about the Bluesky/ATProto things I've been working on lately:


Skythread & Svelte

I've been spending a lot of time since the summer on Skythread, my thread reader webapp. I've added a few statistical and search tools there, and last month I launched a feature codenamed "Lycan" that lets you search for any terms of phrases in any posts you've liked.

After that, I started looking into rewriting the project into some kind of modern reactive UI framework. Up until now, it's all been written in completely plain JavaScript, with raw DOM APIs 🫣

After looking at a few different frameworks on a few occasions, I finally decided to try Svelte. I went through the whole tutorial, and it generally seemed easy to understand, elegant and user-friendly.

But… one does not simply rewrite old-school JS into a reactive framework. Before starting to rewrite the code, I also had to update some aspects of it and of my knowledge of JavaScript from circa 2015 to at least 2020. So, first I read up (and talked with ChatGPT) about package installers like npm, Yarn, pnpm, Bun, and played with a few of those. Then about different bundlers like esbuild, rollup/rolldown, Bun again, or Vite. I had to get some grasp of how all those things fit together, what are the categories/layers and what is on which one. What the hell is webpack, corepack, Next.js, Vercel, Vite and all those other words, and how do you import and export things from modules instead of sharing classes through window. It's still all a bit confusing to me, but I think I have a much better understanding of what is what now. GPT was pretty good at summarizing this, without me having to dig through dozens of Medium blog posts.

I ended up configuring Bun as a package manager + bundler + engine, though it's not necessarily the setup I'd recommend at this point (esbuild or Vite might be a better idea), but I'll write a separate post about Svelte later.

The rewrite has been going pretty well. I think I'm probably about 80% done at this point, now just that other 20% that takes 80% of the time 😅 I started by moving the old code into ESM modules first, splitting some files into smaller ones, and then rewriting things bottom-up: starting with separate pages and some components like the login dialog or account menu, and parts of the main post component, and then moving higher up. Right now I have more or less the whole UI converted, and what I have left to add or change is some general top-level router or App component that combines everything together, the global API client objects, random unfinished things here and there, and moving the CSS from style.css to the components. Plus some other refactors (I've also started converting the code to TypeScript now – previously I had it all mostly typed, but in JSDoc comments so I wouldn't need a build step; but now I have a build step anyway).

I'm very happy with Svelte so far – it's pretty nice and unproblematic to use, and I managed to convert my code from this old architecture to something where components pass data to each other with less effort than I expected. I like how the component code looks, with the JS, HTML and CSS blocks separated cleanly within one file. Of course I can't say much yet about general long term reliability or performance, since I'm mostly converting pieces of code and checking if it still works.

I want to get it to a point where everything is generally rewritten and rearchitected but works pretty much like before, and then test it for some period of time before I start adding new things (and before I deploy it to production). After that, I have a long list of minor enhancements here and there that I wanted to add for some time, but I was a bit afraid to touch the old code – nothing really major that would take the project in a new direction, but just a lot of things I found missing while using the app myself.

You can track how it's going on the svelte branch here:

mackuba.eu/skythread
Thread viewer for Bluesky
https://tangled.org/mackuba.eu/skythread/tree/svelte


Blog posts

A couple of blog posts I wrote recently, apart from the Lycan one:

  • about my adventure with 3 databases (SQLite, MySQL and Postgres) and how I tested the feed service on MySQL & Postgres in parallel and what I had to tweak:

How I ran one Ruby app on three SQL databases for six months
Since June 2023, I’ve been running a service written in Ruby (Sinatra) that provides several Bluesky custom feeds (initially built with a feed for the iOS/Mac developers community in mind, later expanded to many other feeds). If you don’t know much about Bluesky feeds, you make them by basically running a server which somehow collects and picks existing posts from Bluesky using some kind of algorithm (chronological or by popularity, based on keyword matching, personal likes, whatever you want), and then exposes a specific API endpoint. The Bluesky AppView (API server) then calls your service passing some request parameters, and your service responds with a list of URIs of posts (which the API server then turns into full post JSON and returns to the client app). This lets you share such feed with anyone on the platform, so they can add it to their app and use it like any built-in feed. (If you’re interested, check out my example feed service project.)
https://mackuba.eu/2025/10/15/three-bases-one-app/

  • about my experiences with micro.blog and why I switched to Leaflet now:

Everybody has a Leaflet, so do I! - Kuba's Lab Notes 🧪
On switching from micro.blog
https://lab.mackuba.eu/3m5tyjv3ssc2p

  • and an organized collection of ATProto/Bluesky blog posts from the last 2.5 years from the Bluesky team and people from the #atdev community:

ATProto blog posts collection
I come across a lot of blog posts about the AT Protocol and Bluesky technicals – both on Bluesky official blogs and those of the team members, and by independent developers from the community. So many people are blogging now (especially now that Leaflet got popular in these circles) that I started using an RSS reader again just to keep up with everything.
https://mackuba.eu/2025/11/18/atproto-blog-posts/

I also have a post that's been in the drafts for a while now, explaining various misconceptions that people on the Fediverse have about Bluesky & AT Protocol – I'll try to finish it before the end of the year too.


Ruby SDK page

I've built a simple project/documentation page for my Ruby gems for ATProto, at https://ruby.sdk.blue. There isn't really much more info there than what's in the readmes – it's literally just readmes and changelogs put together in one place. I just thought that even though it's not really one uniformly designed SDK, and the word "SDK" doesn't fully feel right here, it would still make sense to have a single starting point presenting everything, where you can be directed if you want to build something for ATProto with Ruby but you're not sure where to start.

Later I'll try to add RDoc-generated class documentation there – once I actually write the documentation comments everywhere… – and maybe some other guides and stuff.

I used Vitepress to build this site, which has been really nice to word with (despite being written in JavaScript 😈) and got me a really nice effect with really not that much effort. I normally use Ruby stuff for both dynamic backends (Sinatra) and static sites (Jekyll, like on sdk.blue), but the reason I chose this one is that it gives you this elegant design & layout for a documentation-type website for free. (Source code here.)

(Note: if you have project that's a library or SDK for ATProto, I can get you another subdomain under sdk.blue for the project page if you want – DM me if you're interested. But it should be something that's been out for a while, not something you've just launched or started.)


And one more thing… ;)

I have a small announcement… I've been waiting with this because I thought there would be a blog post, but it looks like there won't be one, so: there's been another (third?) round of ATProto community grants recently… and I happened to get one 😅 Value: $3k 🫣 Not for development of any project in particular, just to support all the stuff I'm doing – feeds, servers, open source, blog posts.

I would like to thank the Bluesky team for this support and for what they're building, and everyone in the community for building and sharing all these cool things, sharing knowledge, learning together, supporting each other, and just hanging out on "the website". I feel very fortunate to be in a position where I can spend a lot of time doing things that give me a lot of fun and satisfaction, and build and write things by my own design that solve my own problems and also turn out to be helpful to a lot of other people. I hope I can keep doing that for a lot longer, and I hope we can build something really big and good together.

Lots of love to all the Atmosphere, I'm happy that you're there 🩵

(I'm really curious who else got one of those grants too, so if you're one of the happy ones and want to share, DM me ;)