decadv 2025
December Adventure is here again. I wanna try to get underbbs ready for release now that I've gotten over some of the big hurdles that plagued me over the past year.
This post will be updated regularly through the month of december.
Projects in this log:
day 1
I've added some basic styling to underbbs and improved various aspects of the "dashboard" microclient which serves as a demo and currently functions as a minimal honk-like experience.
day 2
Generalized outbox handling (for fetching latest messages "byAuthor"). Most instances to not simply expose the outbox collection as-such but require you to paginate by fetching via the first property on the top-level outbox. GTS on top of that prefers for the Create/Announce activity's object to simply be an ID, so we also have to check if it's an embedded object or if it's an ID we need to fetch separately. underbbs-cli is becoming really useful for debugging this kind of stuff. In any case, now viewing an author's profile will show you their latest messages.
Since ActivityPub replies arrays can't be trusted, I revamped the way the anonAPAdapter fetches convoys. The timeline element's convoy mode is now properly implemented as well. We no longer have to navigate message by message through a conversation but when inspecting a message with the navigator we attempt to construct the entire conversation.
This is all alongside a few style changes and the addition of a favicon.
day 3
Tried to fix the follow/unfollow behavior in the honk adapter. Probably still doing something wrong cause I think it expects the honk-numeric ID of the honker when unfollowing, but the frontend component needs some changes to make that work.
Updated madon (the mastodon client library) to v3, and standardized the subscription/timeline behavior across all the adapters. Mastodon in particular could be updated to poll properly instead of fetching the whole timeline at once, but it's a start.
day 4
Started by trying to fix my icecast setup. Really, nothing was wrong with it in and of itself (other than port contention on the server, quick fix) but the audio source was originally audacious with jack and darkice. But that was a pain to run without X11 forwarding. I figured out how to stream directly with ffmpeg, so now I can operate my radio station from any device that can tunnel into my homeserver:
ffmpeg -re -i file.mp3 -ar 48000 -ac 2 -c:a libopus -b:a 160k -f ogg -content_type 'audio/ogg' iceast://source:password@127.0.0.1:7777/nilfm
The re flag in particular is useful, this makes it transcode the stream in realtime instead of as fast as possible.
In underbbs, one of the issues with websockets is that the reverse proxy might close the idle connection if no messages have come through recently. In lighttpd this defaults to 60 seconds although you can configure it. For my purposes, I just adjust the max idle on the virtual host, but in general, we want to reconnect, reinitialize adapters, and reinitiate a subscribe call from any timelines in subscribe mode. Ideally we'd like to keep some state so we don't redundantly pull subscribed data that we already have in the timeline, but if your max idle on the proxy is longer than your typical underbbs session then you won't run into this very often.
Lastly, I implemented boosts across all adapters and the frontend.
day 5
Fixed a typo in the honk adapter that kept boosts from working, added some margins to some UI elements, and pasted in the theme engine from slab. I also added a deferred recover to the websocket subscribe handler so that if an adapter tries to write to a closed socket the whole program doesn't crash.
day 6
Standardized logging and panic recovery in underbbs, as well as tweaking the CSS for the navigator to be a bit more ergonomic, formatting timestamps, and moved them to the addlmeta grid which looks a lot nicer.
Also finished the bulk of setup on my reinstall of my desktop: hello proteus.
day 7
Added default nostr relays to the underbbs config and allowed the NostrAdapter to start without any keys in order to facilitate similar functionality to the anonymousAPAdapter. Wanted to just do a little something even though I'm really tired today.
days 8-13
Messed around more with proteus, adjusted my taro config slightly, and been drawing dragons.
In particular, I cleared some space on proteus's zhome and made an embedded dataset with case-folding enabled and reinstalled PSO2 there, as well as installed Proton GE. The game no longer locks up during intense quests and loading times (except initial load while zhome's cache fills) are much better.
I'm drawing cyberdragons in prep for a new project. Hoping to have something to show for it by the end of the month.
Also been rollerblading with the crew and we're stacking clips. I updated the blitzwalker page with its current loadout.
